我正在努力寻找帮助。任务是编写一个程序来查找两个给定值之间的所有Wieferich素数。确定它是否是Wieferich素数的等式是这样的: Wieferich素数p是p 2 除以2 (p - 1) - 1
这是我到目前为止所做的:
start=int(input("enter start value"))
end=int(input("enter end value"))
for c in range(start,end):
if c%2!=0:
primedet=(c**2)/((2**(c-1))-1)
if primedet%1==0:
print(c," is a Wiefrich Prime")
每次运行它时,它只会打印给定值之间的所有奇数。我知道只有两个Wieferich素数:1093和3011.我真的不知道如何使这项工作。任何指导都将不胜感激。
答案 0 :(得分:0)
使用模运算可以使这更容易,因为你希望2 p-1 -1可被p 2 整除,即2 p-1 -1 = 0( mod p 2 )重新排列,得到2 p-1 = 1(< i> mod p 2 )在python中这是
(2**(p-1)) % (p**2) == 1
但这样效率很低,因为首先计算2 p-1 然后取模,但不要担心,python有一种有效的方法,可以使用3参数调用进行模幂运算。 POW
pow(2,p-1,p**2) == 1
最后你还需要p是一个素数,然后通过实施素性测试,你准备好了
def isPrime(n:int) -> bool:
return True #put here the code for primality check
def find_Wieferich_prime_in(star,end) -> [int]:
resul = list()
for p in range(star,end):
if isPrime(p) and pow(2,p-1,p**2)==1:
resul.append(p)
return resul
print(find_Wieferich_prime_in(0,4000))
这就是找到Wieferich prime
所需的一切你的另一个错误就在这里
primedet=(c**2)/((2**(c-1))-1)
2 c-1 -1总是大于c 2 (到足够大的c)所以划分c 2 /( 2 c-1 -1)&lt; 1
此外
primedet%1
因为 primedet 是一个浮点数,当你浮点数%1时它会给你那个数字的小数部分,混合问题并且你会得到太多的零, 但更重要的是,你正在测试的东西不是Wieferich prime的定义。
答案 1 :(得分:0)
这很简单。根据你的陈述,数字具有素数素数和 Wieferich 的性质,只需通过你给出的等式,所以(2 (p - 1) ) - 1)%p 2 == 0返回True
表示您找到了一个数字。正如@Copperfield所解释的那样,这可以写成(2 (p-1))%p 2 == 1.然后你就可以了(在{的帮助下) {3}}哪个更快):
# I assume we have `start` and `end` given by user. Now we can safely
# start from the first odd number greater or equal to start so we can
# stride by 2 in the `range` call which will half our iteration
start = start + 1 if start % 2 == 0 else start
# next I'm using filter because it's faster then the normal `for` loop
# and gives us exactly what we need, that is the list of numbers
# that pass the equation test. Note I've also included the `end`
# number. If I were to write `range(start, end, 2)` we wouldn't
# test for `end`
restult = list(filter(lambda n: pow(2, n - 1, n*n) == 1, range(start, end + 2, 2)))