模运算的世界--费马小定理

1.费马小定理

p是素数的情况下,对任意整数x都有x^p=x(mod p),这个定理称为费马小定理。

如果x无法被p整除,我们有x^(p-1)=1(mod p)

上述式子变形后a^(-1)=a^(p-2)(mod p),因此可以通过快速幂运算求出逆元。

在不是素数的情况下,可以有类似的欧拉定理可以使用。m=p1^(e1)*p2^(e2)*p3^(e3)....pn^(en)

合数定理:一个数K能分解成p1^(q1)*p2^(q2)...

那么,这个数的因子个数就是(1+q1)*(1+q2)*...*1+qk


//求欧拉函数值。复杂度O(n½)
int euler_phi(int n)
{
    int res=n;
    for(int i=2;i*i<=n;i++)
    {
        if(n%2==0)
        {
            res=res/i*(i-1);
            for(;n%i==0;n/=i);
        }
    }
    if(n!=1)res=res/n*(n-1);
    return res;
}
//O(maxn)时间内·筛出1-n欧拉函数值的表
const int maxn=100;

int euler[maxn];
void euler_phi2()
{
    for(int i=0;i<maxn;i++)
    {
        euler[i]=i;

    }
    for(int i=2;i<maxn;i++)
    {
        if(euler[i]==i)
        {
            for(int j=i;j<maxn;j++)euler[j]=euler[j]/i*(i-1);
        }
    }
}


原文地址:https://www.cnblogs.com/bryce1010/p/9387287.html