Goto Chapter: Top 1 2 3 4 5 6 7 8 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

5 The native Vole interface
 5.1 The VoleFind record
 5.2 Searching for groups, cosets, and representatives with the native interface
 5.3 Canonising with the native Vole interface

5 The native Vole interface

The native interface to Vole is similar to that provided by ferret, BacktrackKit, and GraphBacktracking.

At a basic level, a search can be executed by choosing a suitable list of constraints (and/or refiners, for more expert users) to define the problem to be solved, and then calling the appropriate function on these constraints.

5.1 The VoleFind record

5.1-1 VoleFind
‣ VoleFind( global variable )

VoleFind is a record that contains the functions providing the native interface to Vole.

gap> LoadPackage("vole", false);;
gap> Set(RecNames(VoleFind));
[ "Canonical", "CanonicalPerm", "Coset", "Group", "Rep", "Representative" ]

5.2 Searching for groups, cosets, and representatives with the native interface

5.2-1 VoleFind.Representative
‣ VoleFind.Representative( arguments... )( function )
‣ VoleFind.Rep( arguments... )( function )

Returns: A permutation, or fail

VoleFind.Representative returns a single permutation that satisfies all of the constraints defined by the arguments, if one exists, and it returns fail otherwise. VoleFind.Rep is a synonym for VoleFind.Representative.

The arguments may be given separately, or as a single list. Each argument may be a Vole constraint (Chapter 6), a refiner (Chapter 7; note that a refiner implies a constraint), or one of the following objects:

For at least one of the arguments, Vole must be able to immediately deduce a positive integer k, such that for the corresponding constraint:

Otherwise, an error is given. This guarantees that Vole terminates (given sufficient resources). See Section 6.1 for examples and further information.

This function supports various options, which are documented in Section 8.2.

gap> tuple_transport := Constraint.Transport([1,2,3], [1,2,4], OnTuples);;
gap> VoleFind.Rep(Constraint.InGroup(SymmetricGroup(4)), tuple_transport);
(3,4)
gap> VoleFind.Rep(AlternatingGroup(4), tuple_transport);
fail

5.2-2 VoleFind.Group
‣ VoleFind.Group( arguments... )( function )

Returns: A permutation group

VoleFind.Group returns the group of permutations that satisfy the constraints defined by the arguments. It is assumed, although not verified, that for each such constraint, the set of permutations satisfying it forms a group: this is the responsibility of the user.

The arguments may be given separately, or as a single list. Each argument may be a Vole constraint (Chapter 6), a refiner (Chapter 7; note that a refiner implies a constraint), or one of the following objects:

For at least one of the arguments, Vole must be able to immediately deduce a (finite) largest moved point of all the permutations that satisfy the corresponding constraint. Otherwise, an error is given. This guarantees that Vole terminates (given sufficient resources). See Section 6.1 for examples and further information.

This function supports various options, which are documented in Section 8.2.

gap> graph_auto := Constraint.Stabilise(JohnsonDigraph(4,2), OnDigraphs);;
gap> set_stab := Constraint.Stabilise([2,4,6], OnSets);;
gap> G := VoleFind.Group(graph_auto, set_stab, 6);;
gap> G = Group([ (2,4)(3,5), (1,3,5)(2,6,4) ]);
true

Note that multiple groups-by-generators may be given as constraints:

gap> norm_PSL25 := Constraint.Normalise(PSL(2,5));;
gap> in_A6  := Constraint.InGroup(AlternatingGroup(6));;
gap> in_D12 := Constraint.InGroup(DihedralGroup(IsPermGroup, 12));;
gap> G := VoleFind.Group(in_A6, in_D12, norm_PSL25);;
gap> G = Group([ (1,3,5)(2,4,6) ]);
true

5.2-3 VoleFind.Coset
‣ VoleFind.Coset( arguments... )( function )

Returns: A GAP right coset of a permutation group, or fail

For this function, it is assumed, although not verified, that for each constraint defined by the arguments, the set of permutations satisfying it either is empty, or forms a right coset of some group. It is the responsibility of the user to ensure that this is the case.

Given this, VoleFind.Coset returns the set of permutations that satisfy the constraints defined by the arguments, in the case that the set is nonempty, and it returns fail otherwise. The set of permutations is returned as a GAP right coset object.

The arguments may be given separately, or as a single list. Each argument may be a Vole constraint (Chapter 6), a refiner (Chapter 7; note that a refiner implies a constraint), or one of the following objects:

For at least one of the arguments, Vole must be able to immediately deduce a (finite) largest moved point of all the permutations that satisfy the corresponding constraint. Otherwise, an error is given. This guarantees that Vole terminates (given sufficient resources). See Section 6.1 for examples and further information.

This function supports various options, which are documented in Section 8.2.

gap> tuple_transport := Constraint.Transport([1,2,3], [1,2,4], OnTuples);;
gap> VoleFind.Coset(Constraint.InGroup(SymmetricGroup(6)), tuple_transport);
RightCoset(Group([ (5,6), (4,5,6) ]),(3,4,6))
gap> VoleFind.Coset(AlternatingGroup(4), tuple_transport);
fail
gap> VoleFind.Coset(AlternatingGroup(5), Constraint.Transport(
> CycleDigraph(5), DigraphReverse(CycleDigraph(5)), OnDigraphs));
RightCoset(Group([ (1,2,3,4,5) ]),(1,4)(2,3))

5.3 Canonising with the native Vole interface

Given a group \(G\), a set \(X\), and an action of \(G\) on \(X\), then a canoniser for \(X\) with respect to the action of \(G\) is a function \(f\) from \(X\) to itself such that:

In other words, a canoniser maps a point \(x \in X\) to a canonical element of its orbit under the action of \(G\).

This canonical element is known as the canonical image of \(x\) with respect to the action of \(G\). It is sometimes called the canonical form of \(X\).

In this context, a canonical permutation for \(x\) is any element of \(G\) that maps \(x\) to its canonical image under the action of \(G\) on \(x\). This is sometimes called a canonical labelling. Note that there is not necessarily a unique canonical permutation for each element of \(X\). Indeed, by the orbit-stabiliser theorem, the number of canonical permutations for \(x \in X\) is equal to the size of the stabiliser of \(x\) in \(G\).

5.3-1 VoleFind.Canonical
‣ VoleFind.Canonical( G, arguments... )( function )

Returns: A record

VoleFind.Canonical is the main function in Vole for canonising various kinds of objects, i.e. finding canonical images and permutations. See the beginning of Section 5.3 for a definition of these terms.

The forthcoming details are crucial for obtaining meaningful results from VoleFind.Canonical.

For users who wish to canonise an object under an action listed in the table in Constraint.Stabilise (BacktrackKit: Constraint.Stabilise), and who do not wish to specify particular refiners, it may be easier to use the simpler functions Vole.CanonicalPerm (4.5-1) and Vole.CanonicalImage (4.5-2).

The first argument to VoleFind.Canonical must be the group G in which to canonise. The remaining arguments specify the rest of the canonisation problem; in particular, they define the relevant object and action.

The arguments that follow G may be given separately, or in a list. Each of the arguments must be an instance of a Constraint.Stabilise (BacktrackKit: Constraint.Stabilise) constraint, either directly, or indirectly as an instance of Constraint.Normalise (BacktrackKit: Constraint.Normalise) or Constraint.Centralise (BacktrackKit: Constraint.Centralise). Note that it is not permitted to include constraints of the kind produced by Constraint.InGroup (BacktrackKit: Constraint.InGroup).

It is also permitted to include special kinds of refiners as arguments to VoleFind.Canonical, although we do not yet document the details of this, since the theory and implementation is still under active development. (Refiners will be documented in Chapter 7).

For the following, we will suppose that arguments... is a list of k constraints Constraint.Stabilise(object_i,action_i), for i=1..k in sequence. Then VoleFind.Canonical canonises the k-tuple [object_1,...,object_k], where the action on the i-th coordinate is action_i.

In order to canonise in G another k-tuple of the same kind, such as [nextobject_1,...,nextobject_k] with respect to the same action, and in a way that is comparable to the first canonisation, it is necessary to call VoleFind.Canonical with the same group G followed by the arguments... Constraint.Stabilise(nextobject_i,action_i), in the same order.

The result of VoleFind.Canonical is given as a record, with the following components (see the beginning of Section 5.3 for a definition of some of the following terms):

This function supports various options, which are documented in Section 8.2.

Warning: The permutation given by a canonical search and the canonical image that it defines are not guaranteed to be the same across different sessions. In particular, canonical permutations/labellings and images may differ in different versions of Vole, in different versions of GAP, and on different hardware. In addition, please note that the result also depends on order in which the arguments are given, and on the specific arguments that are used.

In the following examples, we first show how to canonise two cycle digraphs in the alternating group of degree \(6\), to find that they are indeed in the same orbit of \(A_6\) under the natural action. We canonise them again in a different group, but this time as vertex-coloured digraphs, by canonising them digraph simultaneously with a corresponding colouring of the vertices.

gap> cycle := CycleDigraph(6);;
gap> reverse := DigraphReverse(cycle);;
gap> A6 := AlternatingGroup(6);;
gap> canon1 := VoleFind.Canonical(A6, Constraint.Stabilise(cycle, OnDigraphs));
rec( canonical := (1,3,4,6,5), group := Group([ (1,3,5)(2,4,6) ]) )
gap> canon2 := VoleFind.Canonical(A6,
>                                 Constraint.Stabilise(reverse, OnDigraphs));
rec( canonical := (1,4,5), group := Group([ (1,3,5)(2,4,6) ]) )

Let us verify that the canonical permutations are indeed in \(A_6\), and that the group record component is indeed the stabiliser in \(A_6\):

gap> SignPerm(canon1.canonical) = 1 and SignPerm(canon2.canonical) = 1
> and canon1.group = Vole.Stabiliser(A6, cycle, OnDigraphs)
> and canon2.group = Vole.Stabiliser(A6, reverse, OnDigraphs);
true

Next, let's compare the canonical images of the digraphs, to test whether they are in the same orbit of \(A_6\). et us also verify this result with Vole.RepresentativeAction (4.4-3):

gap> OnDigraphs(cycle, canon1.canonical)
> = OnDigraphs(reverse, canon2.canonical);
true
gap> Vole.RepresentativeAction(A6, cycle, reverse, OnDigraphs);
(1,5)(2,4)

Next, we turn to vertex-coloured digraphs. This time, we will canonise in the 2-transitive group G defined below. We first verify that cycle and reverse are in the same orbit of G, as digraphs:

gap> G := Group([ (1,2,3,4,6), (1,4)(5,6) ]);;
gap> Vole.RepresentativeAction(G, cycle, reverse, OnDigraphs) <> fail;
true

We will colour the vertices 1, 3, and 5 of cycle with colour 1, and the remainder with colour 2; and we will colour the vertices of reverse in the opposite way.

gap> colours1 := [[1,3,5],[2,4,6]];;
gap> colours2 := [[2,4,6],[1,3,5]];;

We may therefore consider a vertex-coloured digraph as a pair [digraph,colours], with colours in the above form, and a permutation group acts on vertex-coloured digraphs by acting via OnDigraphs on the first component, and acting via OnTuplesSets on the second component.

gap> canon1 := VoleFind.Canonical(G,
>                                 Constraint.Stabilise(cycle, OnDigraphs),
>                                 Constraint.Stabilise(colours1, OnTuplesSets));
rec( canonical := (1,5,2,3,6), group := Group(()) )
gap> canon2 := VoleFind.Canonical(G,
>                                 Constraint.Stabilise(reverse, OnDigraphs),
>                                 Constraint.Stabilise(colours2, OnTuplesSets));
rec( canonical := (1,6,5,4,3), group := Group(()) )

We find that these vertex-coloured digraphs are not in the same orbit of G:

gap> OnDigraphs(cycle, canon1.canonical)
> = OnDigraphs(reverse, canon2.canonical);
false

However, if we canonise them again in the whole symmetric group of degree 6, we find that they are in the same orbit of it as coloured digraphs:

gap> canon1 := VoleFind.Canonical(SymmetricGroup(6),
>                                 Constraint.Stabilise(cycle, OnDigraphs),
>                                 Constraint.Stabilise(colours1, OnTuplesSets));
rec( canonical := (1,5,2,3,4,6), group := Group([ (1,3,5)(2,4,6) ]) )
gap> canon2 := VoleFind.Canonical(SymmetricGroup(6),
>                                 Constraint.Stabilise(reverse, OnDigraphs),
>                                 Constraint.Stabilise(colours2, OnTuplesSets));
rec( canonical := (1,3)(2,5,6,4), group := Group([ (1,3,5)(2,4,6) ]) )
gap> OnDigraphs(cycle, canon1.canonical)
> = OnDigraphs(reverse, canon2.canonical);
true

5.3-2 VoleFind.CanonicalPerm
‣ VoleFind.CanonicalPerm( G, arguments... )( function )

Returns: A permutation

This function returns VoleFind.Canonical(G,arguments...).canonical. This is the canonical component of the record returned by VoleFind.Canonical (5.3-1), under the same arguments.

Please see the documentation of VoleFind.Canonical (5.3-1) for much more information.

Warning: The permutation given by a canonical search and the canonical image that it defines are not guaranteed to be the same across different sessions. In particular, canonical permutations/labellings and images may differ in different versions of Vole, in different versions of GAP, and on different hardware. In addition, please note that the result also depends on order in which the arguments are given, and on the specific arguments that are used.

The following example shows how to compute a canonical permutation for the group \(\langle (1\,2) \rangle\) under conjugation by \(A_{4}\):

gap> VoleFind.CanonicalPerm(AlternatingGroup(4),
>  Constraint.Normalise(Group([ (1,2) ]))
> );
(1,4)(2,3)

Thus the canonical image of \(\langle (1\,2) \rangle\) under this action of \(A_{4}\) is the group \({\langle (1\,2) \rangle}^{(1\,4)(2\,3)}\), i.e. \(\langle (3\,4) \rangle\).

This second example shows how to compute a canonical permutation for the pair \([S, D]\) under the specified componentwise action of \(S_{4}\), where \(S\) is the set-of-sets \(\{ \{1,2\}, \{1,4\}, \{2,3\}, \{3,4\} \}\), and \(D\) is the cycle digraph on four vertices:

gap> VoleFind.CanonicalPerm(SymmetricGroup(4),
>  Constraint.Stabilise([ [1,2], [1,4], [2,3], [3,4] ], OnSetsSets),
>  Constraint.Stabilise(CycleDigraph(4), OnDigraphs)
> );
(1,2,3)
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 Bib Ind

generated by GAPDoc2HTML