欧拉函数及其特性

什么是欧拉函数
欧拉函数是 小于 xxx 的整数中与 xxx 互质的个数 , 一般用 φ(x)φ(x)φ(x) 表示。特殊的,φ(1)=1。

如何求欧拉函数
通式:φ(n)=n∗(1−1/p1)∗(1−1/p2)∗(1−1/p3)∗...∗(1−1/pn)φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*...*(1-1/pn)φ(n)=n(11/p1)(11/p2)(11/p3)...(11/pn) 其中 p1,p2,p3....pnp1,p2,p3....pnp1,p2,p3....pnnnn 的所有质因数,n为正整数

欧拉函数的性质
特性一:若n为质数 φ(n)=n-1
特性二:若a为质数,b%a=0,φ(ab)=φ(b)∗ab \%a=0 ,φ(ab)=φ(b)*ab%a=0,φ(ab)=φ(b)a
特性三:若a,b互质, φ(ab)=φ(a)∗φ(b)φ(ab)=φ(a)*φ(b)φ(ab)=φ(a)φ(b),特别的m=2,n为奇数时, φ(2n)= φ(n)
特性四:若n=pk,φ(n)=pk-pk-1,证明:因为p是n的唯一质因数,所以 φ(pk)=pk(1-1/p)=pk-pk-1;
特性五:不大于n且与n互质的整数和为: φ(n)∗n/2(n>1)φ(n)*n/2(n>1)φ(n)n/2n>1
特性六:n=∑{d∣n} φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n

#include<bits/stdc++.h>
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int maxn=1e6+5;

int num_prime;/** 质数个数 **/
int prime[maxn];/** 记录质数 **/
bool isnot_prime[maxn];/** 0 为质数 **/
int phi[maxn];/** 欧拉函数 **/

/** 欧拉线性筛 + 质数线性筛 **/
void Eouler(int x)
{
    mem(isnot_prime,0);
    isnot_prime[0]=isnot_prime[1]=1;
    num_prime=0;
    for(int i=2;i<=x;i++){
        if(!isnot_prime[i]){/** 判断i是否为质数**/
            prime[num_prime++]=i;/**记录质数**/
            phi[i]=i-1;/**欧拉特性一**/
        }
        for(int j=0;j<num_prime&&i*prime[j]<=x;j++){
            isnot_prime[i*prime[j]]=1;/**记录非质数**/
            if(i%prime[j]==0){/**判断 i prime[j] 是否互质**/
                phi[i*prime[j]]=phi[i]*prime[j];/**欧拉特性二**/
                break;
            }
            else{
                phi[i*prime[j]]=phi[i]*phi[prime[j]];/**欧拉特性三**/
            }
        }
    }
}

/** 欧拉线性筛 **/
void Eouler(int x)
{
    for(int i=1;i<=x;i++){
        phi[i]=i;
    }
    for(int i=2;i<=x;i++){
        if(phi[i]==i){/** 判断i是否为质数 **/
            for(int j=i;j<=x;j+=i){/** 将i的倍数更新 **/
                phi[j]=phi[j]/i*(i-1); /** 欧拉表达式 **/
            }
        }
    }
}

/** 单个数的欧拉筛 **/
ll Eouler(ll x)
{
    ll ans=x;
    for(ll i=2;i*i<=x;i++){/** 质因数筛 欧拉表达式**/
        if(x%i==0){
            ans-=ans/i;
            while(x%i==0){x/=i;}
        }
    }
    if(x>1){
        ans-=ans/x;
    }
    return ans;
}
int main()
{
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值