Function Resource

Function Repository Resource:

GroupHomomorphism

Source Notebook

Construct homomorphisms between groups

Contributed by: Naman T.

ResourceFunction["GroupHomomorphism"][G1,G2,f]

constructs the group homomorphism from G1 to G2 specified by f.

Details and Options

G1 and G2 must be valid group objects such as CyclicGroup, DihedralGroup, SymmetricGroup, MathieuGroupM11, etc.
f must be a list or an association specifying the image of each generator under the required homomorphism.

Examples

Basic Examples (5) 

Embed CyclicGroup[2] in CyclicGroup[4] via (12)↦(13)(24):

In[1]:=
\[Phi] = ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][CyclicGroup[2], CyclicGroup[4], {Cycles[{{1, 3}, {2, 4}}]}]
Out[1]=

Click on + to reveal more information about the homomorphism. For example, ϕ is injective but not surjective. Obtain the underlying mapping:

In[2]:=
Normal[\[Phi]]
Out[2]=

Retrieve the domain or co-domain of a homomorphism:

In[3]:=
\[Phi]["Domain"]
Out[3]=
In[4]:=
\[Phi]["CoDomain"]
Out[4]=

Find the kernel of this homomorphism, indeed the kernel is singleton thus ϕ is an embedding:

In[5]:=
\[Phi]["Kernel"]
Out[5]=

This is the trivial group:

In[6]:=
GroupElements[%]
Out[6]=

Find the image group:

In[7]:=
\[Phi]["Image"]
Out[7]=

Try to specify an invalid homomorphism:

In[8]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][CyclicGroup[2], CyclicGroup[3], <|Cycles[{{1, 2}}] -> Cycles[{{1, 2, 3}}]|>]
Out[8]=

The package efficiently works with large groups. For example, here is the identity homomorphism from SymmetricGroup[10] to itself:

In[9]:=
id = AbsoluteTiming@ResourceFunction[
CloudObject[
    "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][SymmetricGroup[20], SymmetricGroup[20], GroupGenerators[SymmetricGroup[20]]]
Out[9]=

Its image and kernel groups:

In[10]:=
AbsoluteTiming@id[[2]]["Image"]
Out[10]=
In[11]:=
AbsoluteTiming@id[[2]]["Kernel"]
Out[11]=

Scope (2) 

Specify the homomorphism using an association:

In[12]:=
gens = GroupGenerators[SymmetricGroup[4]]
Out[12]=
In[13]:=
assoc = AssociationThread[gens -> gens]
Out[13]=

Build the homomorphism:

In[14]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][SymmetricGroup[4], SymmetricGroup[4], assoc]
Out[14]=

This is the identity homomorphism (an isomorphism, since it is both injective and surjective):

In[15]:=
Select[Normal[%], %[[1]] != %[[2]]]
Out[15]=

Specify an endomorphism (from G to itself):

In[16]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][CyclicGroup[2], {Cycles[{{1, 2}}]}]
Out[16]=

Applications (3) 

Construct the sign homomorphism from SymmetricGroup[4] to CyclicGroup[2]:

In[17]:=
S4 = SymmetricGroup[4];
C2 = CyclicGroup[2];

Odd generators must map to (12):

In[18]:=
GroupGenerators[S4]
Out[18]=
In[19]:=
sgn = ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][S4, C2, {Cycles[{{1, 2}}], Cycles[{{1, 2}}]}]
Out[19]=

Find all even permutations:

In[20]:=
sgn["Kernel"] // GroupElements
Out[20]=

Confirm that there are exactly 12 even permutations:

In[21]:=
Length[%]
Out[21]=

Quotient DihedralGroup[3] by CyclicGroup[2] sending all rotations to ε and reflections to (12):

In[22]:=
GroupGenerators[DihedralGroup[3]]
Out[22]=
In[23]:=
quo = ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][DihedralGroup[3], CyclicGroup[2], <|Cycles[{{2, 3}}] -> Cycles[{{1, 2}}], Cycles[{{1, 2, 3}}] -> Cycles[{{}}]|>]
Out[23]=

Again, kernel is all 3 rotations:

In[24]:=
quo["Kernel"] // GroupOrder
Out[24]=

For an AbelianGroup to itself, the map xxk is a homomorphism:

In[25]:=
GroupGenerators[Ab = AbelianGroup[{2, 2, 3}]]
Out[25]=
In[26]:=
pow = ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][Ab,
  AssociationMap[PermutationPower[#, 3] &, GroupGenerators[Ab]]]
Out[26]=

Its kernel:

In[27]:=
pow["Kernel"]
Out[27]=

Properties and Relations (4) 

GroupHomomorphism preserves operation:

In[28]:=
{c1, c2} = RandomChoice[GroupElements[S4], 2]
Out[28]=
In[29]:=
sgn[c1\[PermutationProduct]c2] == sgn[c1]\[PermutationProduct]sgn[c2]
Out[29]=

GroupHomomorphism preserves inverses:

In[30]:=
sgn@PermutationPower[c1, -1] == PermutationPower[sgn[c1], -1]
Out[30]=

The specified images of generators must belong to G2:

In[31]:=
ResourceFunction[
CloudObject[
  "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][CyclicGroup[2], {Cycles[{{1, 2, 3}}]}]
Out[31]=

Applying the homomorphism to an arbitrary object returns unevaluated:

In[32]:=
sgn[x]
Out[32]=

Replace x by an element:

In[33]:=
% /. x -> Cycles[{{}}]
Out[33]=

Possible Issues (3) 

Consider the homomorphism from SymmetricGroup[3] to CyclicGroup[6]:

In[34]:=
bad = ResourceFunction[
CloudObject[
   "https://www.wolframcloud.com/obj/namantaggar11/DeployedResources/Function/GroupHomomorphism"]][SymmetricGroup[3], CyclicGroup[6],
  {PermutationPower[Cycles[{{1, 2, 3, 4, 5, 6}}], 3], PermutationPower[Cycles[{{1, 2, 3, 4, 5, 6}}], 2]}]
Out[34]=

We mapped an order 2 generator to order 2 element, and 3 to 3. This violates the group relations of SymmetricGroup[3]. Consider for example:

In[35]:=
bad[PermutationProduct[Cycles[{{1, 2}}], Cycles[{{1, 2, 3}}]]]
Out[35]=

But:

In[36]:=
PermutationProduct[bad[Cycles[{{1, 2}}]], bad[Cycles[{{1, 2, 3}}]]]
Out[36]=