# [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 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 *
dem = multiply(power(factorial(n),D(4)),power(D(396),multiply(D(4),D(n))))
return divide(num,dem)
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))
```