project-euler/130_composites_with_prime_r...

50 lines
1.0 KiB
Python

#!/usr/bin/env python3
def divisors(divs):
r = []
for p in divs:
r += [p*d for d in r] + [p]
return r
def add_divisors(n, st=2):
for i in range(st*n, len(sieve), st*n):
sieve[i].append(n)
pw = 2
while n**pw < len(sieve):
m = n**pw
for i in range(st*m, len(sieve), st*m):
sieve[i][-1] *= n
pw += 1
target = 25
count = 0
s = 0
lim = 10**5
sieve = [x for i in range(lim//2) for x in ([], True)]
add_divisors(2, st=1)
for p in range(3, len(sieve)):
if not p%2 and not sieve[p+1]:
for d in divisors(sieve[p]):
if pow(10, d, 9*p+9) == 1:
break
else:
continue
count += 1
s += p + 1
#print(count, p+1)
if count >= target:
break
if not p%2 or not sieve[p]:
continue
for i in range(p**2, len(sieve), 2*p):
sieve[i] = False
add_divisors(p)
if count < target:
print("Limit reached. Count = {}/{}".format(count,target))
print(s)