1. 程式人生 > >尤拉函式(總結)

尤拉函式(總結)

尤拉函式

定義

尤拉函式ϕ(n)是不超過n且和n互質的正整數的個數。尤拉函式φ(n)的作用就是轉化,從而簡化運算(小性質:n的所有質因子之和=eular(n)*n/2);

下面直觀地看看尤拉函式:

n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
φ(n) 1 1 2 2 4 2 6 4 6 4 10 4 12 6 8

定理

  • 定理1 算術函式f如果滿足對於任意兩個互質的正整數m和n,均有f(mn)=f(m)f(n),就稱f為積性函式(或乘性函式)。如果對於任意兩個正整數m和n,均有f(mn)=f(m)f(n),就稱為完全積性函式。

  • 定理2 若m、n互質,ϕ(mn)=ϕ(m)ϕ(n),所以尤拉函式是積性函式。因為mn互質,和m互質的數乘上和n互質的數就會和mn互質。

  • 定理3              

  • 尤拉函式的兩種求法

#include<iostream>
using namespace std;
int phi[100011];
int eular(int n){//求一個數的尤拉值
        int res=n;
        if(n==1)
                return 1;
        for(int i=2;i<=n;i++){
                if(n%i==0){
                        res=res/i*(i-1);
                        while(n%i==0)
                                n/=i;
                }
        }
        return n>1?res/n*(n-1):res;
}
void eularplus(int n){//求多個數的尤拉值
        for(int i=1;i<=n;i++)
                phi[i]=i;
        for(int i=2;i<=n;i++){
                if(phi[i]==i){
                        for(int j=i;j<=n;j+=i)
                                phi[j]=phi[j]/i*(i-1);
                }
        }
}
int main()
{
        int n;
        scanf("%d",&n);
        printf("%d\n",eular(n));
        eularplus(n);
        for(int i=1;i<=n;i++)
                printf("%d ",phi[i]);
        printf("\n");
        return 0;
}
// 15
// 8
// 1 1 2 2 4 2 6 4 6 4 10 4 12 6 8