2017-02-27 12 views
-1

私は、pythonが「汚れとして遅い」ことを知っていますが、素数を見つける高速かつ効率的なプログラムを作りたいと思います。
-DoesこのプリントアウトALL素数:pythonで素数を見つける

num = 5 #Start at five, 2 and 3 are printed manually and 4 is a  multiple of 2 
    print("2") 
    print("3") 

def isPrime(n): 
#It uses the fact that a prime (except 2 and 3) is of form 6k - 1 or 6k + 1 and looks only at divisors of this form. 

    i = 5 
    w = 2 
    while (i * i <= n): #You only need to check up too the square root of n 
     if (n % i == 0): #If n is divisable by i, it is not a prime 
      return False 
     i += w 
     w = 6 - w 
    return True #If it isn´t ruled out by now, it is a prime 


while True: 
    if ((num % 2 != 0) and (num % 3 != 0)): #save time, only run the  function of numbers that are not multiples of 2 or 3 
     if (isPrime(num) == True): 
      print(num) #print the now proved prime out to the screen 
    num += 2 #You only need to check odd numbers 

が今私の質問に来る:これは私が持っているものでしょうか?
- これは素数ではない数値を出力しますか?
- もっと効率的な方法があるでしょうか? - これはどこまで行くのですか(Pythonの制限)、上限を上げる方法はありますか? python 2.7.12

+0

非常に多くの関連はなく、正確な複製:http://stackoverflow.com/q/2068372/1639625 –

+3

あなただけの教会に歩くことができませんPythonの* "それは汚れとして遅い" *と言います。 –

+0

* Miller-Rabin *フィルタリング、* Pocklingtonテスト*などを使うことができます。 –

答えて

2

これはすべての素数を印刷んを使用して

紀元前300年頃にユークリッドによって示されているように、無限に多くの素数が存在します。その質問に対する答えは、おそらくノーである。

これは素数ではない数値を出力しますか?

見た目ではありません。しかし、確かに。なぜユニットテストを書いていないのですか?

もっと効率的な方法がありますか? - これはどこまで行くのですか(Pythonの制限)、上限を上げる方法はありますか?

Fastest way to list all primes below NまたはFinding the 10001st prime - how to optimize?

+0

"すべての素数"では、プログラムが何もスキップしないという意味です。私は、例えば以下のようなバグがあるかどうか疑問に思います。 2、3、7、11(5をスキップする)、私のスクリプトを使って印刷されない数字はありますか?再び – DriverUpdate

+0

;私はユニットテストを書くことをお勧めします。素数の無限の性質のためにあらゆるケースをテストすることはもちろん不可能です。または、既に試したソリューションのうちの1つを上記のリンクで使用することもできます。 –

0

はNUM%2のチェックを参照してください!= 0は、あなたが2ずつ増加にもかかわらず、それぞれの時間が無意味なようです。

このアルゴリズムは高速であることを私が発見した:

primes=[] 

n=3 

print("2") 
while True: 
    is_prime=True 
    for prime in primes: 
     if n % prime ==0: 
      is_prime=False 
      break 
     if prime*prime>n: 
      break 

    if is_prime: 
     primes.append(n) 
     print (n) 

    n+=2 
関連する問題