積性函數
符號
(m,n)最大公約數
[m,n]最小公倍數
m∣a,m整除a
若無明確說明, p指素數
什麼是積性函數
我們設數論函數 f(x),定義域S,m,n∈S.
f(m)f(n)=f(mn),(m,n)=1⇒f(x)是積性函數f(m)f(n)=f(mn)⇒f(x)是完全積性的
可以證明有很多積性函數。例如:
f(n)=nk完全積性f(n)=n−k完全積性f(n)=e2πiamn僅當m∣a時積性f(n)=1完全積性
定理
設 f(n)。
n=p1a1p2a2⋯prar
f(1)=1,f(n)=f(p1a1)f(p2a2)⋯f(prar)⇔f(n)積性
f(1)=1,f(n)=fa1(p1)fa2(p2)⋯far(pr)⇔f(n)完全積性
證明是顯然的。
必要性
0==f(n0)=f(1⋅n0)=f(1)⋅f(n0)
這就推出 f(1)=1
其他可由積性函數的定義推出。
充分性
(m,n)=1
n=p1a1p2a2⋯psas
m=q1b1q2b2⋯qrar
f(mn)=f(q1b1q2b2⋯qrarp1a1p2a2⋯psas)
=f(q1b1)f(q2b2)⋯f(qrar)f(p1a1)f(p2a2)⋯f(psas)
=f(m)f(n)
這就證明了積性。
完全積性的證明也是類似的方法。
n=p1a1p2a2⋯psar
m=p1b1p2b2⋯prbr
f(mn)=f(p1a1+b1p2a2+b2⋯psar+br)
=fa1+b1(p1)fa2+b2(p2)⋯far+br
=fa1(p1)fa2(p2)⋯far(pr)fb1(p1)fb2(p2)⋯fbrf(pr)
=f(n)f(m)
重要積性函數 =====⇒歐拉函數
φ(x),即歐拉函數,代表 1−x中與 x互質的數的個數。
顯然我們得到一個重要性質。
p∈Q⇔φ(p)=p−1
定理
定理1
m=m1m2,(m1,m2)>1⇒φ(m)=m2φ(m1)=m1φ(m2)m=m1m2,(m1,m2)=1⇒φ(m)=φ(m1)φ(m2)
對於第一條 m1,m2具有的素數種類相同
特別的,我們可以推出:
m=p1a1p2a2⋯praraj>=1φ(m)=p1a1−1p2a2−1⋯prar−1φ(p1p2⋯pr)φ(m)=p1a1−1(p1−1)p2a2−1(p2−1)⋯prar−1(pr−1)=mp∣m∏(1−p1)(1)
證明這個定理需要前置技能既約剩餘系。(或者就記下來。)歐拉函數就是既約剩餘系元素的個數。
形象的理解就是區間可以被分爲很多分,如果區間數與區間長度不互質,那麼每一個區間與 m互質的相等,否則就會有影響。
我們也可以用這個定理推出一點點小結論:
φ(1)=φ(2)=1所以
2∣φ(m)⇒m≥3
和
m=m1m2⋯ms,(mi,mj)=1,0≤i<j≤s⇒φ(m)=φ(m1)φ(m2)⋯φ(ms)(2)
定理2
d∣m∑φ(d)=m;
證明方法很多,現在給出一種證明方法:
m=1時顯然成立
m>1m=p1a1p2a2⋯prar
d∣m∑φ(d)=e1=0∑a1e2=0∑a2⋯er∑arφ(p1e1p2e2⋯prer)
利用 (2)式得:
d∣m∑φ(d)=(e1=0∑a1φ(p1e1))(e2=0∑a2φ(p2e2))⋯(er=0∑arφ(prer))
又根據定理1
ei=0∑aiφ(piei)=1+(p−1)+(p2−p)+⋯+(piai−piai−1)=piai
d∣m∑φ(d)=(e1=0∑a1φ(p1e1))(e2=0∑a2φ(p2e2))⋯(er=0∑arφ(prer))=p1a1p2a2⋯prar=m
證畢
定理3
(a,m)=1⇒aφ(m)≡1(modm)
特別的
ap≡a(modm),p∈Q
我們設一組既約剩餘系 r1,r2,⋯rφ(m),當 (a,m)=1, ar1,ar2,⋯arφ(m)也是一組既約剩餘系。可以得到:
j=1∏φ(m)rj≡j=1∏φ(m)(arj)≡aφ(m)j=1∏φ(m)rj(modm)
去掉 ∏j=1φ(m)rj得
1≡aφ(m)(modm)
證畢
我們在求逆元時就可以用這個公式:
a−1≡aφ(m)−1(modm)
對此我們可以引入一個新的函數: δm(a),讀音delta。函數定義爲最小的 d滿足 ad≡1(modm),這個函數不在此討論。
歐拉函數及其重要定理暫時就這麼多。
以上我們可以得出兩種求歐拉函數的方法。
1.歐拉函數線性篩
即計算每一個素數對後面的影響。是線性篩出歐拉函數值的算法。
int n;
int phi[100100],prime[100100],tot=0,ans=0;
bool mark[100100];
void getphi(int n)
{
phi[1]=1;
int i=2,j=1;
while(i<=n)
{
if(!mark[i])
{
prime[++tot]=i;
phi[i]=i-1;
}
j=1;
while(j<=tot)
{
if(i*prime[j]>n) break;
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
++j;
}
++i;
}
}
2.通項公式
求出一個數的素因子及其指數。
int gphi(int n)
{
int res=n,i=2;
while(i*i<=n)
{
if(n%i==0){
res=res-res/i;
do{
n/=i;
}while(n%i==0);
}
++i;
}
if(n>1) res=res-res/n;
return res;
}
重要積性函數 =====⇒莫比烏斯函數
μ(x)即莫比烏斯函數。
μ(x)=⎩⎪⎨⎪⎧1,x=1(−1)r,x=p1p2⋯pr0,others
可以證明:
(d1,d2)=1時, μ(d1d2)=μ(d1)μ(d2)
定理
定理1
d∣m∑μ(d)=[n1]={1,n=10,n=0
證明:
n=1時顯然成立。
n=p1a1p2a2⋯psas
根據定義,我們從中取一定數量的素數,答案是完全確定的。
d∣m∑μ(d)=(0s)−(1s)+(2s)−⋯+(−1)s(ss)=i=0∑s(−1)i(is)
根據二項式定理:
(a+b)s=(0s)as+(1s)as−1b1⋯+(ss)bs
我們得到:
d∣m∑μ(d)=(1−1)s=0
證畢
定理2
A是一個有限的整數序列, K是給定整數, Ad表示 A中被 d整除的數組成的子序列。
K=p1a1p2a2⋯psas
∣Ad∣表示這個子序列的長度。
在序列中與 K既約的個數。
S(A;K)=a∈A,(a,K)=1∑1=∣A∣−r=1∑s(−1)ri1<i2<⋯<iri1=1∑si2=1∑s⋯ir=1∑s∣Api1pi2⋯pir∣
證明:
由定理1得知:
a∈A,(a,K)=1∑1=a∈A∑d∣(a,K)∑μ(d)=d∣K∑μ(d)a∈A,d∣a∑1=d∣K∑μ(d)∣Ad∣
證畢
我們也可以得出兩種求莫比烏斯函數的方法。
莫比烏斯函數線性篩
和歐拉篩一樣,計算素數對後面的影響。
bool notp[100100];
int pnum,p[100100],n,u[100100];
void getmu(int n)
{
memset(notp,0,sizeof notp);
pnum=0;
u[1]=1;
int i=2,j=0;
while(i<=n)
{
if(!notp[i])
{
p[pnum++]=i;
u[i]=-1;
}
j=0;
while((j<pnum)&&(i*p[j]<=n))
{
int k=i*p[j];
notp[k]=1;
if(i%p[j]==0)
{
u[k]=0;
break;
}
u[k]=-u[i];
++j;
}
++i;
}
}
2.通項公式
int getmob(int a)
{
int x=a,tmp=a;
int cnt=0,now=0,j=2;
while(j*j<=x)
{
now=0;
if(x%j==0)
{
while(x%j==0)
{
++now;
x/=j;
}
if(now>1) return 0;
++cnt;
}
++j;
}
if(x!=1) ++cnt;
return (cnt&1 ) ? -1 : 1;
}
莫比烏斯函數以後還有大用,在莫比烏斯變換中用處很大。
最後的最後
祝大家++RP