Implementation GSoC Group Theory (gxyd, jksuom, asmeurer) - gxyd/sympy GitHub Wiki
Implementation Details
Free Group:
Though mathematically Free Groups is just a type of Finitely Presented Groups i.e Free Group is a Finitely Presented Group with no relators, i.e R = ∅ .
But from implementation point of view Finitely Presnted Groups API will look like g = FpGroup( f, r ) here f denotes a FreeGroup like f = FreeGroup( 4 ) and r being a set of relators used for making the Finitely Presnted Group g.
>>> f = FreeGroup(2)
>>> g = f / set([f[0]**2, f[1]**3, (f[0]*f[1])**2)
>>> g
<fp Group on generators >
>>> f.is_fpGroup # even the FreeGroup is a Finitely Presnted Group
True
The Group Class: This will be a central class for all groups from which all the objects like mathematical groups, cosets will be derived from.
>>> f = FreeGroup( 2 )
>>> f.is_Group
True
>>> h = LeftCoset(Permutation(1,2), PermutationGroup((1,3,2),(1,4))
>>> h.is_group
False
Equality checking of any elements of FpGroup? How to do this?
Normal form ??
Algorithms that are used in this regard include: If the FpGroup is known to be of finite order then use the faithful permutation representation by a bounded Todd-Coxeter. If this fails, a Knuth-Bendix[3] is attempted and the words are compared via their normal form. <------ what is normal form here?
Notation used for checking the equality
It can be sort of a debate if we want to use == for checking structural equality or mathematical equality
my opinion: We should go with == refering to mathematical equality since checking the structural equality if not much of a use
in the case of Groups. Since defining mathematical equality is to be done anyway since that is a fundamental operation in Group Theory
Now if we don not define the mathematical equality using == then other methods like .equals will have to be used that don not seem
to be good from the user point of view.
Consider this:
>>> f = FreeGroup( 2 )
>>> g = FpGroup( f, [ f.1**2, f.2**4, (f.1*f.2)**6] )
>>> g.1**2*g.2**4 == g.1**0 ---- 1
True
>>> (g.1**2*g.2**4).equals(g.1**0) ---- 2
True
API 1 seems way more intuitive that API 2
Now for equality of FpGroups since the Groups are abstract objects even if they are constructed from same FreeGroup and relators
they should be different the same is true for FreeGroup
Example
>>> f:=FreeGroup(2);
>>> g1:=f/[f[0]**2, f[1]**3, (f[0]*f[1])**5];
>>> g2:=f/[f[0]**2, f[1]**3, (f[0]*f[1])**5];
>>> g1 == g2;
False
Here though g1 and g2 have the same FreeGroup and relators from which they are constructed the groups g1 and g2 are different.
References
http://www.math.colostate.edu/~hulpke/talks/tala.pdf
https://en.wikipedia.org/wiki/Presentation_of_a_group
... [3] http://homepage.cs.uiowa.edu/~astump/papers/thesis-wehrman.pdf (Knuth Bendix ALgorithm)