Python和具有非常大数字的模运算符

Python和具有非常大数字的模运算符,python,primes,modulus,Python,Primes,Modulus,如果这是一个重复的问题,我提前表示歉意-我对python和module的搜索长达8页,再加上我相对较少的编码经验,使我很难彻底检查是否有任何类似的问题 在试图解决一个问题时,我编写了一个函数来测试一个数字是否是素数: import math def isprime(n): if n % 1 != 0: return(False) else: for j in range(2, math.ceil(math.sqrt(n)) + 1):

如果这是一个重复的问题,我提前表示歉意-我对
python
module
的搜索长达8页,再加上我相对较少的编码经验,使我很难彻底检查是否有任何类似的问题

在试图解决一个问题时,我编写了一个函数来测试一个数字是否是素数:

import math
def isprime(n):
    if n % 1 != 0:
        return(False)
    else:
        for j in range(2, math.ceil(math.sqrt(n)) + 1):
            if n % j == 0:
                return(False)
            else:
                return(True)
        break
这对于小数字非常有效,但是对于绝对不是素数的非常大的数字(例如,我输入了
isprime(101232131241434334545555)
,函数给我一个
True
)的值。为什么会这样


编辑:正如roippi所指出并经我进一步调查证实的,这个函数实际上不适用于许多较小的奇数复合数。我正试图弄明白为什么现在还不行。

我相信你的问题是退货的位置不对。您的代码目前只循环通过2,任何奇数显然都不能被2整除。因此,如果n%j==0,它进入,返回True,并且由于一个返回中断了循环,因此停止运行。因此,任何奇数都将返回True

相反,请尝试:

def isprime(n):
    if n % 1 != 0:
        return True
    else:
        for j in range(2, math.ceil(math.sqrt(n))):
            if n % j != 0:
                return False
        return True
我认为这是可行的。 编辑:不,实际上没有。在这里,我将发布一个不同的质数检查器:

def isprime(n):
    '''check if integer n is a prime'''
    n = abs(int(n))
    if n < 2:
        return False
    if n == 2: 
        return True    
    if not n & 1: 
        return False
    for x in range(3, int(n**0.5)+1, 2):
        if n % x == 0:
            return False
    return True
def isprime(n):
''检查整数n是否为素数''
n=abs(int(n))
如果n<2:
返回错误
如果n==2:
返回真值
如果不是n&1:
返回错误
对于范围(3,int(n**0.5)+1,2)内的x:
如果n%x==0:
返回错误
返回真值

首先,
n%1==0
将始终为整数返回true,因为这将测试n是否可被1整除。所以这是一个有点不正常的测试。如果要检查奇数/偶数,请使用
n%2

它确实检查小数,但在这种情况下,我认为最好抛出一个错误

测试素数的更好算法如下:

def isPrime(n):
    if n < 2:
        return False
    if n < 4:
        return True
    for x in range(2,ceil(sqrt(n)) + 1):
        if (n % x == 0):
            return False
    return True
def isPrime(n):
如果n<2:
返回错误
如果n<4:
返回真值
对于范围(2,ceil(sqrt(n))+1)内的x:
如果(n%x==0):
返回错误
返回真值

您的函数认为
15
是素数。如果我测试3或4,你的函数也会“中断”。@zmo那根本不是真的。即使这是真的,编辑也不应改变改变语义的代码的基本部分。@zmo包含
False
的元组将是
(False,)
@Maroon知道
返回
某个内容后,您的函数就完成了执行。您的
for
循环只检查一个数字是否可被2整除。这根本不起作用。
n%1
什么也不做,因为每个整数都可以被1整除。else也没有意义,它只是返回完全错误的结果Sorree。。。但我只是复制了他的代码并对其进行了一些调整。如果你真的想要一个不同的质数检查器,我会发布一个。使用abs()是不好的。根据定义,负整数不是素数,因此它应该返回False。哦,我想检查小数,尽管回想起来这是没有意义的,因为我自己输入值,这不应该发生。不确定你为什么接受另一个答案。我不确定它是做什么的,但它不检查素数。编辑了一些关于检查小数的内容。@popvitsj:我可能比平时更匆忙地接受答案,最初的代码似乎对我有用/从某种程度上解释了为什么事情会起作用。