Thanks.  I was hoping for something better, since 
the problem as an intellectual exercise feels like 
it should have a well-known solution already.

Pragmatically it doesn't matter.  In a serial
program the sum is computed one term at a time,
and you simply compare the next term (y^k)%!k 
against epsilon to know when to stop.



----- Original Message -----
From: John Randall <[EMAIL PROTECTED]>
Date: Monday, December 4, 2006 4:02 am
Subject: Re: [Jgeneral] Bug?  Sin of pi.

> Roger Hui wrote:
> > Do you have a good estimate for how many terms
> > are needed in the exponential series?  That is,
> > given epsilon>0 and real y>0, what is a good
> > estimate for the smallest n such that
> > epsilon > (y^n)%!n  ?
> >
> > Such an n must exist because the limit of the
> > sequence (y^n)%!n is 0.  My current approach is to
> > use Stirling's approximation for !n .
> >
> 
> Here is a suggestion that does not involve anything as fancy as
> Stirling's approximation.  In each case
> 
> epsilon <verb> y
> 
> gives a value for n such that epsilon>(y^n)%!n.  The verbs ndirect and
> nbinary give the minimal n, while ncrude is used to get an easy upper
> bound.
> 
> NB. Get a crude estimate
> ncrude=:4 : 0
> m=.>.+:y
> assert.(2*y)<m+1
> n=.>.m+ 2^.(y^m)%x*!m
> assert.x>(y^n)%!n
> )
> 
> NB. Go through term by term for an exact estimate.
> ndirect=:4 : 0
> n=.0
> t=.1
> while. t>:x do.
> n=.>:n
> t=.(y*t)%n
> end.
> assert.x>(y^n)%!n
> n
> )
> 
> NB. Start with crude estimate, then do binary search.
> nbinary=:4 : 0
> hi=.x ncrude y
> lo=.0
> while. 1<hi-lo do.
> n=.<.-:hi+lo
> if. x>(y^n)%!n do. hi=.n else. lo=.n end.
> end.
> n=.hi
> assert.x>(y^n)%!n
> )
> 
>   1e_40 ndirect 7
> 70
>   1e_40 ncrude 7
> 150
>   1e_40 nbinary 7
> 70


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to