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

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

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