需要帮助Fermat的主要计算

时间:2018-12-16 14:24:15

标签: python python-3.x

我需要有关如何完成作业的帮助。我应该用两种不同的方法来生成质数:费马小定理和平方根的使用。当我用每种方法生成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)

1 个答案:

答案 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, .... ]