finitefield.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
class FINITE_FIELD < $STR,$HASH,$IS_LT{FINITE_FIELD}
class FINITE_FIELD < $STR,$HASH,$IS_LT{FINITE_FIELD} is
include COMPARABLE;
shared default_base:INT;
attr n, p:INT; -- n mod (p)
set_base(base:INT) is default_base:=#(base); end;
create(i:INT, base:INT):SAME is
default_base:=base; res:SAME:=new; res.p:=base;
m::=i%base; if m>=0 then res.n:=m; else res.n:=m+base; end;
return res;
end;
create(i:INT):SAME is return #(i,default_base); end;
create(i:INTI):SAME is return #( (i%default_base.inti).int ,default_base); end;
copy:SAME is return #(n,p); end;
zero:SAME is return #(0); end;
one:SAME is return #(1); end;
is_eq(o:SAME):BOOL is
return (n=o.n)and(p=o.p);
end;
is_lt(o:SAME):BOOL pre p=o.p is return compare(o)=-1; end;
compare(o:SAME):INT is
if n<o.n then return -1;
elsif n>o.n then return 1;
else return 0
end;
end;
sign:INT is return ((p/2)-n).sign; end;
abs:SAME is return self; end;
is_zero:BOOL is return n.is_zero; end;
is_one:BOOL is return n=1; end;
hash:INT is return n; end;
int:INT is return n; end;
inti:INTI is return n.inti; end;
str:STR is return n.str; end;
inspect:STR is return "["+n.str+"%"+p.str+"]"; end;
negate:SAME is return #(-n,p); end;
inverse:SAME pre n.is_non_zero is return #(INT_EXT::inv(p,n), p); end;
plus(o:SAME):SAME pre p=o.p is return #(n+o.n, p); end;
plus(o:INT):SAME is return #(n+o, p); end;
minus(o:SAME):SAME pre p=o.p is return #(n-o.n, p); end;
minus(o:INT):SAME is return #(n-o, p); end;
times(o:SAME):SAME pre p=o.p is return #(n*o.n, p); end;
times(o:INT):SAME is return #(n*o,p); end;
pow(i:INT):SAME is
if i>=0 then return #(INT_EXT::power_mod(n,i,p), p); else return inverse^(-i); end;
end;
div(o:SAME):SAME pre o.n.is_non_zero and (p=o.p) is return times(o.inverse); end;
div(i:INT):SAME is return #(n*INT_EXT::inv(p,i),p); end;
up!:SAME is
-- Yield successive from self to `p-1'.
p0::=p; loop r::=n.upto!(p0-#(1)); yield #(r,p0); end;
end;
end;