Magma

MAGMA Computational Algebra System

Magma
 •  How to get it
 •  Download
 •  Online Demo
 
Resources
 •  Online Help
 •  Discovering Mathematics with Magma
 •  Citations
 •  How to cite Magma
 •  Links
 •  Contact us
 
[Next][Prev] [Right] [Left] [Up] [Index] [Root]

General Structure Invariants

Subsections
Characteristic(F) : FldFun -> RngIntElt
Characteristic(O) : RngFunOrd -> RngIntElt
The characteristic of the function field F/k or one of its orders O.
IsPerfect(F) : Fld -> BoolElt
Applies to any field in Magma. Returns whether F is perfect.
Degree(F) : FldFunG -> RngIntElt
Degree(F, G) : FldFun, FldFun -> RngIntElt
Degree(O) : RngFunOrd -> RngIntElt
The degree [F:G] of the field extension F/G where G is the base field of F unless specified. For an order O, this function returns the rank of O as a module over its coefficient ring. Note that this rank is equal to the degree [F:G] where F and G are the field of fractions of O and the coefficient ring of O respectively.
AbsoluteDegree(F) : FldFunG -> RngIntElt
AbsoluteDegree(O) : RngFunOrd -> RngIntElt
The degree of the function field F or the order O as a finite extension of k(x) or k[x] or as an infinite extension of k.
DefiningPolynomial(F) : FldFun -> RngUPolElt
DefiningPolynomial(O) : RngFunOrd -> RngUPolElt
The defining polynomial of the function field F over its coefficient ring. For an order O belonging to a function field F, this function returns the defining polynomial of O, which may be different from that of F/k(x, α1, ..., αr).
DefiningPolynomials(F) : FldFun -> [RngUPolElt]
DefiningPolynomials(O) : FldFunOrd -> [RngUPolElt]
Return the defining polynomials of the function field F or the order O as a sequence of polynomials over the coefficient ring.
Basis(F) : FldFunG -> SeqEnum[FldFunElt]
Basis(O) : RngFunOrd -> SeqEnum[FldFunElt]
Basis(O, R) : RngFunOrd, Rng -> SeqEnum[RngElt]
The basis 1, α, ..., αn - 1 of the function field F[α] over the coefficient field.

Given an order O belonging to a function field F, this function returns the basis of O in the form of function field elements.

Given an additional ring R, return the basis of O as elements of R.

TransformationMatrix(O1, O2) : RngFunOrd, RngFunOrd -> AlgMatElt, RngElt
Return the matrix M and a denominator d which transforms elements of the order O1 into elements of the order O2.
CoefficientIdeals(O) : RngFunOrd -> [RngFunOrdIdl]
The coefficient ideals of the order O of a relative extension. These are the ideals {Ai} of the coefficient ring of O such that for every element e of O, e = ∑i ai * bi where {bi} is the basis returned for O and each ai ∈Ai.
BasisMatrix(O) : RngFunOrd -> AlgMatElt
Given an order O in a function field F of degree n, this returns an n x n matrix whose i-th row contains the coefficients for the i-th basis element of O with respect to the power basis of F. Thus, if bi is the i-th basis element of O, bi=∑j=1nMijαj - 1 where M is the matrix and αis the generator of F.
PrimitiveElement(O) : RngFunOrd -> RngFunOrdElt
A root of the defining polynomial of the order O.
Discriminant(O) : RngFunOrd -> .
The discriminant of the order O, up to a unit in its coefficient ring.
AbsoluteDiscriminant(O) : RngFunOrd -> .
The discriminant of the order O of an algebraic function field F over the bottom coefficient ring of O, (the subring of the rational function field F extends).
DimensionOfExactConstantField(F) : FldFunG -> RngIntElt
DegreeOfExactConstantField(F) : FldFunG -> RngIntElt
The dimension of the exact constant field of the function field F/k over k. The exact constant field is the algebraic closure of k in F.
Genus(F) : FldFunG -> RngIntElt
The genus of the function field F/k.

Example FldFunG_invar (H39E11)

> PF<x> := PolynomialRing(GF(31, 3));
> P<y> := PolynomialRing(PF);
> FF1<b> := ext<FieldOfFractions(PF) | y^2 - x^3 + 1>;
> P<y> := PolynomialRing(FF1);
> FF2<d> := ext<FF1 | y^3 - b*x*y - 1>;
> Characteristic(FF2);
31
> EFF2I := EquationOrderInfinite(FF2);
> MFF2I := MaximalOrderInfinite(FF2);
> Degree(MFF2I) eq 3;
true
> AbsoluteDegree(EFF2I);
6
> Genus(FF2);
9
> DefiningPolynomial(EFF2I);
$.1^3 + [ 0, 30/x^3 ]*$.1 + [ 30/x^9, 0 ]
> Basis(MFF2I);
[ 1, 1/x*d, 1/x^2*d^2 ]
> Discriminant(EFF2I);
Ideal of Maximal Equation Order of FF1 over Valuation ring of Univariate 
rational function field over GF(31^3)
Variables: x with generator 1/x
Generator:
(4*x^3 + 27)/x^15*b + 4/x^18
> AbsoluteOrder(EFF2I);
Order of Algebraic function field defined over Univariate rational function
field over GF(31^3) by
y^6 + 29*y^3 + (30*x^5 + x^2)*y^2 + 1 over Valuation ring of Univariate rational
function field over GF(31^3) with generator 1/x
> AbsoluteDiscriminant(EFF2I);
(2*x^9 + 25*x^6 + 6*x^3 + 29)/x^33
> Discriminant($2);
(30*x^24 + 6*x^21 + 16*x^18 + 20*x^15 + 16*x^12 + 7*x^9 + 27*x^6 + 3*x^3 +
    30)/x^48

Example FldFunG_invar-non-simple (H39E12)

Invariants are slightly different for non--simple fields.

> P<x> := PolynomialRing(Rationals());
> P<y> := PolynomialRing(P);
> F<a, b> := FunctionField([3*y^3 - x^2, x*y^2 + 1]);
> DefiningPolynomials(F);
[
    3*y^3 - x^2,
    x*y^2 + 1
]
> DefiningPolynomials(EquationOrderFinite(F));
[
    y^3 - 1/3*x^2,
    y^2 + x
]
> DefiningPolynomials(EquationOrderInfinite(F));
[
    $.1^3 - 1/3/$.1^4,
    $.1^2 + 1/$.1
]
> Basis(F);
[
    1,
    a,
    a^2,
    $.1*b,
    $.1*a*b,
    $.1*a^2*b
]
> TransformationMatrix(EquationOrderFinite(F), MaximalOrderFinite(F));
[1 0 0 0 0 0]
[0 1 0 0 0 0]
[0 0 x 0 0 0]
[0 0 0 1 0 0]
[0 0 0 0 x 0]
[0 0 0 0 0 x]
1
> TransformationMatrix(MaximalOrderFinite(F), EquationOrderFinite(F));
[x 0 0 0 0 0]
[0 x 0 0 0 0]
[0 0 1 0 0 0]
[0 0 0 x 0 0]
[0 0 0 0 1 0]
[0 0 0 0 0 1]
x

GapNumbers(F) : FldFunG -> SeqEnum[RngIntElt]
    SeparatingElement: FldFunGElt       Default: 
The sequence of global gap numbers of the function field F/k (in characteristic zero this is always [1, ..., g]). A separating element used internally for the computation can be specified, it defaults to SeparatingElement(F). See the description of GapNumbers.
GapNumbers(F, P) : FldFunG, PlcFunElt -> SeqEnum[RngIntElt]
GapNumbers(P) : PlcFunElt -> SeqEnum[RngIntElt]
The sequence of gap numbers of the function field F/k at P where P must be a place of degree one. See the description of GapNumbers.
SeparatingElement(F) : FldFunG -> FldFunGElt
Returns a separating element of the function field F/k.
RamificationDivisor(F) : FldFunG -> DivFunElt
    SeparatingElement: FldFunGElt       Default: 
The ramification divisor of the function field F/k. The semantics of calling RamificationDivisor() with F or the zero divisor of F are identical. For further details see the description of RamificationDivisor.
WeierstrassPlaces(F) : FldFunG -> [PlcFunElt]
    SeparatingElement: FldFunGElt       Default: 
The Weierstrass places of the function field F/k. The semantics of calling WeierstrassPlaces with F or the zero divisor of F are identical. See the description of WeierstrassPlaces.
WronskianOrders(F) : FldFunG -> [RngIntElt]
    SeparatingElement: FldFunGElt       Default: 
The Wronskian orders of the function field F/k. The semantics of calling WronskianOrders with F or the zero divisor of F are identical. See the description of WronskianOrders.
Different(O) : RngFunOrd -> RngFunOrdIdl
The different of the maximal order O.
Index(O, S) : RngFunOrd, RngFunOrd -> Any
The index of S in O where S is a suborder of O and O and S have the same equation order.

Galois Groups

Finding Galois groups (of normal closures) of polynomials over rational function fields over k∈{Q, Fq}, where Fq denotes the finite field of characteristic p with q=pr, r∈Z> 0 is a hard problem, in general. All practical algorithms use the classification of transitive groups, which is known up to degree 31 [CHM98]. These algorithms fall into two groups: The absolute resolvent method [SM85] and the method of Stauduhar [Sta73].

The Magma implementation is based on an extension of the method of Stauduhar by Klüners, Geißler [Gei03], [GK00] and, more recently, Fieker. There is no longer any limit on the degree of the polynomials or fields. In contrast to the absolute resolvent method, it also provides the explicit action on the roots of the polynomial f which generates the function field. The algorithm strongly depends on the fact that the corresponding problem is implemented for the residue class field.

Roughly speaking, the method of Stauduhar traverses the subgroup lattice of transitive permutation groups of degree n from the symmetric group to the actual Galois group. This is done by using so-called relative resolvents. Resolvents are polynomials whose splitting fields are subfields of the splitting field of the given polynomial which are computed using approximations of the roots of the polynomial f.

If the Galois group is imprimitive the current implementation for polynomials over Q(t) changes the starting point of the algorithm in the subgroup lattice, to get as close as possible to the actual Galois group. This is done via computation of subfields of a stem field of f, that is the field extension of k(t) which we get by adjoining a root of f to k(t). In the case Q(t) the Galois group is found as a subgroup of the intersection of suitable wreath products (using the knowledge of the subfields) which may be easily computed.

In the case k=Q we use for primitive groups a combination of the method of Stauduhar and the absolute resolvent method. The Frobenius automorphism of the underlying field already determines a subgroup of the Galois group, which is used to speed up computations in the primitive case.

GaloisGroup(f) : RngUPolElt -> GrpPerm, [ RngElt ], Any
    SetVerbose("GaloisGroup", n):       Maximum: 5
    Old: BoolElt                        Default: false
Given a separable, irreducible polynomial f(t, x) of degree n over the rational function field k(t), K∈{Q, Fq}, q != 2, this function returns a permutation group that forms the Galois group of the normal closure of F=k[t][x]/f(t, x)k[t][x] in some algebraic closure of k(t). The permutation group acts on the points 1, 2, ..., n. The roots of f are calculated in the process, expressed as power series and returned as the second argument: For a prime polynomial p(t)∈k(t) denote by bar(N) the splitting field of the polynomial f(t, x) mod p(t). It is well known that the roots of the polynomial f(t, x) can be expressed as power series in bar(N)[[t]]. We embed bar(N) in an unramified p-adic extension. The third return value is a structure containing information about the computation that can be used to compute the roots of f to arbitrary precision. This can be used for example in GaloisSubgroup to compute arbitrary subfields of the splitting field.

The required precision increases linearly with the index of the subgroups, which are passed traversing the subgroup lattice. Therefore computations may slow down considerably for higher degrees and large indices.

The default version employs series computations over either unramified p-adic fields (k=Q) or finite fields (k=Fq) and returns proven results. The prime polynomial is determined during a Galois group computation in such a way that f is squarefree modulo p.

If Old is set to true, then the old version is called. Since the return values af the new version differ substantially from the old one, this may be used in old applications.


Example FldFunG_GaloisGroups (H39E13)

A Galois group computation is shown below.

> k<t>:= FunctionField(Rationals());
> R<x>:= PolynomialRing(k);
> f:= x^15 + (-1875*t^2 - 125)*x^3 + (4500*t^2 + 300)*x^2 + 
>     (-3600*t^2 - 240)*x + 960*t^2+ 64;
> G, r, S:= GaloisGroup(f);
> TransitiveGroupDescription(G);
1/2[S(5)^3]S(3)
> A := Universe(r);
> AssignNames(~A,  ["t"]);
> A;
Power series ring in t over Unramified extension
defined by the polynomial (1 + O(191^20))*x^4 +
    O(191^20)*x^3 + (7 + O(191^20))*x^2 + (100 +
    O(191^20))*x + 19 + O(191^20)
 over Unramified extension defined by the
polynomial (1 + O(191^20))*x + 190 + O(191^20)
 over pAdicField(191)
> r[1];
> r[1];
-54*$.1^3 + 68*$.1^2 + 31*$.1 - 12 + O(191) +
    (-15*$.1^3 - 66*$.1^2 - 2*$.1 - 39 + O(191))*t
    + O(t^2)
> S;
GaloisData of type p-Adic (FldFun over Q)
> TransitiveGroupIdentification(G);
99 15

Example FldFunG_GaloisGroups2 (H39E14)

Some examples for polynomials over rational function fields over finite fields

> k<x>:= FunctionField(GF(1009));
> R<y>:= PolynomialRing(k);
> f:= y^10 + (989*x^4 + 20*x^3 + 989*x^2 + 20*x + 989)*y^8 + (70*x^8 + 
> 869*x^7 + 310*x^6 + 529*x^5 + 600*x^4 + 479*x^3 + 460*x^2 + 719*x + 
> 120)*y^6 + (909*x^12 + 300*x^11 + 409*x^10 + 1000*x^9 + 393*x^8 + 
> 657*x^7 + 895*x^6 + 764*x^5 + 420*x^4 + 973*x^3 + 177*x^2 + 166*x + 
> 784)*y^4 + (65*x^16 + 749*x^15 + 350*x^14 + 909*x^13 + 484*x^12 + 
> 452*x^11 + 115*x^10 + 923*x^9 + 541*x^8 + 272*x^7 + 637*x^6 + 314*x^5 + 
> 724*x^4 + 490*x^3 + 948*x^2 + 99*x + 90)*y^2 + 993*x^20 + 80*x^19 + 
> 969*x^18 + 569*x^17 + 895*x^16 + 101*x^15 + 742*x^14 + 587*x^13 + 
> 55*x^12+ 437*x^11 + 97*x^10 + 976*x^9 + 62*x^8 + 171*x^7 + 930*x^6 + 
> 604*x^5 + 698*x^4 + 60*x^3 + 60*x^2 + 1004*x + 1008;
> G, r, p:= GaloisGroup(f);
> t1, t2:= TransitiveGroupIdentification(G);
> t1;
1
> t2;
10
And a second one.

> k<t>:= FunctionField(GF(7));
> R<x>:= PolynomialRing(k);
> f:= x^12 + x^10 + x^8 + (6*t^2 + 3)*x^6 + (4*t^4 + 6*t^2 + 1)*x^4 + 
> (5*t^4 + t^2)*x^2 + 2*t^4;
> G, r, p:= GaloisGroup(f);
> G;
Permutation group G acting on a set of cardinality 12
    (2, 8)(3, 9)(4, 10)(5, 11)
    (1, 5, 9)(2, 6, 10)(3, 7, 11)(4, 8, 12)
    (1, 12)(2, 3)(4, 5)(6, 7)(8, 9)(10, 11)
> A := Universe(r);
> AssignNames(~A,  ["t"]);
> r;
[
    w^950*t^13 + w^1350*t^12 + w^1900*t^11 + w^500*t^10 + w^2050*t^9 + 2*t^8 + 
        w^1350*t^7 + w^300*t^6 + w^350*t^5 + w^1450*t^4 + w^950*t^3 + w^1000*t^2
        + w^1100*t + w^550,
    w^1175*t^13 + w^1825*t^12 + w^1675*t^11 + w^725*t^10 + w^1025*t^9 + 
        w^1825*t^8 + w^1325*t^7 + w^775*t^6 + w^1775*t^5 + w^1325*t^4 + 
        w^1575*t^3 + w^1175*t^2 + w^2225*t + w^2275,
    w^25*t^13 + w^1075*t^12 + w^425*t^11 + w^925*t^10 + w^225*t^9 + w^2375*t^8 +
        w^2125*t^7 + w^625*t^6 + w^1175*t^5 + w^425*t^4 + w^575*t^3 + w^825*t^2 
        + w^1175*t + w^2375,
    w^175*t^13 + w^1525*t^12 + w^575*t^11 + w^475*t^10 + w^1575*t^9 + w^1025*t^8
        + w^475*t^7 + w^775*t^6 + w^1025*t^5 + w^1775*t^4 + w^1625*t^3 + 
        w^2175*t^2 + w^1025*t + w^1025,
    w^1025*t^13 + w^1975*t^12 + w^2125*t^11 + w^1475*t^10 + w^2375*t^9 + 
        w^1975*t^8 + w^2075*t^7 + w^1825*t^6 + w^425*t^5 + w^875*t^4 + 
        w^1425*t^3 + w^2225*t^2 + w^1175*t + w^325,
    w^650*t^13 + w^2250*t^12 + w^100*t^11 + w^1100*t^10 + w^1150*t^9 + 2*t^8 + 
        w^1050*t^7 + w^2100*t^6 + w^1250*t^5 + w^550*t^4 + w^650*t^3 + 
        w^2200*t^2 + w^1700*t + w^1450,
    w^2150*t^13 + w^150*t^12 + w^700*t^11 + w^1700*t^10 + w^850*t^9 + 5*t^8 + 
        w^150*t^7 + w^1500*t^6 + w^1550*t^5 + w^250*t^4 + w^2150*t^3 + 
        w^2200*t^2 + w^2300*t + w^1750,
    w^2375*t^13 + w^625*t^12 + w^475*t^11 + w^1925*t^10 + w^2225*t^9 + w^625*t^8
        + w^125*t^7 + w^1975*t^6 + w^575*t^5 + w^125*t^4 + w^375*t^3 + 
        w^2375*t^2 + w^1025*t + w^1075,
    w^1225*t^13 + w^2275*t^12 + w^1625*t^11 + w^2125*t^10 + w^1425*t^9 + 
        w^1175*t^8 + w^925*t^7 + w^1825*t^6 + w^2375*t^5 + w^1625*t^4 + 
        w^1775*t^3 + w^2025*t^2 + w^2375*t + w^1175,
    w^1375*t^13 + w^325*t^12 + w^1775*t^11 + w^1675*t^10 + w^375*t^9 + 
        w^2225*t^8 + w^1675*t^7 + w^1975*t^6 + w^2225*t^5 + w^575*t^4 + 
        w^425*t^3 + w^975*t^2 + w^2225*t + w^2225,
    w^2225*t^13 + w^775*t^12 + w^925*t^11 + w^275*t^10 + w^1175*t^9 + w^775*t^8 
        + w^875*t^7 + w^625*t^6 + w^1625*t^5 + w^2075*t^4 + w^225*t^3 + 
        w^1025*t^2 + w^2375*t + w^1525,
    w^1850*t^13 + w^1050*t^12 + w^1300*t^11 + w^2300*t^10 + w^2350*t^9 + 5*t^8 +
        w^2250*t^7 + w^900*t^6 + w^50*t^5 + w^1750*t^4 + w^1850*t^3 + w^1000*t^2
        + w^500*t + w^250
]
> p;
t^2 + 4

Subfields

For finite extensions L of Q(t) and Fq(t) Magma can compute all fields between L and Q(t) or Fq(t). It should be noted that the computation of subfields does not depend on the Galois groups. The implementation over Q is using the algorithm of Klüners [Klü02]. The implementation over Fq(t) follows the newer ideas of Klüners and van Hoeij.

Subfields(F) : FldFun -> SeqEnum[FldFun]
All algebraic function fields G with k(x) ⊂G ⊆F. For non relative algebraic function fields F.

Example FldFunG_Subfields (H39E15)

A subfield computation is shown below.

> k<x>:= FunctionField(Rationals());
> R<y>:= PolynomialRing(k);
> f:= y^14 - 3234*y^12 + (8*x + 123480)*y^11 + (-696*x - 1152480)*y^10 + 
> (27672*x - 43563744)*y^9 + (-663544*x + 1795525424)*y^8 + (10660416*x - 
>  33905500608)*y^7 + (-120467088*x + 409661347536)*y^6 + (976911040*x - 
>  3428257977088)*y^5 + (-5684130144*x + 20264929189344)*y^4 + (23251514496*x -
>  83582683562112)*y^3 + (-63672983360*x + 229899367865216)*y^2 + 
>  (105037027200*x - 380160309247488)*y - 79060128000*x + 286518963720192;
> F:= FunctionField(f);
> Subfields(F);
[
    <Algebraic function field defined over Univariate rational function field 
    over Rational Field
    Variables: x by
    y^14 - 3234*y^12 + (8*x + 123480)*y^11 + (-696*x - 1152480)*y^10 + (27672*x 
        - 43563744)*y^9 + (-663544*x + 1795525424)*y^8 + (10660416*x - 
        33905500608)*y^7 + (-120467088*x + 409661347536)*y^6 + (976911040*x - 
        3428257977088)*y^5 + (-5684130144*x + 20264929189344)*y^4 + 
        (23251514496*x - 83582683562112)*y^3 + (-63672983360*x + 
        229899367865216)*y^2 + (105037027200*x - 380160309247488)*y - 
        79060128000*x + 286518963720192, Mapping from: FldFun: F to FldFun: F>,
    <Algebraic function field defined over Univariate rational function field 
    over Rational Field
    Variables: x by
    y^7 + 294*y^6 - 107016*y^5 + (2744*x + 576240)*y^4 + (-806736*x + 
        2469418896)*y^3 + (88740960*x - 312072913824)*y^2 + (-4329483200*x + 
        15606890921216)*y + 79060128000*x - 286518963720192, Mapping from: 
    Algebraic function field defined over Univariate rational function field 
    over Rational Field
    Variables: x by
    y^7 + 294*y^6 - 107016*y^5 + (2744*x + 576240)*y^4 + (-806736*x + 
        2469418896)*y^3 + (88740960*x - 312072913824)*y^2 + (-4329483200*x + 
        15606890921216)*y + 79060128000*x - 286518963720192 to FldFun: F>
]

Automorphism Group

Let K be a finite extension of the rational function field over a finite field, the rationals or a number field. In contrast to the number field situation, there are two different natural notions of automorphisms here: we distinguish between automorphisms that fix the base field and arbitrary automorphisms that can also induce non-trivial maps of the constant field.

The first case, automorphisms fixing the base field of K, is analogous to the number field case and was implemented by Jürgen Klüners.

The second case of more general automorphisms has been implemented by Florian Heß along the lines of his paper [Heß04]. Here the constant field of K can, in fact, be any exact perfect field in Magma with a few provisos.

Automorphisms over the Base Field
Automorphisms(K, k) : FldFun, FldFunG -> [Map]
Computes all Q(t) automorphisms of the absolute finite extension K that fix k. The field k has to be Q(t) for this function.
AutomorphismGroup(K, k) : FldFun, FldFunG -> GrpFP, Map
Return the group of k-automorphisms of the algebraic function field K together with the map from the group to the sequence of automorphisms of K. The field k has to be Q(t).

Example FldFunG_Automorphisms (H39E16)

We define an extension of degree 7 over Q(t) and compute the automorphisms.

> Q:=Rationals();
> Qt<t>:=PolynomialRing(Q);
> Qtx<x>:=PolynomialRing(Qt);
> f := x^7 + (t^3 + 2*t^2 - t + 13)*x^6 + (3*t^5 - 3*t^4 
>     + 9*t^3 + 24*t^2 - 21*t + 54)*x^5 + (3*t^7 - 
>     9*t^6 + 27*t^5 - 22*t^4 + 6*t^3 + 84*t^2 - 
>     121*t + 75)*x^4 + (t^9 - 6*t^8 + 22*t^7 - 
>     57*t^6 + 82*t^5 - 70*t^4 - 87*t^3 + 140*t^2 - 
>     225*t - 2)*x^3 + (-t^10 + 5*t^9 - 25*t^8 + 
>     61*t^7 - 126*t^6 + 117*t^5 - 58*t^4 - 155*t^3 
>     + 168*t^2 - 80*t - 44)*x^2 + (-t^10 + 8*t^9 - 
>     30*t^8 + 75*t^7 - 102*t^6 + 89*t^5 + 34*t^4 - 
>     56*t^3 + 113*t^2 + 42*t - 17)*x + t^9 - 7*t^8 
>     + 23*t^7 - 42*t^6 + 28*t^5 + 19*t^4 - 60*t^3 -
>     2*t^2 + 16*t - 1;
> K:=FunctionField(f);
> A:=Automorphisms(K, BaseField(K));
> #A;
7
Now we transform this list into a group to see that it is really cyclic. We pass in special functions for equality testing and multiplication to speed the algorithm up.

> G := GenericGroup(A: Eq := func<a,b | a`Images eq b`Images>,
>                    Mult := func<a,b | hom<K -> K | a`Images @ b>>);
> G;
Finitely presented group G on 2 generators
Relations
    G.1 = Id(G)
    G.1 * G.2 = G.2 * G.1
    G.1 * G.2^2 = G.2^2 * G.1
    G.1 * G.2^3 = G.2^3 * G.1
    G.1 * G.2^4 = G.2^4 * G.1
    G.1 * G.2^5 = G.2^5 * G.1
    G.1 * G.2^6 = G.2^6 * G.1
    G.1 = G.2^7

Finally, we verify that this gives the same result as AutomorphismGroup.

> AutomorphismGroup(K, BaseField(K));
Finitely presented group on 2 generators
Relations
    $.1 = Id($)
    $.1 * $.2 = $.2 * $.1
    $.1 * $.2^2 = $.2^2 * $.1
    $.1 * $.2^3 = $.2^3 * $.1
    $.1 * $.2^4 = $.2^4 * $.1
    $.1 * $.2^5 = $.2^5 * $.1
    $.1 * $.2^6 = $.2^6 * $.1
    $.1 = $.2^7
Mapping from: GrpFP to [
    Mapping from: FldFun: K to FldFun: K,
    Mapping from: FldFun: K to FldFun: K,
    Mapping from: FldFun: K to FldFun: K,
    Mapping from: FldFun: K to FldFun: K,
    Mapping from: FldFun: K to FldFun: K,
    Mapping from: FldFun: K to FldFun: K,
    Mapping from: FldFun: K to FldFun: K
] given by a rule

IsSubfield(K, L) : FldFun, FldFun -> BoolElt, Map
Given two absolute finite extensions K and L of Q(t), decide if L is an extension of K. If this is the case, return an embedding map from K into L.
IsIsomorphicOverQt(K, L) : FldFun, FldFun -> BoolElt, Map
Given two absolute finite extensions K and L of Q(t), decide if L is Q(t)-isomorphic to K. If this is the case, return a map from K onto L.

Example FldFunG_IsSubfield (H39E17)

Subfields and IsIsomorphic are illustrated below.

> Q:=Rationals();
> Qt<t>:=PolynomialRing(Q);
> Qtx<x>:=PolynomialRing(Qt);
> K:=FunctionField(x^4-t^3);
> L:=Subfields(K);
> #L;
2
> L:=L[2][1]; L;
Algebraic function field defined over Univariate
rational function field over Rational Field
Variables: t by
x^2 - t^3
Now we will check if L is indeed a subfield of K:

> IsSubfield(L,K);
true Mapping from: FldFun: L to FldFun: K
Obviously, L can be defined using a simpler polynomial:

> LL:=FunctionField(x^2-t);
> IsIsomorphicOverQt(LL,L); 
true Mapping from: FldFun: LL to FldFun: L

General Automorphisms
Isomorphisms(K, E) : FldFunG, FldFunG -> [Map]
    BaseMorphism: Map                   Default: false
    Bound: RngIntElt                    Default: ∞
    Strategy: MonStgElt                 Default: None
Given two function fields K and E, this function computes a list of at most Bound field isomorphisms from K to E.

If BaseMorphism is given it should be an isomorphism f between the constant fields of K and E. In this case only isomorphisms extending f are considered.

The default behaviour is for all isomorphisms from K to E which extend SOME isomorphism of the constant field of K to that of E considered. In this case (no base morphism is specified), the constant fields must be finite, the rationals or a number field. If the base morphism f is specified then the constant fields can be any exact perfect fields ( finite or characteristic 0 ).

If the base morphism f is specified, it can be defined in the natural way for most constant field types. For example, for finite fields and number fields, the usual hom<k->l|x>, where x gives the image of k.1, can be used. A common situation is where the constant fields of K and E are equal to k and f is the identity. This can be defined very simply for any k by IdentityFieldMorphism(k) . Several more intrinsics related to field morphisms are described in the following subsection.

The possible choices of Strategy are None, Weierstrass or DegOne. If Strategy is different to None, this determines the places that are used as the basis of the construction of the maps. In all cases, a finite set of places of E and K which must correspond under any isomorphism are used. All isomorphisms are found between the canonical affine models (as defined by Heß) obtained by omitting one of these places from each of E and K.

DegOne can only be used with finite constant fields. In this case, isomorphisms are determined which map a fixed degree one place of K to any one of the finite number of degree one places of E. This function can fail in rare situations if the constant field of K is too small and no degree one place exists. In this case an appropriate error message is displayed.

Weierstrass uses the Weierstrass places of the fields. Isomorphisms are determined which map a fixed Weierstrass place of K to any of those of E with the same degree and Riemann-Roch data. This strategy can be very fast if the residue field and Riemann-Roch data of a particular place of K match those of only a few (or no!) Weierstrass places of E.

In case of fields of genus <2, the constant field must be finite.

IsIsomorphic(K, E) : FldFunG, FldFunG -> BoolElt, Map
    BaseMorphism: Map                   Default: false
    Strategy: MonStgElt                 Default: None
As above, except the function only computes a single isomorphism if one exists.
Automorphisms(K) : FldFunG -> [Map]
    BaseMorphism: Map                   Default: false
    Bound: RngIntElt                    Default: ∞
    Strategy: MonStgElt                 Default: None
This function computes a list of at most Bound automorphisms of the function field K. This is an abbreviation for Isomorphisms(K, K) and the parameters are as described above.

An important difference is that the BaseMorphism, if specified, must be of field morphism type. IdentityFieldMorphism may be used, but basic constrictors for non-trivial constant field maps f will usually cause an error if used directly. The way around this is to use the following conversion

f := FieldMorphism(f)

(See the following subsection)

Isomorphisms(K,E,p1,p2) : FldFunG, FldFunG, PlcFunElt, PlcFunElt -> [Map]
Automorphisms(K,p1,p2) : FldFunG, PlcFunElt, PlcFunElt -> [Map]
    Bound: RngIntElt                    Default: ∞
As above except that the constant field morphism is taken as the identity and only iso/automorphisms which take function field place p1 to p2 are computed.
AutomorphismGroup(K) : FldFunG -> GrpFP, Map
    BaseMorphism: Map                   Default: false
    Strategy: MonStgElt                 Default: None
Given a function field K, this function computes that group of automorphisms satisfying the conditions specified by the parameters and returns it as a finitely-presented group. The map also returned is invertible and takes a group element to the function field isomorphism that it represents.
AutomorphismGroup(K,f) : FldFunG, Map -> Grp, Map, SeqEnum
    Strategy: MonStgElt                 Default: None
In this variation, the automorphism group of the function field K is computed in its permutation representation on a set of places or divisors or in its linear representation on a space of differentials or subspace of K.

The return values consist of the representing group G, a map (with inverse) from G to the maps of K giving the actual isomorphisms, and a sequence of isomorphisms of K which consist of the kernel of the representation.

Only automorphisms fixing the constant field are considered here. If the set/space on which the representation is to be defined is not invariant by the automorphism group, a run-time error will result.

The argumentf should be a map defining the representation.

Its domain must be an enumerated sequence for a permutation representation or a vector space for a linear representation.

Its codomain should be K or a space or enumerated sequence of elements of K, places of K, divisors of K or differentials of K. The examples below show some common ways of producing f by using functions like DifferentialSpace and RiemannRochSpace.

Field Morphisms

The isomorphisms returned by the functions in the last subsection are of general Map type but contain some extra internal structure. The same is true of the maps used to specify BaseMorphism. These objects come in two flavours: field morphisms, that represent maps between general fields, and the more specialised function field morphisms, representing maps between algebraic function fields. This subsection contains several related functions that are very useful when working with (function) field morphisms.

IsMorphism(f) : Map -> Bool
Returns true, if the map is a field or function field morphism; false otherwise.
FieldMorphism(f) : Map -> Map
Converts a homomorphism between fields into a field morphism.
IdentityFieldMorphism(F) : Fld -> Map
Returns the identity automorphism of field F as a field morphism.
IsIdentity(f) : Map -> BoolElt
Returns true if f is the identity morphism; false otherwise.
Equality(f, g) : Map, Map -> Bool
Returns true, if the two maps are both field morphisms or function field morphisms and are equal; false otherwise.
HasInverse(f) : Map -> MonStgElt, Map
Either returns "true" and the inverse morphism for (function) field morphism f, or "false" if inverse does not exist, or "unknown" if it cannot be computed.
Composition(f, g) : Map, Map -> Map
The composition of the field morphisms f and g.

Example FldFunG_Isomorphisms (H39E18)

We illustrate the use of the general isomorphism functions with some examples. In the first, we have a rational function field of characteristic 5:

> k<w> := GF(5);
> kxf<x> := RationalFunctionField(k);
> kxfy<y> := PolynomialRing(kxf);
> F<a> := FunctionField(x^2+y^2-1);
> L := Isomorphisms(kxf, F);
> #L eq #PGL(2, k);

In the next example we consider the function field of a hyperelliptic curve defined over Q(i) [i2 = - 1] and a Galois twist of it. The fields are not isomorphic over Q(i) but they are over Q:

> k<i> := QuadraticField(-1);
> kxf<x> := RationalFunctionField(k);
> kxfy<y> := PolynomialRing(kxf);
> F1<a> := FunctionField(y^2-x^5-x^2-i);
> F2<b> := FunctionField(i*y^2-x^5-i*x^2+1);
> c := IdentityFieldMorphism(k);
> IsIsomorphic(F1,F2 : BaseMorphism := c);
false
> IsIsomorphic(F1,F2);
true Mapping from: FldFun: F1 to FldFun: F2 given by a rule
> L := Isomorphisms(F1, F2);
> [<f(a), f(x), f(i)> : f in L];
[
    <-i*b, i*x, -i>,
    <i*b, i*x, -i>
]

In the next example we consider the function field of the genus 3 plane curve x3 * y + y3 * z + z3 * x=0, which has full automorphism group PGL2(F7). We compute automorphisms over different finite fields and also compute the automorphisms group as an FP group.

> k := GF(11);
> kxf<x> := RationalFunctionField(k);
> kxfy<y> := PolynomialRing(kxf);
> K<y> := FunctionField(x^3*y+y^3+x);
> L := Automorphisms(K);
> #L;
3
> // Extend base field to get all autos
> k := GF(11^3);
> kxf<x> := RationalFunctionField(k);
> kxfy<y> := PolynomialRing(kxf);
> K<y> := FunctionField(x^3*y+y^3+x);
> L := Automorphisms(K);
> #L;
504
> // restrict to just "geometric" autos, which fix the base
> c := IdentityFieldMorphism(k);
> L := Automorphisms(K : BaseMorphism := c);
> #L;
168
> // get the automorphism group instead as an FP group
> G,mp := AutomorphismGroup(K : BaseMorphism := c);
> G;
Finitely presented group G on 2 generators
Relations
    G.2^3 = Id(G)
    (G.1^-1 * G.2)^3 = Id(G)
    G.1^7 = Id(G)
    (G.2^-1 * G.1^-3)^2 = Id(G)
    (G.2^-1 * G.1^-1)^4 = Id(G)
> #G;
168
> IdentifyGroup(G); // find in small group database
<168, 42>

Finally, we give an example of a genus 1 function field over F5 where the group of automorphisms is computed acting on various spaces of functions and differentials.

> k<w> := GF(5);
> kxf<x> := RationalFunctionField(k);
> kxfy<y> := PolynomialRing(kxf);
> f := x^3 + y^3 + 1;
> F<a> := FunctionField(f);
> f := Numeration(Set(Places(F, 1)));
> G, h, K := AutomorphismGroup(F, f);
> #G; Type(G);
12
GrpPerm
> V, f := SpaceOfDifferentialsFirstKind(F);
> G, h, K := AutomorphismGroup(F, f);
> #G; Type(G);
2
GrpMat
> D := &+ Places(F, 1);  
> V, f := DifferentialSpace( -D );
> G, h := AutomorphismGroup(F, f);
> #G;
12
> V, f := RiemannRochSpace( D );
> G, h, ker := AutomorphismGroup(F, f);
> #G; #ker;
12
1

 [Next][Prev] [Right] [Left] [Up] [Index] [Root]
                       

Version: V2.16 of Mon Nov 16 15:04:45 EST 2009

Valid HTML 4.01! Valid CSS!