我目前正在尝试使用 python 进行简单的素数测试来测试素数。
这是我为测试制作的代码:
def is_prime(n):
if np.mod(n, 2) == 0:
return False
f = 3
while np.square(f) <= n:
if np.mod(n, f) == 0:
return False
f += 2
return True
我运行代码,它适用于小数字。然后我输入一个巨大的数字(为方便起见,我选择了2^128
),它返回 True。但是当我输入 2^129
, 2^130
, 2^131
, 2^132
(等等)时,它总是返回 True。我相信我的循环已被跳过。为了验证这一点,我修改了如下代码:
while np.square(f) <= n:
if np.mod(n, f) == 0:
print(f) #Added line
return False
f += 2
print(f) #Added line
我再次测试了一些小数字,它会打印出正确的 f 值。但是对于任意大的数字(可能高于 '2^50'),它只会打印 3(f 的初始值)。所以我确信这个while循环已经被跳过了。
有没有办法来解决这个问题?
附言:
我还做了其他素数测试。但我想用这个测试来验证这些测试的结果(虽然它需要更长的时间)
我还使用 Numba 来加速我的代码(
@jit(nopython=True)
)。这就是我使用很多 np 函数的原因,因为 Numba 使用 NumPy 提高工作效率
编辑1:
- 我已经重新测试了代码,它工作得非常好(即使有大量数字),但速度要慢得多。所以我猜想在处理大量数字时 Numba 有问题