数値 N が素数であるかどうかを確認するための非常に単純で簡潔な力ずくのソリューション: 単純に、2 から N の平方根までの N の約数があるかどうかを確認します (興味がある場合は、理由を参照してください)。
次のコードは、Python 2 と Python 3 の両方と互換性があります。
from math import sqrt
from itertools import count, islice
def is_prime(n):
return n > 1 and all(n % i for i in islice(count(2), int(sqrt(n) - 1)))
そして、より単純な Python 3 のみの実装を次に示します。
def is_prime(n):
return n > 1 and all(n % i for i in range(2, int(n ** 0.5) + 1))
わかりやすくするために、上記の拡張バージョンを次に示します。
from math import sqrt
from itertools import count, islice
def is_prime(n):
if n < 2:
return False
for divisor in islice(count(2), int(sqrt(n) - 1)):
if n % divisor == 0:
return False
return True
def is_prime(n):
if n < 2:
return False
for divisor in range(2, int(n ** 0.5) + 1):
if n % divisor == 0:
return False
return True
これは、最速または最適な素数性チェック アルゴリズムに近いものを意図したものではありません。シンプルで簡潔にするという目標を達成するだけであり、実装エラーも減少します。の時間複雑度がありO(sqrt(n))
ます。
数値が素数であるかどうかを確認するためのより高速なアルゴリズムを探している場合は、次のことに興味があるかもしれません。
実装に関する注意事項
お気付きかもしれませんが、Python 2 互換の実装では、単純なor ( Python 3 ではデフォルトである古い Python 2ジェネレーターの範囲)の代わりに とitertools.count()
組み合わせて使用しています。これは、CPython 2では、N > 2 63 ‒ 1 (または実装によってはN > 2 31 ‒ 1) のような N に対して が発生するためです。これは残念な CPython 実装の詳細です。itertools.islice()
range()
xrange()
xrange(N)
OverflowError
itertools
この問題を克服するために使用できます。2
を使用して から無限大までカウントアップしているため、ステップの後itertools.count(2)
に到達し、 を使用してジェネレーターを制限できます。sqrt(n)
sqrt(n) - 1
itertools.islice()