Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Support for arbitrarily large numbers?

Hi, I'm trying to compute the Juggler Sequence for relatively large numbers. Standard python doesn't calculate these correctly; I've discovered that Mathematica does, but I'm more familiar with Python and someone suggested I try out Sage.

I've tried this a couple ways using SageCell, and haven't yet succeeded. Here's the simplest possible implementation:

def juggle(n):
    if n % 2:
        return floor(sqrt(n)**3)
    return floor(sqrt(n))

When I run this on 37, it works perfectly:

x = 37
print x,

while x > 1:
    x = juggle(x)
    print u"\u2192 {}".format(x),

produces

37 → 225 → 3375 → 196069 → 86818724 → 9317 → 899319 → 852846071 → 24906114455136 → 4990602 → 2233 → 105519 → 34276462 → 5854 → 76 → 8 → 2 → 1

which standard python fails (it finds 3374 instead of 3375). However, if I try a hard one, say, x = 48443, it times out after a few iterations:

48443 → 10662193 → 34815273349 → 6496130099313865 → 523578821252958052233532 → 723587466207 → 615512041010804067 → 482897358660562651148793788 → 21974925680433 → 103012783516625098121 → 1045530445028727953685811220915

I can improve this by using logarithms:

def juggle(n):
    if n % 2:
        return floor(exp(1.5*log(n)))
    return floor(sqrt(n))

This implementation is much faster and gets much farther; however, it ends with an error:

TypeError: ECL says: #<a FLOATING-POINT-OVERFLOW>

I'd like to attach the full output as a text file, because it involves some very large numbers, but I don't have the karma yet. The number which causes the code to crash is about 3300 characters long. Here's the traceback, at least:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-a9218cbdcf1b> in <module>()
      8 
      9 while x > Integer(1):
---> 10     x = juggle(x)
     11     print u"\u2192 {}".format(x),

<ipython-input-1-a9218cbdcf1b> in juggle(n)
      1 def juggle(n):
      2     if n % Integer(2):
----> 3         return floor(exp(RealNumber('1.5')*log(n)))
      4     return floor(sqrt(n))
      5 

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/functions/other.pyc in __call__(self, x, **kwds)
    412 
    413         try:
--> 414             return floor(SR(x).full_simplify().canonicalize_radical())
    415         except ValueError:
    416             pass

/home/sc_serv/sage/src/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.simplify_full (build/cythonized/sage/symbolic/expression.cpp:53709)()
   9698         x = self
   9699         x = x.simplify_factorial()
-> 9700         x = x.simplify_rectform()
   9701         x = x.simplify_trig()
   9702         x = x.simplify_rational()

/home/sc_serv/sage/src/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.simplify_rectform (build/cythonized/sage/symbolic/expression.cpp:55646)()
   9846 
   9847         """
-> 9848         simplified_expr = self.rectform()
   9849 
   9850         if complexity_measure is None:

/home/sc_serv/sage/src/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.rectform (build/cythonized/sage/symbolic/expression.cpp:53186)()
   9530 
   9531         """
-> 9532         return self.maxima_methods().rectform()
   9533 
   9534     def unhold(self, exclude=None):

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/symbolic/maxima_wrapper.pyc in __call__(self, *args, **kwds)
     30         """
     31         return super(MaximaFunctionElementWrapper, self).__call__(*args,
---> 32                 **kwds).sage()
     33 
     34 class MaximaWrapper(SageObject):

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/interfaces/interface.pyc in __call__(self, *args, **kwds)
    655 
    656     def __call__(self, *args, **kwds):
--> 657         return self._obj.parent().function_call(self._name, [self._obj] + list(args), kwds)
    658 
    659     def help(self):

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/interfaces/interface.pyc in function_call(self, function, args, kwds)
    576                                        [s.name() for s in args],
    577                                        ['%s=%s'%(key,value.name()) for key, value in kwds.items()])
--> 578         return self.new(s)
    579 
    580     def _function_call_string(self, function, args, kwds):

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/interfaces/interface.pyc in new(self, code)
    345 
    346     def new(self, code):
--> 347         return self(code)
    348 
    349     ###################################################################

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/interfaces/interface.pyc in __call__(self, x, name)
    280 
    281         if isinstance(x, string_types):
--> 282             return cls(self, x, name=name)
    283         try:
    284             return self._coerce_from_special_method(x)

/home/sc_serv/sage/local/lib/python2.7/site-packages/sage/interfaces/interface.pyc in __init__(self, parent, value, is_name, name)
    695                 self._name = parent._create(value, name=name)
    696             except (TypeError, RuntimeError, ValueError) as x:
--> 697                 raise TypeError(x)
    698 
    699     def _latex_(self):

TypeError: ECL says: #<a FLOATING-POINT-OVERFLOW>

Does anyone have any suggestions for me? Thanks in advance!