goldbach.py

#!/usr/bin/env python
#
# Author:  Yotam Medini  [email protected] -- Created: 2006/April/23
#
# Find Goldbach sums
#

import sys

M = 2006  # check limit


# Eratosthenes - helping function.
# Mark by False all multipliers of n in the sieve.
# Note that sieve is a list that is being _changed_ here for the caller.
def mark_mults(sieve, n):
    mult = n*n
    while mult < len(sieve):
        sieve[mult] = False
        mult += n

def eratosthenes(M):
    primes = []
    sieve = (M + 1)*[True]
    n_primes = 0
    n = 2
    while n <= M:
        if sieve[n]:
            primes += [n]
            mark_mults(sieve, n)
        n += 1
    return primes


# Program begins
primes = eratosthenes(M)
n_primes = len(primes)
n = 4
while n <= M:
    found = False
    pindex1 = 0
    while (pindex1 < n_primes) and not found:
        pindex2 = pindex1
        while (pindex2 < n_primes) and (primes[pindex1] + primes[pindex2] < n):
            pindex2 += 1
        if (pindex2 < n_primes):
            p1 = primes[pindex1]
            p2 = primes[pindex2] 
            found = (p1 + p2 == n)
            if found:
                sys.stdout.write("%4d = %3d + %4d\n" % (n, p1, p2))
        pindex1 += 1
    if not found:
        sys.stderr.write("Goldbach is wrong! n=%d\n" % n)
        sys.exit(1)
    n += 2
sys.exit(0)

           
               
            
    
    

Generated by GNU enscript 1.6.4.