> < ^ Date: Tue, 23 Jul 2002 15:04:37 +0200 (CEST)
> < ^ From: Franz Gaehler <gaehler@itap.physik.uni-stuttgart.de >
< ^ Subject: Re: Invariant Forms

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
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]