我需要有关如何完成作业的帮助。我应该用两种不同的方法来生成质数:费马小定理和平方根的使用。当我用每种方法生成3,000,000个数字时(由于费马方法不是100%正确,所以具有不同的质数),我应该通过将两个列表或变量除以找出费马方法的准确性(其中所有相互保存)以找到使用第一个母亲求平方根的可信度。
这就是我的问题所在。在我的作业中,如果数字与方程式匹配,我应该返回值“ True”,否则返回false。我需要以某种方式添加列表或变量,同时仍然返回“ True”或“ False”以保存所有数字,以便最终程序可以计算百分比。我真的不知道如何有效地添加它,我想对我的代码提供一些反馈,以便我可以改进它。我有点卡在自动取款机上。
https://en.wikipedia.org/wiki/Fermat%27s_little_theorem
分配基于什么
我的进步(我仅完成了大约3个月的编程工作,因此非常感谢任何建设性的反馈意见。
这只是Fermats版本。另一个看上去相同,但方程式不同。只需获取保存所有True值的列表或变量:
from time import *
start_time = time()
def is_prime(n):
fermat = int(pow(2, n - 1, n))
while n > 1:
if fermat == 1:
return True
return False
for x in range(1, 30001):
print(x, is_prime(x))
print("Total amount of time:", time()-start_time)
答案 0 :(得分:1)
您可以使用列表推导来创建列表,其中索引是数字,值是该索引的素数。
(还注意到我重构了is_prime
。您不需要fermat
变量,并且您绝对不需要while
循环)。
def is_prime(n):
return int(pow(2, n - 1, n)) == 1:
print([is_prime(n) for n in range(1, 30001)])
# [False, False, True, False, True, False, True, ..... ]
警告是Python索引从0开始。我们可以通过在列表中添加前哨值来解决此问题:
print([None] + [is_prime(n) for n in range(1, 30001)])
# [None, False, False, True, False, True, False, True, ..... ]
另一种替代方法是使用字典,其中键是数字,值是质数,但请记住,Python <3.7中字典是无序的:
print({n: is_prime(n) for n in range(1, 30001)})
# {1: False, 2: False, 3: True, 4: False, 5: True, 6: False, 7: True, ..... }
如果您只对(大概)素数列表感兴趣:
print([n for n in range(1, 30001) if is_prime(n)])
# [3, 5, 7, 11, 13, 17, .... ]