Semimonomial transformation group#

The semimonomial transformation group of degree \(n\) over a ring \(R\) is the semidirect product of the monomial transformation group of degree \(n\) (also known as the complete monomial group over the group of units \(R^{\times}\) of \(R\)) and the group of ring automorphisms.

The multiplication of two elements \((\phi, \pi, \alpha)(\psi, \sigma, \beta)\) with

  • \(\phi, \psi \in {R^{\times}}^n\)

  • \(\pi, \sigma \in S_n\) (with the multiplication \(\pi\sigma\) done from left to right (like in GAP) – that is, \((\pi\sigma)(i) = \sigma(\pi(i))\) for all \(i\).)

  • \(\alpha, \beta \in Aut(R)\)

is defined by

\[(\phi, \pi, \alpha)(\psi, \sigma, \beta) = (\phi \cdot \psi^{\pi, \alpha}, \pi\sigma, \alpha \circ \beta)\]

where \(\psi^{\pi, \alpha} = (\alpha(\psi_{\pi(1)-1}), \ldots, \alpha(\psi_{\pi(n)-1}))\) and the multiplication of vectors is defined elementwisely. (The indexing of vectors is \(0\)-based here, so \(\psi = (\psi_0, \psi_1, \ldots, \psi_{n-1})\).)

Todo

Up to now, this group is only implemented for finite fields because of the limited support of automorphisms for arbitrary rings.

AUTHORS:

  • Thomas Feulner (2012-11-15): initial version

EXAMPLES:

sage: S = SemimonomialTransformationGroup(GF(4, 'a'), 4)
sage: G = S.gens()
sage: G[0]*G[1]
((a, 1, 1, 1); (1,2,3,4), Ring endomorphism of Finite Field in a of size 2^2
  Defn: a |--> a)
>>> from sage.all import *
>>> S = SemimonomialTransformationGroup(GF(Integer(4), 'a'), Integer(4))
>>> G = S.gens()
>>> G[Integer(0)]*G[Integer(1)]
((a, 1, 1, 1); (1,2,3,4), Ring endomorphism of Finite Field in a of size 2^2
  Defn: a |--> a)
class sage.groups.semimonomial_transformations.semimonomial_transformation_group.SemimonomialActionMat(G, M, check=True)[source]#

Bases: Action

The left action of SemimonomialTransformationGroup on matrices over the same ring whose number of columns is equal to the degree. See SemimonomialActionVec for the definition of the action on the row vectors of such a matrix.

class sage.groups.semimonomial_transformations.semimonomial_transformation_group.SemimonomialActionVec(G, V, check=True)[source]#

Bases: Action

The natural left action of the semimonomial group on vectors.

The action is defined by: \((\phi, \pi, \alpha)*(v_0, \ldots, v_{n-1}) := (\alpha(v_{\pi(1)-1}) \cdot \phi_0^{-1}, \ldots, \alpha(v_{\pi(n)-1}) \cdot \phi_{n-1}^{-1})\). (The indexing of vectors is \(0\)-based here, so \(\psi = (\psi_0, \psi_1, \ldots, \psi_{n-1})\).)

class sage.groups.semimonomial_transformations.semimonomial_transformation_group.SemimonomialTransformationGroup(R, len)[source]#

Bases: FiniteGroup, UniqueRepresentation

A semimonomial transformation group over a ring.

The semimonomial transformation group of degree \(n\) over a ring \(R\) is the semidirect product of the monomial transformation group of degree \(n\) (also known as the complete monomial group over the group of units \(R^{\times}\) of \(R\)) and the group of ring automorphisms.

The multiplication of two elements \((\phi, \pi, \alpha)(\psi, \sigma, \beta)\) with

  • \(\phi, \psi \in {R^{\times}}^n\)

  • \(\pi, \sigma \in S_n\) (with the multiplication \(\pi\sigma\) done from left to right (like in GAP) – that is, \((\pi\sigma)(i) = \sigma(\pi(i))\) for all \(i\).)

  • \(\alpha, \beta \in Aut(R)\)

is defined by

\[(\phi, \pi, \alpha)(\psi, \sigma, \beta) = (\phi \cdot \psi^{\pi, \alpha}, \pi\sigma, \alpha \circ \beta)\]

where \(\psi^{\pi, \alpha} = (\alpha(\psi_{\pi(1)-1}), \ldots, \alpha(\psi_{\pi(n)-1}))\) and the multiplication of vectors is defined elementwisely. (The indexing of vectors is \(0\)-based here, so \(\psi = (\psi_0, \psi_1, \ldots, \psi_{n-1})\).)

Todo

Up to now, this group is only implemented for finite fields because of the limited support of automorphisms for arbitrary rings.

EXAMPLES:

sage: F.<a> = GF(9)
sage: S = SemimonomialTransformationGroup(F, 4)
sage: g = S(v = [2, a, 1, 2])
sage: h = S(perm = Permutation('(1,2,3,4)'), autom=F.hom([a**3]))
sage: g*h
((2, a, 1, 2); (1,2,3,4),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> 2*a + 1)
sage: h*g
((2*a + 1, 1, 2, 2); (1,2,3,4),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> 2*a + 1)
sage: S(g)
((2, a, 1, 2); (),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> a)
sage: S(1)
((1, 1, 1, 1); (),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> a)
>>> from sage.all import *
>>> F = GF(Integer(9), names=('a',)); (a,) = F._first_ngens(1)
>>> S = SemimonomialTransformationGroup(F, Integer(4))
>>> g = S(v = [Integer(2), a, Integer(1), Integer(2)])
>>> h = S(perm = Permutation('(1,2,3,4)'), autom=F.hom([a**Integer(3)]))
>>> g*h
((2, a, 1, 2); (1,2,3,4),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> 2*a + 1)
>>> h*g
((2*a + 1, 1, 2, 2); (1,2,3,4),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> 2*a + 1)
>>> S(g)
((2, a, 1, 2); (),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> a)
>>> S(Integer(1))
((1, 1, 1, 1); (),
 Ring endomorphism of Finite Field in a of size 3^2 Defn: a |--> a)
Element[source]#

alias of SemimonomialTransformation

base_ring()[source]#

Return the underlying ring of self.

EXAMPLES:

sage: F.<a> = GF(4)
sage: SemimonomialTransformationGroup(F, 3).base_ring() is F
True
>>> from sage.all import *
>>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1)
>>> SemimonomialTransformationGroup(F, Integer(3)).base_ring() is F
True
degree()[source]#

Return the degree of self.

EXAMPLES:

sage: F.<a> = GF(4)
sage: SemimonomialTransformationGroup(F, 3).degree()
3
>>> from sage.all import *
>>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1)
>>> SemimonomialTransformationGroup(F, Integer(3)).degree()
3
gens()[source]#

Return a tuple of generators of self.

EXAMPLES:

sage: F.<a> = GF(4)
sage: SemimonomialTransformationGroup(F, 3).gens()
(((a, 1, 1); (),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a),
 ((1, 1, 1); (1,2,3),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a),
 ((1, 1, 1); (1,2),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a),
 ((1, 1, 1); (),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a + 1))
>>> from sage.all import *
>>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1)
>>> SemimonomialTransformationGroup(F, Integer(3)).gens()
(((a, 1, 1); (),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a),
 ((1, 1, 1); (1,2,3),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a),
 ((1, 1, 1); (1,2),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a),
 ((1, 1, 1); (),
  Ring endomorphism of Finite Field in a of size 2^2 Defn: a |--> a + 1))
order()[source]#

Return the number of elements of self.

EXAMPLES:

sage: F.<a> = GF(4)
sage: SemimonomialTransformationGroup(F, 5).order() == (4-1)**5 * factorial(5) * 2
True
>>> from sage.all import *
>>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1)
>>> SemimonomialTransformationGroup(F, Integer(5)).order() == (Integer(4)-Integer(1))**Integer(5) * factorial(Integer(5)) * Integer(2)
True