50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
|
|
from tools import number_theory
|
|
|
|
def is_prime(num):
|
|
if not num % 2:
|
|
return False
|
|
for p in range(3, int(num ** 0.5) + 1, 2):
|
|
if not num % p:
|
|
return False
|
|
return True
|
|
|
|
def longest_slice(limit, prime):
|
|
for l in range(len(prime)):
|
|
if sum(prime[:l]) > limit:
|
|
return (l - 1, sum(prime[:l - 1]))
|
|
|
|
def reduce_slice(limit, prime, start, length, tale):
|
|
tale -= prime[start]
|
|
start += 1
|
|
t = tale
|
|
while True:
|
|
t = tale - prime[start] + prime[start + length]
|
|
if t > limit:
|
|
break
|
|
tale = t
|
|
return (start, tale)
|
|
|
|
def shift_slice(limit, prime, start, length, tale):
|
|
for s in range(start - 1, -1, -1):
|
|
tale = tale + prime[s] - prime[s + length]
|
|
if is_prime(tale):
|
|
return (tale, length)
|
|
|
|
def search(limit):
|
|
prime = list(number_theory.make_prime(4000))
|
|
length, tale = longest_slice(limit, prime)
|
|
if is_prime(tale):
|
|
return (tale, length)
|
|
start = 0
|
|
while length > 1:
|
|
length -= 1
|
|
start, tale = reduce_slice(limit, prime, start, length, tale)
|
|
if is_prime(tale):
|
|
return (tale, length)
|
|
get = shift_slice(limit, prime, start, length, tale)
|
|
if get:
|
|
return get
|
|
|
|
print(search(1000000))
|