GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############################################################################
##
#W factors.gi Alnuth - ALgebraic NUmber THeory Andreas Distler
##
#############################################################################
##
#M IrrFacsAlgExtPol(<f>) . . . . . lists of irreducible factors of rational
## polynomial over algebraic extensions, initialize default
##
InstallOtherMethod(IrrFacsAlgExtPol,true,[IsPolynomial],0,f -> []);
#############################################################################
##
#F StoreFactorsAlgExtPol( <pring>, <upol>, <factlist> ) . store factors list
##
InstallGlobalFunction(StoreFactorsAlgExtPol,function(R,f,fact)
local irf;
irf:=IrrFacsAlgExtPol(f);
if not ForAny(irf,i->i[1]=R) then
Add(irf,[R,fact]);
fi;
end);
#############################################################################
##
#F FactorsPolynomialAlgExt, function( <H>, <poly> )
##
## Factorizes the rational polynomial <poly> over the field <H>, a proper
## algebraic extension of the rationals, using PARI/GP
##
InstallGlobalFunction( FactorsPolynomialAlgExt, function( H, poly )
local faktoren, irf, i;
if not ForAll( CoefficientsOfUnivariatePolynomial( poly ), IsRat ) then
Error( "polynomial has to be defined over the Rationals" );
fi;
if H = Rationals then
return Factors( poly );
fi;
irf := IrrFacsAlgExtPol( poly );
i := PositionProperty( irf, k -> k[1] = H );
if i <> fail then
return irf[i][2];
fi;
faktoren := FactorsPolynomialPari( AlgExtEmbeddedPol( H, poly ));
StoreFactorsAlgExtPol( H, poly, faktoren );
return faktoren;
end );
#############################################################################
##
#F FactorsPolynomialPari, function( <poly> )
##
## Factorizes the polynomial <poly> defined over an algebraic extension of
## the rationals using PARI/GP
##
## As a method of 'Factors' ? AD
##
InstallGlobalFunction(FactorsPolynomialPari, function( poly )
local faktoren, fak, coeff, c, lcoeff, irf, i, coeffs, H;
H := CoefficientsRing( DefaultRing( poly ));
irf := IrrFacsAlgExtPol( poly );
i := PositionProperty( irf, k -> k[1] = H );
if i <> fail then
return irf[i][2];
fi;
if DegreeOfLaurentPolynomial( poly ) < 2 then
faktoren := [ poly ];
StoreFactorsPol( H, poly, faktoren );
return faktoren;
fi;
faktoren := [ ];
lcoeff := LeadingCoefficient( poly );
coeffs := CoefficientsOfUnivariatePolynomial( poly / lcoeff );
coeffs := List( Reversed( coeffs ), ExtRepOfObj );
for fak in PolynomialFactorsDescriptionPari( H, coeffs ) do
coeff := [ ];
for c in Reversed( fak ) do
if ( c in Rationals ) then
Add( coeff, c );
else
Add( coeff, LinearCombination( EquationOrderBasis(H), c ) );
fi;
od;
Add( faktoren, UnivariatePolynomial( H, One(H)*coeff ) );
od;
faktoren[1] := lcoeff * faktoren[1];
StoreFactorsPol( H, poly, faktoren );
return faktoren;
end );
#############################################################################
##
#E