One may construct an absolute field isomorphic to the current subfield represented by an algebraically closed field. The construction of the absolute field may be very expensive, as it involves factoring polynomials over successive subfields. In fact, it is often the case that the degree of the absolute field is an extremely large integer, so that an absolute field is not practically representable, yet the system may allow one to compute effectively with the original non-absolute presentation.
Simplify the algebraically closed field A fully (see Simplify(A) above) and then return an absolute field as a univariate affine algebra R which is isomorphic to the current (true) algebraic field represented by A, and also return the isomorphism f:A -> R.
Simplify the algebraically closed field A fully (see Simplify(A) above) and then compute an absolute field isomorphic to the current (true) algebraic field represented by A and return the defining polynomial of the absolute field. That is, return a polynomial f such that K[x]/<f> is isomorphic to A in its current state.
Modify the algebraically closed field A in place so that has an absolute presentation. That is, compute an isomorphic absolute field and absolute polynomial f as in AbsolutePolynomial and modify A and its elements in place so that A now only has one variable v and corresponding defining polynomial f(v) and the elements of A correspond via the isomorphism to their old representation.
We first create the ideal I over Q and compute its variety over A, the algebraic closure of Q.
> P<a,b,c,d,e,f> := PolynomialRing(RationalField(), 6); > B := [ > a + b + c + d + e + f, > a*b + b*c + c*d + d*e + e*f + f*a, > a*b*c + b*c*d + c*d*e + d*e*f + e*f*a + f*a*b, > a*b*c*d + b*c*d*e + c*d*e*f + d*e*f*a + e*f*a*b + f*a*b*c, > a*b*c*d*e + b*c*d*e*f + c*d*e*f*a + d*e*f*a*b + > e*f*a*b*c + f*a*b*c*d, > a*b*c*d*e*f - 1]; > I := ideal<P | B>; > time Groebner(I); Time: 1.459 > A := AlgebraicClosure(); > time V := Variety(I, A); Time: 4.219 > #V; 156We now notice that there are 28 variables in A and we check that all elements of V satisfy the original polynomials.
> Rank(A); 30 > V[1]; <-1, -1, -1, -1, r1 + 4, -r1> > V[156]; <r28^3 + 2*r28^2*r9 - 2*r9, -r28^3 - 2*r28^2*r9 + 2*r9, r9, -r28, r28, -r9> > {Evaluate(f, v): v in V, f in B}; { 0 }We now simplify A to ensure that it represents a true field, and prune away useless variables now having linear defining polynomials.
> time Simplify(A); Time: 3.330 > Prune(A); > A; Algebraically closed field with 3 variables Defining relations: [ r3^2 - 1/3*r3*r2*r1 - 5/3*r3*r2 + 2/3*r3*r1 - 2/3*r3 + r2*r1 + 4*r2 + 1, r2^2 - r2*r1 - 4*r1 - 1, r1^2 + 4*r1 + 1 ] > V[1]; <-1, -1, -1, -1, r1 + 4, -r1> > V[156]; <2/3*r3*r2*r1 + 7/3*r3*r2 - 1/3*r3*r1 - 2/3*r3 + 5/3*r2*r1 + 19/3*r2 + 2/3*r1 + 4/3, -2/3*r3*r2*r1 - 7/3*r3*r2 + 1/3*r3*r1 + 2/3*r3 - 5/3*r2*r1 - 19/3*r2 - 2/3*r1 - 4/3, -4/3*r2*r1 - 14/3*r2 - 1/3*r1 - 2/3, 2/3*r3*r2*r1 + 7/3*r3*r2 - 1/3*r3*r1 - 2/3*r3 - 5/3*r2*r1 - 19/3*r2 + 1/3*r1 - 1/3, -2/3*r3*r2*r1 - 7/3*r3*r2 + 1/3*r3*r1 + 2/3*r3 + 5/3*r2*r1 + 19/3*r2 - 1/3*r1 + 1/3, 4/3*r2*r1 + 14/3*r2 + 1/3*r1 + 2/3>Finally we compute an absolute polynomial for A, and then modify A in place using Absolutize to make A be defined by one polynomial of degree 8.
> time AbsolutePolynomial(A); x^8 + 4*x^6 - 6*x^4 + 4*x^2 + 1 Time: 0.080 > time Absolutize(A); Time: 0.259 > A; Algebraically closed field with 1 variables Defining relations: [ r1^8 + 4*r1^6 - 6*r1^4 + 4*r1^2 + 1 ] > V[1]; <-1, -1, -1, -1, 1/2*r1^6 + 2*r1^4 - 7/2*r1^2 + 3, -1/2*r1^6 - 2*r1^4 + 7/2*r1^2 + 1> > V[156]; <r1^7 + 4*r1^5 - 6*r1^3 + 4*r1, -r1^7 - 4*r1^5 + 6*r1^3 - 4*r1, -1/4*r1^7 - 3/4*r1^5 + 11/4*r1^3 - 7/4*r1, -r1, r1, 1/4*r1^7 + 3/4*r1^5 - 11/4*r1^3 + 7/4*r1> > {Evaluate(f, v): v in V, f in B}; { 0 }
We first set f to a degree-8 polynomial using the database of polynomials with given Galois group. The Galois group has order 16, so we know that the splitting field will have absolute degree 16.
> P<x> := PolynomialRing(IntegerRing()); > load galpols; Loading "/home/magma/libs/galpols/galpols" > PolynomialWithGaloisGroup(8, 6); x^8 - 2*x^7 - 9*x^6 + 10*x^5 + 22*x^4 - 14*x^3 - 15*x^2 + 2*x + 1 > f := $1; > #GaloisGroup(f); 16We next create an algebraic closure A and compute the roots of f over A.
> A := AlgebraicClosure(); > r := Roots(f, A); > #r; 8 > A; Algebraically closed field with 8 variables Defining relations: [ r8^8 - 2*r8^7 - 9*r8^6 + 10*r8^5 + 22*r8^4 - 14*r8^3 - 15*r8^2 + 2*r8 + 1, r7^8 - 2*r7^7 - 9*r7^6 + 10*r7^5 + 22*r7^4 - 14*r7^3 - 15*r7^2 + 2*r7 + 1, r6^8 - 2*r6^7 - 9*r6^6 + 10*r6^5 + 22*r6^4 - 14*r6^3 - 15*r6^2 + 2*r6 + 1, r5^8 - 2*r5^7 - 9*r5^6 + 10*r5^5 + 22*r5^4 - 14*r5^3 - 15*r5^2 + 2*r5 + 1, r4^8 - 2*r4^7 - 9*r4^6 + 10*r4^5 + 22*r4^4 - 14*r4^3 - 15*r4^2 + 2*r4 + 1, r3^8 - 2*r3^7 - 9*r3^6 + 10*r3^5 + 22*r3^4 - 14*r3^3 - 15*r3^2 + 2*r3 + 1, r2^8 - 2*r2^7 - 9*r2^6 + 10*r2^5 + 22*r2^4 - 14*r2^3 - 15*r2^2 + 2*r2 + 1, r1^8 - 2*r1^7 - 9*r1^6 + 10*r1^5 + 22*r1^4 - 14*r1^3 - 15*r1^2 + 2*r1 + 1 ]Finally we simplify A. There are defining polynomials of degrees 2 and 8 in the simplified field. The absolute polynomial of degree 16 defines the splitting field of f.
> time Simplify(A); Time: 2.870 > A; Algebraically closed field with 8 variables Defining relations: [ r8 + 1/2*r3*r1^6 - 2*r3*r1^5 - r3*r1^4 + 8*r3*r1^3 - 2*r3*r1^2 - 5*r3*r1 - 1/2*r3 + r1^7 - 3/2*r1^6 - 9*r1^5 + 4*r1^4 + 19*r1^3 - r1^2 - 9*r1 - 5/2, r7 - 1/2*r3*r1^6 + 2*r3*r1^5 + r3*r1^4 - 8*r3*r1^3 + 2*r3*r1^2 + 5*r3*r1 + 1/2*r3, r6 + r3 - 3/2*r1^7 + 2*r1^6 + 14*r1^5 - 5*r1^4 - 28*r1^3 + 3*r1^2 + 19/2*r1, r5 - 1/2*r3*r1^6 + 2*r3*r1^5 + r3*r1^4 - 8*r3*r1^3 + 2*r3*r1^2 + 4*r3*r1 + 1/2*r3 + r1^6 - r1^5 - 9*r1^4 - r1^3 + 14*r1^2 + 6*r1, r4 + 1/2*r3*r1^6 - 2*r3*r1^5 - r3*r1^4 + 8*r3*r1^3 - 2*r3*r1^2 - 4*r3*r1 - 1/2*r3 - 1, r3^2 - 3/2*r3*r1^7 + 2*r3*r1^6 + 14*r3*r1^5 - 5*r3*r1^4 - 28*r3*r1^3 + 3*r3*r1^2 + 19/2*r3*r1 + 3/2*r1^6 - r1^5 - 15*r1^4 - 4*r1^3 + 27*r1^2 + 11*r1 - 9/2, r2 + 1/2*r1^7 - 3/2*r1^6 - 4*r1^5 + 10*r1^4 + 10*r1^3 - 16*r1^2 - 11/2*r1 + 3/2, r1^8 - 2*r1^7 - 9*r1^6 + 10*r1^5 + 22*r1^4 - 14*r1^3 - 15*r1^2 + 2*r1 + 1 ] > AbsolutePolynomial(A); x^16 - 36*x^14 + 488*x^12 - 3186*x^10 + 10920*x^8 - 19804*x^6 + 17801*x^4 - 6264*x^2 + 64