[Edu-sig] Fibonacci Numbers and Phi (again)

kirby urner kirby.urner at gmail.com
Sat Nov 23 05:57:34 CET 2013


"""
Another version, using a generator of Fibonacci "triples"...

Encapsulating a discovery -- not a proof.
By David Koski (Python by K. Urner)

Failure at around 37th power is due to floating point limitations.
"""

import unittest

def fib_triple(a=0, b=1):
    """
    >>> from anyproject import fib_triple
    >>> gem = fib_triple()
    >>> next(gem)
    (0, 1, 1)
    >>> next(gem)
    (1, 1, 2)
    >>> next(gem)
    (1, 2, 3)
    >>> next(gem)
    (2, 3, 5)
    >>> next(gem)
    (3, 5, 8)
    >>> gem = fib_triple(13,-8)
    >>> next(gem)
    (13, -8, 5)
    >>> next(gem)
    (-8, 5, -3)
    >>> next(gem)
    (5, -3, 2)
    >>> next(gem)
    (-3, 2, -1)
    >>> next(gem)
    (2, -1, 1)
    >>> next(gem)
    (-1, 1, 0)
    """
    c = a + b
    while True:
        yield a, b, a + b
        a, b, c = b, a + b, b + c


series = fib_triple(13,-8)  # 13, -8, 5, -3, 2, -1, 1, 0 , 1, 2, 3, 5, 8

RT5 = pow(5, .5)   # "square root" of five
PHI = (1 + RT5)/2  # golden proportion

def cool_formula():
    """
    Two fib numbers, two apart, plus the one in the middle * sqrt(5)
    all over 2, gives PHI to a power.  Advancing all three sequences
    gives successive powers.
    """
    while True:
        f0, f1, f2 = next(series)
        yield (f0 + f2 + f1 * RT5)/2.0

class TestPhi(unittest.TestCase):

    def test_loop(self):
        gem = cool_formula()
        for e in range(-6, 30):  # adjust range (fails about 37th power)
            answer = next( gem )
            self.assertAlmostEqual( PHI ** e, answer)

if __name__ == "__main__":
    unittest.main()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20131122/e72c99a9/attachment.html>


More information about the Edu-sig mailing list