【发布时间】:2021-08-03 13:33:55
【问题描述】:
print("Number of primes must be greater than 2")
number = int(input("Number of primes: "))
if number < 1:
print("Invalid input")
exit()
print(2)
print(3)
i = 0
no_primes = 2
while 1 < 2:
m = 6 * i - 1
n = 6 * i + 1
if (2 ** m) % m == 2:
print(m)
no_primes += 1
if no_primes == number:
break
if (2 ** n) % n == 2:
print(n)
no_primes += 1
if no_primes == number:
break
i += 1
我的代码使用除了 2 和 3 之外的素数可以以 6n-1 或 6n+1 的形式表示的事实。我的 while 循环看起来很奇怪,但我不具备操作由两个循环组成的循环的专业知识变量(本例中为 no_primes 和 i)。当我生成前 1000 个素数时,它会跳过一些,以 7789 而不是 7919 结尾。有人知道为什么吗?另外,如果代码看起来多余,对不起。如果是,请说明我如何改进它
几周前我才开始使用 python,我想你应该知道
【问题讨论】:
-
你为什么用
while 1<2而不是while True? -
你能解释一下
(2 ** n) % n == 2吗?这是n成为素数的充分条件吗? -
@KotaMori 这是一个素数测试,称为费马小定理。从数学上讲,它总是有效的。但是,由于某种原因,它不适用于 Pycharm 上的大量数据
-
@Aqeel Fermat 的小定理指出,如果
p是素数,则遵循a**p % p == a。它确实 not 说明相反的情况,因此如果a**p % p == a这并不意味着p是素数 - 请参阅 341 作为示例。这意味着您的程序不仅打印素数,还打印费马伪素数。 -
我不知道!谢谢@l4mpi