Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで素数を見つけるためのさまざまな方法の分析


素数は、1またはそれ自体でのみ割り切れる正の整数です。数が素数であるかどうかを見つけることは、長い間興味深いプログラミングの課題です。さらに、さまざまな方法があり、それらはさまざまな効率を持っています。この記事では、そのような3つの方法を検討し、実行のタイミングの観点からどちらがより効率的かを判断します。

すべての除数を確認

これは単純なプログラムであり、1から指定された数より1少ない整数までを取り、その数がこれらのいずれかで除算されるかどうかをチェックし続けます。この数を割ることができる数が見つからない場合、その数は素数です。

import time
#Function to check Prime Number
def check_prime(final_val):
   if final_val <= 1:
      return False
   for divisor in range(2,final_val):
      if final_val % divisor == 0:
         return False
      return True
# Track the Start Time
StartTime = time.time()
#Count the number of prime numbers
cnt = 0
for final_val in range(1,10001):
   x = check_prime(final_val)
   cnt += x
print 'Count of prime numbers till',final_val,'is ', cnt
# Track the End Time
EndTime = time.time()
print 'Time Elapsed is: ', EndTime - StartTime

出力

上記のコードを実行すると、次の結果が得られます-

Count of prime numbers till 10000 is 1229
Time Elapsed is: 2.3100001812

平方根(N)までの因子

数学的には、チェックしている数の平方根までの因子を見つけるだけで十分であることがわかります。このアプローチは反復回数を減らすため、以下のように確認できるより高速なはずです。このアイデアを実装するためのロジックは次のとおりです。

  • プライム値がチェックされている数値の平方根を見つけます。

  • 数値を値2から始まる平方根値まで各値で除算し、余りが残っているかどうかを確認します。

  • 上記のいずれかのステップで余りがゼロの場合、その数は素数ではありません。

import math
import time
def is_prime(final_val):
   # 1 is not a prime number
   if final_val <= 1:
      return False
   i = 2
   while i <= math.floor(math.sqrt(final_val)):
   # Check if any remainders are cerated
      if final_val % i == 0:
         return False
      i += 1
   return True
# Track the Start Time
StartTime = time.time()
cnt = 0
for n in xrange(1, 10001):
   x = is_prime(n)
   cnt += x
print 'Count of prime numbers till',n,'is ', cnt
# Track the End Time
EndTime = time.time()
print 'Time Elapsed is: ', EndTime - StartTime

出力

上記のコードを実行すると、次の結果が得られます-

Count of prime numbers till 10000 is 1229
Time Elapsed is: 0.0529999732971

エラトステネスのふるい

この方法では、非素数または合成数を削除して、特定の数まで素数を取得します。それを達成するために私たちが従うステップは以下のとおりです。

  • 2からその数までの連続する整数のリストを作成し、それまですべての素数を見つけます。

  • 最初の数、つまり2を取り、そのすべての倍数のリストを作成します。元のリストからこの倍数のリストを削除しますが、2は削除しません。次の番号に対してこれを繰り返します。つまり、次の番号に対して3というように繰り返します。数自体ではなく、倍数のみを削除していることに注意してください。したがって、5または11が削除されることはありませんが、10および22が削除されます。

  • すべての除去の後、残ったリストは、求められた数までの素数のリストです。

import time
def sieve_method(n):
#Create a list of prime numbers
   prime_number_list = []
   for i in range(2, n+1):
# Capture the number if it si not in prime list
   if i not in prime_number_list:
      print (i)
# Add the number to the prime list number if it is a multiple
   for j in range(i*i, n+1, i):
      prime_number_list.append(j)
# Track the Start Time
StartTime = time.time()
cnt = 0
print(sieve_method(25))
# Track the End Time
EndTime = time.time()
print 'Time Elapsed is: ', EndTime - StartTime

出力

上記のコードを実行すると、次の結果が得られます-

2
3
5
7
11
13
17
19
23
Time Elapsed is: 0.0

  1. 素数をチェックするPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −数が与えられているので、与えられた数が素数であるかどうかを確認する必要があります。 1より大きい特定の正の数で、1以外の要素はなく、その数自体は素数と呼ばれます。 2、3、5、7などは他の要素がないため素数です。 以下のこのプログラムでは、素数または非素数の性質について番号がチェックされます。 1以下の数は素数とは言えません。したがって、数値が1より大きい場合にのみ反復します。 ここで、その数が2から(num-1 // 2)の範囲の任意の数で正確に割り切れるかどうかを確認します。指定された範囲内に何ら

  2. 数の最大の素因数を見つけるためのPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します- 問題の説明 正の整数nが与えられます。数の最大の素因数を見つける必要があります。 アプローチ 指定された数値を数値の約数で割って因数分解します。 最大素因数を更新し続けます。 例 import math def maxPrimeFactor(n):    # number must be even    while n % 2 == 0:       max_Prime = 2       n /= 1