group.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
class KNOT_GROUP
class KNOT_GROUP is
-- 2001/1 merge group code for Theta-curve
-- vertex relation (a b c)
--
-- 1997/1 1997/8
-- un-oriented surface in S^4
--
-- 1996/10
-- LINUX version
--
-- Kouji Kodama 1989/8
-- FTL-Modula2 version
-- 1. Assume the relation be the form of
-- (a b a~ c~) or (a b) or (a b c).
-- Relations are in Relator[0..size-1].
printWordLog(w:WORD) is
#LOGOUT+" "+w.wstr+"\n";
end;
getThetaVertexR(TCode:TCODE, inout i1:INT, out word:WORD):BOOL is
-- i1 is start/end of 1-st string
word:=#;
k1::=TCode.compoStart(1.int);
k2::=TCode.compoStart(2.int);
k3::=TCode.compoStart(3.int);
if VERTEXC::ks.in(TCode[i1].sep) then
if VERTEXC::positive.in(TCode[i1].sep) then
word.append(TCode[k1].gen);
word.append(TCode[k2].gen);
word.append(TCode[k3].gen);
return true;
elsif VERTEXC::negative.in(TCode[i1].sep) then
word.append(TCode[k1].gen);
word.append(TCode[k3].gen);
word.append(TCode[k2].gen);
return true;
end;
elsif VERTEXC::ke.in(TCode[i1].sep) then
k1:=TCode[k1].companion;
k2:=TCode[k2].companion;
k3:=TCode[k3].companion;
if VERTEXC::positive.in(TCode[i1].sep) then
word.append(TCode[k1].gen);
word.append(TCode[k3].gen);
word.append(TCode[k2].gen);
return true;
elsif VERTEXC::negative.in(TCode[i1].sep) then
word.append(TCode[k1].gen);
word.append(TCode[k2].gen);
word.append(TCode[k3].gen);
return true;
end;
end;
return false;
end;
getCrossR(TCode:TCODE, inout i1:INT, out word:WORD):BOOL is
n0,n1,n2,n3:INT;
word:=#;
loop i1:=i1+1; while!( ~VERTEXC::endc.in(TCode[i1].sep)) ;
if VERTEXC::under.in(TCode[i1].sep)
and (TCode[i1].companion<TCode.bandStart) then
n1:=TCode[i1].gen;
n3:=TCode[i1+1].gen;
n2:=TCode[TCode[i1].companion].gen;
if (n1/=n2) then
if ~VERTEXC::positive.in(TCode[i1].sep) then
n0:=n1; n1:=n3; n3:=n0;
end;
word.append(n2); word.append(n3);
word.append(-n2); word.append(-n1);
return true;
end;
end;
end;
return false;
end;
getBandR(TCode:TCODE, inout bds:INT, out word:WORD):BOOL is
-- need tStart
word:=#;
bds:=TCode.endOfString(bds,1.int)+1;
if VERTEXC::endc.in(TCode[bds].sep) then return false; end;
bde:INT:=TCode.endOfString(bds,1.int);
oriFlg:BOOL:=VERTEXC::positive.in(TCode[TCode[bds].companion].sep);
word.append(TCode[bds].gen);
i2:INT;
loop i1::=(bds+1).upto!(bde-1);
i2:=TCode[i1].companion;
if VERTEXC::under.in(TCode[i1].sep) and (i2<TCode.bandStart) then
if VERTEXC::positive.in(TCode[i1].sep) then
word.append(TCode[i2].gen);
else word.append(-TCode[i2].gen);
end;
end;
end;
if oriFlg=(VERTEXC::positive.in(TCode[TCode[bde].companion].sep)) then
word.append(-TCode[bde].gen);
else
word.append(TCode[TCode[bde].companion].gen);
end;
loop i1::=(bde-1).downto!(bds+1);
i2:=TCode[i1].companion;
if VERTEXC::under.in(TCode[i1].sep) and (i2<TCode.bandStart) then
if VERTEXC::positive.in(TCode[i1].sep) then
word.append(-TCode[i2].gen);
else word.append(TCode[i2].gen);
end;
end;
end;
return true;
end;
get_Relator(TCode:TCODE,out relator:ARRAY{WORD},out gen2compo:ARRAY{CARD}) is
-- gen2compo[1..gen_max]: convert gen to component
get_Relator(TCode, out relator);
gen2compo:=#(TCode[TCode.length].gen.card+1);
gen2compo.to_val(0);
loop i:CARD:=0.upto!(TCode.length.card-1); gen2compo[TCode[i].gen.card]:=TCode[i].compo.card; end;
end;
get_Relator(TCode:TCODE, out relator:ARRAY{WORD}) is
relator:=#;
i1:INT:=0.int; word:WORD:=#;
-- crossing relations
loop while!( getCrossR(TCode,inout i1, out word) );
relator:=relator.resize(relator.size+1);
relator[relator.size-1]:=word;
end;
-- band relations
oriFlg:BOOL;
loop i::=0.up!; while!( ~VERTEXC::endc.in(TCode[i].sep));
i1:=TCode[i].companion;
if VERTEXC::ts.in(TCode[i].sep) then
oriFlg:=VERTEXC::positive.in(TCode[i1].sep);
elsif VERTEXC::te.in(TCode[i].sep) and
(oriFlg/=(VERTEXC::positive.in(TCode[i1].sep))) then
-- un-orientable band
word:=#;
word.append(TCode[i1].gen);
word.append(TCode[i].gen);
relator:=relator.resize(relator.size+1);
relator[relator.size-1]:=word;
end;
end;
end;
get_Relator_Theta(TCode:TCODE, out relator:ARRAY{WORD},out gen2compo:ARRAY{CARD}) is
-- gen2compo[1..gen_max]: convert gen to component(string).
get_Relator_Theta(TCode, out relator);
gen2compo:=#(TCode[TCode.length].gen.card+1);
gen2compo.to_val(0);
loop i::=0.upto!(TCode.length-1); gen2compo[TCode[i].gen.card]:=TCode[i].compo.card; end;
end;
get_Relator_Theta(TCode:TCODE, out relator:ARRAY{WORD}) is
-- relator=| crossing relations, 2 of verteces relations|.
relator:=#;
-- crossing relations
i1:INT:=0.int; word:WORD:=#;
loop while!( getCrossR(TCode,inout i1, out word) );
relator:=relator.resize(relator.size+1);
relator[relator.size-1]:=word;
end;
-- vertex relation
i1:=TCode.compoStart(1.int);
if getThetaVertexR(TCode,inout i1,out word) then
relator:=relator.resize(relator.size+1);
relator[relator.size-1]:=word;
end;
i1:=TCode.endOfString(TCode.compoStart(1.int),1.int);
if getThetaVertexR(TCode,inout i1,out word) then
relator:=relator.resize(relator.size+1);
relator[relator.size-1]:=word;
end;
end;
printKnotR(TCode:TCODE) is
#OUT+"Crossing relation:\n";
i1:INT:=0.int; word:WORD:=#; tStart::=TCode.bandStart;
loop while! (getCrossR(TCode,inout i1,out word) and(i1<tStart) ); printWordLog(word); end;
end;
printBandR(TCode:TCODE) is
#OUT+"Band relation:\n";
i1:INT:=TCode.bandStart.int-1; word:WORD:=#;
loop while!( getBandR(TCode,inout i1,out word) ); printWordLog(word); end;
end;
printThetaR(TCode:TCODE) is
#OUT+"Vertex relation:\n";
i1::=TCode.compoStart(1.int); word:WORD:=#;
if getThetaVertexR(TCode,inout i1,out word) then printWordLog(word); end;
i1:=TCode.endOfString(TCode.compoStart(1.int),1.int);
if getThetaVertexR(TCode,inout i1,out word) then printWordLog(word); end;
end;
printGroup(TCode:TCODE) is
c0,cp0,cn0,l0,b0:INT;
maxG::=TCode.number_gen;
TCode.numbers_count(inout c0,inout cp0,inout cn0,inout l0,inout b0);
#LOGOUT+"\n"; LOGOUT::LogTime;
#LOGOUT+"#compo = "+l0.str+"\n";
#LOGOUT+"#C_posi = "+cp0.str+"\n";
#LOGOUT+"#C_nega = "+cn0.str+"\n";
#LOGOUT+"#C = "+(cp0+cn0).str+"\n";
#LOGOUT+"writhe = "+(cp0-cn0).str+"\n";
#LOGOUT+"#band = "+b0.str+"\n";
if l0=1.int then LOGOUT::Title("Knot","group");
else LOGOUT::Title("Link","group"); #LOGOUT+l0.str+" component link\n";
end;
#LOGOUT+maxG.str+" generator";
if maxG>1 then #LOGOUT+"s"; end;
#LOGOUT+".\n";
#LOGOUT+"number of positive/negative crossing: "+ cp0.str+", "+cn0.str+"\n";
relator:ARRAY{WORD};
get_Relator(TCode, out relator);
if relator.size=0 then #LOGOUT+"The group has no relation.\n";
else
printKnotR(TCode); --crossing relation
if TCode.has_band then printBandR(TCode); end; --band relation
end;
LOGOUT::flush;
end;
printGroupTheta(TCode:TCODE) is
c0,cp0,cn0,l0,b0:INT;
maxG::=TCode.number_gen;
TCode.numbers_count(inout c0,inout cp0,inout cn0,inout l0,inout b0);
#LOGOUT+"\n"; LOGOUT::LogTime;
LOGOUT::Title("Theta","group");
#LOGOUT+maxG.str+" generator";
if maxG>1 then #LOGOUT+"s"; end;
#LOGOUT+".\n";
#LOGOUT+"number of positive/negative crossing: "+ cp0.str+", "+cn0.str+"\n";
relator:ARRAY{WORD};
get_Relator_Theta(TCode, out relator);
if relator.size=0 then #LOGOUT+"The group has no relation.\n";
else
printKnotR(TCode); --crossing relation
printThetaR(TCode);
end;
LOGOUT::flush;
end;
end;