Experimental code for computing Galois groups over p-adic fields. Written in Magma.
We have also compiled some tables of Galois groups.
- Download from GitHub.
- Attach the
spec
file (see the example below). - Optional/recommended: Download and attach the ExactpAdics2 (or ExactpAdics) package and call
PGG_UseExactpAdicsFactorization()
andPGG_UseExactpAdicsRoots()
. This makes our package use superior "OM" algorithms for factorization and root finding, instead of the ones builtin to Magma. For polynomials of about degree 32 or more, this can be a significant improvement in both speed and p-adic precision. Note that this does not actually use the exact p-adic functionality from the ExactpAdics package (yet). - Optional/recommended: Download and attach the ExactpAdics2 (or ExactpAdics) package and pass a polynomial defined there (e.g. an element of
PolynomialRing(ExactpAdicField(2))
) toPGG_GaloisGroup
. This causes our algorithm to use the exact p-adic functionality everywhere, providing proven results. It is usually quicker for large inputs.
The following confirms the Galois group in the 12th line of this table is S_4.
> // the following line only needs to be done once per session
> AttachSpec("/path/to/package/spec");
> // optional/recommended if you have the ExactpAdics package (see the Getting started section)
> PGG_UseExactpAdicsFactorization();
> PGG_UseExactpAdicsRoots();
>
> // define a polynomial over Q_2
> K := pAdicField(2,100);
> R<x> := PolynomialRing(K);
> f := x^8 + 20*x^2 + 4;
>
> // compute its Galois group with this package
> // the syntax of the algorithm parameter is explained below
> time G := PGG_GaloisGroup(f : Alg:="ARM[Global[RamTower[Symmetric]],All[FactorDegrees,Index]]");
Time: 0.370
> GroupName(G);
S4
GaloisGroup(f :: PGGPol)
PGG_GaloisGroup(f :: RngUPolElt)
PGG_GaloisGroup(f :: RngUPolElt_FldPadExact)
-> GrpPerm
The Galois group of f
which must be a univariate polynomial defined over a p-adic field.
The group is a permutation group on the roots of f
, and therefore has the same degree as f
. The group is defined up to conjugacy in the corresponding symmetric group. If using the absolute resolvent method with global models, it may be defined up to conjugacy in a smaller group depending on the global model used.
If using the ExactpAdics
package, the polynomial can be over an exact p-adic field.
Parameters.
Alg
: The algorithm to use (see "Algorithm parameter").Time
: When true, prints out detailed timings of each part of the algorithm.
Call SetVerbose("PGG_GaloisGroup", 1);
to print out information as the algorithm proceeds, including some timings.
Our implementation is modular, meaning that different algorithms are used in various places. An algorithm is specified by a string of the form NAME[ARG1,ARG2,...]
where the part in brackets is optional.
The arguments have an order, but in general they have defaults and can be skipped over, so ARM[All,Global]
, ARM[All]
, ARM[Global]
and ARM
might all be interpreted the same, assuming the arguments to ARM
have defaults All
and Global
.
Arguments can be given by their name instead of by their order, so ARM[Eval:Global,All]
is interpreted the same as ARM[All,Global]
.
In fact :
is syntactic sugar allowing us to write the last parameter outside of brackets. So a[b,c]:d
is equivalent to a[b,c,d]
, which is useful for writing highly nested parameters such as Global:Factors:RamTower:Symmetric:SinglyRamified
.
Here we notate the current options for the algorithms. The Alg
parameter to PGG_GaloisGroup
must be a GALOISGROUP
algorithm.
How to compute a Galois group.
ARM [Eval:RESEVAL_ALG, Groups:GROUP_ALG, UpTo:UPTO]
: The absolute resolvent method. UsesEval
to evaluate resolvents andGroups
to deduce the Galois group up toUpTo
.Tame
: For polynomials whose splitting field is tamely ramified (or unramified).SinglyRamified
: The algorithm due to Greve for singly ramified extensions.Builtin
: Magma's builtinGaloisGroup
intrinsic. This is currently the "naive" algorithm which computes the splitting field and automorphisms explicitly, so is only suitable for small cases.[GALOISGROUP, ...]
: Tries each algorithm in turn. Useful to rule out special cases, e.g.[Tame,SinglyRamified]:ARM[...]
.
How to deduce the Galois group using resolvents. Use Maximal2
in general or All
when it is quick to enumerate all possible Galois groups.
All [Stat:STATISTIC, Choice:SUBGROUP_CHOICE, Dedupe:SUBGROUP_DEDUPE]
: Enumerate all possible Galois groups, then eliminate possibilities until only one remains.Stat
is the statistic used to distinguish between possible Galois groups.Choice
determines how to choose which subgroups to form resolvents from.Dedupe
determines how to dedupe any groups considered up to conjugacy.Maximal [Stat:STATISTIC, Choice:SUBGROUP_CHOICE, DescendWhen, Descend, Useful, Reprocess:BOOL, Reset:BOOL, Blacklist:BOOL, Dedupe:SUBGROUP_DEDUPE]
: Work down the graph of possible Galois groups by maximal inclusion.Stat
: The statistic used to distinguish between possible Galois groups.Choice
: Determines how to choose which subgroups to form resolvents from.DescendWhen
When to descend through the graph. One of:Sufficient
: Don't descend if there are two groups in the pool which might be equal to the Galois group, or if there is one in the pool which might be equal and it has a child which might contain the Galois group. In either of these cases, we can certainly deduce some information (via theSufficient
measure of usefulness), so we only descend when we don't know if we can deduce anything.Always
: Descend as soon as possible.AllUnequal
: Descend when all nodes in the pool are known not to be the Galois group.NoSubgroup
: Descend when the subgroup choice algorithm has no subgroups remaining. Note that useful subgroups are marked as "special" in the subgroup choice algorithm, so the subgroup choice algorithm can dynamically change depending on which subgroups are useful.AllUnequalAndNoSubgroup
: Descend whenAllUnequal
andNoSubgroup
would both descend. This marks useful subgroups as "special" only whenAllUnequal
would descend.Necessary
: LikeAllUnequal
, but also require that the remaining top nodes have a common subgroups which could be a Galois group. Experimental!Ask
: Ask the user.
Descend
: How to descend. One of:All
: Replace every node in the pool which is not the Galois group by its children.OneNode
: Replace a single node by its children.OneChild
: Add a single child to the pool, and remove the parent when all its possible children have been pooled.
Useful:
: How to decide whether a subgroup is useful. One of:Sufficient
: Useful if there are two groups in the pool which might be equal to the Galois group and which have differing statistics, or if there is one in the pool which might be the Galois group, and a child, such that the statistic of the child is strictly less than the pool group. This guarantees some information is deduced.Necessary
: Like sufficient, but the statistic of pool group should not be equal to or less than the statistic of the child.Generous
: Useful if there is a pair of nodes with different statistics.All
: Always useful.
Reprocess
: When true (default), on a descent re-use all resolvents computed so far.Reset
: When true (default), on a descent reset the subgroup choice algorithm.Dedupe
: How to dedupe any groups considered up to conjugacy.
RootsMaximal [Dedupe:SUBGROUP_DEDUPE]
: Work down the graph of possible Galois groups by maximal inclusion, similar to the relative resolvent method, forming resolvents from the subgroups of the current candidate G and testing for roots to rule out the subgroup or change the candidate to that subgroup. Will compute resolvents of degree equal to the index of the Galois group, which is exponential in the degree of the input polynomial.Dedupe
: How to dedupe any groups considered up to conjugacy.
Maximal2 [Stat:STATISTIC, Choice:SUBGROUP_CHOICE, Reset:BOOL, Dedupe:SUBGROUP_DEDUPE]
: LikeRootsMaximal
but where the statisticRoots
is parameterised. We maintain a "pool" of groups such that the Galois group is contained in at least one of them. On each iteration, we find a resolvent such that we can either eliminate all subgroups of some group in the pool, or we can replace a pool element by some of its maximal subgroups. This is very similar toMaximal
except that instead of merely ruling out groups which cannot contain the Galois group, we identify groups which certainly do contain the Galois group, which is more powerful.Choice
determines how to choose which subgroups to form resolvents from.Stat
: The statistic used to distinguish between possible Galois groups.Choice
: Determines how to choose which subgroups to form resolvents from.Reset
: When true (default), reset the subgroup choice algorithm each time something gets added to the pool.Dedupe
: How to dedupe any groups considered up to conjugacy.
[GROUP_ALG, ...]
: Try each of the algorithms in turn: when the first one runs out of resolvents to try (e.g. because its subgroup choice algorithm is limited) then move on to the second, and so on. This will re-use as much information as possible from one run to the next, so for example[All[NumRoots,...],All[FactorDegrees,...]]
will only enumerate all possible Galois groups once, and remember which ones were eliminated.ForEach [Vars, [Val1,Val2,...], GROUP_ALG]
: Like the previous, but with a more compact notation. For each ofVal1
,Val2
, etc, its values are unpacked into variables with names coming fromVars
and substituted into theGROUP_ALG
. For exampleForEach[STAT,[NumRoots,FactorDegrees],All[STAT,...]]
is equivalent to the previous example. TheVars
can be more complex, such asForEach[[X,xs],[[A,[a1,a2]],[B,[b]]],ForEach[x,xs,...]]
will have(x,y)
successively(A,a1)
,(A,a2)
,(B,b)
.
How to evaluate resolvents.
Global [GLOBAL_MODEL]
: Produce a global model for the local fields involved.
How to produce a global model, a global number field which completes to a given local field.
Symmetric [GALOISGROUP]
: Use a global approximation of the defining polynomial, with its coefficients minimized if possible. Assume the global Galois group is the full symmetric group. TheGALOISGROUP
algorithm is used to compute the actual Galois group; this doesn't change the global model, but it can cut down the possibilities for the overall Galois group.Factors [GLOBAL_MODEL]
: Factorize the polynomial and produce a global model for each factor. Corresponds to a direct product of groups.RamTower [GLOBAL_MODEL]
: Get the ramification filtration of the extension defined by the polynomial, and produce a global model for each piece. Corresponds to a wreath product of groups.D4Tower [GLOBAL_MODEL]
: Given an irreducible polynomial of degree 4 defining an extension with Galois groupD4
, splits the extension into a tower of two quadratics and makes aS2
extension for each one.RootOfUnity [Minimize:BOOL, Complement:BOOL]
: Adjoin a root of unity to make an unramified extension. The local Galois group is cyclic and the global one is abelian and known. By default, we adjoin a(q^d-1)
th root of unity; whenMinimize
is true, we minimize the degree of the extension by choosing a suitable divisor of this; whenComplement
is set we take a subfield of this so that the global degree is as small as possible. Note: The global model may be of higher degree than the local extension, which in a wreath product can make the overall group size exponentially larger.RootOfUniformizer
: Adjoin a root of a uniformizer to make a totally tamely ramified extension. The local and global Galois groups are known.Select [EXPRESSION, GLOBAL_MODEL] ... [GLOBAL_MODEL]
: Select between several global models. The global model next to the first expression evaluating to true is used, or else the final model is used. The expressions are in the following variables:p
(the prime),irr
(true if irreducible),deg
(degree),unram
(true if defines an unramified extension),tame
(true if defines a tamely ramified extension),ram
(true if defines a ramified extension),wild
(true if defines a wildly ramified extension),totram
(true if defines a totally ramified extension),totwild
(true if defines a totally wildly ramified extension).
A function which can be applied to polynomials and groups, with the property that the statistic of a polynomial equals the statistic of its Galois group. The most useful is usually FactorDegrees
.
HasRoot
: True or false depending on whether the resolvent has a root (i.e. the group has a fixed point).NumRoots
: The number of roots of the resolvent (i.e. the number of fixed points in the group).FactorDegrees
: The multiset of degrees of irreducible factors (i.e. the sizes of the orbits). Equivalent toFactors[Degree]
but more efficient because it doesn't need to compute the orbit images.FactorDegreesSeq
: A generalization ofFactorDegrees
to a tuple of resolvents (e.g. as returned by theTuples
tranche algorithm).Factors [STATISTIC]
: A multiset of statistics corresponding to the irreducible factors.Factors2 [Stat2:STATISTIC, Stat1:STATISTIC, Strict:BOOL]
: If there aren
irreducible factors, this is then x n
array where the(i,j)
entry is the multiset of statistics (byStat2
) of factors of thei
th factor over the field defined by thej
th factor. Each row and column in the array is also labelled with a statistic (byStat1
) for the corresponding factor. The array is defined up to a permutation on factors. WhenStrict
is true, then two values are equal iff there is a permutation of the factors making the arrays and labels equal; when false, we just check if the multisets along rows and columns are the same, which is much faster (and in practice usually just as good).Degree
: The degree of the polynomial or group.AutGroup
: The automorphism group assuming the polynomial is irreducible (i.e.N_G(S)/S
whereS=Stab_G(1)
up toS_d
-conjugacy, whered
is the order of the group, assuming the group is transitive).NumAuts
: The number of automorphisms, i.e. the order of the automorphism group.Tup [STATISTIC, ...]
: A tuple of statistics.Stab [STATISTIC]
: The statistic applied to a point stabilizer of a transitive group (equivalently, the polynomial over the field it defines).GaloisGroup [DegLe:INTEGER, Alg:GALOISGROUP]
: The Galois group, computed usingAlg
, if the degree is at mostDegLe
, and otherwise the trivial group.SubfieldDegrees
: The multiset of degrees of subfields of the field defined by the irreducible polynomial.Order
: The order of the Galois group. Cannot be used on polynomials, only groups.
How to choose the subgroup.
SUBGROUP_TRANCHE
: Consider each group in each tranche in turn and select the first useful one.[SUBGROUP_TRANCHE, SUBGROUP_PRIORITY]
: As above, but the tranches are reordered according to some priority.Prioritize[SUBGROUP_PRIORITY, SUBGROUP_TRANCHE]
: Equivalent to the previous, but can be used likePrioritize[PRIORITY]:TRANCHE
.Stream[Limit:INTEGER, SUBGROUP_STREAM]
: Consider up toLimit
groups from each stream in turn and select the first useful one.
How to select sets ("tranches") of subgroups.
All
: All subgroups.Index [If:EXPRESSION, Sort:EXPRESSION, Take:SUBGROUP_TAKE, Dedupe:SUBGROUP_DEDUPE]
: All subgroups by index. Only uses indices whereIf
evaluates true, and sorts bySort
, both expressions inidx
(the index).If
may additionally be in variableshas_special
(true if there exists a special tranche) andsidx0
(the index of the first special tranche, or 0 if there is none): some tranches may be dynamically marked as special from outside the tranche, e.g. theMaximal
GROUP_ALG
withDescendWhen:NoSubgroup
marks tranches containing useful groups as special, giving a means to dynamically control how many tranches to use based on what was previously useful.Take
controls which subgroups are used, andDedupe
controls how to dedupe groups by conjugacy.OrbitIndex [If:EXPRESSION, Sort:EXPRESSION, Take:SUBGROUP_TAKE, Dedupe:SUBGROUP_DEDUPE]
: All subgroups by orbit-index and index. Orbit-index is the index of the stabilizer of the orbits of the group. Parameters are as forIndex
, exceptIf
andSort
have variablesidx
(index),oidx
(orbit index) andridx
(remaining index, i.e index divided by orbit index).Shuffle [SUBGROUP_TRANCHE]
: The inner tranche, but in a random order.Truncate [Length:INTEGER, SUBGROUP_TRANCHE]
: The inner tranche, but truncated to at mostLength
items.Sample [SUBGROUP_TRANCHE]
: The inner tranche, but takes a random selection of up toLength
items. (ForIndex
orOrbitIndex
, consider using the parameterTake:Random
instead.)Tuples [Length:INTEGER, Random:INTEGER, SUBGROUP_TRANCHE]
: Generates tuples of lengthLength
from the inner tranche. By default this generates all such tuples, but whenRandom
is given, it generates up to this many tuples at random.
How to select possibly infinite streams of subgroups. Unlike tranches, the subgroups are not cached and so this is typically used for randomly generated subgroups.
Index [If:EXPRESSION, Sort:EXPRESSION, Dedupe:SUBGROUP_DEDUPE]
: Random subgroups of a given index.If
andSort
are expressions inidx
used to filter and sort the indices used (as withIndex
tranche algorithm).Dedupe
controls how to dedupe groups by conjugacy (currently ignored, no deduping).
A priority to order a set of groups.
Null
: Does nothing.Random
: Randomizes the order.Reverse [SUBGROUP_PRIORITY]
: The reverse of its parameter.EXPRESSION
: Sort by this expression in the variablesIndex
,OrbitIndex
,Diversity
,Information
.
Controls how to dedupe subgroups up to conjugacy in some larger group.
BOOL
: WhenFalse
, no deduping is performed.True
is equivalent to the current favoured algorithm, currentlyTree
.Pairwise
: Performs pairwise comparisons usingIsConjugate
. Equivalent toClassFunction[0]
.ClassFunction [Num:INTEGER]
: Uses a conjugacy-class function to generate a hash for each group so that only groups with the same hash need to be considered. TheNum
selects which function to use, currently one of:- 0: Everything hashes to the same value.
- 1: Counts the number of elements in each conjugacy class of the overgroup.
- 2: The
GroupName
of the group. - 3: The
TransitiveGroupIdentification
of each orbit of the group. - 4: The size of the intersection of the group with each normal subgroup of the overgroup up to some index (currently 2).
Tree [Statistic:STATISTIC, Tranche:SUBGROUP_TRANCHE]
: Dynamically produces a decision tree to distinguish between groups, the hash being where in the tree the group lies. Each node of the decision tree compares groups by the statistic of their image under the coset action of a group from the tranche algorithm. The default statistic isTup[Order,FactorDegrees]
and the default tranche isOrbitIndex[If:and[mle[idx,p^3],mle[ridx,p]]]
wherep
is the product of primes dividing the order of the overgroup.
Controls how some tranches generate their groups.
All
: Generates all subgroups.Random[Limit:INTEGER, NewTries:INTEGER, RandomTries:INTEGER]
: At mostLimit
randomly-generated subgroups. It triesRandomTries
times to randomly generate a group. It tries thisNewTries
times to find one we haven't seen before.
Specifies an equivalence relation on possible Galois groups such that it suffices to determine the class of the actual Galois group.
In the context of the absolute resolvent method, we take OvergroupEmbedding[CheckInjective:True]
as the default.
OvergroupEmbedding [CheckInjective:BOOL]
: In the absolute resolvent method, with overgroup embeddinge : W -> Wtil
, groupsG1
andG2
are equivalent ife(G1)
ande(G2)
areWtil
-conjugate. This is the best we can do, since we then compose this with a coset actionq : Wtil -> A
, which is a class function. IfCheckInjective
is true, thene
must be injective and therefore this is a finer equivalence thanSymmetric
.Symmetric
: GroupsG1
andG2
of degreed
are equivalent if they areS_d
-conjugate.Full
: In ARM with embeddinge : W -> Wtil
, subgroupsG1
andG2
ofW
are equivalent if they areW
-conjugate.
An expression with free variables.
<free variable>
: A free variable. The possibilities depend on context.<integer>
: A constant.p
: The prime.eq|ne|le|lt|ge|gt [EXPRESSION, EXPRESSION]
: Equality and comparisons.mle|mlt|mge|mgt
: Multiplicative comparisons, e.g.mle[x,y]
iffx
dividesy
(note that everything divides 0, so it is the multiplicative infinity)val[p:EXPRESSION,x:EXPRESSION]
,val[x:EXPRESSION]
: Thep
-adic valuation ofx
.and|or [EXPRESSION, ...]
: True if all or any of the parameters are true.not [EXPRESSION]
: True if its argument is false.- [EXPRESSION]
: Negation.- [EXPRESSION, EXPRESSION]
: Subtraction.+ [EXPRESSION, ...]
: Sum.* [EXPRESSION, ...]
: Product.^ [EXPRESSION, EXPRESSION]
: Power.
Represents true or false.
True
False
The script unit_tests.mag
can be used to test that most functionality of the package is working. Call it like:
magma -b OPTIONS unit_tests.mag
Debug:=true/false
(default:false
) when true, errors during tests cause the debugger to open.Catch:=true/false
(default:true
) when false, errors during tests are not caught.Quit:=true/false
(default:true
) when false, keeps Magma open at the end of the script.Start:=N
(default:1
) starts at theN
th test.Filter:=STR
STR is a comma-separated list of tags, and we only run the tests which have all of these tags; any tags preceded by a-
mean that a test must not have this tag.
Each test has a set of tags associated to it. Here are their meanings:
unram
: unramifiedtame
: tamely ramifiedsram
: singly ramifiedirred
: irreducibledegN
: polynomials of degreeN
2by
: the overgroup is of the form C2 wr C2 wr ... (some algorithm parameters are tailored to this)
Each Galois group test also is given a tag for each component of its algorithm, so ARM[Global[Symmetric],RootsMaximal]
has tags ARM
, Global
etc.
Currently, there is one type of test called GaloisGroup
. An instance of this will compute the Galois group of some polynomial over some field using some algorithm, and check that the results equals some expected answer. There is a built-in list of polynomials and a built-in list of algorithms, and we test every polynomial-algorithm pair which is reasonable (i.e. should be compatible and won't take ages to run).