word.sa


Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
 
-- This code is "GPL"ed. 


class WORD

class WORD is -- group word attr w:ARRAY{INT}; create:SAME is res::=new; res.w:=#; return res; end; create(s:STR):SAME is -- convert STR to WORD. -- format: "2 -1 3 -2 -3 2 1" -- ^^^^^^^^^^^^^^^^word g:INT; s1:STR; res:SAME:=#; sc:STR_CURSOR:=#(s); loop if sc.is_done then return res; end; s1:=STRINGSK::splitStr(inout sc); g:=#(s1); if g.is_non_zero then res.append(g); end; end; return res; end; aget(i:CARD):INT is return w[i]; end; aset(i:CARD, g:INT) is w[i]:=g; end; clone:SAME is res:SAME:=#; res.w:=w.copy; return res; end; size:CARD is return w.size; end; is_trivial:BOOL is return size.is_zero; end; check:BOOL is if void(self) then return false; elsif void(w) then return false; end; return true; end; maxGen:CARD is -- m= max index of generator m::=0; loop m:=m.max(w.elt!.abs.card); end; return m; end; total_power:INT is p:INT:=INT::zero; loop e::=w.elt!; p:=p+e.sgn; end; return p; end; total_power(g:INT):INT is -- total power for g-th generator. p:INT:=INT::zero; loop e::=w.elt!; if g=e.abs then p:=p+e.sgn; end; end; return p; end; total_appearance(g:INT):INT is -- total appearance for g-th generator. p:INT:=INT::zero; loop e::=w.elt!; if g=e.abs then p:=p+1; end; end; return p; end; total_positive_power:INT is p:INT:=INT::zero; loop if w.elt!.is_pos then p:=p+INT::one; end; end; return p; end; total_negative_power:INT is p:INT:=INT::zero; loop if w.elt!.is_neg then p:=p+INT::one; end; end; return p; end; reverse:SAME is -- reverse order of elements b:SAME:=#; b.w:=w.reverse; return b; end; inverse:SAME is -- inverse as group res:SAME:=reverse; neg:ROUT{INT}:INT:=bind(_.negate); res.w.map(neg); return res; end; append(b:SAME) is w:=w.append(b.w); end; append(b:SAME):SAME is res:SAME:=clone; res.append(b); return res; end; append(s:INT) is w:=w.append(|s|); end; append(s:INT):SAME is res:SAME:=clone; res.append(s); return res; end; insert(pos:CARD,b:SAME):SAME is res:SAME:=#; if pos.is_pos then res.w:=w.slice(0,pos); end; res.w:=res.w.append(b.w); if pos<w.size then res.w:=res.w.append(w.slice(pos,w.size-pos)); end; return res; end; insert(pos:CARD, s:INT):SAME is res:SAME:=#; if pos.is_pos then res.w:=w.slice(0,pos); end; res.w:=res.w.resize(pos+1); res.w[pos]:=s; if pos<w.size then res.w:=res.w.append(w.slice(pos,w.size-pos)); end; return res; end; insert(pos:CARD, s:INT) is res::=insert(pos,s); w:=res.w; end; delete(pos:CARD) is if pos<(w.size-1) then loop i::=pos.upto!(w.size-2); w[i]:=w[i+1]; end; end; if pos<w.size then w:=w.resize(w.size-1); end; end; delete(pos:CARD):SAME is res:SAME:=clone; res.delete(pos); return res; end; times(s:INT):SAME is return append(s); end; times(b:SAME):SAME is return append(b); end; div(b:SAME):SAME is return times(b.inverse); end; div(s:INT):SAME is return times(-s); end; pow(n:INT):SAME is r:SAME; if n.is_neg then n:=-n; r:=inverse; else r:=clone; end; res:SAME:=#; loop while!(n.is_pos); if n.is_odd then res:=res*r; end; n:=n/2.int; r:=r*r; end; return res; end; pow(n:CARD):SAME is return pow(n.int); end; cancel:SAME is res:SAME:=clone; if size<2 then return res; end; loop i::=(size-2).downto!(0); if (i<(res.w.size-1)) and(res.w[i]=-res.w[i+1]) then res.delete(i+1); res.delete(i); elsif res.w[i].is_zero then res.delete(i); end; end; return res; end; ---------------- str and print out ----------------- printD is -- print for debug/check #OUT+"word "+str+"\n"; end; str_n(nl:CARD):STR is -- convert WORD to STR as a sequence of number -- "\n" can be included. -- format: "1 2 3 -2 -1 -2" s::=""; sep::=""; loop i::=w.ind!; s:=s+sep+w[i].str; sep:=" "; if (nl.is_pos) and (i+1).mod(nl)=0 then s:=s+"\n"; end; end; return s; end; str:STR is return str_n(16); end; wstr(s1,s2,s3:STR):STR is -- convert WORD to STR -- s1(s2 resp.) is pre(post resp.) str for generator name "g". s::=""; sep::=""; loop g::=w.elt!; if g.is_non_zero then s:=s+sep+gstr(g,0.int,s1,s2,s3); sep:=" "; end; end; return s; end; wstr:STR is -- convert WORD to STR in TeX like format -- as "x_{1} x_{2} x_{1}^{-1} x_{2}^{-1}" return wstr("x_{","}","^{-1}"); end; gstr(g:INT,b:INT, s1,s2,s3:STR):STR is -- b: base for coverings -- s1(s2 resp.) is pre(post resp.) str for generator name "g". if g.is_zero then return ""; end; s::=s1+g.abs.str; if b.is_pos then s:=s+"."+b.str; end; s:=s+s2; if g.is_neg then s:=s+s3; end; return s; end; gstr(g:INT, b:INT):STR is -- b: base for coverings. x_{g.b} or x_{g.b}^{-1} return gstr(g,b,"x_{", "}","^{-1}"); end; ind!:CARD is loop yield w.ind!; end; end; end; -- class WORD