欧拉函数及欧拉定理 学习笔记

欧拉函数,即$\varphi(n)$,表示$\leq n$且与$n$互质的个数。

例如,$\varphi(1)=1$。当$n$为质数时,显然有$\varphi(n)=n-1$。

求某一个数的欧拉函数,我们可以用唯一分解定理求出。

设$n=p_1^{k_1}+p_2^{k_2}+\cdots +p_s^{k_s}$,则$\varphi(n)=n*\prod\limits_{i=1}^s \frac{p_i-1}{p_i}$。证明详见OI Wiki。(反正OI不需要证明,只需要会用

根据上述式子,我们可以$\sqrt n$求出一个数的欧拉函数。

一定要把除号写在乘号的前面!!!(血与泪的教训QAQ)

inline int phi(int x)
{
    int res=x,m=x);
    for (int i=2;i*i<=m;i++)
    {
        if (x%i==0){
            res=res/i*(i-1);
            while(x%i==0) x/=i;
        }
    }
    if (x>1) res=res/x*(x-1);
    return res;
}

如果求多个数的欧拉函数,可以使用线性筛。欧拉函数是积性函数,当$b$为质数时,满足下面性质:

$\varphi(ab)=\varphi(a)*b\ (a\ mod\ b=0)$($b$为最小质因子)

$\varphi(ab)=\varphi(a)*\varphi(b)\ (a\ mod\ b≠0)$

所以我们可以线性筛质数的同时求出欧拉函数。

inline int work()
{
    vis[0]=vis[1]=1;
    for (int i=2;i<=maxn;i++)
    {
        if(!vis[i]) prime[++tot]=i;
        for (int j=1;j<=tot&&prime[j]*i<=maxn;j++)
        {
            vis[i*prime[j]]=1;
            if (i%prime[j]==0){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

 欧拉定理:如果$gcd(a,p)=1$,那么$a^{\varphi(p)}\equiv 1\ (mod\ p)$。

扩展欧拉定理(学长的PPT):

欧拉定理可以解决一些幂比较大的毒瘤题目(比如$10^{2000000}$之类的)。证明什么的看OI Wiki吧。反正我也不会证明qwq

posted @ 2020-07-24 19:55  我亦如此向往  阅读(237)  评论(0编辑  收藏  举报