Es kann überraschend schwierig sein, eine Primzahl zu finden und durch die Primzahl zu teilen ... Wie machst du das mit Python?
Als ich das GIF von [Eratostenes 'Sieb](https://ja.wikipedia.org/wiki/Eratostenes' Sieb) auf Wikipedia sah, dachte ich, dass dies möglich wäre, also versuchte ich es. Zum Beispiel? Mit Lambda-Bindung.
do = lambda *x : x
switch = lambda x : x[-1]
primes = (
lambda n : find_primes( range( 2, n + 1 ), ( n + 1 ) ** 0.5, [ ] )
)
find_primes = (
lambda xs, end_point, ys :
switch(
xs[0] <= end_point and do( ys.append( xs[0] )
, find_primes( remove_fst_multiples( xs ) , end_point, ys )
)
or do( ys.extend( xs )
, ys
)
)
)
remove_fst_multiples = (
lambda xs : [ x for x in xs if x % xs[0] ]
)
print primes(100)
Ausführungsergebnis:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Der Algorithmus ist der gleiche wie bei Wikipedia.
Primzahlen sind eine Funktion, die Werte nur auf nette Weise übergibt. Die Entität ist find_primes.
find_primes ist
remove_fst_multiples nimmt eine Liste und gibt eine Liste ohne Vielfache des ersten Werts der Liste zurück.
Ich habe einen Kommentar erhalten und versucht, ihn zu verwenden. Ich weiß jedoch nicht, was es ist, also habe ich es gegoogelt und die Suchliste vorerst durch einen Iterator ersetzt. Bitte beachten Sie die Kommentare und andere Ankündigungen zur ordnungsgemäßen Verwendung.
from itertools import count, ifilter, takewhile
do = lambda *x : x
switch = lambda x : x[-1]
primes = ( lambda n :
find_primes(
takewhile(lambda x : x < n + 1, count(2))
, ( n + 1 ) ** 0.5
, [ ]
)
)
find_primes = (
lambda xs, end_point, ys :
(lambda a = next( xs ) :
switch(
a <= end_point and do( ys.append( a )
, find_primes( remove_multiples( xs, a ) , end_point, ys )
)
or do( ys.append( a )
, ys.extend(list( xs) )
, ys
)
)
)()
)
remove_multiples = (
lambda xs, a : ifilter(lambda x : x % a , xs )
)
print primes(100)
Recommended Posts