【尤拉函式】(小於或等於n的數中與n互質的數的數目)
阿新 • • 發佈:2019-02-12
【尤拉函式】
在數論,對正整數n,尤拉函式是少於或等於n的數中與n互質的數的數目。此函式以其首名研究者尤拉命名,它又稱為Euler's totient function、φ函式、尤拉商數等。 例如φ(8)=4,因為1,3,5,7均和8互質。 從尤拉函式引伸出來在環論方面的事實和拉格朗日定理構成了尤拉定理的證明。【證明】:
設A, B, C是跟m, n, mn互質的數的集,據中國剩餘定理,A*B和C可建立一一對應的關係。因此φ(n)的值使用算術基本定理便知, 若 n= ∏p^(α(下標p))p|n 則φ(n)=∏(p-1)p^(α(下標p)-1)=n∏(1-1/p) p|n p|n 例如φ(72)=φ(2^3×3^2)=(2-1)2^(3-1)×(3-1)3^(2-1)=24,與尤拉定理、
程式碼實現:(寫一遍尤拉函式,加深印象!)
線上版:
預處理#include <bits/stdc++.h> using namespace std; int eular(int n) { int res=1; for(int i=2;i*i<=n;i++){ if(n%i==0){ n/=i,res*=i-1;//保證i一定是素數 while(n%i==0) n/=i,res*=i; } } if(n>1) res*=n-1; return res; } int main() { int n; while(scanf("%d",&n)!=EOF){ printf("%d\n",eular(n)); } return 0; }
尤拉函式的和:phi_sum(n) = the sum of phi(i) where gcd(i,n) = 1 and 1 <= i <= n#include <bits/stdc++.h> using namespace std; const int N=le5+5; int phi[N]; void pre_eular() { phi[1]=1; for(int i=2; i<N; i++) { if(!phi[i]) { for(int j=i; j<N; j+=i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } }
1)phi_sum(n) = n * phi(n) / 2 (n >= 2)
2)phi_sum(n) = 1 (n == 1)