python - 当我输入一个巨大的数字时,为什么 python 在我的素数测试中跳过我的 while 循环?
问题描述
我目前正在尝试使用 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 有问题
解决方案
推荐阅读
- postgresql - 如何使用空值将 csv 文件导入 Postgres?
- android - 防止 Cordova Android 在后台运行
- excel - 从 Excel 将约会保存到共享的 Outlook 日历
- angular - Angular 材质 - 表格骨架占位符
- c# - 如何从 Type blob 签名中解释 FNPTR?
- xml - 在 xPath 中使用多个过滤器无法正确过滤
- javascript - 在数组中查找具有相同日期和总和值的元素
- javascript - 从属性对象创建对象的更好方法?
- python - 地图未使用地理位置显示在管理站点中
- android - 在 Android Studio 中创建了一个简单的按钮,但什么也没有出现