(本篇博客大部分内容都会在讲证明(也许不够严谨),要想看代码实现的请点击这里)
目录
- 数论基础
一些定义
性质
- 费马小定理
定理内容
证明
- 欧几里得算法(gcd)
定理内容&证明
扩展欧几里得算法(exgcd)
定理内容&证明
- 欧拉函数
定义
通项公式
性质
- 莫比乌斯函数
定义
性质
莫比乌斯反演
- 筛法
质数筛法
暴力筛
埃氏筛法
线筛
欧拉函数线性筛
莫比乌斯函数线性筛
逆元线性筛
- Baby-Step-Giant-Step(大步小步算法)
exbsgs(扩展bsgs)
- 中国剩余定理(crt)
扩展中国剩余定理(excrt)
- Lucas定理
扩展Lucas定理(exlucas)
- 杜教筛
数论基础
质数
定义:因数只有1和它本身的数(1不算质数)
取模
两数相除的余数(如7对4取模=3,一般用 $mod$ 或 % 表示取模)%清华学姐clz
取模与乘除运算优先级同级
整除
如果a除b(注意是除不是除以)能得到一个整数,则称a整除b,记作a|b
同余
如果两个整数a,b满足一个模数m|a-b,则称整数a与b对模m同余,记作 $a$ $equiv$ $b$ $pmod{m}$
最大公因数
几个数中最大的公因数就是最大公因数,记作$gcd(a,b)$,也可记作$(a,b)$
$gcd(a_{1},a_{2},a_{3}.....a_{n})$ $=$ $gcd(gcd(gcd(gcd(a_{1},a_{2}),a_{3}),a_{4})..........,a_{n})$
最小公倍数
几个数中最小的公倍数就是最小公倍数,记作$lcm(a,b)$
易证两个数的最小公倍数 $=$ 它们的乘积除以最大公因数
互质
指两数最小公倍数为1
阶乘
$1 imes 2 imes .... imes n = prod_{i=1}^{n}i = n!$
性质
$(a$ $+$ $b)$ $mod$ $m$ $=$ $a$ $mod$ $m$ $+$ $b$ $mod$ $m$
$a$ $cdot$ $b$ $mod$ $m$ $=$ $(a$ $mod$ $m)$ $cdot$ $(b$ $mod$ $m)$
$a$ $-$ $b$ $mod$ $m$ $=$ $a$ $mod$ $m$ $-$ $b$ $mod m$ (注意大部分语言的%之后会是负的:如-11 % 4 = -3,所以大部分时候要把(得出的答案+模数)% 模数
(以上三条性质易证)
$a$ $div$ $b$ $mod$ $m$ 不一定等于 $a$ $mod$ $m$ $div$ $(b$ $mod$ $m)$
为什么呢?
因为除法默认下取整,所以直接模会有问题
所以再引入一个东西
逆元
如果一个整数x满足$a$ $cdot$ $x$ $equiv$ $1$ $pmod{m}$ ,则称x是a关于模m的逆,一般记作$a^{-1}$
逆元是广义化了的倒数
所以在模运算中,除以一个数相当于乘这个数的逆元
对于整数a,m逆元存在当且仅当 $gcd(a,m)$ $=$ $1$
必要性证明
反证法:设 $d$ $=$ $gcd(a,m)$ $>$ $1$ ,$b cdot d = a$,$n cdot d = m$,且 $b,n$ $in$ $mathbb{Z}$
$ecause$ $a$ $cdot$ $x$ $=$ $1$ $pmod{m}$
$ herefore$ $a$ $cdot$ $x$ $+$ $k$ $cdot$ $m$ $=$ $1$, $k$ $in$ $mathbb{Z}$
$ herefore$ $d$ $cdot$ $($ $b$ $cdot$ $x$ $+$ $n$ $ imes$ $k$ $)$ $=$ $1$
设$A$ $=$ $b$ $cdot$ $x$ $+$ $n$ $cdot$ $k$,显然$A$ $in$ $mathbb{Z}$
$ herefore$ $A$ $=$ $frac{1}{d}$
$ herefore$ $d$ $>$ $1$
$ herefore$ $A$ $=$ $d$ $ otin$ $mathbb{Z}$
这与 $A$ $in$ $mathbb{Z}$ 矛盾
$ herefore$ 当逆元存在时,$gcd(1,m)$ $=$ $1$
充分性证明详见后面的扩展欧几里得的证明
数学用语
存在$exists$,所有的/任意的$forall$,质数集$mathbb{P}$,自然数集$mathbb{N}$,整数集$mathbb{Z}$,有理数集$mathbb{Q}$,实数集$mathbb{R}$,复数集$mathbb{C}$ 女装QRC(NZQRC)
属于$in$,不属于$ otin$
(不懂得稍微百度一下?)
费马小定理
讲了那么多,那么到底怎么求逆元呢?
定理内容
如果对于a,p,$a$ $in$ $mathbb{Z}$,$p$ $in$ $mathbb{P}$(质数集),$gcd(a,p)$ $=$ $1$ (等价于a不是p的倍数),则$a^{p-1}$ = $1$
$a^{p-2}$ $ imes$ $a$ $=$ $1$
$a^{p-2}$ 即为a的逆元
下面给出证明
证明
引理1:如果 $a cdot c equiv b cdot c pmod m$ ,且 $(c,m) = 1$ ,则$a equiv b pmod m$
$ecause a cdot c equiv b cdot c pmod m$
$ herefore a cdot c - b cdot c equiv 0 pmod m$
$ herefore (a - b) cdot c equiv 0 pmod m$
$ecause (c,m) = 1$
$ herefore$ 存在c的逆元
$ herefore$ 两边同时乘上 $c^{-1}$
$ herefore a - b equiv 0 pmod m$
$ herefore a equiv b pmod m$
引理2:定义对于数列A,满足A的大小为m且对于$forall i,j ( i eq j)$满足$a_{i} otequiv a_{j} pmod m$,则称A构成模m的完全剩余系
当$a_{0},a_{1},.....,a_{m-1}$构成模m的完全剩余系,$b in mathbb{Z}$,$(b,m) = 1$,则$b cdot a_{0},b cdot a_{1},.......,b cdot a_{m-1}$也构成模m的完全剩余系
反证法
若$b cdot a_{0},b cdot a_{1},.......,b cdot a_{m-1}$不构成模m的完全剩余系,则$exists i,j (i eq j)$满足$b cdot a_{i} equiv b cdot a_{j} pmod m$
$ herefore$ 根据引理1,$a_{i} equiv a_{j} pmod m$
这与完全剩余系的定义相矛盾
$ herefore$ 引理2得证
引理3:若$A =$ {$0,a_{1},a_{2},....,a_{m-1}$},$B =$ {$0,b_{1},b_{2},....,b_{m-1}$}分别构成模m的剩余系,则$a_{1} cdot a_{2} cdot .... cdot a_{m-1} equiv b_{1} cdot b_{2} cdot .... cdot b_{m-1} pmod m$
因为A是模m的完全剩余系
所以对于每个i,$a_{i} equiv$ 1~m-1的一个不同的数
B同理
所以对于每个i,都有不同的j使得$a_{i} equiv b_{j} pmod m$
所以设排列C使得$a_{i} equiv b_{c_{i}} pmod m$
所以$a_{1} cdot a_{2} cdot .... cdot a_{m-1} equiv b_{c_{1}} cdot b_{c_{2}} cdot ... cdot b_{c_{m-1}} pmod m$
所以$a_{1} cdot a_{2} cdot .... cdot a_{m-1} equiv b_{1} cdot b_{2} cdot .... cdot b_{m-1} pmod m$
我们构造一个模m的剩余系{$0,1,2,3,...,m-1$}
根据引理2,{$0,a,2a,3a,....,(m-1)a$}也是模m的剩余系
根据引理3,$1 imes 2 imes .... imes (m-1) equiv a cdot 2a cdot ... cdot (m-1)a pmod m$
$ herefore 1 imes 2 imes .... imes (m-1) equiv (1 imes 2 imes .... imes (m-1)) cdot a^{p-1} pmod m$
显然$1 imes 2 imes .... imes (m-1)$与m互质
$ herefore$ 根据引理1,$a^{p-1} equiv 1 pmod m$
得证
复杂度&主要代码实现
快速幂
时间:O($log_2m$)
空间:O(1)
条件:模数m为质数,$(a,m) = 1$
欧几里得算法(exgcd)
这时候就有人要说了:
“哎呀,费马小定理好菜啊,只能求模数为质数的情况”
别急,下面就给出模数不为质数的情况
定理内容
设整数a>整数b,则
$gcd(a,b) = egin{cases}
a & ext{ } b = 0\
gcd(b,a mod b) & ext{ } b
eq 0
end{cases}$
证明
当b = 0时显然
当$b eq 0$时,设$a = k cdot b + r$,$k,r in mathbb{Z}$,$|r| leq |b|$
则$r = k cdot b - a$,$a mod b = r$
设d为a,b的任意一个公因数,即d|a且d|b
则$r / d = k cdot b / d - a / d$
显然等式右边是个整数,则等式左边也是个整数,即d|r
显然对于任意的一个r和b的公因数e,e|a
所以a,b的公因数集合与r,b的公因数集合相等
则它们的最大公因数也会相等
所以$gcd(a,b) = gcd(r,b) =gcd(a mod b,b)$
复杂度&主要代码实现
直接递归调用
时间:最坏O($log_2Min(a,b)$),当数据为斐波那契数列时才会卡到这个上界
空间:O(1)
扩展欧几里得算法(exgcd)
用以求解一组解(x,y)使得a*x+b*y=gcd(x,y)
操作
若b为0,则x=1,y=0
若b不为0,则递归调用求出exgcd(b,a%b)的解$x_{2} , y_{2}$,则此时解$x_{1} = y_{2} , y_{1} = x_{2} - [a/b] cdot y_{2}$
[a]为取整函数(下取整),其作用为舍去实数a的小数部分,只保留整数部分
用途
求逆元
对于$a cdot x equiv 1 pmod m$
$exists k in mathbb{Z}$使得$a cdot x + k cdot m = 1$
因为$(a,m) = 1$
所以求出的x就是逆元了
证明
依然设a>b
若此时$b = 0$,则$gcd(a,b) = a = 1 cdot a + 0 cdot b$,所以$x = 1 , y = 0$
若此时$b eq 0$,则设$x_{1} cdot a + y_{1} cdot b = gcd(a,b)$,$x_{2} cdot b + y_{2} cdot (a mod b) = gcd(b,a mod b)$
因为$gcd(a,b) = gcd(b,a mod b)$(根据普通的欧几里得算法)
所以$x_{1} cdot a + y_{1} cdot b = x_{2} cdot b + y_{2} cdot (a mod b) = x_{2} cdot b + y_{2} cdot (a - [a/b] cdot b) = x_{2} cdot b + y_{2} cdot a - y_{2} cdot [a/b] cdot b = y_{2} cdot a + (x_{2} - y_{2} cdot [a/b]) cdot b$
显然$x_{1} = y_{2} , y_{1} = x_{2} - [a/b] cdot y_{2}$是一组解
因为当gcd为1一定能求出逆元,所以逆元存在当且仅当$gcd(a,m) = 1$的充分性得证
复杂度
与gcd一样:最坏O($log_2Min(a,b)$)
只是多了些小常数
那天蒟蒻终于想起了,被卡常支配的恐惧
欧拉函数
定义
指小于等于n中与n互质的正整数的个数,记作$varphi (n)$