RAQ/gap/byconj.gi

98 lines
3.2 KiB
Plaintext
Raw Normal View History

2017-10-20 22:51:30 +00:00
# byconj.gi RAQ Implementation of quandles by conjugation
InstallMethod(ConjugatorFamily, "for a family",
[IsFamily],
function(fam)
local F;
# Does GAP provide any way to get at the name of a family other than
# fam!.NAME ?
F := NewFamily(Concatenation("ConjugatorFamily(", fam!.NAME, ")"),
IsConjugatorObject);
F!.ConjType := NewType(F, IsDefaultConjugatorObject);
return F;
end);
ConjugatorType@ := obj -> ConjugatorFamily(FamilyObj(obj))!.ConjType;
InstallMethod(ConjugatorObj,
"for a mult element that allows quotients (and should be assoc)",
2017-10-20 23:11:04 +00:00
[IsMultiplicativeElement and IsLeftQuotientElement and IsRightQuotientElement],
2017-10-20 23:08:13 +00:00
obj -> Objectify(ConjugatorType@(obj), Immutable(obj))
2017-10-20 22:51:30 +00:00
);
# Even though IsMultiplicativeElementWithInverse implies both
# IsLeftQuotientElement and IsRightQuotientElement, GAP doesn't seem to
# calculate these implications on built-in elements. So we need to repeat the
# method for IsMultiplicativeElementWithInverse, which is true of built-ins,
# particularly permutations, which serve as a common representation of group
# elements.
InstallMethod(ConjugatorObj,
"for a mult element with inverse (and should be assoc)",
[IsMultiplicativeElementWithInverse],
2017-10-21 18:38:51 +00:00
obj -> Objectify(ConjugatorType@(obj), [Immutable(obj)])
);
2017-10-20 22:51:30 +00:00
## Printing and viewing
InstallMethod(String, "for conjugator objects",
[IsDefaultConjugatorObject],
obj -> Concatenation("ConjugatorObj( ", String(obj![1]), " )")
);
InstallMethod(ViewString, "for conjugator objects",
[IsDefaultConjugatorObject],
obj -> Concatenation("^", ViewString(obj![1]), ":")
);
InstallMethod(UnderlyingMultiplicativeElement, "for a conjugator object",
[IsDefaultConjugatorObject],
obj -> obj![1]
);
InstallMethod( \=, "for two conjugator objects",
IsIdenticalObj,
[IsDefaultConjugatorObject, IsDefaultConjugatorObject],
function(l,r) return l![1] = r![1]; end
);
InstallMethod( \<, "for two conjugator objects",
IsIdenticalObj,
[IsDefaultConjugatorObject, IsDefaultConjugatorObject],
function(l,r) return l![1] < r![1]; end
);
InstallMethod( \*, "for two conjugator objects",
IsIdenticalObj,
[IsDefaultConjugatorObject, IsDefaultConjugatorObject],
function(l,r) return ConjugatorObj(LeftQuotient(l![1],r![1])*l![1]); end
2017-10-20 22:51:30 +00:00
);
InstallOtherMethod(LeftQuotient, "for two conjugator objects",
2017-10-20 22:51:30 +00:00
IsIdenticalObj,
[IsDefaultConjugatorObject,IsDefaultConjugatorObject],
2017-10-21 18:58:41 +00:00
function(l,r) return ConjugatorObj((l![1]*r![1])/l![1]); end
2017-10-20 22:51:30 +00:00
);
2017-10-20 23:27:37 +00:00
InstallMethod(ConjugationQuandle, "for a group",
2017-10-20 22:51:30 +00:00
[IsGroup and IsFinite],
function(G)
local fam, elts, Q;
2017-10-20 23:17:58 +00:00
fam := CollectionsFamily(ConjugatorFamily(ElementsFamily(FamilyObj(G))));
2017-10-20 22:51:30 +00:00
# Question: how do we easily/quickly determine a set of generators of
# Conj(G) from a set of generators of G, so that we can handle infinite
# conj-quandles here?
2017-10-20 23:17:58 +00:00
elts := List(Elements(G), g -> ConjugatorObj(g) );
2017-10-20 22:51:30 +00:00
# What we would like to do is
# return AsLeftQuandle[NC?](elts);
# but that's NIY.
Q := LeftQuandleNC(fam, elts);
# We know that elts was actually closed under * and LeftQuotient, and
# since we are in a method only for finite groups, ergo Q is finite:
SetIsFinite(Q, true);
return Q;
2017-10-20 22:51:30 +00:00
end);
2017-10-20 23:24:13 +00:00
2017-10-20 22:51:30 +00:00