/usr/share/axiom-20170501/src/algebra/IALGFACT.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 | )abbrev package IALGFACT InnerAlgFactor
++ Author: Patrizia Gianni
++ Date Last Updated: 20 Jul 1988
++ Description:
++ Factorisation in a simple algebraic extension
++ Factorization of univariate polynomials with coefficients in an
++ algebraic extension of a field over which we can factor UP's;
InnerAlgFactor(F, UP, AlExt, AlPol) : SIG == CODE where
F : Field
UP : UnivariatePolynomialCategory F
AlPol: UnivariatePolynomialCategory AlExt
AlExt : Join(Field, CharacteristicZero, MonogenicAlgebra(F,UP))
NUP ==> SparseUnivariatePolynomial UP
N ==> NonNegativeInteger
Z ==> Integer
FR ==> Factored UP
UPCF2 ==> UnivariatePolynomialCategoryFunctions2
SIG ==> with
factor : (AlPol, UP -> FR) -> Factored AlPol
++ factor(p, f) returns a prime factorisation of p;
++ f is a factorisation map for elements of UP;
CODE ==> add
pnorm : AlPol -> UP
convrt : AlPol -> NUP
change : UP -> AlPol
perturbfactor: (AlPol, Z, UP -> FR) -> List AlPol
irrfactor : (AlPol, Z, UP -> FR) -> List AlPol
perturbfactor(f, k, fact) ==
pol := monomial(1$AlExt,1)-
monomial(reduce monomial(k::F,1)$UP ,0)
newf := elt(f, pol)
lsols := irrfactor(newf, k, fact)
pol := monomial(1, 1) +
monomial(reduce monomial(k::F,1)$UP,0)
[elt(pp, pol) for pp in lsols]
--- factorize the square-free parts of f ---
irrfactor(f, k, fact) ==
degree(f) =$N 1 => [f]
newf := f
nn := pnorm f
--newval:RN:=1
--pert:=false
--if ^ SqFr? nn then
-- pert:=true
-- newterm:=perturb(f)
-- newf:=newterm.ppol
-- newval:=newterm.pval
-- nn:=newterm.nnorm
listfact := factors fact nn
#listfact =$N 1 =>
first(listfact).exponent =$Z 1 => [f]
perturbfactor(f, k + 1, fact)
listerm:List(AlPol):= []
for pelt in listfact repeat
g := gcd(change(pelt.factor), newf)
newf := (newf exquo g)::AlPol
listerm :=
pelt.exponent =$Z 1 => cons(g, listerm)
append(perturbfactor(g, k + 1, fact), listerm)
listerm
factor(f, fact) ==
sqf := squareFree f
unit(sqf) * _*/[_*/[primeFactor(pol, sqterm.exponent)
for pol in irrfactor(sqterm.factor, 0, fact)]
for sqterm in factors sqf]
p := definingPolynomial()$AlExt
newp := map(x +-> x::UP, p)$UPCF2(F, UP, UP, NUP)
pnorm q == resultant(convrt q, newp)
change q == map(coerce, q)$UPCF2(F,UP,AlExt,AlPol)
convrt q ==
swap(map(lift, q)$UPCF2(AlExt, AlPol,
UP, NUP))$CommuteUnivariatePolynomialCategory(F, UP, NUP)
|