质数求解

欧拉(乌拉(雾)):

\(a^{\phi\( n)}\ \equiv 1\( mod n)\)
拓展一下就是:
$a^c= $
\(1. a^{c\ mod\ \phi\( m)}\) \(gcd(a,m)=1\)
\(2. a^{c\ mod\ \phi\( m)+\phi\( m)}\) \(gcd(a,m) \ne 1\ 异或\ c \ge\ \phi\( m)\)

费🐎小定理(那就是\(\color {white}{nmsl(bushi)}\)

\(a^{p-1} \equiv 1\(%p)\)

\(p\)是质数
\(a*a^{-1} \equiv 1\)
=> \(a*a^{p-2} \equiv 1\)

威尔逊定理

\(\(p-1)! \equiv -1\( mod p)\)
是p为质数的条件,不考

中国剩余定理(\(\color {white}{中国剩男剩女定理(buni)}\)


真的看不懂=_=|||
上代码吧:

typedef long long ll;
ll ksm(ll a,ll b,ll p)
{
    //省略,去这里:

点我滚过去

}
ll inv(ll a,ll b)
{
    return ksm(a,b-2,b);
}
ll crt(int n,ll *a,ll *m)
{
    ll M=1,ret=0;
    for(int i=1;i<=n;i++)
        M*=m[i];//将所有数求出来
    for(int i=1;i<=n;i++)
    {
        ll w=M/m[i];//求每个Sn
        ret=(ret+w*inv(w,m[i])*a[i])%M;
    }
    return (ret+M)%M;
    }
}

质数筛

质数的倍数就\(\color {red}{一定不是}\)质数
所以可以直接筛所有的质数倍数,剩下的一定是质数
当循环到当前数的因子的时候,可以跳出循环了,因为这之后的分解已经包括了当前的因子
\(CODE:\)

int p[N],tot;
bool vis[N];
void gen(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
            p[++tot]=i;
            for(int j=1;j<=tot&&i*p[j]<=n;j++)
            {
                vis[i*p[j]]=1;
                if(i%p[j]==0)
                    break;
            }
    }
}

积性函数

\(a\)\(b\)互质,且\(f(a*b)=f(a)*f(b)\),则该函数为积性函数
带入线性筛:

int p[N],tot;
bool vis[N];
void gen(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            p[++tot]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=tot&&i*p[j]<=n;j++)
        {
            vis[i*p[j]]=1;
            if(i%p[j]!=0)
                phi[i*p[j]]=phi[i]*phi[p[j]];//积性函数
            if(i%p[j]==0)
                phi[i*p[j]]=phi[i]*p[j];//欧拉函数
                break;
        }
    }
}
posted @ 2019-07-07 08:50  ComputerEngine  阅读(254)  评论(0编辑  收藏  举报