# Orthogonal Linear Groups¶

The general orthogonal group $$GO(n,R)$$ consists of all $$n\times n$$ matrices over the ring $$R$$ preserving an $$n$$-ary positive definite quadratic form. In cases where there are muliple non-isomorphic quadratic forms, additional data needs to be specified to disambiguate. The special orthogonal group is the normal subgroup of matrices of determinant one.

In characteristics different from 2, a quadratic form is equivalent to a bilinear symmetric form. Furthermore, over the real numbers a positive definite quadratic form is equivalent to the diagonal quadratic form, equivalent to the bilinear symmetric form defined by the identity matrix. Hence, the orthogonal group $$GO(n,\RR)$$ is the group of orthogonal matrices in the usual sense.

In the case of a finite field and if the degree $$n$$ is even, then there are two inequivalent quadratic forms and a third parameter e must be specified to disambiguate these two possibilities. The index of $$SO(e,d,q)$$ in $$GO(e,d,q)$$ is $$2$$ if $$q$$ is odd, but $$SO(e,d,q) = GO(e,d,q)$$ if $$q$$ is even.)

Warning

GAP and Sage use different notations:

• GAP notation: The optional e comes first, that is, GO([e,] d, q), SO([e,] d, q).
• Sage notation: The optional e comes last, the standard Python convention: GO(d, GF(q), e=0), SO( d, GF(q), e=0).

EXAMPLES:

sage: GO(3,7)
General Orthogonal Group of degree 3 over Finite Field of size 7

sage: G = SO( 4, GF(7), 1); G
Special Orthogonal Group of degree 4 and form parameter 1 over Finite Field of size 7
sage: G.random_element()   # random
[4 3 5 2]
[6 6 4 0]
[0 4 6 0]
[4 4 5 1]


TESTS:

sage: G = GO(3, GF(5))
sage: latex(G)
\text{GO}_{3}(\Bold{F}_{5})
sage: G = SO(3, GF(5))
sage: latex(G)
\text{SO}_{3}(\Bold{F}_{5})
sage: G = SO(4, GF(5), 1)
sage: latex(G)
\text{SO}_{4}(\Bold{F}_{5}, +)


AUTHORS:

• David Joyner (2006-03): initial version
• David Joyner (2006-05): added examples, _latex_, __str__, gens, as_matrix_group
• William Stein (2006-12-09): rewrite
• Volker Braun (2013-1) port to new Parent, libGAP, extreme refactoring.
sage.groups.matrix_gps.orthogonal.GO(n, R, e=0, var='a')

Return the general orthogonal group.

The general orthogonal group $$GO(n,R)$$ consists of all $$n imes n$$ matrices over the ring $$R$$ preserving an $$n$$-ary positive definite quadratic form. In cases where there are muliple non-isomorphic quadratic forms, additional data needs to be specified to disambiguate.

In the case of a finite field and if the degree $$n$$ is even, then there are two inequivalent quadratic forms and a third parameter e must be specified to disambiguate these two possibilities.

Note

This group is also available via groups.matrix.GO().

INPUT:

• n – integer. The degree.
• R – ring or an integer. If an integer is specified, the corresponding finite field is used.
• e+1 or -1, and ignored by default. Only relevant for finite fields and if the degree is even. A parameter that distinguishes inequivalent invariant forms.

OUTPUT:

The general orthogonal group of given degree, base ring, and choice of invariant form.

EXAMPLES:

sage: GO( 3, GF(7)) General Orthogonal Group of degree 3 over Finite Field of size 7 sage: GO( 3, GF(7)).order() 672 sage: GO( 3, GF(7)).gens() ( [3 0 0] [0 1 0] [0 5 0] [1 6 6] [0 0 1], [0 2 1] )

TESTS:

sage: groups.matrix.GO(2, 3, e=-1)
General Orthogonal Group of degree 2 and form parameter -1 over Finite Field of size 3

class sage.groups.matrix_gps.orthogonal.OrthogonalMatrixGroup_gap(degree, base_ring, special, sage_name, latex_string, gap_command_string)

Bases: sage.groups.matrix_gps.orthogonal.OrthogonalMatrixGroup_generic, sage.groups.matrix_gps.named_group.NamedMatrixGroup_gap

Base class for “named” matrix groups using LibGAP

INPUT:

• degree – integer. The degree (number of rows/columns of matrices).
• base_ring – rinrg. The base ring of the matrices.
• special – boolean. Whether the matrix group is special, that is, elements have determinant one.
• latex_string – string. The latex representation.
• gap_command_string – string. The GAP command to construct the matrix group.

EXAMPLES:

sage: G = GL(2, GF(3))
sage: from sage.groups.matrix_gps.named_group import NamedMatrixGroup_gap
sage: isinstance(G, NamedMatrixGroup_gap)
True

invariant_bilinear_form()

Return the symmetric bilinear form preserved by the orthogonal group.

OUTPUT:

A matrix $$M$$ such that, for every group element g, the identity $$g m g^T = m$$ holds. In characteristic different from two, this uniquely determines the orthogonal group.

EXAMPLES:

sage: G = GO(4, GF(7), -1)
sage: G.invariant_bilinear_form()
[0 1 0 0]
[1 0 0 0]
[0 0 2 0]
[0 0 0 2]

sage: G = GO(4, GF(7), +1)
sage: G.invariant_bilinear_form()
[0 1 0 0]
[1 0 0 0]
[0 0 6 0]
[0 0 0 2]

sage: G = GO(4, QQ)
sage: G.invariant_bilinear_form()
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]

sage: G = SO(4, GF(7), -1)
sage: G.invariant_bilinear_form()
[0 1 0 0]
[1 0 0 0]
[0 0 2 0]
[0 0 0 2]


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$$.

EXAMPLES:

sage: G = GO(4, GF(7), -1)
[0 1 0 0]
[0 0 0 0]
[0 0 1 0]
[0 0 0 1]

sage: G = GO(4, GF(7), +1)
[0 1 0 0]
[0 0 0 0]
[0 0 3 0]
[0 0 0 1]

sage: G = GO(4, QQ)
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]

sage: G = SO(4, GF(7), -1)
[0 1 0 0]
[0 0 0 0]
[0 0 1 0]
[0 0 0 1]

class sage.groups.matrix_gps.orthogonal.OrthogonalMatrixGroup_generic(degree, base_ring, special, sage_name, latex_string)

Bases: sage.groups.matrix_gps.named_group.NamedMatrixGroup_generic

Base class for “named” matrix groups

INPUT:

• degree – integer. The degree (number of rows/columns of matrices).
• base_ring – rinrg. The base ring of the matrices.
• special – boolean. Whether the matrix group is special, that is, elements have determinant one.
• latex_string – string. The latex representation.

EXAMPLES:

sage: G = GL(2, QQ)
sage: from sage.groups.matrix_gps.named_group import NamedMatrixGroup_generic
sage: isinstance(G, NamedMatrixGroup_generic)
True

invariant_bilinear_form()

Return the symmetric bilinear form preserved by the orthogonal group.

OUTPUT:

A matrix.

EXAMPLES:

sage: GO(2,3,+1).invariant_bilinear_form()
[0 1]
[1 0]
sage: GO(2,3,-1).invariant_bilinear_form()
[2 1]
[1 1]


Return the quadratic form preserved by the orthogonal group.

OUTPUT:

A matrix.

EXAMPLES:

sage: GO(2,3,+1).invariant_quadratic_form()
[0 1]
[0 0]
[1 1]
[0 2]

sage.groups.matrix_gps.orthogonal.SO(n, R, e=None, var='a')

Return the special orthogonal group.

The special orthogonal group $$GO(n,R)$$ consists of all $$n imes n$$ matrices with determint one over the ring $$R$$ preserving an $$n$$-ary positive definite quadratic form. In cases where there are muliple non-isomorphic quadratic forms, additional data needs to be specified to disambiguate.

Note

This group is also available via groups.matrix.SO().

INPUT:

• n – integer. The degree.
• R – ring or an integer. If an integer is specified, the corresponding finite field is used.
• e+1 or -1, and ignored by default. Only relevant for finite fields and if the degree is even. A parameter that distinguishes inequivalent invariant forms.

OUTPUT:

The special orthogonal group of given degree, base ring, and choice of invariant form.

EXAMPLES:

sage: G = SO(3,GF(5))
sage: G
Special Orthogonal Group of degree 3 over Finite Field of size 5

sage: G = SO(3,GF(5))
sage: G.gens()
(
[2 0 0]  [3 2 3]  [1 4 4]
[0 3 0]  [0 2 0]  [4 0 0]
[0 0 1], [0 3 1], [2 0 4]
)
sage: G = SO(3,GF(5))
sage: G.as_matrix_group()
Matrix group over Finite Field of size 5 with 3 generators (
[2 0 0]  [3 2 3]  [1 4 4]
[0 3 0]  [0 2 0]  [4 0 0]
[0 0 1], [0 3 1], [2 0 4]
)


TESTS:

sage: groups.matrix.SO(2, 3, e=1)
Special Orthogonal Group of degree 2 and form parameter 1 over Finite Field of size 3

sage.groups.matrix_gps.orthogonal.normalize_args_e(degree, ring, e)

Normalize the arguments that relate the choice of quadratic form for special orthogonal groups over finite fields.

INPUT:

• degree – integer. The degree of the affine group, that is, the dimension of the affine space the group is acting on.
• ring – a ring. The base ring of the affine space.
• e – integer, one of $$+1$$, $$0$$, $$-1$$. Only relevant for finite fields and if the degree is even. A parameter that distinguishes inequivalent invariant forms.

OUTPUT:

The integer e with values required by GAP.

TESTS:

sage: from sage.groups.matrix_gps.orthogonal import normalize_args_e
sage: normalize_args_e(2, GF(3), +1)
1
sage: normalize_args_e(3, GF(3), 0)
0
sage: normalize_args_e(3, GF(3), +1)
0
sage: normalize_args_e(2, GF(3), 0)
Traceback (most recent call last):
...
ValueError: must have e=-1 or e=1 for even degree
`

Linear Groups

#### Next topic

Symplectic Linear Groups