数论相关
本文是一些对基础数论的总结。
欧几里得 Gcd
定义:gcd(a,b)即求a和b的最小公因数。
求法:根据gcd(a,b)=gcd(b,amodb),递归求解知道b=0时,gcd(a,b)=a。
时间复杂度:O(loga)
证明:时间复杂度不是很会证,但是算法的正确性还是很好证的。
设 k=⌊ab⌋,r=amodb。
当r=0时
gcd(a,b)=gcd(b,0)=b
正确。
当r>0时,设d=gcd(a,b),a=xd,b=yd
r=a−kb=xd−kyd=(x−ky)d
可知
d也是
r的因数,即
gcd(b,r)=d′d。接下来就是要证明
d′=1即
gcd(y,x−ky)=1。我们用反证法,设
x−ky=nd′,y=md′,d′>1 x=ky+nd′=kmd′+nd′=(km+n)d′a=xd=(km+n)d′db=yd=mdd′
那么gcd(a,b)=dd′(d′>1)那么与前提gcd(a,b)=d不符 所以
d′=1,gcd(a,b)=gcd(b,r)。扩展欧几里得 ExGcd
定义:解决一类形如求ax+by=c(a,b,c已知)最小正整数解的问题。
求法:首先方程有解的充要条件是gcd(a,b)|c,因为gcd(a,b)|ax+by。对于求解x,y我们只需参考去gcd的方法递归求解。
假设我们要求ax+by=gcd(a,b)的最小正整数解。
根据
gcd(a,b)=gcd(b,amodb)ax+by=gcd(a,b)bx′+(amodb)y′=gcd(b,amodb)
可得
ax+by=bx′+(amodb)y′,我们化简一下式子:
ax+by=bx′+(amodb)y′ax+by=bx′+(a−[ab]∗b)y′ax+by=ay′+bx′−[ab]∗by′
也就是说
x=y′,y=x′−[ab]∗y′,这样我们就可以递归求解,对与边界
b=0的情况显然
x=1,y=0。
对于ax+by=gcd(a,b)的其他整数解,设为x′,y′,gcd(a,b)=d,a′=ad,b′=bd。
ax+by=ax′+by′a(x−x′)=b(y′−y)a′(x−x′)=b′(y′−y)
此时
a′与b′互质,即
b′|(x−x′),a′|(y′−y),设
b′k=(x−x′)那么
a′k=(y′−y),也就是说
k的每种不同取值就对应这一组整数解,我们可以表达为
x′=x+kb′,y′=y−ka′。
类欧几里得
定义:求解形如∑nx=0⌊ax+bc⌋(a,b,c已知)。
求法:我们先设Sd(n)=∑nx=1xd
1. 如果a≥c,设d=⌊ac⌋则有
∑x=0n⌊ax+bc⌋=∑x=0n(⌊(a%c)x+bc⌋+d∗x)=d∗S1(n)+⌊(a%c)x+bc⌋
2.如果b≥c,设d=⌊bc⌋则有
∑x=0n⌊ax+bc⌋=∑x=0n(⌊ax+(b%c)c⌋+d)=d∗S0(n)+∑x=0n(⌊ax+(b%c)c⌋
根据1,2我们把规模为
(a,b,c,n)转化为规模为
(a%c,c,b%c,n)3.a≥c,b≥c时,设M=⌊an+bc⌋
∑x=0n⌊ax+bc⌋=∑x=0n∑y=0M[y<⌊ax+bc⌋]
接下来化简一下
y<⌊ax+bc⌋ c∗(y+1)≤a∗x+bc∗y+c−b≤a∗xc∗y+c−b−1<a∗xx>⌊c∗y+c−b−1a⌋
原式
=∑y=0M∑x=0n[x>⌊c∗y+c−b−1a⌋]=∑y=0M(n−⌊c∗y+c−b−1a⌋)=n∗(M+1)−∑y=0M⌊c∗y+c−b−1a⌋
于是问题又从
(a%c,b%c,c,n)转换成了
(c,c−b%c−1,,a%c,M)。
那么我们只需要递归求解就可以了,而规模每次都是取模的,所以和
Gcd类似,复杂度也是
O(log)的。
欧拉函数
详细内容戳这里
模相关
中国剩余定理
定义:给定n条形如x≡ai(modmi)的方程,求解x。(mi互质)。
求法:考虑如果x=∑ni=1Fi,且保证
满足{Fimodmi=aiFimodmj(j≠i)=0
那么令
M=∏mi,则
Fi=Mmi∗(Mmi)−1∗ai。
证明:显然满足。
组合数取模
莫比乌斯函数
定义:设函数
f(n)=∑d|ng(d)
求法:当
f函数已知的情况下可以通过一下函数求的
g函数
g(n)=∑d|nμ(d)∗f(nd)μ(d)=⎧⎩⎨⎪⎪1,d=1(−1)k,d=p1∗p2∗...pk(pi为互不相同的质数)0,其余
证明:首先,
f(n)肯定包含
g(n),所以
μ(1)=1。那么现在就要减去
f(n)中除了
g(n)的其他项。这就和容斥原理很像了,考虑减去除掉一个质数的
f值,加上除去两个质数的
f值…这就是
μ(d)的第二种情况。其余的
f值不用考虑,对应第三种情况。至此,就是最基础的反演。
性质一:对于任意正整数n,有
∑d|nμ(d)={1,n=10,n>1
证明:对于
n=1的情况,直接就是
μ(1)。那么现在考虑
n>1的情况。
设
n=px11∗px22...pxkk(pi为互质的质因子)。设
d=py11∗py22...pykk,加入存在
yi≥2,那么
μ(d)=0。现在考虑
yi=0或1的情况。假设
d中有
r个
i满足
yi=1,那么
μ(d)=(−1)r,这样的
d有
Crk个,所以
∑d|nμ(d)=∑r=0kCrk∗(−1)r=(1−1)k=0
(根据二项式展开的公式)。
性质二:莫比乌斯函数是积性函数,即当a,b互质时,满足μ(a∗b)=μ(a)∗μ(b)
性质三:设f(n)和g(n)是集合上的两个函数,并满足f(n)=∑d|ng(d),则g(n)的积性函数的充分必要条件是f(i)是积性函数。
变形一:
f(i)=∑d=1⌊ni⌋g(d∗i)⇒g(i)=∑d=1⌊ni⌋f(d∗i)∗μ(d)
往容斥方面想一想。
变形二
f(i)=∑i|d,d≤ng(d)⇒g(i)=∑i|d,d≤nf(d)∗μ(di)
同样往容斥方面想一想。
线筛求μ:根线筛求质数一样先要把质数筛出来。那么每个质数p只会被访问一次,且μ(p)=−1。考虑非质数的数x,我们只用x的最小质因子来更新它的μ(x),假设枚举都数字i和第j个质数,那么当imodprij=0时,由于存在存在两个相同的质因子,那么μ(i∗prij)=0,否则μ(i∗prij)=−μ(i)。这样就能线性的求出μ了。
大步小步法(BSGS)
模型:求解ax≡b(modp),p≤109+7
解法:分两种情况讨论,p与a为质数,p与a不互质。
p与a互质
考虑欧拉定理,当x>φ(p)在模p意义下ax就已经循环了,所以x≤φ(p)。
设x=Ap√+B,则原式变为
aAp√+B≡b(modp)aAp√≡b∗(aB)−1(modp)
那么可以预处理右边的
n√种取值用
hash存起来,然后直接枚举
A找
B的最小值。
复杂度
O(φ(p)−−−−√) *当然设的时候可以令
x=Ap√−B,那么就不用求逆元了。
p与a不互质
考虑怎么把问题转化成第一种情况。
设d=gcd(a,p),那么原式变为
adax−1≡bd(modpd)ax−1≡ba(modpd)
当然,当
d∤b时无解。
但是
a在模
pd意义下可能还是没有逆元,那么我们可以重复上面的步骤直到
a与模数互质,由于
d≥2所以这个步骤最多执行
log次。然后就转化成第一种情况了。
数学定理