Python 解释一个基于Fermat';s小定理

Python 解释一个基于Fermat';s小定理,python,math,primes,prime-factoring,Python,Math,Primes,Prime Factoring,我发现一些Python代码声称基于以下内容检查素性: def CheckIfProbablyPrime(x): return(2我相信,您示例中的代码是不正确的,因为二进制左移位运算符不等于一个数字的幂,这在费马的小定理中使用。以2为底,二进制左移位将等于x+1的幂,这在费马的小格式版本中不使用 相反,在Python中使用**表示整数的幂 def CheckIfProbablyPrime(x): return (2 ** x - 2) % x == 0 “p− a是p的整数倍,因此对于

我发现一些Python代码声称基于以下内容检查素性:

def CheckIfProbablyPrime(x):

return(2我相信,您示例中的代码是不正确的,因为二进制左移位运算符不等于一个数字的幂,这在费马的小定理中使用。以2为底,二进制左移位将等于x+1的幂,这在费马的小格式版本中不使用

相反,在Python中使用**表示整数的幂

def CheckIfProbablyPrime(x):
    return (2 ** x - 2) % x == 0
“p− a是p的整数倍,因此对于素数,根据定理,x-2的幂2除以x的结果将留下0的剩余值(模“%”检查除法后剩余的数字

对于x-1版本

def CheckIfProbablyPrime(a, x):
   return (a ** (x-1) - 1) % x == 0
这两种变体对于素数都应该是真的,因为它们在Python中表示费马的小定理? 如果一个数字x是素数,那么对于任何整数a:

如果我们把两边都除以a,那么我们可以把方程改写如下:

我要证明这是如何工作的(你的第一个问题),因为在一些谷歌搜索上和下有很多很好的证明(比我能提供的更好)

2.码与定理的关系
因此,您发布的函数将检查
(2)这是该定理的一个非常直接的实现,使用
a==2
。它使用一个位移位运算符来执行
2**x
,阅读运算符我不能理解它的大部分内容,但这有帮助吗?:@Marius好的,所以他这样做是为了提高性能。仍然为什么使用2?它对任何素数都不起作用吗?没有区别吗?@jakekimds谢谢,这是对定理如何工作的一个很好且简短的解释。@bigOTHER我相信341561645和2不适用于列举一些。我想你误解了你所说的
2,它的功能是判断一个数字是否“绝对不是素数”。你能解释一下,为什么341561645和2返回False吗?答案很好。另外值得注意的是,
pow(2,x-1,x)
(2@bigOTHER:如果测试返回
False
,那么输入肯定不是奇数素数。如果测试返回
True
,那么测试是不确定的:它可能是素数,也可能不是素数。毫不奇怪,
2
在这里是一个特例,但是您询问的其他数字(341、561、645)都是复合的。位移位不是我的专长,但是如果
x
很大,那么计算
(2@Dan:回答得好,但是你对卡迈克尔数的定义是错误的。基-2伪素数是这个测试声称是素数的复合数。卡迈克尔数是对任何基声称是素数的测试的复合数。
def CheckIfProbablyPrime(a, x):
   return (a ** (x-1) - 1) % x == 0
def CheckIfProbablyPrime(x):
    return pow(2, x-1, x) == 1