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