1. 程式人生 > >【演算法】尤拉函式——小於n的數中與n互質數的數目

【演算法】尤拉函式——小於n的數中與n互質數的數目

尤拉函式

簡介

在數論,對正整數n,尤拉函式是小於n的數中與n互質的數的數目。此函式以其首名研究者尤拉命名(Ruler’so totient function),它又稱為Euler’s totient function、φ函式、尤拉商數等。 例如φ(8)=4,因為1,3,5,7均和8互質。 從尤拉函式引伸出來在環論方面的事實和拉格朗日定理構成了尤拉定理的證明。

性質

這裡寫圖片描述
若n是質數p的k次冪
這裡寫圖片描述
(因為除了p的倍數外,其他數都跟n互質)
若n為質數則
這裡寫圖片描述
這些定理是篩法求尤拉函式的基礎

演算法寫法

直接求解

int euler(int n){ //返回euler(n)   
int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先進行除法是為了防止中間資料的溢位 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

篩法

    long long a[1000020];
    memset(a,0
,sizeof(a)); a[1]=1; for(int i=2; i<1000020; i++) if(!a[i]) for(int j=i; j<1000020; j+=i) { if(!a[j]) a[j]=j; a[j]=a[j]/i*(i-1); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10