欧拉函数

前言

本文纯属本蒟蒻的学习笔记,若要学更详细更专业的,请出门左拐

正文

欧拉函数,也就是 φ(n)

表示的是小于等于 nn 互质的数的个数

n 是质数的时候,显然有 φ(n)=n1

求法

先说求法吧

首先,可以用定义求,复杂度 O(nlogn)

然后是单个求法

性质1:若 n=pkp 是质数(下文的 p 都是质数),那么 φ(n)=pkpk1

证明:

不与 n 互质的数正好是 p 的倍数,一共有 pk1 个这样的数

(在 1pk 之间,p 的倍数是 p,2p,3p,,pk1

性质2:由唯一分解定理,设
n=i=1spiki ,有
φ(n)=n×i=1s(11pi)

证明:

φ(n)=i=1sφ(piki) =i=1s(pi1)×piki1 =i=1spiki×(11pi) =n i=1s(11pi)

好了,用这个就可以求了(就是求 n 的所有质因数)

复杂度 O(n)

然后是求多个

线性筛!!!

用了三条性质

φ(p)=p1

φ(ip)=φ(i)pimodp=0

φ(ip)=φ(i)(p1)imodp0

代码

void getphi(int n){
    memset(vis,0, sizeof(vis));
    memset(prime,0,sizeof(prime));
    memset(phi,0,sizeof(phi));
    int cnt = 0;
    phi[1]=1; 
    for (int i = 2;i <= n; i++) {
        if (!vis[i]) {//第一个条件
            prime[++cnt] = i;
            phi[i] = i-1;
        }
        for (int j = 1; j <=cnt && i*prime[j] <= n; 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]*(prime[j]-1);//第三个条件
        }
    }
}

多个的是 O(n)

同时这个还可以求单个的,时间复杂度还是根号的

代码

for (int i = 2; i * i <= x; i++)
        if (!(x % i)) {
            pri[++t] = i;
            phi *= (i - 1);
            x /= i;
            while (!(x % i)) phi *= i, x /= i;
        }
 if (x > 1)
        phi *= (x - 1), pri[++t] = x;

其他性质

n=d|nφ(d)

证明:

考虑小于或等于 n 的所有正整数 k,即 1kn。我们可以根据 kn 的最大公约数来对 k 进行分类。

对于每个 k,设 d=gcd(k,n),则 dn 的一个因数。由于 dkn 的最大公约数,我们可以将 k 写成 k=md,其中 m 是一个整数,且 gcd(m,n/d)=1

现在,我们考虑所有满足 gcd(k,n)=dk 的集合。这个集合中的元素个数正好是 φ(n/d),因为 m 必须与 n/d 互质,而 m 的取值范围是 1n/d

所以,现在证明了 n=d|nφ(n/d)

由于 n/dd 有对称性,所以证毕

欧拉定理

gcd(a,m)=1,则 aφ(m)1(modm)

所以,当模数不是质数时求逆元,要约分至 a m 互质,然后逆元就是 aφ(m)1

后记

大概最重要的就是 φ 是一个积性函数,(但不是完全!必须互质)

posted @   小惰惰  阅读(68)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示

目录导航