当我输入一个巨大的数字时,为什么python在素性测试中跳过我的while循环?
我目前正在尝试使用python进行一个简单的素数测试,以测试素数 以下是我为测试编写的代码:当我输入一个巨大的数字时,为什么python在素性测试中跳过我的while循环?,python,loops,while-loop,primality-test,Python,Loops,While Loop,Primality Test,我目前正在尝试使用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
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
我再次测试一些小数字,它会打印出f的正确值。但是对于任意大的数字(可能大于'2^50',它只会打印3(f的初始值)。所以我确信这个while循环已经被跳过了
有办法解决这个问题吗
p/S:
- 我还做了其他的素性测试。但是我想用这个测试来验证这些测试的结果(尽管需要更长的时间)
- 我还使用Numba来加速我的代码(
)。这就是为什么我使用了很多np函数,因为NumPy可以提高工作效率@jit(nopython=True)
- 我重新测试了代码,但没有测试,它工作得非常好(即使有大量数据),但速度要慢得多。所以我想在处理大量数据时,Numba会有问题
2^129
意思是1numpy不能处理大数字。NumPy是围绕机器本机数据类型构建的,而不是任意精度的整数。Numba不能加速任意精度的算法。(另外,调用np.square
或np.mod
而不是**2
或%
对于使用NumPy是没有必要的,也不会提供任何好处。NumPy的好处来自于对NumPy数组的操作。如果a
和b
是NumPy数组,a**2
和a%b
将自动执行o。)在高效的C级循环中跨整个阵列执行操作,每个元素的开销最小。另一方面,如果a
和b
是标量,调用np.square
或np.mod
将不会提供任何效率优势。)NumPy正在退回Python对象操作,实际上它并没有加速任何事情。
while np.square(f) <= n:
if np.mod(n, f) == 0:
print(f) #Added line
return False
f += 2
print(f) #Added line