/usr/share/axiom-20170501/src/algebra/ALGFF.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 | )abbrev domain ALGFF AlgebraicFunctionField
++ Author: Manuel Bronstein
++ Date Created: 3 May 1988
++ Date Last Updated: 24 Jul 1990
++ Description:
++ Function field defined by f(x, y) = 0.
AlgebraicFunctionField(F, UP, UPUP, modulus) : SIG == CODE where
F : Field
UP : UnivariatePolynomialCategory F
UPUP : UnivariatePolynomialCategory Fraction UP
modulus: UPUP
N ==> NonNegativeInteger
Z ==> Integer
RF ==> Fraction UP
QF ==> Fraction UPUP
UP2 ==> SparseUnivariatePolynomial UP
SAE ==> SimpleAlgebraicExtension(RF, UPUP, modulus)
INIT ==> if (deref brandNew?) then startUp false
SIG ==> FunctionFieldCategory(F, UP, UPUP) with
knownInfBasis : N -> Void
++ knownInfBasis(n) is not documented
CODE ==> SAE add
import ChangeOfVariable(F, UP, UPUP)
import InnerCommonDenominator(UP, RF, Vector UP, Vector RF)
import MatrixCommonDenominator(UP, RF)
import UnivariatePolynomialCategoryFunctions2(RF, UPUP, UP, UP2)
startUp : Boolean -> Void
vect : Matrix RF -> Vector $
getInfBasis: () -> Void
brandNew?:Reference(Boolean) := ref true
infBr?:Reference(Boolean) := ref true
discPoly:Reference(RF) := ref 0
n := degree modulus
n1 := (n - 1)::N
ibasis:Matrix(RF) := zero(n, n)
invibasis:Matrix(RF) := copy ibasis
infbasis:Matrix(RF) := copy ibasis
invinfbasis:Matrix(RF):= copy ibasis
branchPointAtInfinity?() ==
(INIT; infBr?())
discriminant() ==
(INIT; discPoly())
integralBasis() ==
(INIT; vect ibasis)
integralBasisAtInfinity() ==
(INIT; vect infbasis)
integralMatrix() ==
(INIT; ibasis)
inverseIntegralMatrix() ==
(INIT; invibasis)
integralMatrixAtInfinity() ==
(INIT; infbasis)
branchPoint?(a:F) ==
zero?((retract(discriminant())@UP) a)
definingPolynomial() ==
modulus
inverseIntegralMatrixAtInfinity() ==
(INIT; invinfbasis)
vect m ==
[represents row(m, i) for i in minRowIndex m .. maxRowIndex m]
integralCoordinates f ==
splitDenominator(coordinates(f) * inverseIntegralMatrix())
knownInfBasis d ==
if deref brandNew? then
alpha := [monomial(1, d * i)$UP :: RF for i in 0..n1]$Vector(RF)
ib := diagonalMatrix
[inv qelt(alpha, i) for i in minIndex alpha .. maxIndex alpha]
invib := diagonalMatrix alpha
for i in minRowIndex ib .. maxRowIndex ib repeat
for j in minColIndex ib .. maxColIndex ib repeat
infbasis(i, j) := qelt(ib, i, j)
invinfbasis(i, j) := invib(i, j)
void
getInfBasis() ==
x := inv(monomial(1, 1)$UP :: RF)
invmod := map(s +-> s(x), modulus)
r := mkIntegral invmod
degree(r.poly) ^= n => error "Should not happen"
ninvmod:UP2 := map(s +-> retract(s)@UP, r.poly)
alpha := [(r.coef ** i) x for i in 0..n1]$Vector(RF)
invalpha := [inv qelt(alpha, i)
for i in minIndex alpha .. maxIndex alpha]$Vector(RF)
invib := integralBasis()$FunctionFieldIntegralBasis(UP, UP2,
SimpleAlgebraicExtension(UP, UP2, ninvmod))
for i in minRowIndex ibasis .. maxRowIndex ibasis repeat
for j in minColIndex ibasis .. maxColIndex ibasis repeat
infbasis(i, j) := ((invib.basis)(i,j) / invib.basisDen) x
invinfbasis(i, j) := ((invib.basisInv) (i, j)) x
ib2 := infbasis * diagonalMatrix alpha
invib2 := diagonalMatrix(invalpha) * invinfbasis
for i in minRowIndex ib2 .. maxRowIndex ib2 repeat
for j in minColIndex ibasis .. maxColIndex ibasis repeat
infbasis(i, j) := qelt(ib2, i, j)
invinfbasis(i, j) := invib2(i, j)
void
startUp b ==
brandNew?() := b
nmod:UP2 := map(retract, modulus)
ib := integralBasis()$FunctionFieldIntegralBasis(UP, UP2,
SimpleAlgebraicExtension(UP, UP2, nmod))
for i in minRowIndex ibasis .. maxRowIndex ibasis repeat
for j in minColIndex ibasis .. maxColIndex ibasis repeat
qsetelt_!(ibasis, i, j, (ib.basis)(i, j) / ib.basisDen)
invibasis(i, j) := ((ib.basisInv) (i, j))::RF
if zero?(infbasis(minRowIndex infbasis, minColIndex infbasis))
then getInfBasis()
ib2 := coordinates normalizeAtInfinity vect ibasis
invib2 := inverse(ib2)::Matrix(RF)
for i in minRowIndex ib2 .. maxRowIndex ib2 repeat
for j in minColIndex ib2 .. maxColIndex ib2 repeat
ibasis(i, j) := qelt(ib2, i, j)
invibasis(i, j) := invib2(i, j)
dsc := resultant(modulus, differentiate modulus)
dsc0 := dsc * determinant(infbasis) ** 2
degree(numer dsc0) > degree(denom dsc0) =>error "Shouldn't happen"
infBr?() := degree(numer dsc0) < degree(denom dsc0)
dsc := dsc * determinant(ibasis) ** 2
discPoly() := primitivePart(numer dsc) / denom(dsc)
void
integralDerivationMatrix d ==
w := integralBasis()
splitDenominator(coordinates([differentiate(w.i, d)
for i in minIndex w .. maxIndex w]$Vector($))
* inverseIntegralMatrix())
integralRepresents(v, d) ==
represents(coordinates(represents(v, d)) * integralMatrix())
branchPoint?(p:UP) ==
INIT
(r:=retractIfCan(p)@Union(F,"failed")) case F =>branchPoint?(r::F)
not ground? gcd(retract(discriminant())@UP, p)
|