Il peut être étonnamment difficile de trouver un nombre premier et de le diviser par le nombre premier ... Comment faites-vous cela avec Python?
Quand j'ai vu le gif du [tamis d'Eratostenes](https://ja.wikipedia.org/wiki/Eratostenes's tamis) sur Wikipédia, j'ai pensé qu'il serait possible de le faire, alors j'ai essayé. Par exemple? Avec la liaison lambda.
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)
Résultat de l'exécution:
[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]
L'algorithme est le même que Wikipedia.
nombres premiers est une fonction qui transmet simplement les valeurs d'une manière agréable. L'entité est find_primes.
find_primes est
remove_fst_multiples prend une liste et retourne une liste excluant les multiples de la première valeur de la liste.
J'ai reçu un commentaire alors j'ai essayé de l'utiliser. Cependant, je ne sais pas ce que c'est, alors je l'ai googlé et j'ai remplacé la liste de recherche par un itérateur pour le moment. Veuillez consulter les commentaires et autres annonces pour savoir comment l'utiliser correctement.
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