Looks like a known problem:
http://trac.sagemath.org/sage_trac/ticket/13054
The routine in question tries to find a better defining polynomial for
a given field. With
R.<y>=QQ['y']
poly=y^4 - 4294967296*y^2 + 54265257667816538374400
it executes:
degree = poly.degree()
pari_poly = pari(poly)
red_table = pari_poly.polred(3)
best = None
best_discr = None
for i in range(red_table.nrows()):
red_poly = red_table[i,1]
if red_poly.poldegree() < degree:
continue
red_discr = red_poly.poldisc().abs()
if best_discr is None or red_discr < best_discr:
best = red_poly
best_discr = red_discr
best_elt = red_table[i,0]
assert(best is not None)
After which (this happened for i==3) we have best_discr == 0, so the
found element generates only a subfield and polred, quite
misleadingly, only reports the characteristic polynomial rather than
the minimal polynomial. We could avoid this problem by
testing "red_descr > 0 and ( best_discr is None or red_discr <
best_discr)". The pari documentation of polred suggests there is
always at least one element that passes that test, so the assertion
should still hold.
According to the documentation, this is an error in pari, since it
should be returning the minimal poly.
GP session illustrating the error: (GP/PARI 2.5.3 (development
git-6fd07f9))
? poly=x^4 - 4294967296*x^2 + 54265257667816538374400
%1 = x^4 - 4294967296*x^2 + 54265257667816538374400
? L=polred(poly,3)
%2 =
[1 x - 1]
[1/145522114880*x^3 - 67108864/
2273783045*x x^4 - 11005853696*x^2 +
356327727107810941435025]
[1/4*x x^4 - 268435456*x^2 + 211973662764908353025]
[1/16*x^2 - 134217728 x^4 + 423911296732797742082*x^2 +
44925196874420524410175311836119348423681]
? elt=Mod(L[4,1],poly)
%3 = Mod(1/16*x^2 - 134217728, x^4 - 4294967296*x^2 +
54265257667816538374400)
? minpoly(elt)
%4 = x^2 + 211955648366398871041
? factor(L[4,2])
%5 =
[x^2 + 211955648366398871041 2]
As you can see L[4,2] is the square of the minimal polynomial.