[package]
[Java implementation]
[Execution output]
Modular
import church.lang.Array;class Modular<T>: modular(T: modulus, T: residue);canonical(m1, m2, residue) = {
if m1 != m2 then error "Modular:: incompatible moduli" else modular(m1, residue % m1);
}
extendedEuclid(u, v) =
if v[2] == additive_identity
then u
else {
q = quotient(u[2], v[2]);
extendedEuclid(v, createArray(3, i −> u[i] - q * v[i]));
};stream << modular(modulus, residue) = stream << residue << " (modulo " << modulus << ")";
modular(m1, r1) == modular(m2, r2) = (m1 == m2 and r1 == r2);
modular(m1, r1) + modular(m2, r2) = canonical(m1, m2, r1 + r2);
-modular(modulus, residue) = modular(modulus, modulus - residue);
modular(m1, r1) * modular(m2, r2) = canonical(m1, m2, r1 * r2);
/modular(modulus, residue) = {
u = [multiplicative_identity, additive_identity, modulus];
v = [additive_identity, multiplicative_identity, residue];
lc = extendedEuclid(u, v);
if lc[2] != multiplicative_identity
then error "Modular: cannot invert residue as it shares a factor with modulus"
else modular(modulus, lc[1]);
}