Python can handle Very Large Numbers

vegaseat 2 Tallied Votes 5K Views Share

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)
mlin 0 Newbie Poster

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
ultimatebuster 14 Posting Whiz in Training

i know this for a long time. lol

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

Ene Uran 638 Posting Virtuoso

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

Lucaci Andrew 140 Za s|n

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
paddy3118 11 Light Poster

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.

sneekula 969 Nearly a Posting Maven

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
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.