def are_prime(l): for n in l: is_p = primes_map.get(n, None) if is_p is None: is_p = euler.is_prime(n) primes_map[n] = is_p if not is_p: return False return True
def test(a, b): n = 0 while 1: term = f(n, a, b) p = primes.get(term, None) if p is None: p = euler.is_prime(term) primes[term] = p if p: n+=1 else: break return n
""" http://projecteuler.net/index.php?section=problems&id=58 """ from lib import spiraldiagonals from lib import euler """ this is pretty easy - we can generate the diagonals indefinitely from the formula we came up with in q28 and simply check the prime ratio it's a bit slow, probably the prime check, but still less than a minute """ primes = [] ds = [1] for i, diagonals in enumerate(spiraldiagonals.diagonals()): for d in diagonals: ds += [d] if euler.is_prime(d): primes += [d] ratio = float(len(primes)) / len(ds) if ratio <= 0.1: print (i+1)*2 + 1 # this is the spiral width break
""" What is the largest n-digit pandigital prime that exists? """ from lib import euler import math digits = '123456789' while digits: n = digits p = 0 while 1: if int(n) > p and euler.is_prime(int(n)): p = int(n) try: n = ''.join(euler.lexicographic_permutation(n)) except: break if p: break digits = digits[:-1] print p