Asal jeneratoru:
import sympy
def primes():
n = 1
while True:
yield sympy.prime(n)
n += 1
(sympy’de yok mu?)
Suradaki inits
fonksiyonunun tembel/jenerator versiyonu:
def inits(it):
head = []
while True:
e = next(it)
yield head + [e]
head += [e]
Asal zinciri jeneratoru:
import itertools
def ranges_less_than(gen, sum_):
g1, g2 = itertools.tee(gen)
yield from itertools.takewhile(lambda ps: sum(ps) <= sum_, inits(g1))
try:
n = next(g2)
except StopIteration:
return
if n > sum_:
return
yield from ranges_less_than(g2, sum_)
Toplami asal < 999 olan cok halkali zincirler:
chains = filter(lambda ns_len_sum: ns_len_sum[1] > 1 and sympy.isprime(ns_len_sum[2]), map(lambda ns: (ns, len(ns), sum(ns)), ranges_less_than(primes(), 999)))
En uzun zincir:
print(sorted(chains, key=lambda n_l_s: n_l_s[1], reverse=True)[0])
([7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89], 21, 953)
Challenge:
Toplami sum_
'dan kucuk olan butun gen
zincirlerini ureten yukaridaki ranges_less_than
fonksiyonunun butun gen
zincirlerini ureten versiyonunu yazin.