1. 程式人生 > >【尤拉函式】(小於或等於n的數中與n互質的數的數目)

【尤拉函式】(小於或等於n的數中與n互質的數的數目)

【尤拉函式】

數論,對正整數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,與尤拉定理、
費馬小定理
的關係,對任何兩個互質的正整數a, m, m>=2有a^φ(m)≡1(mod m)即尤拉定理:當m是質數p時,此式則為:a^(p-1)≡1(mod m)即費馬小定理。(慢慢理解~~)
程式碼實現:(寫一遍尤拉函式,加深印象!)
線上版:
#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;
}
預處理
#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);
            }
        }
    }
}
尤拉函式的和:phi_sum(n) = the sum of phi(i) where gcd(i,n) = 1 and 1 <= i <= n
1)phi_sum(n) = n * phi(n) / 2 (n >= 2)
2)phi_sum(n) = 1 (n == 1)