Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

As reference i am using https://doc.sagemath.org/html/en/reference/groups/sage/groups/matrix_gps/orthogonal_gap.html.

The group G constructed in the OP comes with the information on the used invariant (bilinear) form, and the quadratic form determining $G$:

sage: G = GO(4, GF(2), 1)
sage: B = G.invariant_bilinear_form()
sage: B
[0 1 0 0]
[1 0 0 0]
[0 0 0 1]
[0 0 1 0]
sage: M = G.invariant_form()
sage: M
[0 1 0 0]
[1 0 0 0]
[0 0 0 1]
[0 0 1 0]
sage: G.order()
72

Let us check that for every $g$ in $G$ we have the equality $gBg^t=B$, where $B$ is the invariated (bilinear) form:

sage: [g.matrix() * B * g.matrix().transpose() == B for g in G] == 72*[True]
True

So we have $72$ times True in both lists above. So what we expect is not the equality $gg^t=1$, but rather in the matrix world the conservation of the (symplectic, characteristic is two, $1=-1$) bilinear form $B$. This is answering the last confusion in the post.

Same sage game for the value $-1$ for `e`, the bilinear form does not distinguish between the "isotopes".
But the quadratic form does:
sage: G = GO(4, GF(2), 1)
sage: H = GO(4, GF(2), -1)
sage: G.invariant_quadratic_form() == H.invariant_quadratic_form()
False
sage: G.invariant_quadratic_form()
[0 1 0 0]
[0 0 0 0]
[0 0 0 1]
[0 0 0 0]
sage: H.invariant_quadratic_form()
[0 1 0 0]
[0 0 0 0]
[0 0 1 1]
[0 0 0 1]
sage: G.invariant_bilinear_form() == H.invariant_bilinear_form()
True

As in loc. cit or in the doc string for

sage: G.invariant_quadratic_form??

And the info starts with

Type:            CachedMethodCallerNoArgs
String form:     Cached version of <function OrthogonalMatrixGroup_gap.invariant_quadratic_form at 0x7f7d1073bd80>
File:            /usr/lib/python3.11/site-packages/sage/groups/matrix_gps/orthogonal_gap.py
Source:
    @cached_method
    def invariant_quadratic_form(self):
        r"""
        Return the quadratic form preserved by the orthogonal group.

        OUTPUT:

        The matrix `Q` defining "orthogonal" as follows. The matrix
        determines a quadratic form `q` on the natural vector space
        `V`, on which `G` acts, by `q(v) = v Q v^t`. A matrix `M` is
        an element of the orthogonal group if `q(v) = q(v M)` for all
        `v \in V`.

This is in fact the definition. We can check as follows, that each matrix in $G$ preserves $Q$. Let's say for $e=+1$ first. I'll do this in dialog form. We define the space $V=F^4$ of dimension four over $F=\Bbb F_2$, the field with two elements. Then ask for $G=$GO(4, GF(2), 1). Its quadratic form $q$ is determined by the matrix $Q$ from above, $q(v)=vQv^t$, if row vectors are used. Somehow, matrix multiplication is arranged to work for $v$ in $V$ without any need of transposition, so in sage the formula is $q(v) = vQv$.

sage: V = VectorSpace(GF(2), 4)
sage: G = GO(4, GF(2), 1)
sage: Q = G.invariant_quadratic_form()
sage: v = V.random_element()
sage: v
(0, 1, 0, 1)
sage: g = G.random_element()
sage: g
[0 1 0 0]
[1 0 1 0]
[0 0 1 0]
[0 1 0 1]
sage: w = v * g.matrix()
sage: w
(1, 1, 1, 1)
sage: v * Q * v
0
sage: w * Q * w
0

This was one random check. To do the check for all $v\in V$ and all $g\in G$ we build the corresponding list (using list comprehension) of true or false values...

sage: # and now for all elements
sage: q = lambda v: v*Q*v
sage: False not in [q(v) == q(v*g.matrix()) for v in V for g in G]
True

There is thus no false in the list, all equalities are verifies.

We may want ourselves to construct the set of all invertible $g$'s that preserve $q$... Let us check that there are

sage: G.order()
72

elements. Well, this is a very pedestrian search, we let $s$ run in $SL(4,\Bbb F_2)$, a group with $(16-1)(16-2)(16-4)(16-8)=$ elements.

sage: S = SL(4, GF(2))
sage: len([s for s in S if False not in [q(v) == q(v*s) for v in V]])
72
sage: G.order()
72

It may be interesting to see the GAP documentation for this group, since gap generously gives it. Related links are:

  • https://docs.gap-system.org/doc/ref/chap50_mj.html - Search for 50.2-6 GeneralOrthogonalGroup here to see which parameters can be used.

  • See also the reference KL90 in the above link, we have a mathematical source for the construction of the group,

    Kleidman, P. and Liebeck, M., The subgroup structure of the finite classical groups, Cambridge University Press, London Mathematical Society Lecture Note Series, 129, Cambridge (1990), x+303 pages.

    however the GAP doc mentions that the notation GO is used in the book for some other object, pointing further to the implemented one.

  • https://www.gap-system.org/ForumArchive2/2009/002619.html - Here we have some GAP code mentioning the GAP version of our groups and how to use the arguments, GO(1, 4, 2) with $72$ elements, and GO(-1, 4, 2) with $120$ elements.