/usr/share/axiom-20170501/src/algebra/FFP.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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | )abbrev domain FFP FiniteFieldExtensionByPolynomial
++ Authors: R.Sutor, J. Grabmeier, O. Gschnitzer, A. Scheerhorn
++ Date Created:
++ Date Last Updated: 31 March 1991
++ Reference:
++ Grab92 Finite Fields in Axiom
++ Lidl83 Finite Field, Encyclopedia of Mathematics and Its Applications
++ Description:
++ FiniteFieldExtensionByPolynomial(GF, defpol) implements the extension
++ of the finite field GF generated by the extension polynomial
++ defpol which MUST be irreducible.
++ Note: the user has the responsibility to ensure that
++ defpol is irreducible.
FiniteFieldExtensionByPolynomial(GF,defpol) : SIG == CODE where
GF : FiniteFieldCategory
defpol : SparseUnivariatePolynomial(GF)
PI ==> PositiveInteger
NNI ==> NonNegativeInteger
SUP ==> SparseUnivariatePolynomial
I ==> Integer
R ==> Record(key:PI,entry:NNI)
TBL ==> Table(PI,NNI)
SAE ==> SimpleAlgebraicExtension(GF,SUP GF,defpol)
OUT ==> OutputForm
SIG ==> FiniteAlgebraicExtensionField(GF)
CODE ==> add
-- global variables ====================================================
Rep:=SAE
extdeg:PI := degree(defpol)$(SUP GF) pretend PI
-- the extension degree
alpha := new()$Symbol :: OutputForm
-- a new symbol for the output form of field elements
sizeCG:Integer := size()$GF**extdeg - 1
-- the order of the multiplicative group
facOfGroupSize := nil()$(List Record(factor:Integer,exponent:Integer))
-- the factorization of sizeCG
normalElt:PI:=1
-- for the lookup of the normal Element computed by
-- createNormalElement
primitiveElt:PI:=1
-- for the lookup of the primitive Element computed by
-- createPrimitiveElement()
initlog?:Boolean:=true
-- gets false after initialization of the discrete logarithm table
initelt?:Boolean:=true
-- gets false after initialization of the primitive and the
-- normal element
discLogTable:Table(PI,TBL):=table()$Table(PI,TBL)
-- tables indexed by the factors of sizeCG,
-- discLogTable(factor) is a table with keys
-- primitiveElement() ** (i * (sizeCG quo factor)) and entries i for
-- i in 0..n-1, n computed in initialize() in order to use
-- the minimal size limit 'limit' optimal.
-- functions ===========================================================
generator() == reduce(monomial(1,1)$SUP(GF))$Rep
norm x == resultant(defpol, lift x)
initializeElt: () -> Void
initializeLog: () -> Void
basis(n:PI) ==
(extdeg rem n) ^= 0 => error "argument must divide extension degree"
a:$:=norm(primitiveElement(),n)
vector [a**i for i in 0..n-1]
degree(x) ==
y:$:=1
m:=zero(extdeg,extdeg+1)$(Matrix GF)
for i in 1..extdeg+1 repeat
setColumn_!(m,i,coordinates(y))$(Matrix GF)
y:=y*x
rank(m)::PI
minimalPolynomial(x:$) ==
y:$:=1
m:=zero(extdeg,extdeg+1)$(Matrix GF)
for i in 1..extdeg+1 repeat
setColumn_!(m,i,coordinates(y))$(Matrix GF)
y:=y*x
v:=first nullSpace(m)$(Matrix GF)
+/[monomial(v.(i+1),i)$(SUP GF) for i in 0..extdeg]
normal?(x) ==
l:List List GF:=[entries coordinates x]
a:=x
for i in 2..extdeg repeat
a:=Frobenius(a)
l:=concat(l,entries coordinates a)$(List List GF)
((rank matrix(l)$(Matrix GF)) = extdeg::NNI) => true
false
a:GF * x:$ == a *$Rep x
n:I * x:$ == n *$Rep x
-x == -$Rep x
random() == random()$Rep
coordinates(x:$) == coordinates(x)$Rep
represents(v) == represents(v)$Rep
coerce(x:GF):$ == coerce(x)$Rep
definingPolynomial() == defpol
retract(x) == retract(x)$Rep
retractIfCan(x) == retractIfCan(x)$Rep
index(x) == index(x)$Rep
lookup(x) == lookup(x)$Rep
x:$/y:$ == x /$Rep y
x:$/a:GF == x/coerce(a)
x:$ * y:$ == x *$Rep y
x:$ + y:$ == x +$Rep y
x:$ - y:$ == x -$Rep y
x:$ = y:$ == x =$Rep y
basis() == basis()$Rep
0 == 0$Rep
1 == 1$Rep
factorsOfCyclicGroupSize() ==
if empty? facOfGroupSize then initializeElt()
facOfGroupSize
representationType() == "polynomial"
tableForDiscreteLogarithm(fac) ==
if initlog? then initializeLog()
tbl:=search(fac::PI,discLogTable)$Table(PI,TBL)
tbl case "failed" =>
error "tableForDiscreteLogarithm: argument must be prime divisor_
of the order of the multiplicative group"
tbl pretend TBL
primitiveElement() ==
if initelt? then initializeElt()
index(primitiveElt)
normalElement() ==
if initelt? then initializeElt()
index(normalElt)
initializeElt() ==
facOfGroupSize:=factors(factor(sizeCG)$Integer)
-- get a primitive element
pE:=createPrimitiveElement()
primitiveElt:=lookup(pE)
-- create a normal element
nElt:=generator()
while not normal? nElt repeat
nElt:=nElt*pE
normalElt:=lookup(nElt)
-- set elements initialization flag
initelt? := false
void()$Void
initializeLog() ==
if initelt? then initializeElt()
-- set up tables for discrete logarithm
limit:Integer:=30
-- the minimum size for the discrete logarithm table
for f in facOfGroupSize repeat
fac:=f.factor
base:$:=primitiveElement() ** (sizeCG quo fac)
l:Integer:=length(fac)$Integer
n:Integer:=0
if odd?(l)$Integer then n:=shift(fac,-(l quo 2))
else n:=shift(1,(l quo 2))
if n < limit then
d:=(fac-1) quo limit + 1
n:=(fac-1) quo d + 1
tbl:TBL:=table()$TBL
a:$:=1
for i in (0::NNI)..(n-1)::NNI repeat
insert_!([lookup(a),i::NNI]$R,tbl)$TBL
a:=a*base
insert_!([fac::PI,copy(tbl)$TBL]_
$Record(key:PI,entry:TBL),discLogTable)$Table(PI,TBL)
-- set logarithm initialization flag
initlog? := false
-- tell user about initialization
--print("discrete logarithm tables initialized"::OUT)
void()$Void
coerce(e:$):OutputForm == outputForm(lift(e),alpha)
extensionDegree() == extdeg
size() == (sizeCG + 1) pretend NNI
inGroundField?(x) ==
retractIfCan(x) = "failed" => false
true
characteristic() == characteristic()$GF
|