[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