写一个递归算法,列举显性素数.你的算法应该在找到它们时打印显性素数(而不是在最后).默认情况下,我们将我们要寻找的主要素数限制为最大值10 ^ 12,预期的运行时间应该在或小于一分钟.
以下是我的python代码,它不能按预期工作:
import math
def test_prime(n):
k = 2
maxk = int(math.sqrt(n))
while k <= maxk:
if n % k == 0:
return False
if k == 2:
k += 1
else:
k += 2
return (n is not 1)
def dominant_prime_finder(maxprime=10**12,n=1):
l = 1 #length of the current number
while n // 10 > 0:
l += 1
n //= 10
if test_prime(n) == True:
is_dominant_prime = True
index_smaller = n
while l > 1 and index_smaller > 9:
index_smaller //= 10
if test_prime(index_smaller) == False:
is_dominant_prime = False
break
for i in range(1,10):
if test_prime(i*10**l + n) == True:
is_dominant_prime = False
break
if is_dominant_prime == True:
print(n)
while n <= maxprime:
dominant_prime_finder()
解决方法:
您可以在不枚举10 ^ 12下的所有数字的情况下解决问题,这通过对数字的长度进行递归是低效的.
它的工作方式如下:
>长度1的素数是:2,3,5,7.
>对于所有这些数字,检查第三个条件,对于任何数字dn1∈{1,…,9},dn 1dn … d0不是素数.对于2,没关系.对于3它失败(例如13).将您找到的所有素数存储在列表L中.对长度为1的所有素数执行此操作.
>在L中,你现在拥有长度为2的所有素数,其中一个素数作为第一个数字,因此你拥有长度为2的主要素数的所有候选者
递归地执行此操作会在python中获得所有主要素数:
def test_prime(n):
k = 2
maxk = int(math.sqrt(n))
while k <= maxk:
if n % k == 0:
return False
if k == 2:
k += 1
else:
k += 2
return (n is not 1)
def check_add_digit(number,length):
res = []
for i in range(1,10):
if test_prime( i*10**(length) + number ):
res.append(i*10**(length) + number)
return res
def one_step(list_prime,length):
## Under 10^12
if length > 12:
return None
for prime in list_prime:
res = check_add_digit(prime,length)
if len(res) == 0:
#We have a dominant prime stop
print(prime)
else:
#We do not have a dominant prime but a list of candidates for length +1
one_step(res,length+1)
one_step([2,3,5,7], length=1)
这在我的机器上工作不到一分钟.
标签:python,algorithm,data-structures,recursion,primes
来源: https://codeday.me/bug/20190527/1161822.html