尤拉函式,求互質;
阿新 • • 發佈:2019-02-03
尤拉函式 :
尤拉函式是數論中很重要的一個函式,尤拉函式是指:對於一個正整數 n ,小於 n 且和 n 互質的正整數(包括 1)的個數,記作 φ(n) 。
完全餘數集合:
定義小於 n 且和 n 互質的數構成的集合為 Zn ,稱呼這個集合為 n 的完全餘數集合。 顯然 |Zn| =φ(n) 。
有關性質:
對於素數 p ,φ(p) = p -1 。
對於兩個不同素數 p, q ,它們的乘積 n = p * q 滿足 φ(n) = (p -1) * (q -1) 。
這是因為 Zn = {1, 2, 3, ... , n - 1} - {p, 2p, ... , (q - 1) * p} - {q, 2q, ... , (p - 1) * q} , 則 φ(n) = (n - 1) - (q - 1) - (p - 1) = (p -1) * (q -1) =
尤拉定理 :
對於互質的正整數 a 和 n ,有 aφ(n) ≡ 1 mod n 。
證明: ( 1 ) 令 Zn = {x1, x2, ..., xφ(n)} , S= {a * x1 mod n, a * x2 mod n, ... , a * xφ(n) mod n} ,
則 Zn = S 。
① 因為 a 與 n 互質, xi(1 ≤ i ≤ φ(n)) 與 n 互質, 所以 a * xi 與 n 互質,所以 a * xi mod n ∈ Zn 。
② 若 i ≠ j , 那麼 xi ≠ xj,且由 a, n互質可得
( 2 ) aφ(n) * x1 * x2 *... * xφ(n) mod n ≡ (a * x1) * (a * x2) * ... * (a * xφ(n)) mod n ≡(a * x1mod n) * (a * x2 mod n) * ... * (a * xφ(n)mod n) mod n ≡x1 * x2 * ... * xφ(n) mod n 對比等式的左右兩端,因為 xi (1 ≤ i ≤ φ(n)) 與 n 互質,所以 aφ(n) ≡ 1 mod n (消去律)。 注: 消去律:如果 gcd(c,p) = 1 ,則 ac ≡ bc mod p ⇒ a ≡ b mod p 。 費馬定理 :
#include<iostream> #include<cstring> #include<cmath> using namespace std; int a[1500005]; int euler_phi(int x) //尤拉函式 { int n=x; int k=(int)sqrt(double(n)+0.5); int m=n; for(int i=2;i<=k;i++) { if(n%i==0) { m=m/i*(i-1); while(n%i==0) n/=i; } } if(n>1)m=m/n*(n-1); return m; } void phi_table() //打表,求出1500000中所有的數的尤拉函式值 { memset(a,0,sizeof(a));a[1]=1; for(int i=2;i<=1500000;i++) if(!a[i]) { for(int j=i;j<=1500000;j+=i) { if(!a[j])a[j]=j; a[j]=a[j]/i*(i-1); } } } int main() { int n;phi_table(); while(cin>>n) { cout<<euler_phi(n)<<endl; cout<<a[n]<<endl; } }