|Bill Daly on Wed, 11 Feb 2009 20:42:20 +0100|
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
(I've tried sending messages to pari-users before, but something
was always screwed up. I hope it's fixed by now.)|
Anyway, I looked for a simple way to generate the splitting field of a polynomial but didn't find one, so I wrote one:
h = f;
fac = lift(factornf(f,subst(h,x,r)));
g = fac[matsize(fac),1];
if (poldegree(g,x) < 2,
v = vector(matsize(fac),j,
h = rnfequation(nfinit(subst(h,x,r)),g);
It assumes that factornf() always returns factors in increasing order by degree; if this is not the case, I could do a search for an appropriate factor g of degree > 1, returning if all the factors are linear.
f must be a polynomial in x. splittingpol(f) returns a vector with 2 components:
 = a polynomial in x which represents the splitting field of f;
 = a vector of length poldegree(f) whose components are the roots of f in terms of a root r of the splitting polynomial.
It works as follows. During each iteration of the main loop, I factor f in the number field of the current value of h (initially, h is set to f), using r as the root of the number field generated by h. I take g to be the factor of highest degree in x (the coefficients of g are generally polynomials in r). If the degree of g in x is 1, then all of the factors are linear and I am done. Otherwise, I use rnfequation() to replace h with a polynomial (in x) which represents the field containing g over the field generated by subst(h,x,r). This gives me a field containing the roots of f augmented by the roots of g. By repeating this loop, I must eventually arrive at a polynomial h which contains all the roots of f.
This may provide a relatively quick way of finding the Galois group of f.