这一部分只考虑整数
一些定义#
完全积性函数
f为完全积性函数,则f(ab)=f(a)f(b)
积性函数
f为积性函数,则在(a,b)=1时,有f(ab)=f(a)f(b)
常见的积性函数
I(n)=1
ε(n)=[n=1]
id(n)=n
φ(n)=∑i=1n[(i,n)=1]=n∏(1−pi1),pi为n的唯一分解中互不相同的质数
μ(n)莫比乌斯函数,n=1时,μ(n)=1,当n的唯一分解的质数的次数都为1,μ(n)为−1的质数种类次方,否则μ(n)=0
d(n)表示n的约数个数
σ(n)表示n的约数和
σk(n)表示n的约数的k次方的和(除数函数)
埃拉托斯特尼筛法#
埃拉托斯特尼筛法筛素数
主体思想是逐个去掉所有质数的倍数,枚举到的下一个就是质数
void Eratosthenes(int n){
for(int i=2;i<=n;i++)vis[i]=1;
for (int j=i*i;j<=n;j+=i){
线性筛(欧拉筛)#
线性筛的主体思想是让每个数都被自己最小的质因数筛掉
for (int i=2;i<=n;i++)vis[i]=0;
if (!vis[i])pri[cnt++]=i;
for (int j=1;j<=cnt;j++){
if (1ll*i*pri[j]>n)break;
注意代码中imodpri[j]=0说明已经到了i的最小质数,如果继续,那么接下来的数就不是被最小的质数筛掉了,以为i的最小质数是pri[j]
用线性筛求一些函数#
求φ(n),设p1为n的最小质因子,且n=mp1
如果(m,p1)=1,φ(n)=φ(p1)×φ(m)=(p1−1)φ(m)
如果(m,p1)=1,φ(n)=n∏(1−pi1)=mp1∏(1−pi1)=p1φ(m)
for (int i=2;i<=n;i++)vis[i]=0;
if (!vis[i])pri[++cnt]=i,phi[i]=i-1;
for (int j=1;j<=cnt;j++){
if (1ll*i*pri[j]>n)break;
vis[i*pri[j]]=1;phi[i*pri[j]]=pri[j]*phi[i];
vis[i*pri[j]]=1;phi[i*pri[j]]=(pri[j]-1)*phi[i];
求μ(n),设p1为n的最小质因子,n=mp1
μ(pk)=−1×[k=1]
如果(m,p1)=1,μ(n)=μ(p1)×μ(m)=−1×μ(m)
如果(m,p1)=1,μ(n)=0
for (int i=2;i<=n;i++)vis[i]=0;
if (!vis[i])pri[++cnt]=i,mu[i]=-1;
for (int j=1;j<=cnt;j++){
if (1ll*i*pri[j]>n)break;
vis[i*pri[j]]=1;mu[i*pri[j]]=0;
vis[i*pri[j]]=1;mu[i*pri[j]]=-mu[i];
求d(n),设n=∏piai,d(n)=∏(ai+1),n=p1m,p1为n的最小质因子
如果(m,p1)=1,d(n)=d(p1)d(m)=2d(m)
如果(m,p1)=1,d(n)=d(p1k)d(p1kn),p1k∣∣n
我们需要维护k,即最小质因子的个数,令numi为i的最小质因子的个数,则有
如果(m,p1)=1,d(n)=d(p1)d(m)=2d(m),numn=1
如果(m,p1)=1,d(n)=d(p1k)d(p1kn)=numm+1(numm+2)d(m)=numn(numn+1)d(m),numn=numm+1
for (int i=2;i<=n;i++)vis[i]=0;
if (!vis[i])pri[++cnt]=i,d[i]=2,num[i]=1;
for (int j=1;j<=cnt;j++){
if (1ll*i*pri[j]>n)break;
vis[i*pri[j]]=1;num[i*pri[j]]=num[i]+1;d[i*pri[j]]=d[i]*(num[i*pri[j]]+1)/num[i*pri[j]];
vis[i*pri[j]]=1;num[i*pri[j]]=1;d[i*pri[j]]=2*d[i];
求σ(n),σ(n)=∏(1+pi+...+piai)=∏pi−1piai+1−1,n=mp1,p1为n的最小质因子
令gi=∑t=0numip1t
如果(m,p1)=1,σ(n)=(1+p1)σ(m),numn=1,gn=1+p1
如果(m,p1)=1,σ(n)=σ(p1numm+1)σ(p1nummm)=p1numm+1−1(p1numm+2−1)σ(m)=gmgnσ(m),gn=1+p1gm
for (int i=2;i<=n;i++)vis[i]=0;
if (!vis[i])pri[++cnt]=i,dsum[i]=1+i,gsum[i]=1+i;
for (int j=1;j<=cnt;j++){
if (1ll*i*pri[j]>n)break;
gsum[i*pri[j]]=pri[j]*gsum[i]+1;
dsum[i*pri[j]]=dsum[i]*(gsum[i*pri[j]])/gsum[i];
dsum[i*pri[j]]=(1+pri[j])*dsum[i];
狄利克雷卷积#
(f∗g)(n)=∑d∣nf(d)g(dn)
waiting
数论分块#
用于计算形如∑i=1nf(i)g(⌊in⌋)的式子
若能O(1)预处理f的前缀和,则可在O(n)的时间计算上式
先看简单情况考虑计算∑i=1n⌊in⌋,即为f(i)=1,g(i)=i
我们按照⌊in⌋=d的值分块,设这块区间为[l,r]
则有d≤in<d+1 ,取倒数有d+11<ni≤d1,
则⌊d+1n⌋+1≤i≤⌊dn⌋
右端点为r=⌊⌊ln⌋n⌋
向上取整#
计算∑i=1nf(i)g(⌈in⌉)
注意到 ⌈in⌉=⌊in−1⌋+1
∑i=1nf(i)g(⌈in⌉)=f(n)g(1)+∑i=1n−1f(i)g(⌊in−1⌋+1)
计算∑i=1nf(i)g(⌊in1⌋,⌊in2⌋,...,⌊inm⌋)
只需要对一个l取交集即可,r=mini=1m⌊⌊lni⌋ni⌋
任意指数#
计算∑i=1⌊nba⌋f(i)g(⌊ibna⌋)
同上可知⌊(d+1)b1nba⌋+1≤i≤⌊db1nba⌋
复杂度为O(nb+1a)
莫比乌斯反演#
普通形式#
首先有恒等式∑d∣nμ(d)=[n=1]
设n=∏piei,n′=∏pi,则∑d∣n=∑i=0k(−1)i(ik)=(1+(−1))k=[n=1]
即ε=1∗μ
简单应用[gcd(i,j)=1∑d∣gcd(i,j)μ(d)=∑d[d∣i][d∣j]μ(d)
主要形式f(n)=∑d∣ng(d)<=>g(n)=∑d∣nμ(dn)f(d),可直接带入验证
上述形式等价与f=1∗g<=>g=μ∗f
故μ∗f=μ∗1∗g=ϵ∗g=g
对φ(n)有,n=∑d∣nφ(d),即id=1∗φ,则φ=μ∗id,φ(n)=∑d∣ndμ(dn)
对σk(n)=∑d∣ndk,有σk=1∗idk,则idk=μ∗σk
对互异素因子数目函数ω(n)=∑d∣n[d∈P],即ω=1∗1P,则1P=μ∗ω,[n∈P]=∑dμ(dn)ω(d)
拓展形式#
f(n)=∑n∣dg(d)<=>g(n)=∑n∣dμ(nd)f(d)
f(n)=∏d∣ng(d)<=>g(n)=∏d∣nf(d)μ(dn)
f(n)=∑d∣nα(dn)g(n)<=>g(n)=∑d∣nα−1(dn)f(d),即f=α∗g<=>g=α−1∗f,α−1为α的Dirichlet逆
f(n)=∑i=1ng(⌊in⌋)<=>g(n)=∑i=1nμ(i)f(⌊in⌋)
Dirichlet前缀和#
如果将每一个素数都看作一个维度,这就是一种高维前缀和.从小到大遍历所有素数 𝑝,并将 𝑛处的函数值累加到 𝑛𝑝处.这和Eratosthenes筛法 的遍历顺序是一致的.因此,这一算法可以在 O(nloglogn)时间内计算出长度为 n 的数列的 Dirichlet 前缀和.类似地,利用逐维差分就可以在相同时间复杂度内求出数列的 Dirichlet 差分.
for (int i=0;i<=n;i++)vis[i]=0,f[i]=g[i];
for (int j=1,ij=i;i*j<=n;j++,ij+=j){
for (int i=0;i<=n;i++)vis[i]=0,g[i]=f[i];
for (int j=n/i,ij=i*j;j>=1;j--,ij-=j){
杜教筛#
用低于线性的时间求S(n)=∑i=1nf(i)
构造一个g,g满足g,f∗g的前缀和可以很快的求出
∑i=1n(f∗g)(i)=∑i=1n∑d∣if(di)g(d)=∑i=1ng(i)S(⌊in⌋),最后一步可以这么理解f,g括号内的乘积都是小于等于n的
则g(1)S(n)=∑i=1n(f∗g)(i)−∑i=2ng(i)S(⌊in⌋)
时间复杂度O(n43)
Min_25筛#
低于线性时间求积性函数前缀和
要求:f(p)是关于p的可以快速求值的完全积性函数之和;f(pc)可以快速求值
pk为第k小的质数,p0=1
lpf(n)为n的最小质因数,lpf(1)=1
Fprime(n)=∑p≤nf(p)
Fk(n)=∑i=2n[pk≤lpf(i)]f(i)
发现答案即为F1(n)+f(1)
Fk(n)=i=2∑n[pk≤lpf(i)]f(i)=k≤i,pi2≤n∑c≥1,pic≤n∑f(pic)([c>1]+Fi+1(⌊n/pic⌋))+Fprime(n)−Fprime(pk−1)=k≤i,pi2≤n∑c≥1,pic+1≤n∑(f(pic+1)+f(pic)Fi+1(⌊n/pic⌋))+Fprime(n)−Fprime(pk−1)考虑计算Fk(n)
1.直接递推
2.从大到小枚举p,当p2<n时转移增加值不为零,可后缀和优化
考虑计算Fprime(n),发现只有1,2,...,⌊n⌋,⌊⌊n⌋n⌋,...,⌊2n⌋,n这几个点有用
一般f(p)=∑aipci,我们计算∑p≤mg(p),g(p)=ps
Gk(n)表示埃筛第k轮筛后剩下的g的和
有递推公式Gk(n)=Gk−1(n)−[pk2≤n]g(pk)(Gk−1(⌊pkn⌋)−Gk−1(pk−1))
Gk−1(⌊pkn⌋)−Gk−1(pk−1)的结果是最小质因子大于pk−1的数的次方和
然后就可以用G合并得到F了
类欧几里得算法#
f(a,b,c,n)=∑i=0n⌊cai+b⌋
g(a,b,c,n)=∑i=0n⌊cai+b⌋2
h(a,b,c,n)=∑i=0ni⌊cai+b⌋
计算f
f(a,b,c,n)=i=0∑n⌊cai+b⌋=i=0∑n⌊c(⌊a/c⌋⋅c+(amodc))i+⌊b/c⌋⋅c+(bmodc)⌋=i=0∑n⌊c(amodc)i+(bmodc)⌋+⌊a/c⌋i+⌊b/c⌋=2n(n+1)⌊a/c⌋+(n+1)⌊b/c⌋+f(amodc,bmodc,c,n)如果a<c,b<c,m=⌊can+b⌋,⌊cai+b⌋=⌈cai+b+1⌉−1
f(a,b,c,n)=i=0∑n⌊cai+b⌋=i=0∑nj=0∑m−1[j<⌊cai+b⌋]=i=0∑nj=0∑m−1[j<⌈cai+b+1⌉−1]=i=0∑nj=0∑m−1[j+1<⌈cai+b+1⌉]=i=0∑nj=0∑m−1[j+1<cai+b+1]=i=0∑nj=0∑m−1[jc+c<ai+b+1]=j=0∑m−1i=0∑n[i>acj+c−b−1]=j=0∑m−1i=0∑n[i>⌊acj+c−b−1⌋]=j=0∑m−1(n−⌊acj+c−b−1⌋)=mn−f(c,c−b−1,a,m−1)计算g,h
g(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑n⌊c(⌊a/c⌋⋅c+(amodc))i+⌊b/c⌋⋅c+(bmodc)⌋2=i=0∑n(⌊c(amodc)i+(bmodc)⌋+⌊a/c⌋i+⌊b/c⌋)2=i=0∑n⌊c(amodc)i+(bmodc)⌋2+i=0∑n(⌊a/c⌋i)2+i=0∑n⌊b/c⌋2+2⌊a/c⌋i=0∑ni⌊c(amodc)i+(bmodc)⌋+2⌊b/c⌋i=0∑n⌊c(amodc)i+(bmodc)⌋+2⌊a/c⌋⌊b/c⌋i=0∑ni=g(amodc,bmodc,c,n)+6n(n+1)(2n+1)⌊a/c⌋2+(n+1)⌊b/c⌋2+2⌊a/c⌋h(amodc,bmodc,c,n)+2⌊b/c⌋f(amodc,bmodc,c,n)+n(n+1)⌊a/c⌋⌊b/c⌋如果a<c,b<c,m=⌊can+b⌋
g(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑nj=0∑m−1(2j+1)[j<⌊cai+b⌋]=j=0∑m−1(2j+1)i=0∑n[i>⌊acj+c−b−1⌋]=j=0∑m−1(2j+1)(n−⌊acj+c−b−1⌋)=m2n−2h(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1)h(a,b,c,n)=i=0∑n⌊cai+b⌋i=i=0∑n⌊c(⌊a/c⌋⋅c+(amodc))i+⌊b/c⌋⋅c+(bmodc)⌋i=i=0∑n⌊c(amodc)i+(bmodc)⌋i+⌊a/c⌋i2+⌊b/c⌋i=h(amodc,bmodc,c,n)+6n(n+1)(2n+1)⌊a/c⌋+2n(n+1)⌊b/c⌋如果a<c,b<c,m=⌊can+b⌋
h(a,b,c,n)=i=0∑n⌊cai+b⌋i=i=0∑nij=0∑m−1[j<⌊cai+b⌋]=j=0∑m−1i=0∑ni[i>⌊acj+c−b−1⌋]=j=0∑m−1i=⌊acj+c−b−1⌋+1∑ni=j=0∑m−12(n+⌊acj+c−b−1⌋+1)(n−⌊acj+c−b−1⌋)=21j=0∑m−1((n+1)n−⌊acj+c−b−1⌋−⌊acj+c−b−1⌋2)=21(n+1)nm−21f(c,c−b−1,a,m−1)−21g(c,c−b−1,a,m−1)
最大公因数#
欧几里得算法#
gcd(a,b)=gcd(b,amodb)
扩展欧几里得算法#
ax1+by1=gcd(a,b)
bx2+(amodb)y2=gcd(b,amodb),又(amodb)=a−b⌊ba⌋,带入得
bx2+(a−b⌊ba⌋)y2=ay2+b(x2−⌊ba⌋y2)=ax1+by1
有x1=y2,y1=x2−⌊ba⌋y2
最终会有b=0,a=gcd=>x=1,y=0
int exgcd(int a,int b,int& x,int& y){
欧拉函数#
一些性质#
积性函数gcd(a,b)=1=>φ(ab)=φ(a)φ(b)
n=∑d∣nφ(d)
φ(pk)=pk−pk−1
φ(n)=∏i=1sφ(piki)=∏i=1spiki−1(pi−1)=n∏i=1s(1−pi1)
φ(mn)φ(gcd(m,n))=φ(m)φ(n)gcd(m,n)
欧拉反演#
gcd(a,b)=∑d∣gcd(a,b)φ(d)=∑d[d∣a][d∣b]φ(d)
∑i=1ngcd(i,n)=∑d∑i=1n[d∣i][d∣n]φ(d)=∑d⌊dn⌋[d∣n]φ(d)=∑d∣n⌊dn⌋φ(d)
欧拉定理#
gcd(a,m)=1,则aφ(m)≡1(modm)
费马小定理#
ap−1≡1(modp)
扩展欧拉定理#
ab≡⎩⎨⎧abmodφ(m),ab,a(bmodφ(m))+φ(m),gcd(a,m)=1,gcd(a,m)=1, b<φ(m),gcd(a,m)=1, b≥φ(m).
裴蜀定理#
存在x,y使得ax+by=gcd(x,y)
二元一次不定方程#
a1x+a2y=b
(x,y)=(x1+tgcd(a1,a2)a2,x2−tgcd(a1,a2)a1)
Frobenius 硬币问题#
有a1,a2,...,an的面值的硬币若干种,且gcd(a1,a2,...,an)=1,那么最大的不能被表示的面值为多少
n=2时,答案为a1a2−a1−a2
Stern−Brocot树与Farey序列#
waiting
线性求逆元#
p=⌊ip⌋i+(pmodi)
0≡⌊ip⌋i+(pmodi)i+(pmodi)modp
i−1≡−⌊ip⌋(pmodi)−1modp
中国剩余定理(CRT)#
基本形式#
gcd(n1,n2,...,nk)=1
⎩⎨⎧x≡a1(modn1),x≡a2(modn2),⋮x≡ak(modnk).求x
1.计算n=∏i=1kni
2.mi=nin,mi−1为mimodni的逆元
3.x=∑i=1kaimimi−1
for (int i=1;i<=k;i++)n*=r[i];
ans=(ans+a[i]*m*pow(m,r[i])%n)%n;
Garner#
a<∏i=1kpi且
⎩⎨⎧a≡a1(modp1),a≡a2(modp2),⋮a≡ak(modpk).构造a=x1+x2p1+...xkp1...pk−1,设piri,j≡1(modpj)
带入有
x1≡a1(modp1)
x1+x2p1≡a2(modp2)=>,x2≡(a2−x1)r1,2(modp2)
以此类推
xk≡(...((ak−x1)r1,k−x2)r2,k...)rk−1,k(modpk)
for (int i = 0; i < k; ++i) {
for (int j = 0; j < i; ++j) {
x[i] = r[j][i] * (x[i] - x[j]);
if (x[i] < 0) x[i] += p[i];
(粘的代码)
x≡a1(modm1),x≡a2(modm2),m1,m2不一定互质
x=m1p+a1=m2q+a2=>m1p+m2q=(a2−a1)
当gcd(m1,m2)∤(a2−a1)时,无解
否则可以求出一组(p,q),使得x≡b(modlcm(m1,m))
多个方程两两合并
升幂引理#
νp(n),表示n的标准分解中p的次数,即pνp(n)∣∣n
第一部分#
对所有素数p和满足gcd(n,p)=1的整数n,
1.若p∣x−y,则:νp(xn−yn)=νp(x−y)
2.若p∣x+y,则对奇数n有:νp(xn+yn)=νp(x+y)
Proof:
p∣x−y<=>x≡y(modp)
∑i=0n−1xiyn−1−i≡nxn−1≡0(modp)
xn−yn=(x−y)∑i=0n−1xiyn−1−i
则有νp(xn−yn)=νp(x−y)
p∣x+y<=>x≡−y(modp)
∑i=0n−1xi(−y)n−1−i≡nxn−1≡0(modp)
xn+yn=(x+y)∑i=0n−1xi(−y)n−1−i
则有νp(xn+yn)=νp(x+y)
第二部分#
对所有奇素数p,
1.若p∣x−y,则:νp(xn−yn)=νp(x−y)+νp(n)
2.若p∣x+y,则对奇数n有:νp(xn+yn)=νp(x+y)+νp(n)
Proof
我们只需要证明p∣n的情况
n=p时,我们只要证p2∤∑i=0n−1xiyn−1−i
设y=x+kp,(下面有点啰嗦)
i=0∑p−1xp−1−iyi=i=0∑p−1xp−1−i(x+kp)i=i=0∑p−1xp−1−ij=0∑i(ji)xi−j(kp)j=i=0∑p−1xp−1j=0∑i(ji)(xkp)j=xp−1j=0∑p−1i=j∑p−1(ji)(xkp)j=xp−1j=0∑p−1(xkp)ji=j∑p−1(ji)≡xp−1(p+xkpi=1∑p−1(1i))≡xp−1(p+xkp⋅2(p−1)p)≡xp−1p≡0(modp2)则有νp(xp−yp)=νp(x−y)+νp(p)
下面用数学归纳法证明第一个式子
设n=pab,gcd(p,b)=1
νp((xpa)b−(ypa)b)=νp(xpa−ypa)
νp((xpa−1)p−(ypa−1)p)=νp(xpa−1−ypa−1)+νp(p)
以此类推得
νp(xn−yn)=νp(x−y)+νp(n)
与上面相似,我们只要证明p∣n的情况
n=p时,我们只要证p2∤∑i=0n−1xi(−y)n−1−i
设y=−x−kp,与上面完全相同
i=0∑p−1xp−1−i(−y)i=i=0∑p−1xp−1−i(x+kp)i≡xp−1p≡0(modp2)则有νp(xp+yp)=νp(x+y)+νp(p)
下面用数学归纳法证明第二个式子
设n=pab,gcd(p,b)=1
νp((xpa)b+(ypa)b)=νp(xpa+ypa)
νp((xpa−1)p+(ypa−1)p)=νp(xpa−1+ypa−1)+νp(p)
以此类推得
νp(xn+yn)=νp(x+y)+νp(n)
第三部分#
若p=2且p∣x−y
1.对奇数n,νp(xn−yn)=νp(x−y)
2.对偶数n,νp(xn−yn)=νp(x−y)+νp(x+y)+νp(n)−1
对上述x,y,n,
若4∣x−y,则:
ν2(x+y)=1
ν2(xn−yn)=ν2(x−y)+ν2(n)
Proof
p=2时,会把第二部分推导部分倒数第三行分母中的2约掉,不能用上面的方法
n=2ab,a=ν2(n),a∤b
ν2(xn−yn)=ν2(x2a−y2a)=ν2((x−y)(x+y)∏i=1a−1(x2i+y2i))
易知奇数的偶数次方模4余1,则x2i+y2i≡2(mod4)
则νp(xn−yn)=νp(x−y)+νp(x+y)+νp(n)−1
阶乘取模#
n!=pνp(n!)(n!)p
Wilson定理#
对自然数n>1,当且仅当n时素数时,(n−1)!≡−1(modn)
对自然数m>1,有∏1≤k<m,gcd(k,m)=1k≡±1(modm)
取−1,当且仅当模m的原根存在
对素数p和正整数α,有
1≤k<pα∏k≡{1,−1,p=2, α≥3,otherwise(modpα)阶乘余数#
计算(n!)pmodp
(n!)p≡(−1)⌊pn⌋⋅(nmodp)!⋅(⌊pn⌋!)p(modp)
(n!)p≡(±1)⌊pn⌋⋅(∏1≤j≤(nmodpα),gcd(j,p)=1j)⋅(⌊pn⌋!)p(modpα),当p=2,α≥3时取1,其余情况取−1
(n!)p≡(±1)∑j≥α⌊pjn⌋∏j≥0F(⌊pjn⌋modpa),F(m)=∏1≤k≤m,gcd(k,m)=1kmodpα,当p=2,α≥3时取1,其余情况取−1
Legendre公式#
νp(n!)=∑i=1∞⌊pin⌋=p−1n−Sp(n),Sp(n)为p进制下n的各个位数之和
Kummer定理#
νp((nm))=p−1Sp(n)+Sp(m−n)−Sp(m)
Lucas定理#
对素数p,有
(kn)≡(⌊pk⌋⌊pn⌋)(kmodpnmodp)(modp)
Proof
(np)≡[n=0∨n=p](modp)
f(x)=axn+bxm
(f(x))p=(axn+bxm)p=k=0∑p(kp)(axn)k(bxm)p−k=apxpn+bpxpm=a(xp)n+b(xp)m=f(xp)(modp)(1+x)n=(1+x)p⌊pn⌋(1+x)nmodp≡(1+xp)⌊pn⌋(1+x)nmodp(modp)
对比系数有,(kn)≡(⌊pk⌋⌊pn⌋)(kmodpnmodp)(modp)
exLucas算法#
素数幂模情况#
(kn)=pνp(n!)−νp(k!)−νp((n−k)!)(k!)p((n−k)!)p(n!)p
一般模数情况#
用中国剩余定理直接计算即可
m=p1α1p2α2...psαs
⎩⎨⎧(kn)≡r1(modp1α1),(kn)≡r2(modp2α2),⋮(kn)≡rs(modpsαs).
同余方程#
对整数m和一元整系数多项式f(x)=∑i=0naixi,其中未知数x∈Zm,称形如f(x)≡0(modm)的方程为关于未知数x的模m的一元同余方程,若an≡0(modm),则上式称为n次同余方程
素数幂模同余方程#
m=pe,p∈P,e∈Z>1
我们有f(x0)≡0(modpe),则f(x0)≡0(modpe−1)
Hensel引理#
p∈P,e∈Z>1,f(x)=∑i=0naixi,(pe∤a),f′(x)=∑i=1niaixi−1,且f(x0)≡0(modpe−1)
1.若f′(x0)≡0(modp),则存在整数t使得x=x0+pe−1t,是方程f(x)≡0(modpe)的解
2.若f′(x0)≡0(modp)且f′(x0)≡0(modpe),则t=0,1,...,p−1都可
3.若f′(x0)≡0(modp)且f′(x0)≡0(modpe),则不能由上式构造
Proof
假设x是解,带入后有
f(x0+pe−1t)≡i=0∑nai(x0+pe−1t)i≡i=0∑naij=0∑i(ji)x0i−j(pe−1t)j≡j=0∑n(pe−1t)ji=j∑nai(ji)x0i−j≡i=0∑nai(0i)x0i+pe−1ti=1∑nai(1i)x0i−1≡f(x0)+pe−1tf′(x0)≡0(modpe)则tf′(x0)≡−pe−1f(x0)(modp)
三种情况对应即可
注意到我们推理中只有最后一步用到f(x0)≡0(modpe−1),那么我们可以对着最后的式子构造解
推论1#
1.f(s)≡0(modp),f′(s)≡0(modp),则存在xs∈Zpe,xs≡s(modp),st.f(xs)≡0(modpe)
2.f(x)≡0(modp),f′(x)≡0(modp)无公共解,则原方程的解数与f(x)≡0(modp)相同
proof?
素数模同余方程#
e=1,其余的同上
定理1#
若f(x)≡0(modp)有k个不同的解x1,x2,...,xk(k≤n),则
f(x)≡g(x)∏i=1k(x−xi)(modp),
degg=n−k,[xn−k]g(x)=an
推论2#
(∀x∈Z),xp−1−1≡∏i=1p−1(x−i)(modp)
(p−1)!≡−1(modp)
Lagrange定理#
f(x)≡0(modp)至多有n个根
推论3#
若∑i=0nbixi≡0(modp)的解数大于n,则(∀i=0,1,...,n),p∣bi
定理2#
若f(x)≡0(modp)的解数不为p,则必定存在degr<p的整系数多项式r(x),st.r(x)≡0(modp)与f(x)≡0(modp)同解集
Proof
不妨设n≥p
f(x)=g(x)(xp−x)+r(x),degr<p
运用费马小定理即可
定理3#
设n≤p,则方程xn+∑i=0n−1aixi≡0(modp)有n个解当且仅当存在整系数多项式q(x),r(x),(degr<n),st.
xp−x=f(x)q(x)+pr(x)
Proof
必要性:
xp−x=f(x)q(x)+r1(x)
则r1与f同解,则知r1(x)=pr(x)
充分性:
f(x)q(x)≡0(modp)
设f的解数为s,s≤n
degf+degq≥p=>,s+p−n≥q,s≥n
则s=n
定理4#
设n∣p−1,p∤a,则方程xn≡a(modp)有解当且仅当anp−1≡1(modp),若有解,解数为n
Proof
必要性:
方程有解x0,则anp−1≡(x0n)np−1≡1(modp)
充分性:
anp−1≡1(modp),
xp−x=x(xp−1−1)=x((xn)np−1−anp−1+anp−1−1)=(xn−a)P(x)+x(anp−1−1)
由定理3知有n个解
高次同余方程(组)的求解#
我们可以进行下面转化
同余方程组-同余方程
模合数-模素数幂-模素数(Hensel引理)
我们最后只需考虑
xn+∑i=0n−1aixi≡0(modp),n<p
将x代换为x−nan−1可消去xn−1项
只需考虑xn+∑i=0n−2aixi≡0(modp),n<p
n=1线性同余方程
n=2二次剩余
可化为xn≡a(modp)k次剩余
二次剩余#
gcd(a,p)=1,若存在整数x使得x2≡a(modp),则称a为模p的二次剩余,否则称a为模p的二次非剩余
Euler判别法#
对奇素数p,和满足gcd(a,p)=1的a,有
a2p−1≡⎩⎨⎧1(modp),−1(modp),∃x∈Z, a≡x2(modp),otherwise.Proof
由费马小定理,ap−1≡1(modp)
则(a2p−1−1)(a2p−1+1)≡0(modp)
则若gcd(a,p)=1,则a2p−1≡±1(modp)
又知xp−x=(xn−a)P(x)+x(anp−1−1)
可证上述结论
对于奇素数p,模p意义下的二次剩余和二次非剩余都有2p−1个
Legendre符号#
对奇素数p和整数a,定义Legendre符号如下:
(pa)=⎩⎨⎧0,1,−1,p∣a,p∤a ∧ ∃x∈Z, a≡x2(modp),otherwise.1.对任意整数a,a2p−1≡(pa)(modp)
则(p1)=1,(p−1)=(−1)2p−1
2.a1≡a2(modp)=>(pa1)=(pa2)
3.(完全积性)对任意整数a1,a2,(pa1a2)=(pa1)(pa2)
则对整数a,b,p∤b,(pab2)=(pa)
4.(p2)=(−1)8p2−1
二次互反律#
设p,q是两个不同的奇素数,则(qp)(pq)=(−1)2p−12q−1
Proof?
模意义下的开平方#
pmod4=3时,a4p+1modp为一个解
Cipolla算法#
求解x2≡a(modp)
1.找到一个r使得r2−a为模p非二次剩余(amodp=0需要特判),期望两步找到,定义w2≡r2−a(modp),wp−1≡−1(modp)
2.解为±(r+w)2p+1,(疑似需要复数类)
阶&原根#
对于a∈Z,m∈N+且gcd(a,m)=1,满足同余式an≡1(modm)的最小正整数n称为a模m的阶,记作δm(a)或ordm(a)
幂的循环结构#
1.对于a∈Z,m∈N+且gcd(a,m)=1,幂次a0,a1,...,aδm(a)−1模m两两不同余
2.对于a,n∈Z,m∈N+且gcd(a,m)=1,同余式an≡1(modm)成立当且仅当δm(a)∣n
3.对于a,k∈Z,m∈N+且gcd(a,m)=1,有δm(ak)=gcd(δm(a),k)δm(a)
4.对于a,b∈Z,m∈N+且gcd(a,m)=1,gcd(b,m)=1,有
gcd(δm(a),δm(b))lcm(δm(a),δm(b))∣δm(ab)∣lcm(δm(a),δm(b))
gcd(δm(a),δm(b))=1<=>δm(ab)=δm(a)δm(b)
5.对于a,b∈Z,m∈N+且gcd(a,m)=1,gcd(b,m)=1,∃c∈Z,gcd(c,m)=1使得δm(c)=lcm(δm(a),δm(b))
对于m∈N+,如果存在g∈Z且gcd(g,m)=1使得δm(g)=φ(m),则称g为模m的原根
原根判定定理#
对整数m≥3和gcd(g,m),g为模m的原根,当且仅当对于φ(m)的每个素因子p有gpφ(m)≡1(modm)
原根个数#
模m的原根个数为φ(φ(m))
原根存在定理#
模m的原根存在,当且仅当m=1,2,4,pe,2pe,其中p为奇素数且e∈N+
Proof?
Carmichael函数#
对于m∈N+,定义λ(m)为能使an≡1(modm)对所有gcd(a,m)=1都成立的最小正整数
λ(m)=lcm{δm(a):gcd(a,m)=1}
由幂的循环结构性质5知:λ(m)=max{δm(a):gcd(a,m)=1}
递推公式#
gcd(m1,m2)=1,λ(m1m2)=lcm(λ(m1)λ(m2))
对于m=2e且e∈N+,有λ(2)=1,λ(4)=2,且对于e≥3有λ(m)=2e−2
对于m=pe,p为奇素数且e∈N+,λ(m)=pe−1(p−1)
λ(m)=⎩⎨⎧φ(m),21φ(m),lcm(λ(p1e1),λ(p2e2),…,λ(pses)),m=1,2,4,pe, p odd, e∈N+,m=2e, e≥3,m=p1e1p2e2⋯pses.Carmichael数#
对于合数n,对所有满足gcd(a,n)=1的整数有an−1≡1(modn),则n为 Carmichael数
Korselt判别法
合数n为 Carmichael数当且仅当n无平方因子且对于n的任意质因子p均有(p−1)∣(n−1)
Carmichael数为奇数,没有平方因子,且至少有3个不同的素因子
离散对数#
取有原根的正整数m,和其一原根g,对满足gcd(a,m)=1,存在唯一整数0≤k<φ(m),使得gk≡a(modm)
我们称这个k为以g为底,模m的离散对数,记作k=indga,
indg1=0,indgg=1
设g是模m的原根,gcd(a,m)=gcd(b,m)=1
1.indg(ab)≡indga+indgb(modφ(m))
2.g1也是模m的原根,indga≡indg1⋅indgg1(modφ(m))
3.a≡b(modm)<=>indga=indgb
BSGS大步小步算法#
在O(m)的时间内求解ax≡b(modm),gcd(a,m)=1
x=A⌈m⌉−B,其中0≤A,B≤m,则aA⌈m⌉−B≡b(modm),也就是aA⌈m⌉≡baB(modm)
然后预处理所有baB,在枚举aA⌈m⌉即可
可用hash/map存储,map会多一个log
扩展BSGS算法#
求解ax≡b(modm)
就是想办法把底数和模数变得互质
d1=gcd(a,m),d1∤b无解,否则得到d1aax−1≡d1b(modd1m)
d2=gcd(a,d1m),d2∤d1b无解,否则得到d1d2a2ax−2≡d1d2b(modd1d2m)
...
D=∏i=1kdi,Dakax−k≡Db(modDm)
转化成普通的BSGS问题
高次剩余&单位根#
高次剩余#
整数k≥2,整数a和正整数m互素,若存在整数x使得xk≡a(modm),则称a为模m的k次剩余,x为a模m的k次方根;否则称a为模m的k次非剩余
设整数k≥2,整数a和正整数m互素,设模m的原根存在,且g是模m的一个原根,记d=gcd(k,φ(m)),d′=dφ(m)
1.a为模m的k次剩余,当且仅当ad′≡1(modm)
2.当a为模m的k次剩余时,在同余意义下,a模m恰好有d个互不相同的k次方根,且它们具有形式x≡gy0+id′(modφ(m)),0≤y0<d′,i=0,1,...,d−1
3.模m的k次剩余类的个数为d′,且它们全体就是{gdimodm:0≤i<d′}
Proof
gcd(a,m)=1,则gcd(x,m)=1,又g为模m的原根,所以a和x与g的某次幂同余,设x≡gy(modm),原方程等价于gky≡gindga(modm),等价于ky≡indga(modφ(m)),该方程有解当且仅当d∣indga,且通解的形式为y=y0+id′
对于ad′≡1(modm),又由阶的性质3知δm(a)=δm(gindga)=gcd(φ(m),indga)φ(m)=indgaφ(m),又方程有解当且仅当d∣indga,即d′φ(m)∣δm(a)φ(m),也即δm(a)∣d′由阶的性质2其等价于ad′≡1(modm)
设整数k≥2,奇数a和正整数m=2e,e≥2
当2∤k时
1.a恒为模m的k次剩余
2.a模m的k次方根有且仅有一个
3.模m的k次剩余类个数为2e−1,且它们就是全体既约剩余类
当2∣k时,d=gcd(k,2e−2),d′=d2e−2
1.a为模m的k次剩余当且仅当a≡1(mod4),ad′≡1(modm)
2.当a为模m的k次剩余时,同余意义下,a模m恰好有2d个互不相同的k次方根,且他们具有相同的形式x≡±5y0+id′(mod2e−1),0≤y0<d′,i=0,1,...,d−1
3.模m的k次剩余类的个数为d′,且他们的全体就是{5dimodm:0≤i<d′}
Proof
gcd(a,m)=1,则gcd(x,m)=1,因为a,x为奇数,设a≡(−1)s5r(mod2e),x≡(−1)y5z(mod2e),则原方程等价于kz≡s(mod2),ky≡r(mod2e−2)
当2∤k时总是有解
当2∣k时,第一个方程有解当且仅当2∣s,即a≡1(mod4),第二个条件有解当且仅当d=gcd(k,2)∣r同上知等价于ad′≡1(modm),根据两个方程,知解的形式为z≡0,1(mod2),y=y0+id′(mod2e−2),0≤y0<2e−2
单位根#
对于模数 𝑚,元素 1 的 𝑘次方根称为模 𝑚的 𝑘次单位根.特别地,如果 𝑥是模 𝑚的一个 𝑘 次单位根,且它不是模 𝑚 的任何 𝑘′ <𝑘 次单位根,那么,也称 𝑥为 模 𝑚 的 𝑘 次本原单位根
原根g是模m的φ(m)次本原单位根
模数m,λ(m)为它的Carmichael函数
1.所有与m互素的整数a都是模m的δm(a)次本原单位根
2.元素a是模m的k次单位根,且k′为k的任意倍数,那么a也是模m的k′次单位根
3.元素a是模m的k次(本原)单位根,那么元素al是模m的gcd(k,l)k次(本原)单位根
4.当k′遍历k的因数,所有模m的k′次本原单位根恰好构成模m的k次单位根的一个划分。对于gcd(l,k)=1,x∣−>xl给出k次单位根之间的双射,且保持上述划分不变
5.模m的k次本原单位根存在,当且仅当k∣λ(m),,特别的,模m的λ(m)次本原单位根存在,称为模m的λ−原根
6.元素a是模m的k次单位根,当且仅当ak≡1(modm),且对任意素因子p∣k,apk≡1(modm)
Proof
只证明5
由Carmichael函数性质知,模m的λ(m)次本原单位根总是存在,设为a,且δm(a)=λ(m),对于k∣λ(m),设k′=kλ(m),总有δm(ak′)=gcd(λ(m),k′)λ(m)=k′λ(m)=k,因此ak′是k次本原单位根,又所有x,gcd(a,m)=1,的阶都是λ(m)的因子,故由性质5
设x是a模m的一个k次方根,当r遍历模m的全体k次单位根时,xr遍历a模m的全体k次方根
对于模数m,设模m的原根存在,且a是模m的k次本原单位根,那么b是k次单位根,当且仅当它可以表示为a的幂次
模意义下的开方#
改良Tonelli−Shanks算法#
求解xk≡a(modm),m为素数幂
特别的对于m=2e的情形,还要保证a≡1(mod4),将φ(m)换成δm(5)=2e−2
设d=gcd(k,φ(m)),当a是模m的k次剩余时,a总是模m的dφ(m)次单位根,对任意gcd(l,dφ(m))=1,x−>xl为单位根之间的双射,取l=(dk)−1(moddφ(m))
原方程两边同时取l次幂xd≡xkl≡al≡b(modm)
左边是因为ld−1≡k−1(modφ(m)),则d≡kl(modφ(m))
考虑d=∏p∈Ppe,从b开始以次开pe即可
即求解xpe≡b(modm)
设φ(m)=psr,gcd(p,r)=1,设q∈N+,qr≡−1(modpe),由于b是rps−e次单位根,那么bqr是ps−e次单位根,设ζ是模m的ps次本原单位根,那么ζpe是ps−e次本原单位根,存在h,bqr≡ζhpe(modm)可知x≡bpeqr+1ζ−h(modm)
为计算上式,需要找到摸 m的一个p次非剩余η,则有ηrps−1≡1(modm),ηrps≡1(modm),ζ=ηr(modm),ξ=ηrps−1(modm)分别为ps,p次本原单位根
计算h,取h<ps−e,考虑p进制h=∑j=0s−e−1hjpj当前j为计算完时(bqrζ−pe(h0+...+hj−1pj−1))ps−e−j−1≡ζhjpe−1≡ξhj(modm)
可用BSGS计算
一般情形#
m=pe,gcd(a,m)>1
若a≡0(modm),x=p⌈ke⌉l(modpe),l=0,1,...,pe−⌊ke⌋−1
若a≡0(modm),a=psa′,gcd(a′,p)=1,x=pzx′,gcd(x′,p)=1则xk=pkz(x′)k≡psa′(modpe),该方程有解当且仅当kz=s,(x′)k≡a′(modpe−s),最终解为x≡pks(x′+lpe−s)(modpe),l=0,1,...,ps−ks−1