[Edu-sig] Pascal's Triangle (in 2.6)

kirby urner kirby.urner at gmail.com
Sat Jan 30 18:23:59 CET 2010


"""
Rows of Pascal's Triangle

See:
http://en.wikipedia.org/wiki/Pascal%27s_triangle
"Calculating an individual row"

Consider a row starting as follows:
1, 12...

Initialize to [1] and multiply by (row_num/1)
to get the next term, row[1].

Then decrement and increment again, getting
(11 / 2), (10 / 3), (9 / 4) and so forth, and multiply
by the last term so far.  Stop when the numerator
is 0.

1 * (12/1) = 12
12 * (11 / 2) = 66
66 * (10 / 3) = 220
220 * (9 / 4) = 495

etc.

This is another way of computing successive values
of C(n, k) without using a factorial function and
dividing.

Independently discovered by David Koski,
implemented in Python by Kirby Urner

"""

def pascal_row(row_num):
    numer = row_num
    denom = 1
    # initialize row of Pascal's Triangle
    row = [1]
    while numer > 0:
        row.append((row[-1] * numer/denom))
        numer -= 1  # decrement numerator
        denom += 1  # increment denominator
    return row

def pascal_mod2(row_num = 0):
    """
    row integers mod 2, give a binary string which
    corresponds to Rule 60 in the Wolfram categorization
    scheme for cellular automata

    http://www.research.att.com/~njas/sequences/A001317
    """
    while True:
        therow = pascal_row(row_num)
        binary = "".join(str(i % 2) for i in therow)
        yield [int(binary,2), binary]
        row_num += 1

"""
traditional generator for successive rows, included
for completeness
"""

def pascal_gen():
    row = [1]
    while True:
        yield row
        row = [i + j for i,j in zip(row + [0], [0] + row)]


More information about the Edu-sig mailing list