欧拉函数及其线性筛选法

欧拉函数

       欧拉函数,它又称为Euler's totient function、φ函数、欧拉商数等,对正整数n,欧拉函数是小于n且和n互质的正整数(包括1)的个数。例如φ(8)=4,因为1,3,5,7均和8互质,下面用φ(n)表示欧拉函数的值。

欧拉定理

费马定理适用于素数模下的,指数同余性质,当模为合数的时候,需要用欧拉定理

推荐博客https://blog.csdn.net/TateBrwonJava/article/details/79866570

引理    (p为素数)

1. φ(p)=p-1;

2. φ(p^a)=(p-1)*p^(a-1);

3. 对于互质的a,b,   φ(a*b)=φ(a)*φ(b);

4   为正整数n的素数幂乘积表达式,有下面的

    

欧拉定理公式 

欧拉函数线性筛选法

用到的性质

①:φ(p)=p-1

②:φ(p*i)=p*φ(i) (当p%i==0时

③:φ(p*i)=(p-1)*φ(i) (当p%i!=0时)

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include <iomanip>
#include<list>
#include<queue>
#include<sstream>
#include<stack>
#include<string>
#include<set>
#include<vector>
using namespace std;
#define PI acos(-1.0)
#define EPS 1e-8
#define MOD 1e9+7
#define LL long long
#define ULL unsigned long long     //1844674407370955161
#define INT_INF 0x7f7f7f7f      //2139062143
#define LL_INF 0x7f7f7f7f7f7f7f7f //9187201950435737471
const int dr[]={0, 0, -1, 1, -1, -1, 1, 1};
const int dc[]={-1, 1, 0, 0, -1, 1, -1, 1};
// ios.sync_with_stdio(false);
// 那么cin, 就不能跟C的 scanf,sscanf, getchar, fgets之类的一起使用了。
LL accumulate[1000005];//使用long long
int phi[1000005];
int prime[1000005];
bool not_prime[1000005];
int tot;
void Phi()
{
    for(int i=2;i<1000001;++i)
    {
        if(!not_prime[i])
        {
            prime[tot++]=i;
            phi[i]=i-1;
        }
        for(int j=0;j<tot&&i*prime[j]<=1000001;++j)
        {
            not_prime[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}
int main()
{
    Phi();
    for(int i=2;i<1000001;++i)
        accumulate[i]=accumulate[i-1]+phi[i];
    int n;
    scanf("%d",&n);
    do
    {
        printf("%lld\n",accumulate[n]);
        scanf("%d",&n);
    }while(n);
    return 0;
}




在筛选素数的时候同时求欧拉函数

猜你喜欢

转载自blog.csdn.net/sdau_fangshifeng/article/details/81349062