############################################################################### ## #R IsSelfSimRep ## ## This is how IsSelfSim object is stored in GAP: ## IsSelfSim object is a thing of kind "w = (w_1, w_2, ..., w_d)\pi", where ## deg = d - arity of tree; ## perm = \pi - permutation on first level; ## w, w_1, ..., w_d - elements of free group representing elements of ## automata group; ## word = w; ## states = [w_1, ..., w_d]. ##
DeclareRepresentation("IsSelfSimRep",
IsComponentObjectRep and IsAttributeStoringRep,
["word", "states", "perm", "deg"]);
InstallGlobalFunction(__AG_CreateSelfSim, function(family, word, states, perm, invertible)
local a, cat;
if invertible then cat := IsInvertibleSelfSim and IsSelfSimRep;
if perm^-1=fail then
Error(perm, " is not invertible"); else
perm := AG_PermFromTransformation(perm); fi; else cat := IsSelfSim and IsSelfSimRep; fi;
a := Objectify(NewType(family, cat),
rec(word := word,
states := states,
perm := perm,
deg := family!.deg));
if fam!.use_rws then
w := AG_ReducedForm(fam!.rws, w); fi;
if Length(w) = 0then
return One(fam); elif Length(w) = 1then if ExponentSyllable(w, 1) = 1then
return fam!.recurgens[GeneratorSyllable(w, 1)]; else if IsBound(fam!.recurgens[GeneratorSyllable(w, 1) + fam!.numstates]) then
return fam!.recurgens[GeneratorSyllable(w, 1) + fam!.numstates]; else
Error(fam!.recurgens[GeneratorSyllable(w, 1)], " is not invertible"); fi; fi; fi;
exp := LetterRepAssocWord(w); for i in [1..Length(exp)] do if exp[i] < 0then if IsBound(fam!.recurlist[-exp[i] + fam!.numstates]) then
exp[i] := -exp[i] + fam!.numstates; else
Error(fam!.recurgens[-exp[i]], " is not invertible"); fi; fi;
od;
wstates := [];
nperm := (); for i in [1..Length(exp)] do
nperm := nperm * fam!.recurlist[exp[i]][fam!.deg+1];
od;
for i in [1..fam!.deg] do
wstates[i] := One(fam!.freegroup);
perm := ();
for j in [1..Length(exp)] do
wstates[i] := wstates[i]*fam!.recurgens[exp[j]]!.states[i^perm];
perm := perm * fam!.recurlist[exp[j]][fam!.deg+1];
od;
# if fam!.use_rws and Length(wstates[i]) > 0 then # wstates[i] := AG_ReducedForm(fam!.rws, wstates[i]); # fi;
od;
invertible := true; if not fam!.isgroup then for i in exp do if i <= fam!.numstates and not IsInvertibleSelfSim(fam!.recurgens[i]) then
invertible := false;
break; fi;
od; fi;
############################################################################### ## #M PrintObj( <a> ) ##
InstallMethod(PrintObj, "for [IsSelfSim]",
[IsSelfSim], function (a)
local deg, printword, i;
printword := function(w) if IsOne(w) then Print(AG_Globals.identity_symbol); else Print(w); fi; end;
if true then
View(a);
return; fi;
deg := a!.deg;
printword(a!.word);
Print(" = ("); for i in [1..deg] do
printword(a!.states[i]); if i <> deg then Print(", "); fi;
od;
Print(")"); if not IsOne(a!.perm) then AG_PrintTransformation(a!.perm); fi; end);
############################################################################### ## #M ViewObj( <a> ) ##
InstallMethod(ViewObj, "for [IsSelfSim]",
[IsSelfSim], function (a) if IsOne(a!.word) then Print(AG_Globals.identity_symbol); else Print(a!.word); fi; end);
############################################################################### ## #M String( <a> ) ##
InstallMethod(String, "for [IsSelfSim]",
[IsSelfSim], function (a) if IsOne(a!.word) then return AG_Globals.identity_symbol; else return String(a!.word); fi; end);
############################################################################### ## #M k ^ a ##
InstallMethod(\^, "for [IsPosInt, IsSelfSim]", [IsPosInt, IsSelfSim], function(k, a)
return k ^ Perm(a); end);
############################################################################### ## #M seq ^ a ##
InstallMethod(\^, "for [IsList, IsSelfSim]", [IsList, IsSelfSim], function(seq, a)
local i, deg, img, cur;
deg := DegreeOfTree(a); for i in seq do if not IsInt(i) or i < 1 or i > deg then
Print("\^(IsList, IsFGSelfSim): ",
i, "is out of range 1..", deg, "\n");
return seq; fi;
od;
if Length(seq) = 0then return []; fi; if Length(seq) = 1then return [seq[1]^Perm(a)]; fi;
# if a1 or a2 are elements of semigroup, which is not a group, then G1 or G2 is `fail'
if IsIdenticalObj(G1, G2) and HasIsFinite(G1) and IsFinite(G1) then
return IsOne(Image(IsomorphismPermGroup(G1), a1*a2^-1)); fi;
d := a1!.deg;
areequalstates := function(a, b)
local j;
if a!.word = b!.word then
return true; fi;
if [a!.word, b!.word] in checked_pairs then
return true; else if a!.perm <> b!.perm then
return false; fi;
AddSet(checked_pairs, [a!.word, b!.word]); for j in [1..d] do if not areequalstates(Section(a, j), Section(b, j)) then
return false; fi;
od;
return true; fi; end;
CyclicallyReduce := function(w)
local i, j, wtmp, reduced;
for i in [1..Length(w)] do if -w[i] in gens_ord2 then w[i] := -w[i]; fi;
od;
repeat
reduced := true;
j := 1; while reduced and j<Length(w) do if w[j]=-w[j+1] or (w[j]=w[j+1] and w[j] in gens_ord2) then
reduced := false;
wtmp := ShallowCopy(w{[1..j-1]});
Append(wtmp, w{[j+2..Length(w)]});
w := wtmp; fi;
j := j+1;
od;
until reduced;
repeat if Length(w)<2then return w; fi;
reduced := true; if w[1]=-w[Length(w)] or (w[1]=w[Length(w)] and w[1] in gens_ord2) then
w := w{[2..Length(w)-1]};
reduced := false; fi;
until reduced;
return w; end;
AreConjugateUsingSmallRels := function(g, h)
local i, g_list, h_list, long_cycle, l;
g_list := CyclicallyReduce(LetterRepAssocWord(g));
h_list := CyclicallyReduce(LetterRepAssocWord(h)); if Length(g_list)<>Length(h_list) then return false; fi;
l := [2..Length(g_list)];
Add(l, 1);
long_cycle := PermList(l); for i in [0..Length(g_list)-1] do if h_list=Permuted(g_list, long_cycle^i) then return true; fi;
od;
return false; end;
OrderUsingSections_LOCAL := function(g)
local i, el, orb, Orbs, res, st, reduced_word, loc_order; if IsOne(g) then return 1; fi;
if IsActingOnBinaryTree(g) and IsSphericallyTransitive(g) then
Info(InfoAutomGrp, 3, g!.word, " acts transitively on levels and is obtained from (", a!.word, ")^", Product(degs{[1..Length(degs)]}), "\n by taking sections and cyclic reductions at vertex ", vertex);
return infinity; fi;
for i in [1..Length(cur_list)] do
el := cur_list[i]; if (AreConjugateUsingSmallRels(g!.word, el!.word) or AreConjugateUsingSmallRels((g!.word)^(-1), el!.word)) then if Product(degs{[i..Length(degs)]})>1then if i>1then Info(InfoAutomGrp, 3, "(", a!.word, ")^", Product(degs{[1..i-1]}), " has ", el!.word, " as a section at vertex ", vertex{[1..i-1]}); fi;
Info(InfoAutomGrp, 3, "(", el!.word, ")^", Product(degs{[i..Length(degs)]}), " has conjugate of ", g!.word, " as a section at vertex ", vertex{[i..Length(degs)]});
SetIsFinite(GroupOfSelfSimFamily(FamilyObj(a)), false);
return infinity; else # Info(InfoAutomGrp, 3, "The group <G> might not be contracting, ", g, " has itself as a section.");
return 1; fi; fi;
od; if Length(cur_list)>=max_depth then return fail; fi;
Add(cur_list, g);
Orbs := OrbitsPerms([g!.perm], [1..g!.deg]);
loc_order := 1;
for orb in Orbs do
Add(degs, Length(orb));
Add(vertex, orb[1]);
st := Section(g^Length(orb), orb[1]);
reduced_word := AssocWordByLetterRep(FamilyObj(st!.word), CyclicallyReduce(LetterRepAssocWord(st!.word))); # Print(st!.word, " at ", vertex, "\n");
res := OrderUsingSections_LOCAL(SelfSim(reduced_word, FamilyObj(g))); if res = infinity then return res; elif res=fail then
loc_order:=fail; fi; if loc_order<>fail then
loc_order := Lcm(loc_order, res*Length(orb)); fi;
Remove(degs);
Remove(vertex);
od;
Remove(cur_list);
return loc_order; end;
F := FamilyObj(a)!.freegroup; if IsObviouslyFiniteState(FamilyObj(a)) then
gens_ord2 := GeneratorsOfOrderTwo(FamilyObj(a)); else
gens_ord2 := []; fi;
cur_list := []; # degs traces at what positions we raise to what power
degs := []; vertex := [];
res := OrderUsingSections_LOCAL(a); if res=infinity then
SetIsFinite(GroupOfSelfSimFamily(FamilyObj(a)), false);
SetOrder(a, infinity); fi;
return res; end);
InstallMethod(SphericalIndex, "for [IsSelfSim]", [IsSelfSim], function(a) # XXX check uses of SphericalIndex everywhere
return rec(start := [], period := [a!.deg]); end);
# XXX check uses of this everywhere
InstallMethod(DegreeOfTree, "for [IsSelfSim]", [IsSelfSim], function(a)
return a!.deg; end);
# XXX check uses of this everywhere
InstallMethod(TopDegreeOfTree, "for [IsSelfSim]", [IsSelfSim], function(a)
return a!.deg; end);
############################################################################### ## #M CanEasilyTestSphericalTransitivity( <a> ) ##
InstallTrueMethod(CanEasilyTestSphericalTransitivity,
IsActingOnBinaryTree and IsSelfSim and IsFiniteState);
############################################################################### ## #M IsSphericallyTransitive( <a> ) ##
InstallMethod(IsSphericallyTransitive, "for [IsInvertibleSelfSim]",
[IsInvertibleSelfSim], function(a)
local w, i, ab, abs;
if IsOne(Word(a)) then
Info(InfoAutomGrp, 3, "IsSphericallyTransitive(a): false");
Info(InfoAutomGrp, 3, " IsOne(Word(a)): a = ", a);
return false; fi;
TryNextMethod(); end);
######################################################################### ## #M Order( <a> ) ##
InstallMethod(Order, "for [IsInvertibleSelfSim]", true,
[IsInvertibleSelfSim], function(a)
local ord_loc; if HasIsFiniteState(GroupOfSelfSimFamily(FamilyObj(a))) and IsFiniteState(GroupOfSelfSimFamily(FamilyObj(a))) then if IsGeneratedByBoundedAutomaton(UnderlyingAutomatonGroup(GroupOfSelfSimFamily(FamilyObj(a)))) then
return OrderUsingSections(a, infinity); fi; fi; if IsActingOnBinaryTree(a) and IsSphericallyTransitive(a) then
return infinity; fi;
ord_loc := OrderUsingSections(a, 10); if ord_loc <> fail then
return ord_loc; fi;
return OrderUsingSections(a, infinity); end);
find_all_sections := function(s)
local i; if not s!.word in state_words then
Add(state_words, s!.word); for i in [1..s!.deg] do find_all_sections(Section(s, i)); od; fi; end;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.