int Oula(int x){ int i,res=x; for(i=2;i<(int)sqrt(x*1.0)+1;i++) if(x%i==0) { res=res/i*(i-1); while(x%i==0) x/=i; } if(x>1) res=res/x*(x-1); return res;}
#define nmax 3000010#define nnum 290000int flag[nmax], prime[nnum];int plen;void mkprime(){ int i,j; memset(flag,-1,sizeof(flag)); for(i = 2, plen = 0; i < nmax; i ++){ if(flag[i]) prime[plen ++] = i; for(j = 0; (j < plen) && (i * prime[j] < nmax); j ++){ flag[ i * prime[j] ] = 0; if(i % prime[j] == 0) break; } }}LL Oula(LL n) {//求歐拉函數的值 int i, te; LL phi; te = (int) sqrt(n * 1.0); for (i = 0, phi = n; (i < plen) && (prime[i] <= te); i++) { if (n % prime[i] == 0) { phi = phi / prime[i] * (prime[i] - 1); while (n % prime[i] == 0) { n /= prime[i]; } } } if (n > 1) { phi = phi / n * (n - 1); } return phi;}
快速求歐拉函數:
#include <iostream>#include <cstdio>#include <cmath>using namespace std;#define bint __int64#define N 3000001bint phi[N];void init(){ int i, j; for(i = 1; i < N; i++) phi[i] = i; for(i = 2; i < N; i++) if(i == phi[i]) //此時i為素數 for(j = i; j < N; j += i) //j累加i phi[j] = (phi[j] / i) * (i - 1); //j有因子i,而且i是素數,正是歐拉函數}int main(){ init(); int a, b; while(scanf("%d%d", &a, &b) != EOF) { bint ans = 0; for(int i = a; i <= b; i++) ans += phi[i]; printf("%I64d\n", ans); } return 0;}
在數論中,對正整數n,歐拉函數是少於活等於n的數中與n互質的數的數目。例如φ(8)=4,因為1,3,5,7均和8互質。
歐拉函數的演算法:
一.從1到N-1逐個判斷時候滿足歐拉函數的條件,如果滿足則輸出概述,並計算出歐拉函數&(N);
二.利用歐拉函數和他本身不同質因數的關係,P是N的質因數。
歐拉函數和它本身不同質因數的關係:
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn為x的所有質因數,x是不為0的整數。φ(1)=1(唯一和1互質的數就是1本身)。 (注意:每種質因數只一個。比如12=2*2*3
三.利用歐拉函數&(N)和N的標準非解釋的關係求解歐拉函數。
如果N=p1^q1*p2^q2*……pn^qn,則&(N)的計算公式是
&(N)=p1^(q1-1)*p2^(q2-1)……pn^(qn-1)*(p1-1)*(p2-1)*(p3-1)……(pn-1)
如234=2^1*3^2*13^1;
則&(234)=2^(1-1)*3^(2-1)*13^(1-1)*(2-1)*(3-1)*(13-1);
歐拉函數的幾個推論
一.歐拉函數值為偶數
二.對任意素數p,有&(p)=p-1;
三.設N為指數P的平方,即N=P*P,則&(N)=(P-POY)*P;
四.這N為指數P的n次方(n>=2),則&(N)=N*(1-1/P);