歐拉公式C++實現


歐拉函數Euler(n):求[2,n]中有多少個數與n互素

直接利用公式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)

其中:

  • pi為x的素因數
  • 每個素因數只用一次
    • 比如90=2 * 3^2 * 5
    • φ(90) = 90 * (1-1/2) * (1-1/3) * (1-1/5)
int Euler(int n) {
    int ans = n;
    for(int i = 2; i * i <= n; ++i) {	//注1
		if(n % i == 0) {	
			ans = ans - ans/i;	//x(1-1/p1)的變形
            while(n % i == 0) n /= i;	//注2
        }
    }
    if(n != 1) ans = ans - ans/i;	//注3
    return n;
}

注1:眾所周知,判斷因數時不用超過根號n,這跟判斷素數的算法是類似的

注2:前面說到了,每個素因數只有一次,但是有的素因數許多很多次冪,比如100=22*52,此時需要把素因數除盡。

​ 其實,代碼的實現原理不是像我們手動計算時,先找出所有的素因數然后代入公式。而是“步步蠶食”,有點類似於φ(90)=φ(2) * φ(45) = φ(9) * φ(5) = 6 * 4 = 24,即先把素因數2消掉,然后把素因數3消掉,最后把素因數5消掉。

注3:因為注1的限制,所以我們有的時候會遇到這樣的情況,明明還有素因數沒有被消掉,就已經跳出了循環,比如90,當我們消掉3之后,n變成了5,此時就會跳出for循環。所以我們才需要注3,來消掉素因數5。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM