/usr/share/axiom-20170501/src/algebra/ZMOD.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | )abbrev domain ZMOD IntegerMod
++ Author: Mark Botch
++ Description:
++ IntegerMod(n) creates the ring of integers reduced modulo the integer n.
IntegerMod(p) : SIG == CODE where
p : PositiveInteger
SIG ==> Join(CommutativeRing, Finite, ConvertibleTo Integer, StepThrough)
CODE ==> add
size() == p
characteristic() == p
lookup x == (zero? x => p; (convert(x)@Integer) :: PositiveInteger)
-- Code is duplicated for the optimizer to kick in.
if p <= convert(max()$SingleInteger)@Integer then
Rep:= SingleInteger
q := p::SingleInteger
bloodyCompiler: Integer -> %
bloodyCompiler n == positiveRemainder(n, p)$Integer :: Rep
convert(x:%):Integer == convert(x)$Rep
coerce(x):OutputForm == coerce(x)$Rep
coerce(n:Integer):% == bloodyCompiler n
0 == 0$Rep
1 == 1$Rep
init == 0$Rep
nextItem(n) ==
m:=n+1
m=0 => "failed"
m
x = y == x =$Rep y
x:% * y:% == mulmod(x, y, q)
n:Integer * x:% == mulmod(bloodyCompiler n, x, q)
x + y == addmod(x, y, q)
x - y == submod(x, y, q)
random() == random(q)$Rep
index a == positiveRemainder(a::%, q)
- x == (zero? x => 0; q -$Rep x)
x:% ** n:NonNegativeInteger ==
n < p => powmod(x, n::Rep, q)
powmod(convert(x)@Integer, n, p)$Integer :: Rep
recip x ==
(c1, c2, g) := extendedEuclidean(x, q)$Rep
not (g = 1) => "failed"
positiveRemainder(c1, q)
else
Rep:= Integer
convert(x:%):Integer == convert(x)$Rep
coerce(n:Integer):% == positiveRemainder(n::Rep, p)
coerce(x):OutputForm == coerce(x)$Rep
0 == 0$Rep
1 == 1$Rep
init == 0$Rep
nextItem(n) ==
m:=n+1
m=0 => "failed"
m
x = y == x =$Rep y
x:% * y:% == mulmod(x, y, p)
n:Integer * x:% == mulmod(positiveRemainder(n::Rep, p), x, p)
x + y == addmod(x, y, p)
x - y == submod(x, y, p)
random() == random(p)$Rep
index a == positiveRemainder(a::Rep, p)
- x == (zero? x => 0; p -$Rep x)
x:% ** n:NonNegativeInteger == powmod(x, n::Rep, p)
recip x ==
(c1, c2, g) := extendedEuclidean(x, p)$Rep
not (g = 1) => "failed"
positiveRemainder(c1, p)
|