Subject: BUG in continued fraction, to wit cf(sqrt(31^3));
From: Bernhard Marx
Date: Wed, 06 Oct 2010 15:00:52 +0200
cf(sqrt(31^3));
SHOULD at least give something like
[172,
1,1,1,1,56,1,14,38,3,2,5,1,5,1,1,4,1,2,4,4,31,6,1,6,1,4,2,1,3,1,10,1,2,1,1,2,1,
68,3,8,11,2,1,1,2,2,2,7,3,1,7,3,1,2,2,2,3,1,22,4,6,34,2,1,3,2,22,1,1,2,1,9,1,2,
1,13,15,1,1,1,1,1,1,1,2,10,12,1,2,4,1,1,1,18,1,1,6,1,114,4,1,171,1,4,114,1,6,1,
1,18,1,1,1,4,2,1,12,10,2,1,1,1,1,1,1,1,15,13,1,2,1,9,1,2,1,1,22,2,3,1,2,34,6,4,
22,1,3,2,2,2,1,3,7,1,3,7,2,2,2,1,1,2,11,8,3,68,1,2,1,1,2,1,10,1,3,1,2,4,1,6,1,
6,31,4,4,2,1,4,1,1,5,1,5,2,3,38,14,1,56,1,1,1,1,344]
and NOT what I get (even with cflength:3)
[172,
1,1,1,1,56,1,14,38,3,2,5,1,5,1,1,4,1,2,5,1,2]
I fear the continued fraction is done rather simplistic, having a float of
the value and continuously subtracting the floor() and taking the inverse of
the remaining float, which would eat up a certain number of bits of the
precision of the float PER iteration ...
I fear this is a BUG, that I stumbled across even for smaller numbers than
29791.
If this should be the case, there is an easy way to avoid the problem.
Let r:m0*sqrt(n)+c0 be the periodic continued fraction to be evaluated.
(m0 and c0 are exact rationals (m0 NOT 0), n=a^2+o, n,a,o positive integers
and o <= 2a)
f:bfloat(sqrt(n));
a0:floor(bfloat(m0*f+c0));
/* But now instead of altering f */
d: m0^2*n-(a0-c0)^2;
m1:m0/d;
c1:(a0-c0)/d;
/* exact computations taking of a LIMITED number of bits from the
INITIAL precision of f (constant!) in EACH iteration */
a1:floor(bfloat(m1*f+c1));
d: m1^2*n-(a1-c1)^2;
m2:m1/d;
c2:(a1-c1)/d;
/* ... */
/* until [mj, cj] is equal to a pair previously computed */
--
Neu: GMX De-Mail - Einfach wie E-Mail, sicher wie ein Brief!
Jetzt De-Mail-Adresse reservieren: http://portal.gmx.net/de/go/demail