"""
Euclid (Book IX, Prop 36.):  If M is a
Mersenne prime, then the Mth triangular
number is a perfect number.

Context:
http://www.4dsolutions.net/ocn/perfectnumbers.html

(gpl) 2007 by K. Urner, 4D Solutions
"""

# Table 5.1 The Book of Numbers, JH Conway, RK Guy.

mersennep   = [2, 3, 5, 7, 13, 17, 19,
              31, 61, 89, 107, 127, 521, 607,
              1279, 2203, 2281, 3217, 4253, 4423, 9689,
              9941, 11213, 19937, 21701, 23209, 44497,
               86243]


mersennes = (pow(2,p) - 1 for p in mersennep )

def trinumb(n):
    """
    Triangular numbers
    """
    return n*(n+1)//2

def divisors(n):
    """
    Divisors of small numbers:  trial by division

    Changed slightly since video (see web page, URL above)
    """
    thedivisors = [1]
    d = 2
    while True:
        if not n % d:  # if there's no remainder...            

            thedivisors.append(d)
            otherfactor = n//d
            if d != otherfactor:
                thedivisors.append(otherfactor)
        d += 1                
        if d*d > n:
            break
    thedivisors.sort()
    return thedivisors

def test():
    """
    loop through generated Mersennes testing
    Euclid's Prop IX:36
    """
    for M in mersennes:
        print "The Mersenne is... %s" % M
        tri = trinumb(M)
        print "The Triangular Number is... %s" % tri
        print "The divisors of %s are...\n" % tri
        thedivisors = divisors(tri)
        print thedivisors
        print "...and the sum of these divisors is"
        print "(drum roll)..."
        print sum(thedivisors)
        print
        yield None
        
        
        
# code highlighted using py2html.py version 0.8