# ContinuedFractions fail on large integers?

I've been doing some work with continued fractions, and when I get to a large enough number, I start hitting an error. For example, with the ContinuedFraction from [(18806263158919164762262694978536817267490601162205305175017345804331141023863425152608922362862834892943764814900901973487239748665085369033027389281788183,), [1, 1, 1, 1, 37612526317838329524525389957073634534981202324410610350034691608662282047726850305217844725725669785887529629801803946974479497330170738066054778563576366]]), I get the error below.

Specifically, I get it after I've created a ContinuedFraction with the arguments above, and then call .value() on it. I've tried to make sure all of those are sage Integer types, but it doesn't seem to help, and it looks like internally the CF code is overflowing somewhere. Is there any way around this, or is this a limitation I'll have to live with?

Thanks for any help!

    Traceback (most recent call last):
self.run()
self._target(*self._args, **self._kwargs)
File "/home/tc/code/cfp/pi/piX/ones.py", line 16, in leeloo
v = ocf.value()
Q = QuadraticField(DD, 'sqrt%d' % DD)
return NumberField(f, name, check=False, embedding=embedding, latex_name=latex_name, **args)
return NumberField_version2(polynomial=polynomial, name=name, check=check, embedding=embedding, latex_name=latex_name, assume_disc_small=assume_disc_small, maximize_at_primes=maximize_at_primes, structure=structure)
x = number_field_morphisms.root_from_approx(polynomial, embedding)
ValueError: Cannot convert NaN or infinity to Pari float

edit retag close merge delete

Sort by » oldest newest most voted

Thanks for your report. The problem comes from the fact that you can not create quadratic field with very large D

sage: QuadraticField(4**1000+1)
Traceback (most recent call last):
...
ValueError: Cannot convert NaN or infinity to Pari float


I opened the ticket #23459 to track the issue.

EDIT: in the mean time you can use the following modification of value that I adapted from the .value() method of the continued fraction

def periodic_cf_value(cf):
from sage.rings.continued_fraction import last_two_convergents

if cf._x1 and cf._x1 < 0:
return -(-cf).value()

if cf._x2 is Infinity:
return cf._rational_()

# determine the equation for the purely periodic cont. frac. determined
# by self._x2
p0,q0,p1,q1 = last_two_convergents(cf._x2)

# now x is one of the root of the equation
#   q1 x^2 + (q0 - p1) x - p0 = 0
D = (q0-p1)**2 + 4*q1*p0
x = ((p1 - q0) + sqrt(D)) / (2*q1)

p0,q0,p1,q1 = last_two_convergents(cf._x1)
return (p1*x + p0) / (q1*x + q0)


With the above function you can do with your list l

sage: x = continued_fraction(l)
sage: v = periodic_cf_value(x)


However, the number obtained is a symbolic number not that easy to work with

sage: parent(v)
Symbolic Ring

more