私の現在のアルゴリズムは、Pythonで数字の素数性をチェックする方法で、1000万〜私は10億を超える数字を得ることはないと知って改善したいと思っています。数字が10億未満の数字のためにPythonで素数であるかどうかを素早く判断してください
プロジェクトの問題60を解決するのに十分速い実装を得ることができないということです。オイラー:私は60秒で75秒で問題の答えを得ています。 http://projecteuler.net/index.php?section=problems&id=60
私の処分ではメモリがほとんどないため、10億以下の素数はすべて格納できません。
私は現在、6k±1で調整された標準試行を使用しています。これ以上のものはありますか?私はすでにこれほど大きな番号のRabin-Millerメソッドを取得する必要がありますか?
primes_under_100 = [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]
def isprime(n):
if n <= 100:
return n in primes_under_100
if n % 2 == 0 or n % 3 == 0:
return False
for f in range(5, int(n ** .5), 6):
if n % f == 0 or n % (f + 2) == 0:
return False
return True
このアルゴリズムを改善するにはどうすればよいですか?
精度:私はPythonを初めて使い、Python 3+のみで作業したいと考えています。
最終的なコード興味がある人のために
は、MAKのアイデアを使用して、私は私が以内にオイラーの問題の結果を取得することができ、およそ1/3迅速で、次のコードを生成しました60秒以上!
from bisect import bisect_left
# sqrt(1000000000) = 31622
__primes = sieve(31622)
def is_prime(n):
# if prime is already in the list, just pick it
if n <= 31622:
i = bisect_left(__primes, n)
return i != len(__primes) and __primes[i] == n
# Divide by each known prime
limit = int(n ** .5)
for p in __primes:
if p > limit: return True
if n % p == 0: return False
# fall back on trial division if n > 1 billion
for f in range(31627, limit, 6): # 31627 is the next prime
if n % f == 0 or n % (f + 4) == 0:
return False
return True
はこのPy3kですか? – st0le
私はPython 3やPython 3.1という名前で知っていましたが、Py3kがこれらのバージョンを参照しているようです。 –
それは 'f'と' f + 4'であってはなりません...あなたは確認できますか?なぜ「4」? – st0le