Very interesting issue, superbly documented by Kirby, thanks!

May I contribute a slightly streamlined version of the seidel-generator:
see attachment. (Please check if everything is correct.)

Regards,
Gregor


kirby urner schrieb:
Just adding to what's on file, not sure this is a "must have" but it's
fun to do, especially given the association of Bernoulli Numbers with
"the first computer program" as scoped out in Ada's notes:

http://www.flickr.com/photos/17157...@n00/3718903352/sizes/o/  (shell
view, Akbar font)

http://www.4dsolutions.net/ocn/python/ada.py   (source code)

According to Wikipedia, this is similar to what Knuth recommends i.e.
we're staying with integer operations, although I'm using the Fraction
type to output results (Bernoulli numbers are fractions with lots of
digits once you get into 'em, ideal grist for the mill when learning
about Python generators).

Kirby
4D

"""
Python version: 3.1
author: Kirby Urner, 4D Solutions
release: 1.01, July 15, 2009

quick and dirty implementation of Bernoulli numbers
as a generator, getting clues from Wikipedia article

code of seidel generator slightly streamlined by Gregor Lingl


Dedication:
"to Ada Byron, with respect and admiration"

(hence name ada.py)

"In note G of Ada Lovelace's notes on the
Analytical engine from 1842, Lovelace
describes an algorithm for generating
Bernoulli numbers with Babbage's machine [~ 1].
As a result, the Bernoulli numbers have
the distinction of being the subject of
the first computer program."
Wikipedia:  http://en.wikipedia.org/wiki/Bernoulli_number

Source code (current version):
http://www.4dsolutions.net/ocn/python/ada.py

"""

from fractions import Fraction

def seidel():
    """
    "...in 1877 Philipp Ludwig von Seidel published an ingenious
    algorithm which makes it extremely simple to calculate Tn."
    (Ibid, Wikipedia)
    
    See OEIS:
    http://www.research.att.com/~njas/sequences/A000111
    """
    yield 1
    yield 1
    row = [1]
    while True:
        t = 0
        newrow = []
        for i in row:
            t += i
            newrow.append(t)
        newrow.append(t)
        yield t
        row = reversed(newrow)

def bernoulli():
    yield Fraction(1,1)
    yield Fraction(-1,2)
    seidelgen = seidel()
    next(seidelgen)
    sign = 1
    n = 2
    while True:
        sign *= -1
        denom = 2**n -4**n
        numer = sign * n * next(seidelgen)
        next(seidelgen)
        n += 2
        yield Fraction(numer, denom)
_______________________________________________
Edu-sig mailing list
Edu-sig@python.org
http://mail.python.org/mailman/listinfo/edu-sig

Reply via email to