歐拉函數(C語言實現)


歐拉函數(Euler's totient function)是指小於n的正整數中與n互質的數的數目,用φ(n)表示。特別的,φ(1)=1;

例如:φ(10)=4;1 3 7 9與10互質。

 

公式:φ(n)=n*(1-1/p(1))*(1-1/p(2))*(1-1/p(3))*...*(1-1/p(n)),其中p(1),p(2),p(3)...p(n)為n的所有質因數,每個質因數只能出現一次。

例如:φ(8)=8*(1-1/2)=4;1 3 5 7與8互質

           φ(10)=10*(1-1/2)*(1-1/5)=4;1 3 7 9與10互質

 

性質:

1.若n為質數,則φ(n)=n-1;(注意1非素數也非合數)例如φ(7)=7-1=6;1 2 3 4 5 6(除7外)均與7互質

2.若p為質數,n=p^k,則φ(n)=p^k-p^(k-1)=(p-1)*(p^(k-1)); 例如φ(9)=φ(3^2)=3^2-3^1=(3-1)*(3^(2-1))=6;1 2 4 5 7 8均與9互質

3.若m,n互質,則φ(m*n)=φ(m)*φ(n)=(m-1)*(n-1);

引申:φ(2*n)=φ(2)*φ(n)=(2-1)*φ(n)=φ(n);

 

歐拉定理:

若a,n為正整數且a,n互質,則a^φ(n) ≡ 1 (mod n)

費馬小定理:

若p為素數且a,p互質,則a^(p-1) ≡ 1 (mod p)

友情鏈接:

https://baike.baidu.com/item/MOD運算/7885553#4

 

下面放代碼:

 1 #include<stdio.h>
 2 #include<math.h>
 3 int eular(int n)
 4 {
 5     int res=n;
 6     for(int i=2;i<=sqrt(n);i++)//判斷n是否為質數
 7     {
 8         if(n%i==0)res=res/i*(i-1);//res=res*(1-1/i)先進行除法防止溢出 
 9         while(n%i==0)n/=i;
10     }
11     if(n>1)res=res/n*(n-1);
12     return res;
13 }
14 int main()
15 {
16     int n;
17     scanf("%d",&n);
18     printf("%d",eular(n));
19     return 0;
20 }

 

謝謝觀看,如有問題歡迎提出並指正。


免責聲明!

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



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