Name
    Math::Groups - Find automorphisms of groups and isomorphisms between
    groups.

Synopsis
      use Math::Groups;
      use Data::Dump qw(dump);
      use Math::Cartesian::Product;

      # Print a cyclic group of order 4

      print dump(Group{($_[0]*$_[1]) % 5} 1..4)."\n";

      #   elements => {
      #                 1 => { 1 => 1, 2 => 2, 3 => 3, 4 => 4 },
      #                 2 => { 1 => 2, 2 => 4, 3 => 1, 4 => 3 },
      #                 3 => { 1 => 3, 2 => 1, 3 => 4, 4 => 2 },
      #                 4 => { 1 => 4, 2 => 3, 3 => 2, 4 => 1 },
      #               },
      #   identity => 1,
      #   inverses => { 1 => 1, 2 => 3, 3 => 2, 4 => 4 },
      #   orders   => { 1 => 0, 2 => 4, 3 => 4, 4 => 2 },


      # Find the automorphisms of the cyclic group of order 4

      autoMorphisms {print dump({@_})."\n"}
        Group{($_[0]+$_[1]) % 4} 0..3;

      #   { 1 => 1, 2 => 2, 3 => 3 }
      #   { 1 => 3, 2 => 2, 3 => 1 }

      # Find the automorphisms of dihedral group of order 4

      my $corners = [cartesian {1} ([1,-1]) x 2];
      my $cornerNumbers;
      map {my ($a, $b) = @{$$corners[$_]};
                       $cornerNumbers->{$a}{$b} = $_
                      } 0..$#$corners;

      autoMorphisms {print dump({@_})."\n"}
        Group
         {my ($a, $b, $c, $d) = map {@$_} @$corners[@_];
                $cornerNumbers->{$a*$c}{$b*$d}
         } 0..$#$corners;

      #   { 1 => 1, 2 => 2, 3 => 3 }
      #   { 1 => 1, 2 => 3, 3 => 2 }
      #   { 1 => 2, 2 => 1, 3 => 3 }
      #   { 1 => 3, 2 => 1, 3 => 2 }
      #   { 1 => 2, 2 => 3, 3 => 1 }
      #   { 1 => 3, 2 => 2, 3 => 1 }

Description
    Find automorphisms of groups and isomorphisms between groups.

    A group automorphism is a bijection on the set of elements of a group
    which preserves the group product.

    A group isomorphism is a bijection between the sets of elements of two
    groups which preserves the group product.

  identity(group)
    Returns the identity element.

  inverse(group, element)
    Returns the inverse of an element.

  orders(group)
    Returns a hash which supplies the order of each element. The identity is
    assigned an order of zero.

  order(group, element)
    Returns the order of an element with the group.

  elements(group)
    Returns a hash whose keys are the elements if the group. The value at
    each key of this hash is another hash which gives the product in this
    group.

  Group sub elements...
    Creates a group with the specified elements as multiplied by "sub". The
    first parameter is a subroutine that forms the product of each pair of
    elements drawn from the following list of elements.

  abelian(group)
    Returns 1 if the group is Abelian, else 0.

  cyclic(group)
    If the group is cyclic, returns an element that generates the group,
    else undef.

  subGroup(groups, elements...)
    Returns 1 if the elements specified plus the identity element form a sub
    group of the group else 0.

  homoMorphic(group1, group2, mapping...)
    Returns 1 if mapping forms a homomorphism from group 1 to group 2, else
    0.

    The mapping is a subset of the Cartesian product of the elements of
    group 1 and the elements of group 2 flattened into a list. The pair:

     (identity of group 1, identity of group 2)

    is added for you so there is no need to specify it unless you wish to.

  isoMorphic(group1, group2, mapping...)
    Returns 1 if the mapping is an isomorphism from group 1 to group 2, else
    0.

    The mapping is a subset of the Cartesian product of the elements of
    group 1 and the elements of group 2 flattened into a list. The pair:

     (identity of group 1, identity of group 2)

    is added for you so there is no need to specify it unless you wish to.

  isoMorphisms sub group1, group 2
    Finds all the isomorphisms between two groups and calls "sub" to process
    each of them as they are discovered.

    The parameter list to sub is a pair for each element of group 1
    indicating the corresponding element of group 2 under the isomorphism.

  autoMorphic(group, mapping)
    Returns 1 if the mapping is an automorphism from the group to itself,
    else 0.

    The mapping is a subset of the Cartesian product of the elements of the
    group squared flattened into a list. The pair:

     (identity of group, identity of group)

    is added for you so there is no need to specify it unless you wish to.

  autoMorphisms sub group
    Finds all the automorphisms of the groups and calls "sub" to process
    each of them as they are discovered.

    The parameter list to sub is a pair for each element of the group
    indicating the corresponding element under the automorphism.

Export
    The "Group()", "isoMorphisms()", "autoMorphisms()" functions are
    exported.

Installation
    Standard Module::Build process for building and installing modules:

      perl Build.PL
      ./Build
      ./Build test
      ./Build install

    Or, if you're on a platform (like DOS or Windows) that doesn't require
    the "./" notation, you can do this:

      perl Build.PL
      Build
      Build test
      Build install

Author
    Philip R Brenan at gmail dot com

    http://www.appaapps.com

See Also
    Math::Cartesian::Product
    Math::Permute::List

Copyright
    This module is free software. It may be used, redistributed and/or
    modified under the same terms as Perl itself.

