[Edu-sig] another Python generator (Bernoulli numbers)
kirby urner
kirby.urner at gmail.com
Wed Apr 17 04:30:02 CEST 2013
from fractions import Fraction as R
def choose(n, k):
"""
chosen / adapted from:
http://www.velocityreviews.com/forums/t502438-combination-function-in-python.html
"""
ntok = 1
for t in range(min(k, n-k)):
ntok = ntok*(n-t)//(t+1)
return ntok
def Bernoulli():
"""
Bernoulli Numbers using Fraction type numbers
http://en.wikipedia.org/wiki/Bernoulli_number#Recursive_definition
http://oeis.org/A027641
http://oeis.org/A027642
"""
B = [R(1,1)]
def Sum(m):
total = R(0,1)
for k in range(0,m):
total += choose(m, k) * R(B[k],m-k+1)
return 1 - total
m = 1
while True:
B.append(Sum(m))
yield B[-1]
m += 1
====
>>> thegen = Bernoulli()
>>> [next(thegen) for i in range(20)]
[Fraction(1, 2), Fraction(1, 6), Fraction(0, 1), Fraction(-1, 30),
Fraction(0, 1), Fraction(1, 42), Fraction(0, 1), Fraction(-1, 30),
Fraction(0, 1), Fraction(5, 66), Fraction(0, 1), Fraction(-691, 2730),
Fraction(0, 1), Fraction(7, 6), Fraction(0, 1), Fraction(-3617, 510),
Fraction(0, 1), Fraction(43867, 798), Fraction(0, 1), Fraction(-174611,
330)]
>>> import pprint
>>> pprint.pprint([next(thegen) for i in range(20)], width=80)
[Fraction(0, 1),
Fraction(854513, 138),
Fraction(0, 1),
Fraction(-236364091, 2730),
Fraction(0, 1),
Fraction(8553103, 6),
Fraction(0, 1),
Fraction(-23749461029, 870),
Fraction(0, 1),
Fraction(8615841276005, 14322),
Fraction(0, 1),
Fraction(-7709321041217, 510),
Fraction(0, 1),
Fraction(2577687858367, 6),
Fraction(0, 1),
Fraction(-26315271553053477373, 1919190),
Fraction(0, 1),
Fraction(2929993913841559, 6),
Fraction(0, 1),
Fraction(-261082718496449122051, 13530)]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20130416/83a32e08/attachment.html>
More information about the Edu-sig
mailing list