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;