def prob27(): sieve = prime.prime_table(10**4) D = {} for a in range(-999, 999, 2): for b in range(a + 2, 1000): if (a*a - 4*b >= 0): continue num_primes = 0 for n in range(0, b): temp = n*n + a*n + b if (temp < 2): break elif (temp == 2): num_primes += 1 else: if (temp%2 == 1 and sieve[int((temp-1)/2)]): num_primes += 1 else: D[(a,b)] = num_primes break max_primes = 0 max_term = (0, 0) for i,j in D: if (D[(i,j)] > max_primes): max_primes = D[(i, j)] max_term = (i, j) return [max_term]
def prob37(): sieve = prime_table(10**6) # the set of truncatable primes h = set() n = 11 while len(h) < 11: truncatable = True l = str(n) for i in range (1, len(l) + 1): left_num = int(l[:i]) right_num = int(l[len(l) - i:]) left_index = (left_num - 1) // 2 right_index = (right_num - 1) // 2 # check for prime if not (left_num > 1 and right_num > 1 and sieve[left_index] and sieve[right_index]): truncatable = False break # if n is truncatable, add it to h if truncatable: h.add(n) # increase n by 2 n += 2 if (l[len(l) - 1] == 3): n += 2 return (sum(i for i in h), h)
def prob21(limit): cache = [] miss = [0, 1, 2] sieve = prime.prime_table(limit+1) # 1. Prime numbers are not amicable numbers for i in range(1, len(sieve)): if (sieve[i] == True): miss.append(2*i+1) for i in range(3, limit+1): # 2. Find i in cache and miss if not (i in cache or i in miss): # 3. Compute sum of divisors for i p = sum_of_divisors(i) if (i != p and i == sum_of_divisors(p)): cache.append(i) if (p not in cache): cache.append(p) print("result: ", i, p) else: if (p != i): miss.append(i) miss.append(p) else: miss.append(i) return sum(i for i in cache)
def prob23(): limit = 20162 s = 0 abn = set() prime_sieve = prime.prime_table(limit) for n in range(1, limit): if is_abundant(n, prime_sieve): abn.add(n) if not any((n-a in abn) for a in abn): s += n return s
def prob12(): n = 3 # triangle number = n*(n+1)/2 D[n] = 2 # number of divisors sieve = prime.prime_table(1000) # the prime table MIN_DIVISORS = 500 count = 0 while count <= MIN_DIVISORS: n += 1 n1 = n if (n1%2 ==0): n1 /= 2 D[n1] = 1 for i in range(0, len(sieve)): if sieve[i] == False: continue if i == 0: prime = 2 else: prime = 2 * i + 1 if (prime*prime) > n1: Dn1 *= 2 break exponent = 1 while n1 % (prime) == 0: n1 /= prime exponent += 1 # if a number can be factorized as A = p1^k1 * p2^k2 * p3^k3 ... where # p1, p2, p3.. is prime then it has (k1 + 1)*(k2 + 1)*(k3 + 1) ... divisors if exponent > 1: Dn1 *= exponent if n1 == 1: break count = D[n]*D[n1] D[n] = D[n1] return int(n*(n-1)/2)
def prob35(limit): # there are 13 circular primes below 1,000,000 num_cprimes = 13 sieve = prime_table(limit) for n in range(111, limit - 1, 2): l = str(n) if not any(d in ("0","2","4","5","6","8") for d in l): num_digits = len(l) is_cprime = True for i in range(0, num_digits): # shift the string 1 digit to the left l = l[1:] + l[:1] # index in the prime table index = (int(l) - 1) // 2 if (sieve[index] == False): is_cprime = False break; if is_cprime: # h.add(n) num_cprimes += 1 return num_cprimes
def extend_primes(self, to, step): name = 'prime' display_name = '素数' _ptable = prime_table(to) ptable = [n for i, n in enumerate(_ptable) if (i+1)%step==0] self.append(Sequence(name, display_name, step, ptable, NamedNumber))