1.11M Members

Python can handle Very Large Numbers

 
2
 

Scientists and deficit spenders like to use Python because it can handle very large numbers. I decided to give it a test with factorials. Factorials reach astronomical levels rather quickly. In case you can't quite remember, the factorial of 12 is !12 = 1*2*3*4*5*6*7*8*9*10*11*12 = 479001600, that is 479 million and some change! After that languages like C++ start to fizzle quickly! At !16 we get past the nations debt. Python can handle that and more! I stopped at !69 only because the display started to wrap the line. The result has 98 digits in it, I thought I made my point anyway.

# check the numeric range of Python with huge factorials
# factorial(69) still checks out accurately! Has 98 digits in it!
# 171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000
# tested with Python24      vegaseat    01aug2005

def getFactorial(n):
    """returns the factorial of n"""
    if n == 0:
        return 1
    else:
        k = n * getFactorial(n-1)
        return k

for k in range(1, 70):
    print "factorial of", k,"=", getFactorial(k)
 
0
 

I didn't know Python could handle such big numbers natively. Cool stuff, particularly for cryptography I'm sure. I hit a wall at 999.

>>> getFactorial(999)
  File "<stdin>", line 5, in g
  File "<stdin>", line 5, in g
  ...
  File "<stdin>", line 5, in g
RuntimeError: maximum recursion depth exceeded

Try this definition instead. It seems to be getting the same results as yours, but is non-recursive.

>>> def getFactorial(n):
...   r = 1
...   for x in range(n):
...     r = r * (n + 1)
...   return r
...
>>> getFactorial(100000)
(insert monster number here)L
 
0
 

i know this for a long time. lol

I think i had something x 10^500 or 10^5000 at one point.

 
1
 

There is a limit to recursions in Python,
find the limit with
sys.getrecursionlimit() --> usually 1000
Can be changed with
sys.setrecursionlimit(new_limit)

 
1
 

You could use an iterative version of the factorial for big numbers:

'''
>>> factorial(1000)
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
'''

Here's the version:

>>> def factorial(nr, prod = 1):
    for i in range(nr): prod *= (i + 1)
    return prod

[Edit:] Nvm, already posted this above, didn't see it.
[Edit2:] Nvm the first edit, the factorial function provided above is wrong:

def getFactorial(n):
    r = 1
    for x in range(n):
        r = r * (n + 1)
    return r

it should be

def getFactorial(n):
    r = 1
    for x in range (n):
        r = r * (x+1)
    return r
 
0
 

If you want even larger numbers from a simple series then the Ackermann function is to factorials as factorials are to a simple count of integers.

 
1
 

The factorial function is part of the math module in later versions of Python:

''' math_factorial.py
tested with Python 2.7.3
'''

from math import factorial

for k in range(1, 101):
    print("factorial of {} = {}".format(k, factorial(k)))

print(type(factorial(10)))       # <type 'int'>
print(type(factorial(100)))      # <type 'long'>
print(len(str(factorial(100))))  # 158
print(len(str(factorial(69))))   # 99
Isn't it about time forums rewarded their contributors?

Earn rewards points for helping others. Gain kudos. Cash out. Get better answers yourself.

It's as simple as contributing editorial or replying to discussions labeled or OP Kudos

You
This is an OP Kudos discussion and contributors may be rewarded
Post:
Start New Discussion
Tags Related to this Article