Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
""" Heisenberg Group
AUTHORS:
- Hilder Vitor Lima Pereira (2017-08): initial version """
#***************************************************************************** # Copyright (C) 2017 Hilder Vitor Lima Pereira <hilder.vitor at gmail.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # http://www.gnu.org/licenses/ #*****************************************************************************
r""" The Heisenberg group of degree `n`.
Let `R` be a ring, and let `n` be a positive integer. The Heisenberg group of degree `n` over `R` is a multiplicative group whose elements are matrices with the following form:
.. MATH::
\begin{pmatrix} 1 & x^T & z \\ 0 & I_n & y \\ 0 & 0 & 1 \end{pmatrix},
where `x` and `y` are column vectors in `R^n`, `z` is a scalar in `R`, and `I_n` is the identity matrix of size `n`.
INPUT:
- ``n`` -- the degree of the Heisenberg group
- ``R`` -- (default: `\ZZ`) the ring `R` or a positive integer as a shorthand for the ring `\ZZ/R\ZZ`
EXAMPLES::
sage: H = groups.matrix.Heisenberg(); H Heisenberg group of degree 1 over Integer Ring sage: H.gens() ( [1 1 0] [1 0 0] [1 0 1] [0 1 0] [0 1 1] [0 1 0] [0 0 1], [0 0 1], [0 0 1] ) sage: X, Y, Z = H.gens() sage: Z * X * Y**-1 [ 1 1 0] [ 0 1 -1] [ 0 0 1] sage: X * Y * X**-1 * Y**-1 == Z True
sage: H = groups.matrix.Heisenberg(R=5); H Heisenberg group of degree 1 over Ring of integers modulo 5 sage: H = groups.matrix.Heisenberg(n=3, R=13); H Heisenberg group of degree 3 over Ring of integers modulo 13
REFERENCES:
- :wikipedia:`Heisenberg_group` """ """ Normalize input to ensure a unique representation.
EXAMPLES::
sage: H1 = groups.matrix.Heisenberg(n=2, R=5) sage: H2 = groups.matrix.Heisenberg(n=2, R=ZZ.quo(5)) sage: H1 is H2 True
sage: H1 = groups.matrix.Heisenberg(n=2) sage: H2 = groups.matrix.Heisenberg(n=2, R=ZZ) sage: H1 is H2 True """ raise TypeError("degree of Heisenberg group must be a positive integer") else: raise ValueError("R must be a positive integer") raise NotImplementedError("R must be a finite ring or ZZ")
""" Initialize ``self``.
EXAMPLES::
sage: H = groups.matrix.Heisenberg(n=2, R=5) sage: TestSuite(H).run() # long time sage: H = groups.matrix.Heisenberg(n=2, R=4) sage: TestSuite(H).run() # long time sage: H = groups.matrix.Heisenberg(n=3) sage: TestSuite(H).run(max_runs=30, skip="_test_elements") # long time sage: H = groups.matrix.Heisenberg(n=2, R=GF(4)) sage: TestSuite(H).run() # long time """
# We need the generators of the ring as a commutative additive group else: else: # This is overkill, but is the only way to ensure # we get all of the elements
for j in range(1, dim-1) for gen in ring_gens] for i in range(1, dim-1) for gen in ring_gens]
gap_group, category=cat)
""" Return a string representation of ``self``.
EXAMPLES::
sage: groups.matrix.Heisenberg() Heisenberg group of degree 1 over Integer Ring """
r""" Return a latex representation of ``self``.
EXAMPLES::
sage: H = groups.matrix.Heisenberg() sage: latex(H) H_{1}({\Bold{Z}}) """
""" Return the order of ``self``.
EXAMPLES::
sage: H = groups.matrix.Heisenberg() sage: H.order() +Infinity sage: H = groups.matrix.Heisenberg(n=4) sage: H.order() +Infinity sage: H = groups.matrix.Heisenberg(R=3) sage: H.order() 27 sage: H = groups.matrix.Heisenberg(n=2, R=3) sage: H.order() 243 sage: H = groups.matrix.Heisenberg(n=2, R=GF(4)) sage: H.order() 1024 """ else:
|