GENERIC INTERFACEResidueClassBasic (R);
Arithmetic for Modula-3, see doc for detailsAbstract: Generic residue class type
Instantiate with integers, polynomials
ToDo: Test cases. Check isomorphy of the polynomial ring modulo (x^2+1) to the complex numbers.
FROM Arithmetic IMPORT Error; CONST Brand = R.Brand & "ResidueClass"; TYPE T = RECORD r, d: R.T; END; (* Representative of a residue class, divisor (generator of the ideal) *)You must not create residue classes with respect to the zero as divisor.
PROCEDURE NewZero (d: R.T; ): T; (* neutral additive element in the class 'd' *) PROCEDURE NewOne (d: R.T; ): T; (* neutral multiplicative element in the class 'd' *) PROCEDURE FromRepresentative (x, d: R.T; ): T; (* the residue class with respect to 'd' to which 'x' belongs *) PROCEDURE ToRepresentative (READONLY x: T; ): R.T; (* a representative of the residue class *)the operands must belong to the same residue class
PROCEDURE Add (READONLY x, y: T; ): T; (* x+y *) PROCEDURE Sub (READONLY x, y: T; ): T; (* x-y *) PROCEDURE Neg (READONLY x: T; ): T; (* -x *) PROCEDURE IsZero (READONLY x: T; ): BOOLEAN; PROCEDURE Equal (READONLY x, y: T; ): BOOLEAN; (* x=y *) PROCEDURE Mul (READONLY x, y: T; ): T; (* x*y *) PROCEDURE Div (READONLY x, y: T; ): T RAISES {Error}; (* returns z with y*z=x, if the divisor is reducible then the ring of residue classes is not a field and some divisors 'y' have undefined (Error) or multiple results *) PROCEDURE Rec (READONLY x: T; ): T RAISES {Error}; (* 1/x *) PROCEDURE Mod (READONLY x, y: T; ): T RAISES {Error}; (* x mod y *) PROCEDURE Square (READONLY x: T; ): T; (* x*x *) PROCEDURE Scale (READONLY x: T; y: R.T; ): T; (* x*y *) END ResidueClassBasic.