示例#1
0
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)
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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.")