欧拉函数
定义
对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目
当然除了1以外其他正整数都不会与自身互质。
\(\{1,2,\cdots,m-1,m\}\)中有多少个整数与m互素。这个量用\(\psi(m)\)表示,函数\(\psi\)称为欧拉函数。
容易得到\(\psi(1)=1\),\(\psi(p)=p-1\)(p为素数),且所有合数m均有\(\psi(m)<m-1\)
如果m是一个素数幂\(p^k\),则\(\psi(p^k)=p^k-p^{k-1}\)
首先有\(n\perp p^k\Leftrightarrow p\nmid n\)(p不整除n),
在\(\{1,2,\cdots,p^k-1\}\)中的p的倍数是\(\{p,2p,\cdots,p^k-p,p^k\}\),一共\(p^{k-1}\)个,
剩下的就是与\(p^k\)互素的。
注意当k=1是有\(\psi(p)=p-1\)。
如果m>1不是素数幂,我们可以写成\(m=m_1m_2\),其中\(m_1\perp m_2\),那么我们可以得到\(n\perp m\Leftrightarrow (n\ mod\ m_1)\perp m_1\)且\((n\ mod\ m_2)\perp m_2\)
\(\because m=m_1m_2,n\perp m\)
\(\therefore n\perp m_1,n\perp m_2\)
\(gcd(n,m_1)=gcd(n\ mod\ m_1,m_1)=1\) 即\((n\ mod\ m_1)\perp m_1\)
这就意味着与m互素的数必定与\(m_1\),\(m_2\)互素(好像是废话哎)
先来看下仅有两个模3和4的剩余系:
n mod 12 | n mod 3 | n mod 4 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 2 | 2 |
3 | 0 | 3 |
4 | 1 | 0 |
5 | 2 | 1 |
6 | 0 | 2 |
7 | 1 | 3 |
8 | 2 | 0 |
9 | 0 | 1 |
10 | 1 | 2 |
11 | 2 | 3 |
以12为例,我们有\(\psi(12)=\psi(3)\psi(4)\),
因为n与12互素当且仅当n mod 4=1或3(即n与4互素)且n mod 3=1或2(n与3互素),
在上面的表中也可以看出与3互质的数有两个(1,2),与4互质的数有2个(1,3),他们有四种组合。
那么与12互素的值有(1,1),(2,1),(1,3),(2,3)(已经在上面的表中用黄黄的东西标出)
如果\(f(1)=1\),且\(f(m_1m_2)=f(m_1)f(m_2)只要m_1\perp m_2\)
那么正整数的函数f(m)称为是积性的,我们刚才证明了\(\psi\)(m)是积性的。
那么我们不难得出
\(\psi(m)=\underset{p|m}\Pi(p^{m_p}-p^{m_p-1})=m\underset{p|m}\Pi(1-\frac{1}{p})\)
这里有\(m=\underset{p}\Pi p^{m_p}\),上面式子的右边对于每个因式提一个\(p^{m_p}\)即可
例如:\(\psi(12)=(4-2)(3-1)=12(1-\frac{1}{2})(1-\frac{1}{3})\)
代码
在分解质因数的同时求解
int _phi(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++)
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
if(n>1)ans=ans/n*(n-1);
return ans;
}