欧拉函数总结
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)\) ,于是可以考虑线性筛。
代码如下:
例题:
推论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\) 很小,所以可以直接暴力计算。
例题:
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\) 。
这类题目一般都可以根据这个性质先预处理一下欧拉函数。
例题: