擅长:python、mysql、java
<p>这很简单。根据你的陈述,这些数字的性质是素数<strong>prime</strong>和<strong>Wieferich</strong>仅仅通过你给出的等式,所以(2<sup>(p-1)</sup>-1)%p<sup>2</sup>==0返回<code>True</code>意味着你找到了一个数字。如@Copperfield所述,这可以写成(2<sup>(p-1)</sup>)%p<sup>2</sup>==1。然后你可以做(在<a href="https://docs.python.org/2/library/functions.html#pow" rel="nofollow">pow</a>的帮助下,速度更快):</p>
<pre><code># 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)))
</code></pre>