【欧拉函数】
任务开始。
- 什么是欧拉函数?我们又怎么求呢???
- 此次任务的主要怪物:欧拉函数
(1)欧拉函数定义
欧拉函数嘛,当然是我们著名的莱昂哈德·欧拉发明的啦~那么他是怎么定义介个函数滴?
咳咳,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)
啊?这就完了?好像挺简单的啊。。。
但是不要小瞧他,看过上一篇讨伐的各位可能还记得这样一张图:
当时是不是对它一知半解有点懵?现在我们来认真的导一下,彻底学习~
(2)欧拉函数性质
1.φ(n)=n-1 当且仅当n为质数
这这这,这不废话吗,n要是质数的话小于n的数里面不都跟它互质吗!过过过过过
2.φ(pa)=pa-pa-1 p为质数
em...这个稍微有点意思了。对于pa而言,与它不互质的数必然含有因子p,说白了就是所有p的倍数都不与它互质
而这些数的数量就是(pa)/p=pa-1,然后再一减,就有了这个式子!下一个~!
3.φ(n*m)=φ(n)*φ(m) 当gcd(n,m)=1时
难度逐渐上升了呢,这个证明比较复杂。务必参考这个
不过我在这里会进一步的解释,你准备好这场惊心动魄的狩猎了吗?
首先我们列个矩阵:
可见这里我们拿出了所有n*m以内的数,每个数都可以表示为k*m+r,其中k为第几行(从0开始),r为第几列(从1开始)
接下来明确我们要求的:phi(n*m)
想要让一个数与n*m互质,只要满足其与n互质,又满足与m互质即可(设gcd(a,n)=1且gcd(a,m)=1。首先因为n与m互质,所以将n与m分别拆分质因数
,你会发现他们没有共同的质因子,而mn的质因子就为他们两个质因子的合集。如果a与n互质,那么他与n没有共同的质因子,同理与m也没有共同的
质因子,所以把a与mn放在一起,你理所应当的发现他们没有共同的质因子,即gcd(a,mn)=1)
所以求解就变成了所有即与n互质又与m互质的数
由于 GCD(km+r, m)=GCD(r, m)(记得辗转相除法吗?),所以每一列的 n 个元素同时与 m 互素当且仅当 GCD(r,m)=1,
因此与 m 互素的列共有phi(m)列。
假定第 r 列元素满足 GCD(r,m)=1. 则该列的所有元素为
而我们需要验证的是,这些数中有phi(n)个数是与n互质的
首先我们要知道这些数组成了一个mod n的完全剩余系。
什么是完全剩余系呢?就是说有n-1个数,这些数除n的余数两两不相同,就说这些数构成了模n完全剩余系。
怎么证明这一点呢?
设其中的两个数分别为r+am,r+bm(0<=a,b<n),假设a!=b,同时他们除n的余数相同,这就不是完全剩余系。这个条件写为:(r+am)%n==(r+bm)%n
所以[(r+am)%n]-[(r+bm)%n]==0,根据模运算,这么写也可以:
[(r+am)-(r+bm)]%n==0
所以[(a-b)m]%n==0
要想让这个式子成立,只有以下两种可能:
- a-b==0,但是因为a!=b,所以不成立。
- (a-b)m是n的倍数,因为gcd(m,n)=1,所以(a-b)==kn(k>=1),但是因为0<=a,b<n,所以仍然不成立
综上所述,假设不成立,所以这些数构成了模n完全剩余系
根据gcd(r+km,n)==gcd((r+km)%n,n),问题就转化成了[1,n-1]有多少与n互质的数(0肯定不行),没错就是我们一直梦寐以求的phi(n)!
在这mn个数中,有phi(m)列与m互质,这些列中又各自有phi(n)个数与n互质,
综上所述!phi(m*n)=phi(m)*phi(n)!(当且仅当gcd(m,n)=1)
4.φ(n)=n*∏1-1/p 其中p是n的质因子
这一条可以翻译成这样:
其中p1到pj为x所有的质因子
证明:拆n->p1a1*p2a2*......*pjaj
用第3条变成:phi(n)=phi(p1a1)*phi(p2a2)*...*phi(pjaj)
再用第2条变成:p1a1*p2a2*...*pjaj*(1-p1-1)*(1-p2-1)*...*(1-pj-1)
化简得证~~
5.φ(2*n)=φ(n) 当n是奇数时
因为n为奇数,所以由 n到2n的变化中增加了质因子”2“,根据第四条可以变成:
φ(2*n)=φ(n)*2*(1-1/2)=φ(n),得证
6.φ(n) mod 2=0 当n>2时
由于第5条,我们只需要证明n为奇数或为2^a(a>1)时成立即可
- n=2^a(a>1),所以phi(n)=2a-2a-1=2a-1*(2-1)为偶数
- n为奇数,则n拆分后必有奇质因数,而pa与pa-1都为奇数,所以pa-pa-1必为偶数
综上,得证
(哎我去切了半天刀都钝了了TAT赶快磨下)
【砥石】入手!
有了这些素材性质做武器工具,我们就能更好的讨伐欧拉函数啦!让我们进入正题吧!
(3)欧拉函数计算
算法1:线性筛
这个线性筛你们一定眼熟,不眼熟赶快去看!在这里不讲了
时间代价:O(n)
缺点:处理大范围数据是比较憋手
优点:能求出范围内所有的欧拉函数值还附赠素数表~~