<p>模运算的使用使这一任务变得更容易,因为您希望2<sup>p-1</sup>-1可以被p<sup>2</sup>整除,也就是说2<sup>p-1</sup>-1=0(<i>mod</i>p<sup>2</sup>)重新排列,在python中得到2<sup>p-1</sup>=1(<i>mod</i>p<sup>2</sup>)</p>
<pre><code>(2**(p-1)) % (p**2) == 1
</code></pre>
<p>但这是低效的,因为首先计算2<sup>p-1</sup>然后取模,但别担心,python有一种有效的方法,用pow的3参数调用进行模幂运算</p>
<pre><code>pow(2,p-1,p**2) == 1
</code></pre>
<p>最后,你还需要p是素数,然后实现素数测试,你就可以开始了</p>
<pre><code>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))
</code></pre>
<p>这就是你找到<a href="https://en.wikipedia.org/wiki/Wieferich_prime" rel="nofollow">Wieferich prime</a>所需要的一切</p>
<p>你的另一个错误就在这里</p>
<pre><code>primedet=(c**2)/((2**(c-1))-1)
</code></pre>
<p>2<sup>c-1</sup>-1总是大于c<sup>2</sup>(到足够大的c),因此c<sup>2</sup>/(2<sup>c-1</sup>-1)<;1</p>
<p>此外</p>
<pre><code>primedet%1
</code></pre>
<p>因为primedet是一个float,当你做float%1时,它会给你这个数字的小数部分,混合四舍五入问题,你会得到太多的零,
但更重要的是,你测试的不是Wieferich素数的定义。你知道吗</p>