素数判定のアルゴリズムとライブラリ【Python】

pythonの素数の記事のアイキャッチPython

素数判定のアルゴリズムをPythonで実装する方法を紹介していきますが、その前に計算量の比較を紹介しておきます

試し割り法(めちゃくちゃ簡単)

おそらく最も簡単な素数判定のプログラムですね

単純に自分より小さい数で割ってみて、割れなかったら素数と判定します

def isPrime(n):
    for i in range(2, n):
        if n%i==0:
            return False
    if n==1:
        return False

    return True

for i in range(2,100):
    print(i,':',isPrime(i))

試し割り法の改善

試し割り法は愚直に割って言っているだけなので、いくつか改善する点がありそうです

今回は以下の改善を行います

  • \(\sqrt{n}\)までしか判定しなくて良い
  • 偶数は必ず割り切れるので、2以外の偶数は必ず素数でない(奇数のみ判定する)

ちなみに1個目の改善点がわからなければ、以下を参考にしてください

次の問題の解き方を教えて下さい自然数nが,√n(ルートnです)以下のすべての素数で割り切れなければ,nは素数であることを... - Yahoo!知恵袋
次の問題の解き方を教えて下さい自然数nが,√n(ルートnです)以下のすべての素数で割り切れなければ,nは素数であることを照明せよ。です。 それと,自分にはさっぱりなのですがこの問題はどれくらいの難しさなのでしょうか? 約数をさがす作業、やったことありますか?例えば、60の約数は何個あるか、といわれたとき、1,2,3,4...
import math

def isPrime(n):
    for i in range(3, math.floor(math.sqrt(n))+1, 2):
        if n%i==0:
            return False

    if n==2:
        return True
    if n%2==0:
        return False
    if n==1:
        return False

    return True

for i in range(2,100):
    print(i,':',isPrime(i))

エラトステネスの篩

エラトステネスの篩はエラトステネスさんが考えた素数判定のアルゴリズムです
素数判定ではよく使われるのではないでしょうか?

エラトステネスの篩は表を使って素数を求めます
例えば37以下の素数を全て求めたければ、以下のような表を作ります

数値表

そしたら小さい数字から見ていくのですが、まず2は表にあるから(ふるい落とされていない)素数となります
素数の倍数は素数ではないので、2の倍数を表から消していきましょう

2の倍数を取り除いた数値表

次に3に対しても同じことを行います

3の倍数を取り除いた数値表

これを\(\sqrt{37}\)まで繰り返していきましょう
そしてその表がこれです

最終的には表には素数しか残っていないはずです

最終的な数値表

このエラトステネスの篩をPythonコードに落とすと以下のようになります
あっていると思いますが、自前コードなので間違えてたら教えてください

import math

# n以下の素数判定のリストを返す(0は簡単にするために入れているだけです)
def eratosthenes(n):
    prime_list = [False, False] + [True]*(n-1)
    for i in range(2, math.floor(math.sqrt(n))+1):
        if not prime_list[i]:
            continue
        for j in range(i*2, n+1, i):
            prime_list[j] = False
    return prime_list

n = 10
l = eratosthenes(n)
for i in range(n+1):
    print(i,':',l[i])

# 0 : False
# 1 : False
# 2 : True
# 3 : True
# 4 : False
# 5 : True
# 6 : False
# 7 : True
# 8 : False
# 9 : False
# 10 : False

素数ライブラリ

素数を計算してくれるものにSymPyがあります

*SymPyについて工事中

コメント