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:我可能比平时更匆忙地接受答案,最初的代码似乎对我有用/从某种程度上解释了为什么事情会起作用。