零、前情提要
总所周知,我是一个纯血web狗,可能会些misc,会点reverse,会一点点pwn,但是密码绝对是0基础,被某二比密码手骗入职了新公司,新公司给我的第一任务就是准备熵密杯…既然躲不掉,那就只能重拾数学课本开始了。
一、初等数论
基本数学概念
整除
若 a=b×k(k为整数),则称b整除a,记作 b∣a。
例如 3∣12,因为 12=3×4。
质数与合数
质数:大于1且只能被1和自身整除的数(如2、3、5、7…)。
合数:大于1且能被其他数整除的数(如4、6、8、9…)。
1既不是质数也不是合数。
质因数分解
每个大于1的整数都可以唯一分解为质数的乘积。
例如 60=22×3×5。
模运算
a除以m的余数,称为a在模m下的余数,记作 amodm。
例如 17mod5=2,因为 17=5×3+2。
同余
若两个整数a和b除以m的余数相同,则称a与b在模m下同余,记作 a≡b(modm)。
例如 17≡2(mod5),−3≡4(mod7)。
乘法逆元
若 a×x≡1(modm),则称x为a在模m下的乘法逆元,记作 a−1。
只有当 gcd(a,m)=1 时,a在模m下才存在乘法逆元。
例如 3−1≡4(mod11),因为 3×4=12≡1(mod11)。
费马小定理
若p为质数,a不是p的倍数,则 ap−1≡1(modp),如果是倍数则是ap−1≡0(modp)。
等价形式:ap≡a(modp)。
欧拉函数 φ(n)
小于n且与n互素的正整数个数。质数p时 φ(p)=p−1。
若 n=p×q(p、q为质数),则 φ(n)=(p−1)(q−1)。
欧拉定理
若 gcd(a,m)=1,则 aφ(m)≡1(modm)。
费马小定理是欧拉定理在m为质数时的特例。
二次剩余定理
设 p 为奇质数,a 为整数且 p∤a,若同余方程
x2≡a(modp)
有解,则称 a 是模 p 的二次剩余,否则称为二次非剩余。
例如模 7 下,12≡1,22≡4,32≡2,故 {1,2,4} 是二次剩余,{3,5,6} 是二次非剩余。
二次剩余基本性质
- 模 p 下恰好有 2p−1 个二次剩余和 2p−1 个二次非剩余。
- 乘法规律:(pab)=(pa)(pb)。
- −1 是模 p 的二次剩余 ⟺p≡1(mod4)。
- 2 是模 p 的二次剩余 ⟺p≡±1(mod8)。
- 二次剩余之积仍为二次剩余;二次剩余与二次非剩余之积为二次非剩余。
基础算法
欧几里得算法 (GCD)
两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
例如求252和101的最大公约数,那么首先就是252mod101=42,那么252和101的最大公约数就等效为101和42的最大公约数,依此类推,直至余数变为0,剩下那个数就是最大公约数。
欲求最大公约数的两个数为 a,b ,第i步带余除法得到的商为 qi ,余数为 ri+1 。
a=b⋅q0+r1(0≤r1≤b)
gcd(a,b)=gcd(b,r_1)
同时假设r0=a,r1=b那么公式就变成了
ri+1=ri−1−qiri
ri+1=0 时计算结束
求两数最大公约数一般简写为 gcd(a,b),如果gcd(a,b)=1则ab互素(两数最大公因数为1)。
python实现
def gcd(a, b):
return a if b == 0 else gcd(b, a % b)
扩展欧几里得算法(EXGCD)
代入额外两个数求出 ax+by=gcd(a,b) 中的x、y,其主要作用是用来求解模反元素、线性同余方程等。
扩展欧几里得算法在欧几里得算法的基础上加了两个序列,记 si 和 ti ,且初始 s0=1 ,s1=0和 t0=0和 t1=1,然后在原算式算完后多加两步额外计算。si+1=si−1−qisi 和 ti+1=ti−1−qiti 。
python实现
def exgcd(a, b):
if b == 0:
return a, 1, 0
d, x, y = exgcd(b, a % b)
return d, y, x - (a // b) * y
求解模线性方程
解
ax≡c(modb)
等价于
ax+by=c
求乘法逆元
若 gcd(a,m)=1,则存在x使 ax≡1(mod m),即x为a模m的逆元。通过扩展欧几里得解 ax+my=1得到 x,然后调整到 [0,m−1] 范围。
中国剩余定理(CRT)
设模数 m1,m2,…,mn 两两互素,即对任意 i=j,都有 gcd(mi,mj)=1 。
那么对于任意整数 a1,a2,…,an ,同余方程组
⎩⎨⎧x≡a1(modm1)x≡a2(modm2)...x≡ai(modmi)
在模 M=m1,m2,…,mi 有唯一解,即存在x满足所有条件
公式
x=∑aiMiNi
最后去模得到答案
x(modM)
举例
⎩⎨⎧x≡2(mod3)x≡3(mod5)x≡2(mod7)
先求M
M=2×5×7=105
然后构造Mi=miM,得到M1=35,M2=21,M3=15
求Ni,即求
Ni=Mi−1(modmi)
得到N1=2,N2=1,N3=1
最后带入公式
x=∑aiMiNi
x=2×35×2+3×21×1+2×15×1=140+63+30=140+63+30=140+63+30=233
取模 233mod105=23,所以x的解就是23
扩展中国剩余定理(EXCRT)
常规CRT只能解决m互素的问题,即gcd(mi,mj)=1
那么EXCRT就是解决CRT解决不了的问题,同时存在无解,对于同余方程组
{x≡a1(modm1)x≡a2(modm2)
令g=gcd(m1,m2),那么就绪满足g∣a2−a1,即(a2−a1)≡0(modg),否则无解
然后来看核心推导
第一条等同于,x=a1+km1
带入第二条就变成了a1+km1≡a2(modm2)
整理一下就变成这样
m1k≡a2−a1(modm2)
那么接下来就是exgcd的作用求出k即可,因为上式子变形得到
m1k−m2t=a2−a1
那么不就是m1k+m2(−t)=a2−a1的形式吗,然后就是exgcd(m1,m2)求出k的值带回算式x=a1+km1得到最终答案
举例
{x≡1(mod4)x≡3(mod6)
得到
4k≡2(mod6)
即
4k−6t=2⇒4k+6(−t)=2
变一下
4u+6v=2
扩展欧几里得求解
| i | qi−1 | ri | ui | vi |
|---|
| 0 | | 6 | 1 | 0 |
| 1 | | 4 | 0 | 1 |
| 2 | 1 | 2 | 1 | -1 |
| 3 | 2 | 0 | | |
所以u=1,v=−1,k=1的情况带回前面4k−6t=2不成立,那么就是k=-1
x=1+4×−1=−3
最后如果要取正整数解x就为9
如果同余方程组有多组的话,一步一步合并即可
持续学习中…