> < ^ From:

< ^ Subject:

Dear Vahid Dabbaghianab, dear Forum:

I defined the group g generated by matrices gap> x:=[ [ 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 1 ], [ 1, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0 ] ];and

gap> y:= [ [ 1, 0, 0, 0, 0, 0, 0 ], [ 2/3, -1/3, 2/3, -1/3, -1/3, -1/3, -1/3 ], [ 2/3, -1/3, -1/3, -1/3, 2/3, -1/3, -1/3 ], [ 1/3, 1/3, 1/3, -2/3, 1/3, 1/3, -2/3 ], [ 2/3, 2/3, -1/3, -1/3, -1/3, -1/3, -1/3 ], [ 1/3, 1/3, 1/3, -2/3, 1/3, -2/3, 1/3 ], [ 1/3, 1/3, 1/3, 1/3, 1/3, -2/3, -2/3 ] ] ;and tried to find the

gap> InvariantBilinearForm(g);

But I got:

Error, no method found! For debugging hints type ?Recovery from

NoMethodFound

Error, no 2nd choice method found for `InvariantBilinearForm' on 1

arguments c\

alled from

<function>( <arguments> ) called from read-eval-loop

Entering break read-eval-print loop ...

you can 'quit;' to quit to outer loop, or

you can 'return;' to continue

The functionality you requested does not seem to be implemented in the

main GAP library. So far, invariant bilinear forms are used only to

*define* a matrix group as the automorphism group of the given invariant

form. No methods to *compute* an invariant form for a given group seem

to be implemented.

However, with the help of the GAP package Carat the space of invariant

bilinear forms can be determined with a few commands, as detailed below.

The GAP package Carat is a GAP interface to external programs from the

program package CARAT, which must be compiled. For many CARAT programs,

the GAP package Carat provides a high-level GAP interface, so that these

programs can seamlessly be used in GAP. For the computation of the

space of invariant bilinear forms this is unfortunately not the case,

so that a little more work is nessessary. Appended below is an outline

with a few comments. It would indeed be desirable to have this

functionality available in the main GAP library. For the Carat package

see http://www.itap.physik.uni-stuttgart.de/~gaehler/gap/packages.html

I hope this is of help to you.

With best regards,

Franz Gähler

______________________________________________________________________________ Dr. Franz Gähler Phone +49 711 / 685 52 60 ITAP, Universität Stuttgart Fax +49 711 / 685 52 71 Pfaffenwaldring 57 Email gaehler@itap.physik.uni-stuttgart.de 70550 Stuttgart, Germany http://www.itap.physik.uni-stuttgart.de/~gaehler gap> RequirePackage("carat"); true gap> x:=[ [ 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 1 ], > [ 1, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0 ], > [ 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0 ], > [ 0, 0, 0, 0, 1, 0, 0 ] ];; gap> y:= [ [ 1, 0, 0, 0, 0, 0, 0 ], > [ 2/3, -1/3, 2/3, -1/3, -1/3, -1/3, -1/3 ], > [ 2/3, -1/3, -1/3, -1/3, 2/3, -1/3, -1/3 ], > [ 1/3, 1/3, 1/3, -2/3, 1/3, 1/3, -2/3 ], > [ 2/3, 2/3, -1/3, -1/3, -1/3, -1/3, -1/3 ], > [ 1/3, 1/3, 1/3, -2/3, 1/3, -2/3, 1/3 ], > [ 1/3, 1/3, 1/3, 1/3, 1/3, -2/3, -2/3 ] ] ;; gap> G:=Group(x,y); <matrix group with 2 generators>

CARAT can deal only with integer matrix groups,

so we must congugate G with a suitable matrix;

G must be finite, in which case such a matrix exists.

gap> lat:=InvariantLattice(G); [ [ 1/3, 1/3, 1/3, 1/3, 1/3, 1/3, 1/3 ], [ 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 1 ] ] gap> G2:=G^(lat^-1); <matrix group with 2 generators> gap> gens:=GeneratorsOfGroup(G2); [ [ [ 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1 ], [ 3, -1, -1, -1, -1, -1, -1 ], [ 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0 ] ], [ [ 4, -1, -1, -2, -1, -2, -2 ], [ 2, -1, 0, -1, -1, -1, -1 ], [ 2, -1, -1, -1, 0, -1, -1 ], [ 1, 0, 0, -1, 0, 0, -1 ], [ 2, 0, -1, -1, -1, -1, -1 ], [ 1, 0, 0, -1, 0, -1, 0 ], [ 1, 0, 0, 0, 0, -1, -1 ] ] ]

We have to prepare two temporary files for CARAT:

gap> input := CaratTmpFile("input");

"/tmp/fileR1NK1c.1/input"

gap> output:=CaratTmpFile("output");

"/tmp/fileR1NK1c.1/output"

Write the input for the CARAT program; we take the transposed

generators, because CARAT delivers forms invariant under

A -> TransposedMat(g)*A*g, whereas we are interested in forms

invariant under A -> g*A*TransposedMat(g).

gap> CaratWriteBravaisFile(input,rec(generators:=List(gens,TransposedMat)));

Execute the CARAT program:

gap> CaratCommand("Form_space",input,output);

Read the output back into GAP:

gap> forms := CaratReadMatrixFile(output); [ [ [ 7, 3, 3, 3, 3, 3, 3 ], [ 3, 3, 1, 1, 1, 1, 1 ], [ 3, 1, 3, 1, 1, 1, 1 ], [ 3, 1, 1, 3, 1, 1, 1 ], [ 3, 1, 1, 1, 3, 1, 1 ], [ 3, 1, 1, 1, 1, 3, 1 ], [ 3, 1, 1, 1, 1, 1, 3 ] ] ]

In this case, there is only one symmetric invariant form, which is

positive definite (G is finite). This form is invariant under G2 under

the action A -> g*A*TransposedMat(g). If you need all invariant forms,

not only the symmetric ones, or only the skew ones, you have to

replace the second argument of CaratCommand by Concatenation(input," -a")

(all forms) or Concatenation(input," -s") (only skew forms), respectively.

In the present case, there are no skew invariant forms.

Finally, to find the invariant form for G, we have to revert the

basis change:

gap> f := lat^-1*forms[1]*TransposedMat(lat^-1); [ [ 3, 1, 1, 1, 1, 1, 1 ], [ 1, 3, 1, 1, 1, 1, 1 ], [ 1, 1, 3, 1, 1, 1, 1 ], [ 1, 1, 1, 3, 1, 1, 1 ], [ 1, 1, 1, 1, 3, 1, 1 ], [ 1, 1, 1, 1, 1, 3, 1 ], [ 1, 1, 1, 1, 1, 1, 3 ] ] gap> x*f*TransposedMat(x)=f; true gap> y*f*TransposedMat(y)=f; true

> < [top]