欧拉函数总结

update on 2021.9.3:大部分例题都被咕咕了,以后闲的没事再写吧

欧拉函数

定义

\(\large \varphi{(x)}\)表示在整数 \(\large [1,n]\) 中和 \(\large n\) 互质的数的个数.

写出来也就是:\({\large\varphi{(n)}= \sum\limits_{i=1}^{n}{[(i,n)=1]}}\)

常见计算方法

1.计算某一个数的欧拉函数值

\(\large \varphi{(n)}=n\prod\limits_{i=1}^{m}{(1-\dfrac{1}{p_i})}=n\prod\limits_{i=1}^{m}{\dfrac{p_i-1}{p_i}}\)

证明:

由性质1,我们想到可以把\(n\)分解质因数变成 \(\large n=\prod\limits_{i=1}^{m}{c_i^{p_i}}\),然后利用积性函数的性质转化成:

\(\large \varphi{(n)}=\prod\limits_{i=1}^{m}{\varphi{(c_i^{p_i})}}\),然后使用性质4,即:

\(\large \varphi{(n)}=\prod\limits_{i=1}^{m}{\varphi{(c_i^{p_i})}}=\prod\limits_{i=1}^{m}{p_i^{c_i}(1-\dfrac{1}{p_i})}=n\prod\limits_{i=1}^{m}{(1-\dfrac{1}{p_i})}=n\prod\limits_{i=1}^{m}{\dfrac{p_i-1}{p_i}}\)

\(\large Q.E.D.\)

分解质因数

这个过程可以直接分解质因数来做,那么也就可以使用 \(Pollard\_rho\)来做,期望的时间复杂度就是\(O(n^{\dfrac{1}{4}})\),实际应该是\(O(\sqrt{n})\),但是运行效率很高。

代码

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=false;
    while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}

template <typename T>
inline void write(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10^48);
    return ;
}
#define ll long long
#define ull unsigned long long
#define ld long double 
inline ll mul(ll x,ll y,ll mod){
	ll res=x*y-mod*(ll)((ld)x/mod*y);
	if(res<0)return res+mod;
	if(res<mod)return res;
	return res-mod;
}
ll QuickPow(ll x,ll y,ll mod){
	ll res=1;
	for(;y;y>>=1,x=mul(x,x,mod)) if(y&1) res=mul(res,x,mod);
	return res;
}
ll test[3]={2,61};
inline bool Miller_Rabin(ll x){
	if(x==1) return false;
	ll t=x-1,k=0;
	while(!(t&1)) t>>=1,k++;
	for(int i=0;i<2;i++){
		if(x==test[i]) return true;
		ll a=QuickPow(test[i],t,x),Nex=a;
		for(int j=1;j<=k;j++){
			Nex=mul(a,a,x);
			if(Nex==1&&a!=1&&a!=x-1) return false;
			a=Nex;
		}
		if(a!=1) return false;
	}
	return true;
}
inline bool prime(ll x){
    if(x==46856248255981ll||x<2)return false;
    if(x==2||x==3||x==7||x==61||x==24251) return true;
    return Miller_Rabin(x);
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
inline ll f(ll x,ll c,ll mod){
	ll res=mul(x,x,mod)+c;
	return res<mod?res:res-mod;
}
inline ll Pollard_Rho(ll x){
	ll c=rand()%(x-1),s=0;
	for(ll lim=1;;lim<<=1){
		ll t=s,now=1;
		for(ll j=1;j<=lim;j++){
			s=f(s,c,x);
			now=mul(now,abs(s-t),x);
			if(!now){ll d=gcd(s,x);if(d>1)return d;return x;}
			if(j%127==0){ll d=gcd(now,x);if(d>1)return d;}
		}
		ll d=gcd(s,x);
		if(d>1) return d;
	}
}
ll Maxn;
map<ll,int>fac;
inline void GetFact(ll x){
	if(x<=1) return ;
	if(prime(x)){
		fac[x]++;
		return ;
	}
	ll p=Pollard_Rho(x);
	while(p>=x) p=Pollard_Rho(x);
	GetFact(x/p),GetFact(p);
	return ;
}
inline ll GetPhi(ll x){
	map<ll,int>Map;
	swap(Map,fac);
	GetFact(x);
	for(map<ll,int>::iterator it=fac.begin();it!=fac.end();it++) x=x/(*it).first*((*it).first-1);
	return x;
}
ll n;
signed main(){
	srand(time(NULL));
	while(cin>>n&&n) write(GetPhi(n)),putchar('\n');
	return 0;
}

同时我们也有暴力的办法来做,也就是先筛出\(\sqrt{n}\)范围内的质数,然后我们枚举每一个质数即可分解质因数,时间复杂度就是\(\large O(\dfrac{\sqrt{n}}{\log{n}})\)

代码

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=false;
    while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}
template <typename T>
inline void write(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10^48);
    return ;
}
const int N=1e5+5,M=1e6+5,MOD=1e9+7;
#define ll long long
ll n;
int cnt,prime[N];
bool vis[N];
inline void GetPrimes(int d){
	vis[1]=true;
	for(int i=2;i<=d;i++){
		if(!vis[i]) prime[++cnt]=i;
		for(int j=1;j<=cnt&&prime[j]*i<=d;j++){
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
	return ;
}
int main(){
	GetPrimes(1e5);
	while(cin>>n&&n){
		ll tmp=n;
		for(int i=1;prime[i]*prime[i]<=n&&i<=cnt;i++){
			if(n%prime[i]==0){
				while(n%prime[i]==0) n/=prime[i];
				tmp=tmp*(prime[i]-1)/prime[i];
			}
		}
		if(n>1) tmp=tmp*(n-1)/n;
		write(tmp),putchar('\n');
	}
	return 0;
}

2.计算\([1,n]\)的欧拉函数值

首先需要知道欧拉函数的性质

线性筛欧拉函数

首先因为欧拉函数是积性函数,但是不是完全积性。

然后因为我们可以从 \(\large \varphi{(p^k)}\) 快速推出 \(\large \varphi{(p^{k+1})}\),这里是\(O(1)\),(线性筛的复杂度取决于这个转移的复杂度乘上值域范围),于是可以考虑使用线性筛来求出欧拉函数。

代码

int n,cnt,prime[N],phi[N];
bool vis[N];
inline void GetPrimes(int d){
	vis[1]=true;phi[1]=1;
	for(int i=2;i<=d;i++){
		if(!vis[i]) prime[++cnt]=i,phi[i]=i-1;
		for(int j=1;j<=cnt&&prime[j]*i<=d;j++){
			vis[i*prime[j]]=true;
			if(i%prime[j]!=0) phi[i*prime[j]]=phi[i]*(prime[j]-1);
			else phi[i*prime[j]]=phi[i]*prime[j];
			if(i%prime[j]==0) break;
		}
	}
	return ;
}

欧拉函数的常用性质

\(性质1(积性函数)\)

结论

$\varphi \(是积性函数,但不是完全积性函数,即若\)(n,m)=1\(,则\)\varphi{(nm)}=\varphi{(n)}\times\varphi{(m)}$

对于这个结论的扩展,可以看性质11

证明

\((n,m)=1\),那么如果存在一个数 \(x\) 和 $ nm$ 互质,则 \(x\) 一定和 $ n$ 互质,同时也一定和 \(m\) 互质,这样的 \(x\)

显然有 \(\varphi{(n)}\times\varphi{(m)}\) 个,于是可以得到\(\varphi{(nm)}=\varphi{(n)}\times\varphi{(m)}\)

\(Q.E.D.\)

\(性质2(n为质数)\)

结论

对于质数 \(p\) ,那么 \(\varphi{(p)}=p-1\)

证明

因为 \(p\) 是质数,那么比 \(p\) 小的所有正整数都和它互质,所以有 \(p-1\) 个数。

$ Q.E.D.$

\(性质3(n为奇数)\)

结论

\(\large若n是奇数,那么有\varphi{(2n)}=\varphi{(n)}\)

证明

由欧拉函数的积性可以得到$ \varphi{(2n)}=\varphi{(n)}\times\varphi{(2)}=\varphi{(n)}\times 1=\varphi{(n)}$

\(Q.E.D.\)

\(性质4(n为p^k)\)

结论

\(\large 当n=p^k,\varphi{(n)}=p^k-p^{k-1}\)

证明

我们考虑用整体减掉不满足的部分来得到满足条件的部分。

显然因为 \(p\) 是质数,所以和 \(p\) 不互质的都是它的因数,这样的数显然有。

\(Q.E.D.\)

\(性质5(互质数的和)\)

结论

\(1.n\) 中与 \(n\) 互质的数的和为 \(\large \dfrac{\varphi{(n)}\times n}{2}.(n>1)\)

写成和式就是 \(\large\sum\limits_{i=1}^{n}{i[(i,n)=1]}=\dfrac{\varphi{(n)}\times n}{2}\)

注意: \(n=1\) 时,我们的互质数之和的公式不成立,需要特判!

\(2.\varphi{(n)}(n>2)\) 是偶数。

证明

首先我们通过更相减损术可以得到 \(\gcd(n,x)=\gcd(n,n-x).\)

于是我们可以知道,和 \(n\) 互质的数一定是成对出现的。

又因为它们的和都是 \(n\) ,而显然这样的对一共有 \(\dfrac{\varphi{(n)}}{2}\)对。

所以这些数的和为 \(\dfrac{\varphi{(n)}\times n}{2}\),即\(\sum\limits_{i=1}^{n}{i[(x,n)=1]}= \dfrac{\varphi{(n)}\times n}{2}.\)

同时,我们也知道了\(\varphi{(n)}(n>2)\)一定是个偶数

应用1

\(\large \sum\limits_{i=1}^{n}{lcm(i,n)}\) 的值,多组询问。

\(\large \sum\limits_{i=1}^{n}{lcm(i,n)}\)

\(\large =n\sum\limits_{i=1}^n{\dfrac{i}{(i,n)}}\)

\(\large =n\sum\limits_{d|n}\sum\limits_{i=1}^n{\dfrac{i}{d}[(i,n)=d]}\)

\(\large =n\sum\limits_{d|n}\sum\limits_{i=1}^n{\dfrac{i}{d}[(\dfrac{i}{d},\dfrac{n}{d})=1]}\)

\(\large =n\sum\limits_{d|n}\sum\limits_{i=1}^{\dfrac{n}{d}}{i[(i,\dfrac{n}{d})=1]}\)

\(\large =n\sum\limits_{d|n}{\dfrac{\varphi{(\dfrac{n}{d})}\dfrac{n}{d}}{2}}\)

\(\large =n\sum\limits_{d|n}{\dfrac{\varphi{(d)}d}{2}}\)

\(\large =\dfrac{n}{2}\sum\limits_{d|n}{\varphi{(d)}d}+\dfrac{n}{2}\)

注意:这里多出来的 \(\dfrac{n}{2}\) 是因为 \(d=1\) 时,我们的互质数之和的公式不成立,需要特判!

此时外面的 \(\dfrac{n}{2}\) 是系数,于是我们直接求出里面那一部分就可以得到答案。

update on 2021.9.3:其实不用证明这个积性,因为其本身就是一个 \(\varphi * id\) 的形式,直接根据狄利克雷卷积的性质就可以得到

接下来我们可以设 \(\large f(n)=\sum\limits_{d|n}{\varphi{(d)}d}\) ,然后我们现在尝试证明它的积性。

\(\large f(n)\times f(m)\)

\(\large =\sum\limits_{i|n}{\sum\limits_{j|m}{\varphi{(i)}\varphi{(j)}ij}}\)

\(\large =\sum\limits_{i|n}{\sum\limits_{j|m}{\varphi{(ij)}ij}}\)

\(\large =\sum\limits_{d|nm}{{\varphi{(d)}d}}\)

\(\large =f(nm)\)

再加上如果 \(p\) 为质数,那么 \(f(p)=1+\varphi{(p)}\times p=p(p-1)+1\)

以及 \(f(p^{k+1})=f(p^k)+(p^{k+1}-p^k)\times p^{k+1}\)

于是我们可以考虑线性筛。

代码:

ll cnt,prime[N],f[N],low[N];
bool vis[N];
inline void GetPrimes(int d){
	vis[1]=true;f[1]=low[1]=1;//对1进行定义 
	for(ll i=2;i<=d;i++){
		if(!vis[i]) prime[++cnt]=low[i]=i,f[i]=i*(i-1)+1;//对质数进行定义 
		for(ll j=1;j<=cnt&&i*prime[j]<=d;j++){
			vis[i*prime[j]]=true;
			if(i%prime[j]==0){
                low[i*prime[j]]=low[i]*prime[j];
                if (low[i]==i) f[i*prime[j]]=f[i]+(i*prime[j]-i)*(i*prime[j]);//对质数的若干次幂进行定义(一般由f[i]递推);
                else f[i*prime[j]]=f[i/low[i]]*f[low[i]*prime[j]];
                break;
            }
            low[i*prime[j]]=prime[j];
			f[i*prime[j]]=f[i]*f[prime[j]];
		}
	}
	for(ll i=2;i<=d;i++) f[i]=(f[i]*i+i)/2;
	return ;
}

同时,很容易发现如果直接单次求的话就是 \(O(\)因子个数\(\times\)计算欧拉函数\()\),具体复杂度需要结合具体题目。

应用2

\(\large \sum\limits_{i=1}^n{\sum\limits_{j=1}^{n}{lcm(i,j)}}\) 的值,多组询问。

很容易发现我们可以把这道题转化一下就能变成上一道题:

\(\large \sum\limits_{i=1}^n{\sum\limits_{j=1}^{n}{lcm(i,j)}}=2\sum\limits_{i=1}^n{\sum\limits_{j=1}^{i}{lcm(i,j)}}-\sum\limits_{i=1}^n{i}\)

然后对第一项的第二个和式作上面的应用:

\(\large = 2\times \dfrac{\sum\limits_{i=1}^n{i(\sum\limits_{d|i}^{}{\varphi{(d)}d+1})}}{2}-\sum\limits_{i=1}^n{i}=\sum\limits_{i=1}^n{i\sum\limits_{d|i}{\varphi{(d)}d}}\)

于是我们这里直接把 \(\sum\limits_{d|i}{\varphi{(d)}d}\) 使用线性筛筛出来然后计算前缀和即可。

代码:(注意这道题会爆 \(ll\) 需要用 \(pair\) 来实现最后的前缀和)

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=false;
    while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}
template <typename T>
inline void write(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10^48);
    return ;
}
#define ll long long
#define ull unsigned long long
const int N=1e6+5,M=1e6+5,MOD=10000;
const ll limit=1e18;
ll n;
ll cnt,prime[N],f[N],low[N],Pow[20];
bool vis[N];
pair<ll,ll>pre[N];
inline void GetPrimes(int d){
	vis[1]=true;f[1]=low[1]=1;//对1进行定义 
	for(ll i=2;i<=d;i++){
		if(!vis[i]) prime[++cnt]=low[i]=i,f[i]=i*(i-1)+1;//对质数进行定义 
		for(ll j=1;j<=cnt&&i*prime[j]<=d;j++){
			vis[i*prime[j]]=true;
			if(i%prime[j]==0){
                low[i*prime[j]]=low[i]*prime[j];
                if (low[i]==i) f[i*prime[j]]=f[i]+(i*prime[j]-i)*(i*prime[j]);//对质数的若干次幂进行定义(一般由f[i]递推);
                else f[i*prime[j]]=f[i/low[i]]*f[low[i]*prime[j]];
                break;
            }
            low[i*prime[j]]=prime[j];
			f[i*prime[j]]=f[i]*f[prime[j]];
		}
	}
	for(ll i=1;i<=d;i++){
		f[i]=(f[i]*i);
		ll tmp=pre[i-1].second+f[i];
		pre[i].first=pre[i-1].first;
		if(tmp>=limit) pre[i].first+=tmp/limit,pre[i].second=tmp%limit;
		else pre[i].second=tmp;
	}
	return ;
}
int main(){
	GetPrimes(1e6);
	int t;read(t);
	Pow[0]=1;
	for(int i=1;i<=18;i++) Pow[i]=Pow[i-1]*10;
	while(t--){
		read(n);
		if(pre[n].first) write(pre[n].first);
		int tmp=17;
		while(tmp>=0&&pre[n].second/Pow[tmp]==0&&pre[n].first) putchar('0'),tmp--;
		write(pre[n].second);
		putchar('\n');
	}
	return 0;
}

\(性质6(\varphi{(\dfrac{n}{p})}与\varphi{(n)})\)

结论

\({\large若p|n且p^2|n,则\varphi(n)=\varphi(\dfrac{n}{p})*p}\)

\({\large若p|n且p^2 \not|\space\space n,则\varphi(n)=\varphi(\dfrac{n}{p})*(p-1)}\)

这个性质被广泛应用于递推求欧拉函数,也就是线性筛,一个函数要能满足线性筛只要可以快速做到以下条件即可:\(1.\ p\) 是个质数,求 \(f(p)\)\(2.\) 积性函数,\(3.\)\(f(p^k)\) 推出 \(f(p^{k+1})\)

证明

对于第一点:

\(p|n\)\(p^2|n\),则证明 \(n\)\(\dfrac{n}{p}\) 有相同的质因子,只是 \(p\) 这一项的指数不同

那么我们可以将其按照欧拉函数的计算式展开,并相除,可得:

\({\Large\dfrac{n\prod_{i=1}^m(1-\dfrac{1}{p_i})}{\dfrac{n}{p}\prod_{i=1}^{m}(1-\dfrac{1}{p_i})}=\dfrac{n}{\dfrac{n}{p}}=p}\)

对于第二点:

由欧拉函数的积性,并且因为 \(p\) 是质数,所以显然可以得到。

\(Q.E.D.\)

\(性质7(欧拉反演)\)

结论

\({\Large\sum\limits_{d|n}{\varphi{(d)}}=n}\)

证明

\(\large f(n)=\sum\limits_{d|n}{\varphi{(d)}}\),接下来我们要证明 \(\large f(n)\) 是一个积性函数。

\(\large f(n)\times f(m)\)

\(\large =\sum\limits_{i|n}{\varphi{(i)}}\times \sum\limits_{j|m}{\varphi{(j)}}\)
\(\large =\sum\limits_{i|n}\sum\limits_{j|m}{\varphi{(i)}\times \varphi{(j)}}\)
\(\large =\sum\limits_{i|n}\sum\limits_{j|m}{\varphi{(i\times j)}}\)
\(\large =\sum\limits_{d|nm}{\varphi{(d)}}\)
\(\large =f(nm)\)

所以 \(f\) 是一个积性函数。

接下来我们可以根据唯一分解定理:\(\large n=\prod\limits^{m}_{i=1}{p_i^{c_i}}\)

因为 \(f\) 是一个积性函数,所以我们有:\(\large f(n)=\prod\limits_{i=1}^{m}{f(p_i^{c_i})}\)

然后我们考虑如何求出 \(\large f(p_i^{c_i})\) ,很容易发现:

\(\large f(p^c)=\varphi{(1)}+\varphi{(p)}+...+\varphi{(p^c)}=\sum\limits_{i=0}^{c}{\varphi{(p^i)}}=\sum\limits_{i=0}^{c}{p^i-p^{i-1}[i\neq1]}=p^c\)

于是 \(\large f(n)=\prod\limits_{i=1}^{m}{f(p_i^{c_i})}=\prod\limits_{i=1}^{m}{p^{c_i}_{i}}=n\) ,即 \(\large {\sum\limits_{d|n}{\varphi{(d)}}=n}\)

\(\large Q.E.D.\)

推论1

\(\Large \sum\limits_{i=1}^{n}{i}=\sum\limits_{i=1}^{n}{\sum\limits_{k|i}{\varphi{(k)}}}=\sum\limits_{k=1}^{n}{\varphi{(k)}\lfloor\dfrac{n}{k}\rfloor}\)

推论2

\(\Large (i,j)=\sum\limits_{d|(i,j)}{\varphi{(d)}}=\sum\limits_{d|i}{\sum\limits_{d|j}{\varphi{(d)}}}\)

推论3

\(\Large \sum\limits_{i=1}^{n}{(i,n)}=\sum\limits_{i=1}^{n}{\sum\limits_{d|i}{\sum\limits_{d|n}{\varphi{(d)}}}}=\sum\limits_{d|n}{\sum\limits_{i=1}^{n}{\sum\limits_{d|i}{\varphi{(d)}}}}=\sum\limits_{d|n}{\varphi{(d)}\lfloor\dfrac{n}{d}\rfloor}\)

(原理:\(gcd\) 的所有因数等于所有公约数)

注意!这样的形式可以通过递推来获得值,也就是把 \(\varphi{(d)}\lfloor\dfrac{n}{d}\rfloor\) 加到所有的 \(f(dj)\) 上面去(这样做貌似是 \(n\ln{n}\) 的,也就是调和级数的复杂度)。

update on 2021.9.3:根本不用证明积性,因为其实就等价于 \(\varphi * id\),根据狄利克雷卷积的性质直接可以得到这是个积性函数

但是可以尝试线性筛,我们尝试证明这个函数的积性:

\(\large f(x)=\sum\limits_{d|n}{\varphi{(d)}\lfloor\dfrac{n}{d}\rfloor}\)

\(\large f(n)f(m)\)

\(\large =\sum\limits_{i|n}{\sum\limits_{j|m}{\varphi{(i)}\varphi{(j)}\lfloor\dfrac{n}{i}\rfloor\lfloor\dfrac{n}{j}\rfloor}}\)

\(\large =\sum\limits_{i|n}{\sum\limits_{j|m}{\varphi{(ij)}\lfloor\dfrac{n}{i}\rfloor\lfloor\dfrac{m}{j}\rfloor}}\)

\(\large =\sum\limits_{i|n}{\sum\limits_{j|m}{\varphi{(ij)}\dfrac{nm}{ij}}}\)

\(\large= \sum\limits_{d|nm}{\varphi{(d)}\dfrac{nm}{d}}\)

\(\large =f(nm)\)

同时,我们很容易知道,如果 \(p\) 是个质数,有 \(f(p)=\varphi{(p)}+p=2p-1\) ,同时 \(f(1)=1\)\(f(p^{k+1})=p\times f(p^k)+(p^{k+1}-p^k)\) ,于是可以考虑线性筛。

代码如下:


例题:

P2303 [SDOI2012] Longge 的问题

推论4

\(\Large \sum\limits_{i=1}^n{\sum\limits_{j=1}^m}{(i,j)}=\sum\limits_{i=1}^n{\sum\limits_{j=1}^m{\sum\limits_{d|(i,j)}{\varphi{(d)}}}}=\sum\limits_{d=1}^{\min(n,m)}{\varphi{(d)}\lfloor\dfrac{n}{d}\rfloor\lfloor\dfrac{m}{d}\rfloor}\)

转化成这个柿子之后,就可以使用整除分块来解决。

推论5

\(\Large \sum\limits_{k}{\varphi{(k)}[n\% k+m\% k\ge k]}=nm\)

\(\Large \sum\limits_{k}{\varphi{(k)}[n\% k+m\% k\ge k]}\)

\(\Large =\sum\limits_{k}{\varphi{(k)}(\lfloor \dfrac{n+m}{k}\rfloor-\lfloor \dfrac{n}{k}\rfloor-\lfloor \dfrac{m}{k}\rfloor)}\)

\(\Large =\sum_\limits{k=1}^{n+m}{\varphi{(k)}\lfloor \dfrac{n+m}{k}\rfloor}-\sum_\limits{k=1}^{n}{\varphi{(k)}\lfloor \dfrac{n}{k}\rfloor}-\sum_\limits{k=1}^{m}{\varphi{(k)}\lfloor \dfrac{m}{k}\rfloor}\)

\(\Large =\sum\limits_{i=1}^{n+m}{\sum\limits_{k|i}{\varphi{(k)}}}- \sum\limits_{i=1}^{n}{\sum\limits_{k|i}{\varphi{(k)}}} -\sum\limits_{i=1}^{m}{\sum\limits_{k|i}{\varphi{(k)}}}\)

\(\Large =\sum\limits_{i=1}^{n+m}{i}- \sum\limits_{i=1}^{n}{i} -\sum\limits_{i=1}^{m}{i}\)

\(\Large =\dfrac{(n+m)(n+m+1)-n(n+1)-m(m+1)}{2}\)

\(\Large =nm\)

应用1

求有多少个整数对 \(i,j\) 满足 \(1\leq i,j\leq n\)\((i,j)\) 为素数

\(\Large \sum\limits_{p \ is \ prime,p\leq n} \sum\limits_{i=1}^n \sum\limits_{i=1}^n{[(i,j)=p]}=\sum\limits_{p \ is \ prime,p\leq n}2\sum\limits_{i=1}^{\lfloor\frac{n}{p}\rfloor}{\varphi(i)}-1\)

应用2

\(\large m<n\)\(\large m,n\in Z\) ,那么\(\large [1,n!]\) 中有多少个数与 \(\large m!\) 互质

即求 \(\large \sum\limits_{i=1}^{n!}[(i,m!)=1]\)

由于 \(\large (i,m!)=(i+m!,m!)\) ,且 \(n!\)\(m!\) 的倍数,因此可以将 \(\large [1,n!]\) 划分为若干个区间\(\large (0,m!],(m!,2m!]......(n-m!,n!]\) 每段区间内的互质的数字的数量相同。

因此答案为 \(\large \dfrac{n!}{m!} \varphi(m!)=\dfrac{n!}{m!} m!\prod\limits_{p|m!} \dfrac{p-1}{p}=n!\prod\limits_{p|m!}{\dfrac{p-1}{p}}\)

注意,如果要对 \(M\) 取模,则要先将 \(n!\) 中的 \(M\) 和分母中的 \(M\) 抵消之后再进行取模。

这里在得出 \(\large \dfrac{n!}{m!} \varphi(m!)\) 之后其实可以转化成直接递推解决。

怎么做呢,也就是直接预处理 \(n!\) 和逆元,然后 \(\varphi{(n!)}\) 根据积性函数的性质其实就很好算了。

如果 \(n\) 是个质数,那么 \(\varphi{(n!)}=\varphi{((n-1)!)}\times (n-1)\)

如果 \(n\) 是个合数,那么 \(\varphi{(n!)}=\varphi{((n-1)!)}\times n\)

证明很好证,直接用欧拉函数的计算公式即可。

然后就是一个递推了。

应用3

\(\large \sum\limits_{i=1}^n\sum\limits_{j=1}^m(gcd(i,j)-1)(n-i)(m-j)\) 的值。

\(\large \sum\limits_{i=1}^n\sum\limits_{j=1}^m(gcd(i,j)-1)(n-i)(m-j)\)

\(\large =\sum\limits_{i=1}^n\sum\limits_{j=1}^m(gcd(i,j))(n-i)(m-j)-\sum\limits_{i=1}^n{\sum\limits_{j=1}^m{ij}}\)

\(\large =\sum\limits_{d=1}^{min(n,m)}{\varphi{(d)}\sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}{(n-di)\sum\limits_{j=1}^{\lfloor \frac{m}{d}\rfloor}(m-dj)}}-\sum\limits_{i=1}^{n-1}{i\sum\limits_{j=1}^{m-1}{j}}\)

因为 \(n,m\) 很小,所以可以直接暴力计算。

例题:

P3166 [CQOI2014]数三角形

BZOJ3518 点组计数

\(性质8(欧拉定理)\)

结论

\(\large \forall \ a,m\in Z^{+},s.t. \ gcd(a,m)=1\),则一定满足 \(\large a^{\varphi{(m)}}\equiv 1\ (Mod \ m)\),这个定理被称作欧拉定理。

证明

\(\large x_1...\varphi{(m)}\)表示小于等于 \(\large m\) 的正整数中与 \(\large m\) 互质的数 \(\large p_i=a\times x_i\)

引理1

\(\large \forall \ i \neq j , p_i-p_j\not \equiv 0\ (Mod \ m)\)

证明1

\(\large \because \ \gcd(a,m)=1,x_i-x_j\not = 0 \ and \ |x_i-x_j|<m\)

$\large \therefore \ a(x_i-x_j)\not \equiv 0\ (Mod \ m) $

\(Q.E.D.\)

引理2

\(\large gcd(p_i\%m,m)=1\)

证明2

其实等价于这个性质:

\(\large \forall \ a,b,c\in Z^{+},s.t.(a,c)=1,(b,c)=1\),有 \(\large (ab\%c,c)=1\)

证明:

因为 \(\large (a,c)=1\)\(\large (b,c)=1\) ,那么有 \(\large (ab,c)=1\)

根据辗转相除法 \(\large (ab,c)=(ab\%c,c)=1\)

\(\large Q.E.D.\)

证明正文

由引理 \(1\) 可以知道:\(p_i\%m\) 互不相等,由引理 \(2\) 可以知道 \(p_i\%m\) 的只有 \(\varphi{(m)}\) 种不同的取值。

\(P\) 序列和 \(X\) 序列一样,都是 \(m\) 的缩系。

所以有:\(\large \prod\limits_{i=1}^{\varphi{(m)}}{p_i}\equiv\prod\limits_{i=1}^{\varphi{(m)}}{x_i}\ (Mod \ m)\)

那么:\(\large a^{\varphi{(m)}}\prod\limits_{i=1}^{\varphi{(m)}}{x_i}\equiv\prod\limits_{i=1}^{\varphi{(m)}}{x_i}\ (Mod \ m)\),即 \(\large a^{\varphi{(m)}}\equiv 1\ (Mod \ m)\)

\(Q.E.D.\)

\(性质9(\varphi{(n)}与\varphi{(nk)})\)

结论

如果 \(\large n|N\),那么 \(\large \varphi{(n)}|\varphi{(N)}\)

证明

考虑将 \(\large \varphi{(n)}\)\(\large \varphi{(N)}\),用欧拉函数的计算式表示出来,显然正确。

\(性质10(n|\varphi{(a^n-1)})\)

结论

对于 \(\large a,n\in Z^{+}\) ,有 \(\large n|\varphi{(a^n-1)}\)

证明

\(\large m=a^n-1,a\)\(m\) 互素,由欧拉定理知 \(\large a^{\varphi{(m)}}=1 (\bmod m)\)

注意 \(\large a^n=1(\bmod m)\)

\(\large \varphi{(m)}=bn+c\) 其中 \(\large 0\le c<n\)

那么 \(\large a^c \bmod m=(a^c)(a^n)^b \bmod m =a^{\varphi{(m)}}\bmod m =1 (\bmod m)\)

\(\large 0\le a^c-1<a^n-1=m\) 自然只能是 \(\large a^c-1=0\) 所以 \(\large c=0\)

那么 \(\large \varphi{(m)}=bn\) 所以 \(\large n\) 整除 \(\large \varphi{(m)}=\varphi{(a^n-1)}\)

\(\large Q.E.D.\)

\(性质11(\varphi{(nm)}与\varphi{(n)},\varphi{(m)})\)

结论

对于 \(\large n,m\in Z^{+}\),有 \(\large \varphi{(nm)}=\varphi{(n)}\varphi{(m)}\dfrac{gcd(n,m)}{\varphi{(gcd(n,m))}}\)

证明

\(\large \varphi{(n)}\times \varphi{(m)}\)

\(\large =n\prod\limits_{i=1}^{k_1}{(1-\dfrac{1}{p_{1,i}})}\times m\prod\limits_{i=1}^{k_2}{(1-\dfrac{1}{p_{2,i}})}\)

再观察 \(\large \varphi{(nm)}=nm\prod\limits_{i=1}^{k_3}{(1-\dfrac{1}{p_{3,i}})}\)

发现上面多了的部分就是最大公因数的质因子构成的一部分。

这正好等于 \(\large \dfrac{\gcd{(n,m)}}{\varphi{(\gcd{(n,m)})}}\)

\(\large Q.E.D.\)

\(性质12(扩展欧拉定理)\)

结论

\(\large b\ge\varphi(m)\) 时,\(\large a^b\equiv a^{\left(b\mod\varphi(m)\right)+\varphi(m)}\mod m\quad\quad\)

又称欧拉降幂原理,通常可以用于给一个很大的数降幂。

证明

先取 \(m\) 的一个质因数 \(p\) ,令 \(\large m=p^r\times s,\gcd(p,s)=1\)

由欧拉定理得 \(\large p^{\varphi(s)}\equiv1\mod s\),由欧拉函数的性质得 \(\large \varphi(m)=\varphi(s)\times\varphi(p^r)\),所以 \(p^{\varphi(m)}\equiv1\mod s\)

\(\large p^{\varphi(m)}=ks+1\),那么 \(\large p^{\varphi(m)+r}=km+p^r\),所以 \(\large p^{\varphi(m)+r}\equiv p^r\mod m\)

\(\large b\ge r\) 时,\(\large p^b\equiv p^{b-r}\times p^r\equiv p^{b-r}\times p^{\varphi(m)+r}\equiv p^{b+\varphi(m)}\mod m\)

因为 \(\large r\le\varphi(p^r)\le\varphi(m)\),所以当 \(\large b\ge 2\varphi(m)\)\(b-\varphi(m)\ge r\),所以 \(\large p^b\equiv p^{b-\varphi(m)}\mod m\),即

\(\large p^b\equiv p^{(b\mod\varphi(m))+\varphi(m)}\mod m\)

\(\large a\) 质因数分解后乘起来,就可以得到 \(\large a^b\equiv a^{(b\mod\varphi(m))+\varphi(m)}\bmod m\)

需要注意的是,\(\large b<\varphi(m)\) 时,\(\large a^b\equiv a^{(b\mod\varphi(m))+\varphi(m)}\bmod m\) 不一定正确。

推论1

对于一个数 \(\large x\),如果不断地使得 \(\large x=\varphi{(x)}\) ,那么最多取 \(\large \log{x}\) 次,\(\large x\) 就会变成 \(1\)

这类题目一般都可以根据这个性质先预处理一下欧拉函数。

例题:

P4139 上帝与集合的正确用法

P3747 [六省联考 2017] 相逢是问候

CF906D Power Tower

posted @ 2021-08-16 15:11  __Anchor  阅读(139)  评论(0编辑  收藏  举报