/usr/share/axiom-20170501/src/algebra/ALGFACT.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 | )abbrev package ALGFACT AlgFactor
++ Author: Manuel Bronstein
++ Description:
++ Factorization of univariate polynomials with coefficients in
++ \spadtype{AlgebraicNumber}.
AlgFactor(UP) : SIG == CODE where
UP: UnivariatePolynomialCategory AlgebraicNumber
N ==> NonNegativeInteger
Z ==> Integer
Q ==> Fraction Integer
AN ==> AlgebraicNumber
K ==> Kernel AN
UPQ ==> SparseUnivariatePolynomial Q
SUP ==> SparseUnivariatePolynomial AN
FR ==> Factored UP
SIG ==> with
factor : (UP, List AN) -> FR
++ factor(p, [a1,...,an]) returns a prime factorisation of p
++ over the field generated by its coefficients and a1,...,an.
factor : UP -> FR
++ factor(p) returns a prime factorisation of p
++ over the field generated by its coefficients.
split : UP -> FR
++ split(p) returns a prime factorisation of p
++ over its splitting field.
doublyTransitive? : UP -> Boolean
++ doublyTransitive?(p) is true if p is irreducible over
++ over the field K generated by its coefficients, and
++ if \spad{p(X) / (X - a)} is irreducible over
++ \spad{K(a)} where \spad{p(a) = 0}.
CODE ==> add
import PolynomialCategoryQuotientFunctions(IndexedExponents K,
K, Z, SparseMultivariatePolynomial(Z, K), AN)
UPCF2 ==> UnivariatePolynomialCategoryFunctions2
fact : (UP, List K) -> FR
ifactor : (SUP, List K) -> Factored SUP
extend : (UP, Z) -> FR
allk : List AN -> List K
downpoly: UP -> UPQ
liftpoly: UPQ -> UP
irred? : UP -> Boolean
allk l == removeDuplicates concat [kernels x for x in l]
liftpoly p == map(x +-> x::AN, p)$UPCF2(Q, UPQ, AN, UP)
downpoly p == map(x +-> retract(x)@Q, p)$UPCF2(AN, UP ,Q, UPQ)
ifactor(p,l) == (fact(p pretend UP, l)) pretend Factored(SUP)
factor p == fact(p, allk coefficients p)
factor(p, l) ==
fact(p, allk removeDuplicates concat(l, coefficients p))
split p ==
fp := factor p
unit(fp) *
_*/[extend(fc.factor, fc.exponent) for fc in factors fp]
extend(p, n) ==
(degree p = 1) => primeFactor(p, n)
q := monomial(1, 1)$UP - zeroOf(p pretend SUP)::UP
primeFactor(q, n) * split((p exquo q)::UP) ** (n::N)
doublyTransitive? p ==
irred? p and irred?((p exquo
(monomial(1, 1)$UP - zeroOf(p pretend SUP)::UP))::UP)
irred? p ==
fp := factor p
(numberOfFactors fp = 1) and (nthExponent(fp, 1) = 1)
fact(p, l) ==
(degree p = 1) => primeFactor(p, 1)
empty? l =>
dr := factor(downpoly p)$RationalFactorize(UPQ)
(liftpoly unit dr) *
_*/[primeFactor(liftpoly dc.factor,dc.exponent)
for dc in factors dr]
q := minPoly(alpha := "max"/l)$AN
newl := remove((x:K):Boolean +-> alpha = x, l)
sae := SimpleAlgebraicExtension(AN, SUP, q)
ups := SparseUnivariatePolynomial sae
fr := factor(map(x +-> reduce univariate(x, alpha, q),p)_
$UPCF2(AN, UP, sae, ups),_
x +-> ifactor(x, newl))$InnerAlgFactor(AN, SUP, sae, ups)
newalpha := alpha::AN
map((x:sae):AN +-> (lift(x)$sae) newalpha, unit fr)_
$UPCF2(sae, ups, AN, UP) *
_*/[primeFactor(map((y:sae):AN +-> (lift(y)$sae) newalpha,fc.factor)_
$UPCF2(sae, ups, AN, UP),
fc.exponent) for fc in factors fr]
|