当我输入一个巨大的数字时,为什么python在素性测试中跳过我的while循环?

当我输入一个巨大的数字时,为什么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

我目前正在尝试使用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             
我再次测试一些小数字,它会打印出f的正确值。但是对于任意大的数字(可能大于'2^50',它只会打印3(f的初始值)。所以我确信这个while循环已经被跳过了

有办法解决这个问题吗

p/S:

  • 我还做了其他的素性测试。但是我想用这个测试来验证这些测试的结果(尽管需要更长的时间)

  • 我还使用Numba来加速我的代码(
    @jit(nopython=True)
    )。这就是为什么我使用了很多np函数,因为NumPy可以提高工作效率

编辑1:

  • 我重新测试了代码,但没有测试,它工作得非常好(即使有大量数据),但速度要慢得多。所以我想在处理大量数据时,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