.. -*- coding: utf-8 -*-

Grupos Finitos y Grupos Abelianos
=================================

Sage ofrece algunas posibilidades para trabajar con grupos de permutaciones,
grupos finitos clásicos (como :math:`SU(n,q)`), grupos finitos de matrices
(con generadores definidos por el usuario), y grupos abelianos (incluso
infinitos). La mayor parte de esta funcionalidad está implementada por medio
de una interfaz con GAP.

Por ejemplo, para crear un grupo de permutaciones, introducimos una lista de
generadores:

::

    sage: G = PermutationGroup(['(1,2,3)(4,5)', '(3,4)'])
    sage: G
    Permutation Group with generators [(3,4), (1,2,3)(4,5)]
    sage: G.order()
    120
    sage: G.is_abelian()
    False
    sage: G.derived_series()           # random output (resultado aleatorio)
    Subgroup of (Permutation Group with generators [(3,4), (1,2,3)(4,5)]) generated by [(3,4), (1,2,3)(4,5)],
     Subgroup of (Permutation Group with generators [(3,4), (1,2,3)(4,5)]) generated by [(1,5,3), (1,5)(3,4), (1,5)(2,4)]]
    sage: G.center()
    Subgroup generated by [()] of (Permutation Group with generators [(3,4), (1,2,3)(4,5)])
    sage: G.random_element()           # random output (resultado aleatorio)
    (1,5,3)(2,4)
    sage: print(latex(G))
    \langle (3,4), (1,2,3)(4,5) \rangle

También podemos obtener la tabla de caracteres en formato LaTeX (usa 
``show(G.character_table())`` para ver directamente el resultado de compilar el 
código LaTeX):

::

    sage: G = PermutationGroup([[(1,2),(3,4)], [(1,2,3)]])
    sage: latex(G.character_table())
    \left(\begin{array}{rrrr}
    1 & 1 & 1 & 1 \\
    1 & -\zeta_{3} - 1 & \zeta_{3} & 1 \\
    1 & \zeta_{3} & -\zeta_{3} - 1 & 1 \\
    3 & 0 & 0 & -1
    \end{array}\right)

Sage también incluye los grupos clásicos y los grupos de matrices sobre cuerpos
finitos:

::

    sage: MS = MatrixSpace(GF(7), 2)
    sage: gens = [MS([[1,0],[-1,1]]),MS([[1,1],[0,1]])]
    sage: G = MatrixGroup(gens)
    sage: G.conjugacy_classes_representatives()
    (
    [1 0]  [0 6]  [0 4]  [6 0]  [0 6]  [0 4]  [0 6]  [0 6]  [0 6]  [4 0]
    [0 1], [1 5], [5 5], [0 6], [1 2], [5 2], [1 0], [1 4], [1 3], [0 2],
    <BLANKLINE>
    [5 0]
    [0 3]
    )
    sage: G = Sp(4,GF(7))
    sage: G._gap_init_()
    'Symplectic Group of degree 4 over Finite Field of size 7'
    sage: G
    Symplectic Group of degree 4 over Finite Field of size 7
    sage: G.random_element()             # random output (resultado aleatorio)
    [5 5 5 1]
    [0 2 6 3]
    [5 0 1 0]
    [4 6 3 4]
    sage: G.order()
    276595200

También podemos hacer cálculos con grupos abelianos (finitos o infinitos):

::

    sage: F = AbelianGroup(5, [5,5,7,8,9], names='abcde')
    sage: (a, b, c, d, e) = F.gens()
    sage: d * b**2 * c**3 
    b^2*c^3*d
    sage: F = AbelianGroup(3,[2]*3); F
    Multiplicative Abelian group isomorphic to C2 x C2 x C2
    sage: H = AbelianGroup([2,3], names="xy"); H
    Multiplicative Abelian group isomorphic to C2 x C3
    sage: AbelianGroup(5)
    Multiplicative Abelian group isomorphic to Z x Z x Z x Z x Z
    sage: AbelianGroup(5).order()
    +Infinity
