歐拉函數求值

來源:互聯網
上載者:User
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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.