Project Euler #49: Prime permutations

  • + 1 comment

    from collections import OrderedDict, defaultdict from math import sqrt

    code_p = {0: 2, 1: 3, 2: 5, 3: 7, 4: 11, 5: 13, 6: 17, 7: 19, 8: 23, 9: 29}

    N_input, K = map(int, input().split())

    n = N_input N = N_input - 1 if N_input in [10**_ for _ in range(3, 7)] else N_input

    SIEVE_LIMIT = 10**(len(str(N)))-1 primes_sieve_array = [0] * (SIEVE_LIMIT + 1) # 0 for prime, 1 for composite

    for i in range(2, len(primes_sieve_array)):

    if not primes_sieve_array[i] == 0:
        continue
    for j in range(i * 2, len(primes_sieve_array), i):
        primes_sieve_array[j] = 1
    

    def rootval(num_val): s = 1 temp_num = num_val if temp_num == 0: s *= code_p[0] else: while temp_num > 0: s *= code_p[temp_num % 10] temp_num //= 10 return s

    primes_d = OrderedDict() k_vals = OrderedDict()

    for j in (i_prime_candidate for i_prime_candidate in range(2, len(primes_sieve_array)) if primes_sieve_array[i_prime_candidate] == 0 and i_prime_candidate >= 1487):

    if j < n:
        k_vals[j] = {} 
    val = rootval(j)
    
    if val not in primes_d:
        primes_d[val] = [j]
    else:
        for k in primes_d[val]:
    
            if k in k_vals:
    
                for x in k_vals[k]:
                    if (j - k) % x == 0:
                        k_vals[k][x].append((j - k) // x) 
    
                if j - k not in k_vals[k]:
                    k_vals[k][j - k] = [1]
        primes_d[val].append(j) 
    

    for i_start_prime in k_vals: if len(k_vals[i_start_prime]) < K - 1: continue

    for common_diff_val in sorted(set(k_vals[i_start_prime].keys())):
        try:
    
            if k_vals[i_start_prime][common_diff_val][K - 2] == K - 1:
                print(*[i_start_prime + (x * common_diff_val) for x in range(K)], sep='')
        except IndexError as e:
            pass