《洛谷深入浅出进阶篇》 进阶数论

本文章内容比较长,请耐心食用!!!!!

目录:

  • 模意义下的数和运算

  • 模意义下的乘法逆元

  • 同余方程与中国剩余定理

  • 线性筛与积性函数

  • 欧拉函数


一,模意义下的数和运算。

  • 啥是模?
  • 模意义下,数是之间如何运算?
  • 什么是同余?同余有哪些性质?
  • 啥是不定方程?
  • 啥是裴蜀定理?
  • 啥是欧几里得算法?
  • 裴蜀定理+欧几里得算法 = 扩展欧几里得?
  • 扩展欧几里得有啥用?
  • 例题讲解!!!

啥玩意是模?

模就是“%”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.

在后续的章节,我们会介绍,怎么处理除法运算。

什么是同余?同余有哪些性质?

同余指的就是,有两个数,这两个数模以同一个数的结果是相同的,那么这两个数之间就有

一种关系,叫同余。

表示为:a\equiv b(mod \ p)

下面介绍一些具有同余关系的数的几个重要的性质:

1、传递性a\equiv b(mod \ p) \ \, \ \ b \equiv c (mod\ p)>>>>a\equiv c (mod\ p)

2、同加性a\equiv b(mod \ p)\ >>>>>> a+m\equiv b+m (mod\ p)

3、同乘性:a\equiv b(mod \ p)\ >>>>>> am\equiv bm(mod\ p)

4、同幂性  a\equiv b(mod \ p)\ >>>>>> a^{m}\equiv b^{m} (mod\ p)

5、歪比八卜性:a\equiv b(mod \ p)\ >>>>>>p|(a-b)

啥是不定方程?

不定方程,又称为丢番图方程,通俗的说就是多个未知数的方程,求解只在整数范围内进行。

比如: 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)

ax_{1}+by_{1} = bx_{2}+(a\ mod\ b)y_{2}

又因为 a mod \ b = a -[\frac{a}{b}]b

得到:ax_{1}+by_{1} = bx_{2}+(a -[\frac{a}{b}]b)y_{2}

整理:

ax_{1}+by_{1} =ay_{2}+ b(x_{2}-[\frac{a}{b}]y_{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博客icon-default.png?t=N7T8https://blog.csdn.net/louisdlee/article/details/134751119?spm=1001.2014.3001.5502


二、乘法逆元

  • 啥是乘法逆元?
  • 乘法逆元有啥用?
  • 我们有什么方法来求乘法逆元?
  • 例题讲解!!!


啥是模意义下的乘法逆元?

乘法逆元用一个式子就可以搞得定辣!

例如:

5*\frac{1}{5}=1

其中,\frac{1}{5} 的乘法逆元就是 5 ,也可以说5的乘法逆元是 \frac{1}{5}

一个数的乘法逆元乘以这个数本身得到1. 

而其他数乘以这个数,等于除以这个数的逆元。

或者说,除以这个数,等于乘上这个数的逆元。


我们把它拓展到模运算中:

a*x\equiv 1 (mod\ p)

a乘以它的逆元,模上模数得到1.

其中x是a的逆元,或者也可以说a是x的逆元。

还是一样的性质,

一个数在模运算下除以a,等于乘上a的逆元取模。

所以,有了逆元之后,我们就可以处理带除法的模的运算啦,喵喵喵!

但是,值得注意的是,逆元仅在a,与模数互质的情况下存在!喵喵喵!喵喵喵!


 乘法逆元有啥用呢?

有了逆元之后,我们就可以处理带除法的模的运算啦,

 如何求解乘法逆元呢?

下面介绍一些工具!

第一个:扩展欧几里得算法!!!!

还是这个式子:a*x\equiv 1 (mod\ p)

我们可以把它变成:a*x + p*y =1

我们会惊讶惊讶惊讶惊讶惊讶惊讶惊讶惊讶地发现,这就是一组不定方程。

所以我们直接用拓展欧几里得来求解 x 就可以了

最后求出x的通项公式就行了。

第二个捏:费马小定理

若a与p互质,那么有 a^{p-1}\equiv 1(mod\ p)

变形可得:a*a^{p-2}\equiv 1(mod\ p)

所以a的逆元就是a^{p-2}.

然后就可以用快速幂来求解惹。

(快速幂的模板不想打捏!这么简单懒得打辣)

第三个:递推求逆元,超级重要!!!

对于任意一个数 i 和模数 p,我们有   p = i*q+r 

变形: i*q+r \equiv 0 (mod\ p)

移项:i \equiv \frac{-r}{p} (mod\ p)

取倒数:\frac{1}{i} \equiv \frac{-p}{r} (mod\ p)

可以表示成:inv(i) \equiv -inv(r)*q (mod\ p)

inv(i) \equiv -inv(r)*[\frac{p}{i}](mod\ p)

又因为,r=p%i ,一定比i小,所以捏,一定在 i前面被求出来了。

这样的话,我们就得到了递推式子了。

边界就是 inv(1)=1;

然后这样的话,还是有问题,为什么捏?

因为直接求出来的逆元有可能是负数,如果我们需要得到一个最小正整数的逆元,我们就可以不断加p直到大于零。


例题捏!

《洛谷深入浅出进阶篇》模意义下的乘法逆元+洛谷P3811-CSDN博客icon-default.png?t=N7T8https://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博客icon-default.png?t=N7T8https://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博客icon-default.png?t=N7T8https://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博客icon-default.png?t=N7T8https://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

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

louisdlee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值