zoukankan      html  css  js  c++  java
  • 欧拉函数

    定义:1~N中与N互质的数的个数,记为(varphi (N) 或 phi(N))
    积性函数:如果当a,b互质,有f(ab)=f(a)*f(b),则称函数f是积性函数。

    性质

    1. 欧拉函数是积性函数(这里写得更好https://www.zhihu.com/question/410737433)
      证明:
      引理:

    [ m=m_1 m_2,m_1 perp m_2,则有 \ n perp m Leftrightarrow (n mod m_1) perp m_1,( n mod m_2 ) perp m_2 \ 显然 n perp m Leftrightarrow n perp m_1,n perp m_2 \ 而 gcd(n,m_1)=gcd(m_1,n mod m_1) ,故引理得证。 构造m关于模m_1,m_2的剩余系,可证 varphi(m_1m_2)=varphi(m_1) varphi(m_2) ]

    证毕

    2.(varphi(1)=1,varphi(p)=p-1,p是素数)
    3.欧拉函数计算式

    [根据性质1和唯一分解定理,可得欧拉函数的计算式 \ varphi(n)=varphi(prod _{i=1}^{m} p_i^{c_i} )=prod _{i=1}^{m} varphi(p_i^{c_i})=prod _{i=1}^{m} (p_i^{c_i}-p_i^{c_i-1}) \ 解释一下,p是质数,varphi(p^c)是[1,p^c]里与p^c互质的数的个数,与p^c不互质的数有p,2p,3p,cdots,p^{c-1},一共p^{c-1}个 (或者可以理解为p^c / p个)\ =prod _{i=1}^{m} p_{i}^{c_i}(1-frac{1}{p_i})=n prod _{i=1}^{m} (1-frac{1}{p_i}) ]

    因此,我们可以得出快速求某个数n欧拉函数值的方法,对n进行质因数分解,下面是模板

    inline int phi(int n) {
    	int ans = n;
    	int t = sqrt(n);
    	rep(i, 2, t) {
    		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;
    	}
    }
    

    4.(forall n>1,1~n中与n互质的数和为n * varphi(n)/2)
    证明:
    因为gcd(n,x)=gcd(n,n-x),所以与n不互质的数x,n-x是成对出现的,平均值为n/2,因此,与n互质的数的平均值也是n/2,共(varphi(n))个。
    证毕

    1. 若p|n,且(p^2|n,则varphi(n)=varphi(n/p)*p)
      证明:
      因为p|n,(p^2|n) ,所以n,n/p包含了相同的质因子(p^?),只是指数不同。将$ varphi(n),varphi(n/p) 按照欧拉函数计算式写出,相除的商为p$
      证毕

    6.若p|n且(p^2 mid n ,则varphi(n)=varphi(n/p)*(p-1))
    证明:
    若p|n且(p^2 mid n),所以p和n/p互质,所以(varphi(n)=varphi(n/p)*varphi(p),varphi(p)=p-1)
    证毕
    7. $$ sum_{d|n}varphi(d)=n $$

    证明:

    (f(n)=sum _{d|n}varphi(d))
    设m,n互质,则有
    (f(nm)=sum _{d mid nm} varphi(d) =sum _{a|n,b|m} varphi(ab)=sum _{a|n,b|m} varphi(a) varphi(b)=( sum _{a|n} varphi(a) ) * ( sum _{b|m} varphi(b) ))
    所以f(n)也是积性函数。对于单个质因子(f(p^m)=sum _{d|p^m} varphi(d)=varphi(1)+varphi(p)+varphi(p^2)+cdots+varphi(p^m))
    是一个等比数列求和后再加1,公比为p。结果为(p^m)。所以(f(n)=prod _{i=1}^{m}f(p_i^{c_i})=prod _{i=1}^{m}p_i^{c_i}=n)
    得证

    8.若n为奇数,(varphi(2n)=varphi(n))
    证明:因为n为奇数,所以(n perp 2 ,varphi(2n)=varphi(n)*varphi(2),而varphi(2)=1)
    证毕

    求法:1.分解质因数,上文有写
    2.适用与求[1,N]中所有数的欧拉函数值,用质数筛的思想

    (1)埃氏筛,时间复杂度O(N log N)
    inline void Euler(int n){
       rep(i,1,n) phi[i]=i;
       rep(i,2,n){
       	if(phi[i]==i)//  i是质数, 
       	 {
       	for(register int j(i);j<=n;j+=i)	
       		phi[j]=phi[j]/i*(i-1);
       	}
       }
    } 
    
    (2)欧拉筛,我们可以根据性质5和6来边进行欧拉筛边计算被筛除的数的欧拉函数值,时间复杂度为O(N)
    int v[MAXX], prime[MAXX], phi[MAXX], cnt;
    inline void EulerSieve(int N) {
    	memset(v, 0, sizeof v); //最小质因子
    	cnt = 0;
            phi[1]=1;
    	rep(i, 2, N) {
    		if(!v[i]) {
    			v[i] = i;
    			prime[++cnt] = i;
    			phi[i] = i - 1;
    		}
    		rep(j, 1, cnt) {
    			if(prime[j] > v[i] || 1ll * prime[j]*i > 1ll * N) break;
    			v[i * prime[j]] = prime[j];
    			phi[i * prime[j]] =phi[i]*  (i % prime[j] ? prime[j] - 1 : prime[j] );
    		}
    	}
    }
    

    欧拉反演
    (以下公式和部分内容搬运于粉兔,自己懒得打了,加了点注释)
    利用上面性质7
    ,我们可以有

    [egin{align} sum_{i=1}^{n} operatorname{gcd}(i, n) &=sum_{j=1}^{n}left(j imes sum_{i=1}^{n}[g c d(i, n)=j] ight) (枚举gcd) \ &=sum_{j=1}^{n}left(j imes sum_{i=1}^{n}[g c d(i / j, n / j)=1](j|i, j| n) ight) (i/j 会小于等于 n/j) \ &=sum_{j=1}^{n}(j imes varphi(n / j)(j mid n)) \ &=sum_{j mid n}(j imes varphi(n / j)) \ &到这里就可以直接计算了。 但是还可以进一步化简! (以下的 p 为质数) \ \ &=sum_{j mid n}(n / j imes varphi(j)) (变量替换)\ &=sum_{j mid n}left(n / j imesleft(j cdot prod_{p mid j} frac{p-1}{p} ight) ight) (欧拉函数的直接计算式)\ &=sum_{j mid n}left(n cdot prod_{p mid j} frac{p-1}{p} ight) \ &=n imes sum_{j mid n} prod_{p mid j} frac{p-1}{p} \ end{align} ]

    [n=p_1^{b_1} p_2^{b_2} cdots p_k^{b_k} \ 所以 j=p_1^{c_1} p_2^{c_2} cdots p_k^{c_k} ( 0 le c_i le b_i ) \ f_i=frac{p_i-1}{p_i} ]

    [prod_{p mid j} frac{p-1}{p}=prod_{i=1}^{k} f_{i}left[c_{i}>0 ight] ]

    所以可以继续化简

    [n * prod_{i=1}^k(f_i*b_i+1)(可以取,也可以不取) ]

    最后

    [n cdot prod_{i=1}^{k} frac{b_{i} cdot p_{i}-b_{i}+p_{i}}{p_{i}} ]

    模板题和代码见P2303 [SDOI2012] Longge 的问题

    本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15212552.html

  • 相关阅读:
    Linux常用命令(第二版) --系统开关机命令
    Linux常用命令(第二版) --网络通信命令
    Linux常用命令(第二版) --压缩解压缩命令
    Linux常用命令(第二版) --帮助命令
    Linux常用命令(第二版) --文件搜索命令
    Linux常用命令(第二版) --权限管理命令
    Linux常用命令(第二版) --文件管理命令
    程序员练级之路 (作者:陈皓)
    我的算法学习之路
    Linux学习笔记 --服务器优化
  • 原文地址:https://www.cnblogs.com/QQ2519/p/15212552.html
Copyright © 2011-2022 走看看