在Python中查找素数的不同方法的分析

质数是一个只能被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

Eratosthenes筛

在这种方法中,我们消除了非素数或合成数,以得到素数直到一个特定的数。因此,以下是我们为实现该目标而应遵循的步骤。

  • 列出从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