素数费马检测(概率判别法)

检验一个数是否是素数,朴素的方法有试除法,筛法,因为费马小定理和模的运算,可以将时间复杂度降为klogN,k是常数,k越大,算法返回结果正确的概率越高
费马小定理
a^(p-1)≡1 (mod p)(a不是p的倍数)
费马小定理的逆定理不一定成立,即可能是合数也返回了1,这样的数称为伪素数,但a不同的取值会让错误得到修正,重新返回正确结果,任选一个在2~n-1的数,会出现错误的概率不会超过1/2,取十次错误率不到千分之一,所以是具有有效性的。

同余运算:
1、(a±b)%p=(a%p±b%p)%p
2、(ab)%p=(a%pb%p)%p
3、同余式相加减a≡b(mod m) c≡d(mod m) => a±b≡b±d(mod m)
高指数的同余运算利用同余的性质,把余数不断幂乘

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef long long ll;

ll Quick_Mod(ll a, ll b, ll mod)//快速幂 a^b%mod
{
    ll res = 1,term = a % mod;
    while(b)
    {
        if(b & 1) res = (res * term) % mod;//取b的最后一位,若是1,执行
        term = (term * term) % mod;//幂乘
        b >>= 1;//b变为原来1/2
    }
    return res;
}

bool Is_Prime(ll N)
{
    srand(time(0));
    int i;//随机取10个数
    for (i = 0; i < 10; i++) {
        if (Quick_Mod(1 + rand() % (N - 1), N - 1, N)!=1) {
            break;
        }
    }
    if (i < 10)return false;
    else return true;
}

素数费马检测(概率判别法)

上一篇:Linux 系统中 [文件和目录属性] 相关知识详解


下一篇:【YBTOJ】【树形dp】块的计数