#!/usr/bin/python


def isprime(i,known=[2,3,5,7,13]):
    for j in known:
        if i == j:
            return True
        if i % j == 0:
            return False
    return True

def allprimeuntil(n):
    def loop(current=2,known=[2,3,5,7,13,17,19]):
        isprime = True
        for i in known:
            if current % i == 0:
                isprime = False
        if isprime:
            known.append(current)
        if current < n:
            return loop(current+1,known)
        return known
    return loop()

def generateprime(n):
    def loop(current=2,known=[]):
        if current > n:
            return known
        elif [  'not prime'
                for i in known
                if i != current
                if current % i == 0 ]:
            return loop(current+1,known)
        else:
            known.append(current)
            return loop(current+1,known)
    return loop()

if __name__ == '__main__':
    print """
        prime
    """

    known = []
    for i in range(2,128):
        print i,
        if isprime(i,known):
            print "prime"
            known.append(i)
        else:
            print "not prime"
    print "list of prime",known

    print "second algo", allprimeuntil(128)
    print "third algo", generateprime(128)


    print "they are all odd"
    print "let inc then half"
    a = [ (i+1)/2 for i in generateprime(128) ]
    print a
    print "is reversible"
    b = [ (i*2)-1 for i in a ]
    print b
    print "except the first number", 2
