容斥求欧拉函数证明
以前一直对容斥原理求欧拉函数的求法有些不解,昨晚领悟透彻之后准备记录一下。
首先对于一个正整数
因此考虑从
这些数字都与
但是又针对另外一个质因子
发现如果同时删除
因此这两个质数同时对欧拉函数的贡献为:
提取公因式得到:
又可得到:
因此根据乘法原理,每个质数
需要注意的是,这种求法意为每一个质数只被考虑一次,即使
分解质因子求欧拉函数
可以采用算数基本定理中的不同方法分解质因数来求欧拉函数,复杂度即分解质因数的复杂度。
以经典试除法来举例,复杂度为
有两种方法理解该代码,第一种为直接考虑每个质数的贡献然后除去该质数进行分解质因数的步骤,每个质数可以做出
通式见下:
定义
第二种方法是直接从容斥原理的式子倒推:
这两种方法有什么联系呢?只需要考虑每次
代码实现如下:
1 | long long euler(long long n){ |
埃筛求欧拉函数
有一种采用埃筛实现的求欧拉函数的方法:
从
我们对上述语句的式子展开发现实际上与分解质因子求欧拉函数的式子相同,而我们采用埃筛筛出了质数,这些质数只会出现一次,每个质因数都可以对自己的倍数做出贡献,而这些贡献重叠起来就交集成了最终解。
因此该算法的思想实际上也是分解质因子,不过比刚才的方法更加高效。
1 | int phi[MAXN]; |
另外还有一种线性求解欧拉函数的方法,在线筛及其应用中提及。