def prime_concat_partners(list_, primes, failure_point): result = {} length = len(list_) for first in range(length - 1): n1 = list_[first] for second in range(first + 1, length): n2 = list_[second] cand1 = int(str(n1) + str(n2)) cand2 = int(str(n2) + str(n1)) if is_prime(cand1, primes=primes, failure_point=failure_point): if is_prime(cand2, primes=primes, failure_point=failure_point): # sets value to [] if not set, returns value at key result.setdefault(n1, []).append(n2) result.setdefault(n2, []).append(n1) return result def possible_pairings(partner_hash, length): # length = 1 result = [[key] for key in partner_hash] for size in range(2, length + 1): next_iteration = [] for subset in result: possible_additions = partner_hash[subset[0]] for val in subset: possible_additions = [entry for entry in possible_additions if entry in partner_hash[val]] next_iteration.extend([subset[:] + [candidate] for candidate in possible_additions]) result = next_iteration return result def main(verbose=False): MAX_n = 10**4 PRIMES = sieve(MAX_n) partner_hash = prime_concat_partners(PRIMES, PRIMES, MAX_n**2) valid = possible_pairings(partner_hash, 5) min_sum = 10**10 min_set = None for subset in valid: if sum(subset) < min_sum: min_sum = sum(subset) min_set = subset min_set = [str(prime) for prime in sorted(min_set)] if verbose: return '%s.\nThis is obtained with the primes %s.' % ( min_sum, ', '.join(min_set)) else: return min_sum if __name__ == '__main__': print euler_timer(60)(main)(verbose=True)
def prime_concat_partners(list_, primes, failure_point): result = {} length = len(list_) for first in range(length - 1): n1 = list_[first] for second in range(first + 1, length): n2 = list_[second] cand1 = int(str(n1) + str(n2)) cand2 = int(str(n2) + str(n1)) if is_prime(cand1, primes=primes, failure_point=failure_point): if is_prime(cand2, primes=primes, failure_point=failure_point): # sets value to [] if not set, returns value at key result.setdefault(n1, []).append(n2) result.setdefault(n2, []).append(n1) return result
def main(verbose=False): # layer/primes # 2/3 # 1581/835 # 3536/1677 # 5000/2249 # 13121/5248, winning layer # ratio >= .1 iff 10*(primes/total) >= 1 iff 10*primes >= total # iff 10*primes >= 4*index - 3 FAILURE_POINT = 10 ** 9 PRIMES = sieve(int(sqrt(FAILURE_POINT)) + 1) layer = 2 num_primes = 3 while 10 * num_primes >= 4 * layer - 3: layer += 1 candidates = [(2 * layer - 1) ** 2 - 2 * (layer - 1) * i for i in range(1, 4)] if candidates[-1] >= FAILURE_POINT: raise ValueError("Sieve was not big enough, restart function") for candidate in candidates: if is_prime(candidate, primes=PRIMES, failure_point=FAILURE_POINT): num_primes += 1 side_length = 2 * layer - 1 # 2*(layer - 1) + 1 return side_length
def is_truncatable_prime(n, primes): candidates = truncated_all(n) for candidate in candidates: if candidate in primes: continue elif is_prime(candidate): primes.append(candidate) else: return False return True
def main(verbose=False): MAX_n = 987654321 PRIMES = sieve(int(sqrt(MAX_n))) # A 9 digit pandigital will have digit sum 45, so can't be prime # must be divisible by 9 for i in range(8, 1, -1): cand = [str(dig) for dig in range(1, i + 1)] cand = int("".join(cand)) candidates = sorted(all_permutations_digits(cand))[::-1] for candidate in candidates: if is_prime(candidate, primes=PRIMES, failure_point=MAX_n): return candidate raise ValueError("No prime was found, algorithm busted.")