> < ^ Date: Thu, 23 Feb 1995 12:10:00 -0800
> < ^ From: Jacob Hirbawi <hirbawi@commquest.com >
< ^ Subject: Re: Some questions

Johannes M"uller writes :

Second: I'm in need of a function returning the (rounded) modulus of a
cyclotomic, e.g. something like AbsVal(1+E(4)) giving something about
1414/1000. Is there something I haven't found? (gap3r4p0)

to which Alexander Hulpke responds :

No. At the moment, GAP's implementation of field extensions is a purely
algebraic one. There is no way to extend valuation information from the
ground field to the extension.
It would be possible to write a function 'AbsVal' in the GAP language, that
would utilize the canonical embedding E(n)->exp(2\pi i/n) and get an
approximation of the value by numerical evaluation.

I wrote a function that takes a (real) element in Q(E(n)) and gives an
approximate rational of it. Modifying the code for nonreal elements should
be striaght forward, but I didn't need it. As Alexander commented, the code
is both crude and slow; but for what I was doing it worked reasonably well --
(my application involves generating postscipt graphics from objects calculated
in GAP, so round off errors and the like are not at all critical).
Here's what I wrote :

# Taylor series approximation for cos(r)
cos:=r->Sum([0..8],i->(((-1)^i)/Factorial(2*i))*r^(2*i) );
# rationalize r; basically you express r as a sum of cosines using its
# expansion in the cyclotomics, and then approximate each cosine term
# with above series.
Rat:=function(r) local n,cofs,i,j,twopi,res;
twopi:=710/113;
n:=NofCyc(r);
cofs:=CoeffsCyc(r,n);
res:=cofs[1];
for i in [2..n] do
if cofs[i]<>0 then
res:=res+2*cofs[i]*cos(twopi*(i-1)/n);
j:=CoeffsCyc(E(n)^(i-1)+E(n)^-(i-1),n);
cofs:=cofs-cofs[i]*j;
fi;
od;
return Int(1000*res);
end;


some examples :

gap> a1:=1+E(4);
1+E(4)
gap> a2:=a1*GaloisCyc(a1,-1);  # you get the absolute value using
2

gap> b0:=Rat(ER(2));
1414
gap> b0^2;
1999396    # close enough!

gap> b0:=Rat(ER(5));
2236
gap> b0^2;
4999696


Jacob Hirbawi <JcbHrb@CERF.net>

> < [top]