def problem35(n):
    """
    >>> problem35(1000000)
    55
    """
    primes = [2, 3]
    prime.primesBelow_fast(50, primes)
    prime.primesBelow_fast(100000, primes)
    prime.primesBelow_fast(n, primes)
    primes = [str(p) for p in primes]

    #to make it fast comment out above lines 
    #uncomment below line 

    #primes = prime.get_primes_from_file()
    
    evens = ['0', '2', '4', '6', '8']
    required_primes = filter(lambda s: not set(s).intersection(evens), primes)
    result = 1
        
    for num in required_primes:
        value = lib.rotation(list(num), required_primes)
        result = result + value

    return result
def problem37(n):
    """
    >>> problem37(1000000)
    748317
    """
    primes_below_bilion = [2, 3]
    prime.primesBelow_fast(50, primes_below_bilion)
    prime.primesBelow_fast(100000, primes_below_bilion)
    prime.primesBelow_fast(n, primes_below_bilion)
    
    primes = {}
    for p in primes_below_bilion:
        primes.setdefault(len(str(p)), []).append(str(p))

    #to make it fast comment out above lines 
    #uncomment below line 

    #primes = prime.get_primes_dict_from_file()

    result = [] 
    for L in primes.values():
        call_is_truncatable_prime = lambda n: lib.is_truncatable_prime(n, primes)
        result.extend(filter(call_is_truncatable_prime, L))

    return sum(map(lambda x: int(x), result))
def problem50():
    primesList = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
    prime.primesBelow_fast(1000000, primesList)
    primesDict = dict.fromkeys(primesList)
    
    resultDict = {}

    length, count, limit = len(primesList), 1, primesList[-1]
    currentList = primesList[:]
    diffList = [0]*length
    while length:
	result = [x+y-z for x,y,z in zip(currentList[:-1],currentList[1:], diffList) if x+y-z<limit]
	length, count = len(result), count+1
	diffList, currentList = currentList[1:length], result[:]
	if count%2:
	    resultDict[count] = [n for n in result[1:] if primesDict.has_key(n)]
	else:
	    n = result and result[0] or 0
	    resultDict[count] = primesDict.has_key(n) and [n] or []
    
    R = filter(lambda x: resultDict[x], resultDict.keys())
    R.sort()
    return R[-1], resultDict[R[-1]]
def problem27():
    """http://projecteuler.net/index.php?section=problems&id=27
    >>> problem27()
    -59231
    """
    max_pair = (0,0,0)
    primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
    for a in xrange(-999, 1000):
        for b in xrange(max(2, 1-a), 1000): # b >= 2, a + b + 1 >= 2
            n, count = 0, 0
            while True:
                v = n*n + a*n + b
                v = v <=0 and -v or v
                if v > primes[-1]:
                    prime.primesBelow_fast(v, primes)
                    if prime.isprime_fast(v, primes): count = count + 1
                    else: break
                else:
                    if not prime.hasFactors(v, primes): count = count + 1
                    else: break
                n = n + 1
            if count > max_pair[2]:
                max_pair = (a,b,count)
    return max_pair[0] * max_pair[1]
import prime

primes = [2,3,5,7,11,13,17,19,23,29]
prime.primesBelow_fast(int(1000**0.5+1), primes)

def problem47():
    n, count = 6882, 0#2*3*31*37
    while count != 4:
	primeFactors = prime.primeFactors(n, primes)
	if len(primeFactors)==4:
	    count = count+1
	else:
	    count=0
	n=n+1
    return n-4
print problem47()
import prime
primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
prime.primesBelow_fast(103, primes)
def problem49():
    choice = xrange(1489, 3340, 2)
    for n in choice:
	if not prime.hasFactors(n, primes):
	    m1, strn = n+3330, str(n)
	    strm1, setn = str(m1), set(strn)
	    if set(strm1)==setn and not prime.hasFactors(m1, primes):
		m2 = m1+3330
		if set(str(m2))==setn and not prime.hasFactors(m2, primes):
		    return strn+strm1+str(m2)    
print problem49()




import prime

primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
squares = dict.fromkeys((x*x for x in xrange(1, 10000)), 1)
prime.primesBelow_fast(10000, primes)
for x in xrange(35, 10000, 2):
    if not prime.isprime(x):
        is_goldbach = 0
        for p in primes[1:]:
            if p >= x: break
            if squares.has_key((x - p)/2):
                is_goldbach = 1
                break
        if not is_goldbach:
            print x
            break