欧拉函数

1,543 阅读3分钟

φ(n)表示比n小且和n互质的个数。
例: φ(8)=4 (1 3 5 7)
参考链接1
参考链接2

欧拉函数的通式和定义

欧拉函数的通式(注意:质因子就是 是质数的因子,1不是质数,所以1不是质因子) φ(n)=n∗(1−\frac{1}{p_1})∗(1−\frac{1}{p_2})∗……∗(1-\frac{1}{p_r})

Pi是n的质因子(是质数的因子)。注意:1不是质数,所以它不是质因子。

欧拉函数的证明

n是质数p的k次幂

若n是质数p的k次幂,φ(n)=p^k-p^{k-1}=(p-1)*p^{k-1}
因为除了p的倍数外,其他数都跟n互质。(也就是n的质因子只有p)
p^k以内是p的倍数的数一共有p^(k-1)个,
1×p、2×p、3×p、...、p^{k-1}×p, 把这些数去除,剩下的就是与n互质的数。

也可直接根据欧拉函数公式推出

φ(n)=n*(1-\frac{1}{p})=p^k*(1-\frac{1}{p}) = p^{k-1}*(p-1)

欧拉函数是积性函数

这个以后要用别的方法证明,不能用欧拉函数,因为它是用来证明欧拉函数的。
可用中国剩余定理证明。

若m和n互质,φ(m*n)=φ(m)*φ(n)
也可直接根据欧拉函数公式推出
φ(n)=n∗(1−\frac{1}{p_1})∗(1−\frac{1}{p_2})∗……∗(1-\frac{1}{p_r})
φ(m)=m∗(1−\frac{1}{q_1})∗(1−\frac{1}{q_2})∗……∗(1-\frac{1}{q_r})
m和n互质时,Qi和Pi不重合,所以φ(m*n)=φ(m)*φ(n)

欧拉函数的证明

有了上面两个条件,我们可以去证明欧拉函数了。
φ(n)=φ(p_1^{k_1}*p_2^{k_2}*p_3^{k_3}*...p_r^{k_r})
φ(n)=φ(p_1^{k_1})*φ(p_2^{k_2})*φ(p_3^{k_3})*...φ(p_r^{k_r})
因为φ(n)=p^k*(1-\frac{1}{p}),所以
φ(n)=p_1^{k_1}*p2^{k_2}*p_3^{k_3}*...*p_r^{k_r}*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*(1-\frac{1}{p_3})*...*(1-\frac{1}{p_r})
n = p_1^{k_1}*p2^{k_2}*p_3^{k_3}*...*p_r^{k_r},所以欧拉函数得证。

欧拉函数的一些性质

与n互质的小于n的数之和是\frac{n*φ(n)}{2} 若n是质数,φ(n)=n-1,所有小于n的数都和n互质。
若n是奇数,φ(2n)=φ(n),根据欧拉函数公式推出来的。

欧拉函数的应用和模板

单个求解欧拉函数

int eurlar(int x)
{
    int ret = x;
    //1不是质数,所以也不是质因子
    for (int i = 2; i <= sqrt(x) && x > 1; i++)
        if (x%i == 0)
        {
            ret = ret / i * (i-1); 
            while(x%i == 0) ///把一个因子除干净,就能保证后面进来的都是质因子(相当于筛掉了后面的非质数)
                x /= i;
        }
    if (x > 1)//最后可能剩下一个比sqrt(x)大的质因子,比如22 = 2*11
        ret = ret / x * (x-1);//并且最多有一个,假设有两个,那么这两个数的成绩便超过了x本身
    return ret;
}

求gcd(1,n)+...+gcd(n,n)的和f(n)

当p是质数的时,f(p) = gcd(1,p)+gcd(2,p)+...gcd(p,p)
1 \leq x \leq p-1来说,gcd(x,p)=1,而gcd(p,p)=p
所以,f(p) = \sum_{i=1}^{p}gcd(i,p) = \sum_{i=1}^{p-1}gcd(i,p)+gcd(p,p)=p-1+p=2p-1

因为,任何数都可以转化成质数的幂的乘积。

考虑f(p^2)(p为质数),
先假设所有小于p^2的数都和它互质,那么结果是2*p^2-1
而其实有p-1个数是p的倍数,且这p-1个数和p进行gcd的结果都是p。
(这p-1个数是p、p*2、p*3...p*(p-1))
f(p^2)=(2*p^2-1)+(p*(p-1)-(p-1))=2*p^2-1+p^2-p-p+1
所以,f(p^2)=3*p^2-2*p=p*(3p-2)

接着考虑f(p^3)(p为质数), f(p^3)=(2*p^3-1)+(p*(p^2-p)-(p^2-p))+(p^2*(p-1)-(p-1))
f(p^3)=2*p^3-1+p^3-p^2-p^2+p+p^3-p^2-p+1
f(p^3)=4*p^3-3*p^2=p^2*(4p-3)
是p的倍数但不是p^2倍数的数一共有(p^2-1)-(p-1)=p^2-p个。

.....

同理,我们得到f(p^k)=p^{k-1}*((k+1)*p-  k).

考虑最简单的情况,f(p*q) ,p、q都是质数.
根据上面的想法,同理得 f(p*q)=2*(p*q)-1 + p*(q-1)+q*(p-1) - (p-1+q-1)
f(p*q)= (2p-1)(2q-1)=f(p)*f(q)
由此,我们大胆假设,幂大于1的时候,也适用同样的公式,在此就不多加证明了。 现在如何求解已经显而易见了。