Wieferich素数

时间:2015-12-02 21:58:51

标签: python numbers

我正在努力寻找帮助。任务是编写一个程序来查找两个给定值之间的所有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.我真的不知道如何使这项工作。任何指导都将不胜感激。

2 个答案:

答案 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)))