本文章内容比较长,请耐心食用!!!!!
目录:
-
模意义下的数和运算喵~
-
模意义下的乘法逆元喵~
-
同余方程与中国剩余定理喵~
-
线性筛与积性函数喵~
-
欧拉函数喵~
一,模意义下的数和运算。
- 啥是模?喵喵喵!
- 模意义下,数是之间如何运算?喵喵喵!
- 什么是同余?同余有哪些性质?喵喵喵!
- 啥是不定方程?喵喵喵!
- 啥是裴蜀定理?喵喵喵!
- 啥是欧几里得算法?喵喵喵!
- 裴蜀定理+欧几里得算法 = 扩展欧几里得?喵喵喵!
- 扩展欧几里得有啥用?喵喵喵!
- 例题讲解!!喵喵喵!喵喵喵!喵喵喵!
啥玩意是模?喵喵喵!喵喵喵!喵喵喵!
模就是“%”d 读法,即“mod”的读音。它的含义是 被除数除以除数剩下的余数
例如 12%5=2 ,表示12模以5的余数是2.
更严谨的定义是:
对于整数a,b, 满足 b>0,则存在唯一的整数q,r ,满足 a=q*b+r ,( 0<= r< b ) .
其中q叫做商,r叫做余数 , 用 a mod b or a%b 表示
模意义下,数是之间如何运算?喵喵喵!
1,加法: (a+b)% M = ( a%M + b%M ) % M
2,减法: (a-b)% M = ( a%M - b%M ) % M
3,乘法: (a*b)%M = (a%M * b%M)%M
(这里以二元运算举例,实际上,对于多元算式,这三个规则仍然成立 )
为啥取模运算法则里没有除法?喵喵喵!
实际上,除数是不能直接写成 (a/b)%M = (a%M / b%M ) % M
比如 a=12 , b=3, M=6 (a/b)%M =4
(a%M / b%M )%M = 0.
在后续的章节,我们会介绍,怎么处理除法运算。
什么是同余?同余有哪些性质?喵喵喵!
同余指的就是,有两个数,这两个数模以同一个数的结果是相同的,那么这两个数之间就有
一种关系,叫同余。
表示为:
下面介绍一些具有同余关系的数的几个重要的性质:
1、传递性
2、同加性
3、同乘性:
4、同幂性
5、歪比八卜性:
啥是不定方程?喵喵喵!
不定方程,又称为丢番图方程,通俗的说就是多个未知数的方程,求解只在整数范围内进行。
比如: ax+by=c 的二元一次方程。
对于这样子的方程如何求其整数解?
解不定方程需要三个工具:
下面介绍这些工具里面最为重要的一个:
由法国数学家 裴蜀提出的的一个定理:裴蜀定理
啥是裴蜀定理?喵喵喵!
裴蜀定理是一切的基石
裴蜀定理的内容:
对于整数a,b, 设他们的最大公约数gcd(a,b)=d。
那么一定存在无穷多对整数对(x,y),使得ax+by=d。
这里给出裴蜀定理的证明。
由不定方程的形式我们可以看出:
ax+by=c。
c的取值随着x,y的改变而改变,我们取所有的c中的最小正整数解,设为S。
要证明S=gcd(a,b)
也就是要证明:S | gcd(a,b),gcd(a,b)| S (这是数论中常用的证明两数相等的方法)
先证明gcd(a,b)|S
因为,a,b都是gcd(a,b)的倍数,且x1,y1都是整数,那么必然 gcd(a,b)| ax+by
所以gcd(a,b)|S
然后证明S|gcd(a,b)
也就是gcd(a,b)是S的倍数。
如果gcd(a,b)是S的倍数,那么必然,S是a,b的公因数。
设 a=pS+r
将 S=ax+by带入有:
a= p*ax+p*by+r
把它整理一下:
a(1-px)+b(-py)= r (r=a%S)
我们会发现:卧槽,这不是不定方程的形式吗?
因为r = a%S , 即r 必然与 S 是同号的。
且r 必然小于 S
所以我们前面假设的 S是最小整数解,就不成立了,所以r必然不存在,所以 a一定是S的倍数。
同理可得b一定是S的倍数。
所以S是a,b的公约数
S|gcd(a,b)
证毕
所以我们就可以由裴蜀定理引出一个定理:
裴蜀定理: 有无穷个整数对(x,y)使得 ax+by=gcd(a,b)
推论:
若 ax+by = c 有解,那么c 一定是gcd(a,b)的倍数
啥是欧几里得算法?喵喵喵!
先直接给出结论:
gcd(a,b)=gcd(b,a%b) (gcd(a,b)代表最大公约数)
要证明欧几里得算法,首先要了解一些基础的整除理论。
1、要证明 a=b 可以证明:a|b ,b|a
2、如果 d|a,d|b 那么 d| (ax+by) (裴蜀定理应用)
3、对于任意两个数a,b有:a=pb+r ,(其中 p= [a/b], r=a%b)
要证明 gcd(a,b) = gcd ( b,a%b)
即证明 gcd(a,b)|gcd(b,a%b) gcd(b,a%b)|gcd(a,b)
先证明:gcd(a,b) | gcd(b,a%b) :
设 a=qb+r -> r = a-qb
设 d=gcd(a,b)
因为d | a, d | b , 所以 d | (ax+by) 即 d|(a-qb) 即 d|r
又因为:r = a%b
所以 d | gcd(b,a%b)
------------------------------------------
------------------------------------------
只要证: gcd(b,a%b) | gcd(a,b)
设 c = gcd(b,a%b)
设 a= qb+r
因为 c | b , c | r, 所以 c|(bx+ry) 所以 c|(qb+r)
所以 c|a
因为c|a,c|b,所以c|gcd(a,b)
证毕
所以 c==d
gcd(a,b) | gcd(b,a%b) :
裴蜀定理+欧几里得算法 = 拓展欧几里得算法?喵喵喵!喵喵喵!
前面两个算法就是求解ax+by=c这样的不定方程的两个最重要的基础,
我们将前面两种方法融合,形成了终极大招:拓展欧几里得算法。
ax+by = c (由裴蜀定理知,c为gcd(a,b)的倍数)
设d=gcd(a,b) c=t*d
两边同时除以t可得:
ax+by = d
所以我们只要求出ax+by=d的整数解,再乘以t就可以了
又因为gcd(a,b)=gcd(b,a%b)
所以:bx+(a%b)y = d 也有解
在这个基础上:
令 a%b =a , b%(a%b)= b 迭代下去
(a%b)x + b%(a%b)y =d 仍有解。
我们发现:卧槽这不就是欧几里得算法吗?
欧几里得算法:gcd(a,b)=gcd(b,a%b)
一直递归迭代下去,当b为0的时候,就求解到的最大公约数是多少:
所以,我们可以直接借用欧几里得算法进行迭代,直到b=0.
对于
ax+by = d 这个不定方程,当b为0 的时候,此时的a就是gcd(a,b),所以x的取值是1
而y的取值可以为任意值,我们默认写0.
所以,递归的边界我们找到了,即b==0,y=0,x=1.
那么我们怎么迭代回去呢?
让我们看到迭代的通项公式:
ax+by=d --------> bx+(a%b)y = d (左右两边的x,y必然是不一样的,标号为1,2)
又因为
得到:
整理:
由系数相同可得:
x1=y2, y1=(x2-a/b *y2)
所以我们从底部在复原回去的过程就是:
上一层的x,等于这一层的y
上一层 y ,等于这一层的x,y的表达式:(x2-a/b y2)
我们只需要按照顺序迭代加深,自然递归结束后就会一层一层回去。
模板:
void exgcd(int a, int b, int& x, int& y) {if (!b) {x = 1, y = 0;return;}exgcd(b, a % b, x, y);int z = x;x = y;y = z - a / b * y; }
我们可以很清楚的看到:首先把这一层的x存下来,即x2,把它存给z,此后z就代表x2。
根据” 上一层的x,等于这一层的y”这句话
我们 把y2赋值给x , 也就是 x=y ,从此时开始,x表示的值不再是x2,而是x1.
然后我们需要继续把y也给变成上一层的y。
也就是 x2 - a/b y2.
所以就有了 y=z-a/b*y
此时开始,y就代表着上一层的y1.
还有另一种简化版本:(大家看喜欢哪个版本直接用就好了)
void exgcd(int a, int b, int& x, int& y) {if (!b) {x = 1, y = 0;return;}exgcd(b, a % b, y, x);y = y - a / b * x; }
这个模板就是拓展欧几里德的内容。
但是!!!!!
还不够,为什么?
有些时候,一些题目求出来的解虽然没明说,但是暗戳戳地暗示了要最小正整数。
而我们扩展欧几里得求出来的数可能是负数。
所以,我们需要直到通项公式,这样就可以求出最小正整数了。
求通项公式的方法很简单,下面不给出证明地告诉你怎么求:
(懒得给证明,因为好长)
1、首先求出 ax+by=0的一组最小的非零解(不是最小正整数解!!是x,y的绝对值最小)。
2、由于a,b是确定的,这个方程转化为:|ax| =|by|
当x的绝对值变大的时候,显然y的绝对值也会变大。
显然|by|一定是a的倍数,而且a是已知的,所以要让|x|变得最小,也就是|ax|变得最小,
也就是|by|变得最小
我们想到:一个数(如by) 即是a的倍数,又是b的倍数,它的绝对值能变得多小?
对啦!那就是最小公倍数喵~
所以当|ax|=|by|=lcm(a,b)的时候,我们可以求出最小非零解。
x = lcm(a,b)/ a
又因为lcm(a,b) = ab / gcd(a,b)
所以x= b/gcd(a,b)
也就是:另一个系数除以它们的最大公约数。
所以:
通项公式就是: x= x1 + k*(b/gcd(a,b)) (x1,是我们拓展欧几里得求出来的解)
(k是任意整数)
y=y1+k*(a/gcd(a,b))
拓展欧几里得算法有啥用?喵喵喵!
求解不定方程。
在我们后面会学到逆元的内容。我们就需要把逆元式子也转化乘不定方程的形式,
然后用拓展欧几里得算法,求出任意一个正整数解辣!!!
例题讲解!!!喵喵喵!
《洛谷深入浅出进阶篇》 欧几里得算法,裴蜀定理,拓展欧几里得算法————洛谷P1516 青蛙的约会-CSDN博客https://blog.csdn.net/louisdlee/article/details/134751119?spm=1001.2014.3001.5502
二、乘法逆元喵喵喵!喵喵喵!喵喵喵!
- 啥是乘法逆元捏?
- 乘法逆元有啥用捏?
- 我们有什么方法来求乘法逆元捏?
- 例题讲解捏!!!
啥是模意义下的乘法逆元?喵喵喵!
乘法逆元用一个式子就可以搞得定辣!
例如:
其中, 的乘法逆元就是 ,也可以说的乘法逆元是
一个数的乘法逆元乘以这个数本身得到1.
而其他数乘以这个数,等于除以这个数的逆元。
或者说,除以这个数,等于乘上这个数的逆元。
我们把它拓展到模运算中:
a乘以它的逆元,模上模数得到1.
其中x是a的逆元,或者也可以说a是x的逆元。
还是一样的性质,
一个数在模运算下除以a,等于乘上a的逆元取模。
所以,有了逆元之后,我们就可以处理带除法的模的运算啦,喵喵喵!
但是,值得注意的是,逆元仅在a,与模数互质的情况下存在!喵喵喵!喵喵喵!
乘法逆元有啥用呢?喵喵喵!喵喵喵!喵喵喵!
有了逆元之后,我们就可以处理带除法的模的运算啦,喵喵喵!
如何求解乘法逆元呢?喵喵喵!喵喵喵!喵喵喵!
下面介绍一些工具!喵喵喵!喵喵喵!喵喵喵!
第一个:扩展欧几里得算法!!!!喵喵喵!喵喵喵!喵喵喵!喵喵喵!喵喵喵!
还是这个式子:
我们可以把它变成:
我们会惊讶惊讶惊讶惊讶惊讶惊讶惊讶惊讶地发现,这就是一组不定方程。
所以我们直接用拓展欧几里得来求解 x 就可以了
最后求出x的通项公式就行了。喵喵喵!喵喵喵!喵喵喵!
第二个捏:费马小定理
若a与p互质,那么有
变形可得:
所以a的逆元就是.
然后就可以用快速幂来求解惹。喵喵喵!喵喵喵!
(快速幂的模板不想打捏!喵喵喵!喵喵喵!喵喵喵!这么简单懒得打辣)
第三个:递推求逆元,超级重要!!!喵喵喵!喵喵喵!喵喵喵!喵喵喵!
对于任意一个数 i 和模数 p,我们有 p = i*q+r
变形:
移项:
取倒数:
可以表示成:
又因为,r=p%i ,一定比i小,所以捏,一定在 i前面被求出来了。
这样的话,我们就得到了递推式子了。
边界就是 inv(1)=1;
然后这样的话,还是有问题,为什么捏?
因为直接求出来的逆元有可能是负数,如果我们需要得到一个最小正整数的逆元,我们就可以不断加p直到大于零。
例题捏!喵喵喵~喵喵喵~喵喵喵~喵喵喵~喵喵喵~
《洛谷深入浅出进阶篇》模意义下的乘法逆元+洛谷P3811-CSDN博客https://blog.csdn.net/louisdlee/article/details/134766892?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170246734016800211562995%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170246734016800211562995&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-134766892-null-null.nonecase&utm_term=%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97&spm=1018.2226.3001.4450
三、同余方程与中国剩余定理
(本喵之前已经写过了,所以直接去链接里看吧,喵喵喵~喵喵喵~喵喵喵~喵喵喵~喵喵喵~)
《洛谷深入浅出进阶篇》同余方程+中国剩余定理——洛谷P1495-CSDN博客https://blog.csdn.net/louisdlee/article/details/134788229?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170246966516800222838792%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170246966516800222838792&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-134788229-null-null.nonecase&utm_term=%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B&spm=1018.2226.3001.4450
四、线性筛(本喵另外写了一篇,直接放上来叭)
是你流的泪晕开——欧拉筛,线性筛-CSDN博客https://blog.csdn.net/louisdlee/article/details/134227096?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170247015916800185818810%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170247015916800185818810&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-134227096-null-null.nonecase&utm_term=%E7%BA%BF%E6%80%A7%E7%AD%9B&spm=1018.2226.3001.4450
五、欧拉函数(本喵另外写了一篇,直接放上来叭,内有例题哦)
选自《洛谷深入浅出进阶篇》——欧拉函数+欧拉定理+扩展欧拉定理-CSDN博客https://blog.csdn.net/louisdlee/article/details/134858233?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170247021816800185887376%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170247021816800185887376&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-134858233-null-null.nonecase&utm_term=%E7%A7%AF%E6%80%A7%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4450