一个恒成立的等式a^(p-1)%p≡1(p为素数 a<p)
但如果反过来(倘若a^(p-1)%p=1,a<p,则p为素数)并不成立,也就是说它的逆定理并不成立。
但是,它的否逆定理成立。即若a^(p-1)%p≠1,则,p为合数。
所以,对于需要判断素数的p,我们随机枚举若干个a(a<p)判断,倘若a^(p-1)%p≠1,我们就可以判断它一定是合数,倘若a^(p-1)%p=1始终成立(判断二十次以上),那基本可以确定p为素数(并不能完全确定,但不是素数的几率特别小,判断次数越多几率越小)
显然a^(p-1)需要用快速幂,虽然可以边乘边模,但是a*a显然也有可能超。
所以定一个函数f(a,b,p)来计算a*b%p;
如果b为偶数 f(a,b,p)=f((a+a)%p,b/2,p);
else f(a,b,p)=a*f((a+a)%p,b/2,p)
在上面的基础上有一个优化
显然x^2%p=1(p为素数)的解为x1=1,x2=p-1;
倘若x存在其他解满足方程,那么p为合数;
显然,在快速幂的过程中,可以将p-1(显然是偶数,因为p是素数)分解成u*2^j*(j必定≥1,且u为奇数)
那么可以快速幂先算出u,然后乘j次2判断是否满足原基本式即a^(p-1)%p≡1(此时的a与p-1都是运算过程中的需要自己重新计算),倘若不满足等于1则为合数,这样可以增加测试次数,降低错误率。