[Edu-sig] another solution (OST pi day challenge)

Kirby Urner kurner at oreillyschool.com
Mon Mar 14 23:56:03 CET 2011


by Horacio Nunez and posted to the OST FB zone before the end of Pi Day:

http://merthin.com/?p=159  (source code below)

Congratulations Horacio, and happy Pi Day.

That's 2 for Python.  Score!

OST


======


##author: Horacio Nunez

import decimal, math, functools

D = decimal.Decimal
C = decimal.getcontext()

C.prec = 1024

def multiply(x,y): return C.multiply(x,y)
def divide(x,y): return C.divide(x,y)
def addition(x,y): return C.add(x,y)
def power(x,y): return C.power(x,y)
def sqrt(x): return C.sqrt(x)

def factorial(n):
    result = 1
    while n > 1:
        result *= n
        n = n - 1
    return D(result)

def Ramanujan(top):
    def serie(n):
        num = multiply(factorial(4 *
n),addition(D(1103),multiply(D(26390),D(n))))
        dem = multiply(power(factorial(n),D(4)),power(D(396),multiply(D(4),D(n))))
        return divide(num,dem)
    Sum = functools.reduce((lambda x,y: addition(x,y)),map(serie,range(0,top)))
    return multiply(divide(multiply(D(2),sqrt(D(2))),D(9801)),Sum)

def diff(str1,str2):
    if len(str1) != len(str2):
        return "Strings doesn't have the same length"
    else:
        for n in range(0,len(str1)):
            if str1[n] != str2[n]:
                return "They differ at " + str(n) + ": " + str1[n] + "
!= " + str2[n]
        return "They are equals!"

approx_pi = D("""3.14159265358979323846264338327950288419716939937510582097494
                 4592307816406286208998628034825342117067982148086513282306647
                 0938446095505822317253594081284811174502841027019385211055596
                 4462294895493038196442881097566593344612847564823378678316527
                 1201909145648566923460348610454326648213393607260249141273724
                 5870066063155881748815209209628292540917153643678925903600113
                 3053054882046652138414695194151160943305727036575959195309218
                 6117381932611793105118548074462379962749567351885752724891227
                 9381830119491298336733624406566430860213949463952247371907021
                 7986094370277053921717629317675238467481846766940513200056812
                 7145263560827785771342757789609173637178721468440901224953430
                 1465495853710507922796892589235420199561121290219608640344181
                 5981362977477130996051870721134999999837297804995105973173281
                 6096318595024459455346908302642522308253344685035261931188171
                 0100031378387528865875332083814206171776691473035982534904287
                 5546873115956286388235378759375195778185778053217122680661300
                 1927876611195909216420198""".replace('\n','').replace(' ',''))

result = Ramanujan(130);

expected_fraction = str(divide(D(1),approx_pi))[:1001]
actual_fraction = str(result)[:1001]
expected_pi = str(approx_pi)
actual_pi = str(divide(D(1),result))[:1001]

print("Regarding 1/pi: " + diff(expected,actual))

print("Regarding pi: " + diff(expected_pi,actual_pi))


More information about the Edu-sig mailing list