数论集合笔记

搬自原洛谷博客。

这次补的是之前的笔记。

有关质数

含有算法介绍


Chapter I 除法

大家都知道小学除法罢。除非你幼儿园大班就考CSP提高

小学除法长这样:\(n \div p =k \dots r\)

但是OI常用的带余除法,也就是欧几里得除法,长这样: \(n=p\times k+r\)

(原始有意义的情况下势必存在解)

  • 唯一性(只有一个解)

给定整数 \(n\)(被除数)和非零整数 \(p\) (除数),存在唯一的整数 \(k\) (商) 与 \(r\)(余数),其中 \(0\le r < |p|\)

其中\(k=\left\lfloor\dfrac{n}{p}\right\rfloor , r = n \mod p\)

\[\mathsf{{\color{red}\colorbox{white}{请注意}}} \]

\[\mathsf{{\color{red}\colorbox{white}{C/C++中整数类型的除法}}} \]

\[\mathsf{{\color{red}\colorbox{white}{也就是/运算符}}} \]

\[\mathsf{{\color{red}\colorbox{white}{是向0取整而非向下取整}}} \]

例如:-5/3向下取整=-2,向零取整=-1

那%是啥意思?a%b等价于a膜拜b?

c++中的%为取模运算

在c++中,%运算符的运行规则为取余

两数取余,结果符号看被除数

e.g.

5%3=2
5%-3=2
-5%3=-2
-5%-3=-2

所以在取模的时候不需要考虑除数的正负情况。但请注意防爆和题目限制

  1. 有些时候题目的玄学限制可能会导致%一个负数的答案仍然是错的

  2. 小心类型溢出

  3. 当式子里出现减法运算或各个参数/变量中有负数的时候,参考第一条,万分小心,同时注意这个参数/变量的正负是否会影响其他的因素。

  • 而对于 \(\gcd\) (手打辗转相除法)而言,由于内部含有取模运算符%,其大致情况是这样的:
int gcd(int a,int b){
	if(b==0){
		return a;
	}
	else{
		return gcd(b,a%b);
	}
}
gcd(12,-8)=4
gcd(-12,8)=-4
gcd(-12,-8)=-4
gcd(8,-12)=-4
gcd(-8,12)=4
gcd(-8,-12)=-4

你猜对了吗?真聪明!清华北大不是梦


Chapter II 整数唯一分解定理

  • 算术基本定理

任意 \(\ge 1\) 的自然数 \(n\) 都可以唯一地分解为有限个质数的乘积。

\[n = p_1^{r_1} \times p_2^{r_2} \times \dots \times p_k^{r_k} = \prod\limits_{i=1}^{k} p_i^{r_i} \]

其中 \(p_1 < p_2 < \dots < p_k\)\(r_i\) 为正整数

上述式子也被称为\(n\)的标准分解式

这个定理可以把对自然数的研究转换成对质数的研究,且不需要分类讨论——因为是唯一的。

gcd和lcm在整数唯一分解定理中的应用

\(\gcd(a,b) = p_1^{\min(r_{a_1},r_{b_1})} \times p_2^{\min(r_{a_2},r_{b_2})} \times \dots \times p_k^{\min(r_{a_k},r_{b_k})}\)

\(lcm (a,b) = p_1^{\max(r_{a_1},r_{b_1})} \times p_2^{\max(r_{a_2},r_{b_2})} \times \dots \times p_k^{\max(r_{a_k},r_{b_k})}\)

公式太大,只能开大标题了

  • 整数唯一分解定理和欧拉函数 \(\varphi\)

欧拉函数的定义详见这里的Chapter IV

  • 整数唯一分解定理和约数个数 \(d\)

\(d_n = (r_1+1)\times (r_2+1)\times \dots (r_k+1)\)

  • 整数唯一分解定理和约束和 \(\sigma\)

\(\sigma_n = (1 + p_1 + p_1^2 + \times + p_1^{r_1}) \times (1 + p_2 + p_2^2 + \times + p_2^{r_2}) \times (1 + p_n + p_n^2 + \times + p_n^{r_n})\)

分解质因数的方法

方法1

利用性质:

  • \(n\)最多只含1个大于 \(\sqrt{n}\) 的质因子

流程:

  • 试除 \(2\) ~ \(\sqrt{n}\) 内的质数

时间复杂度:\(O(\sqrt{n})\)

适用范围:

  • 时间限制非常宽松

  • 需要简单快速的代码实现

  • 像CF等的手速赛。

  • 小型数据范围

优点:

  • 简单方便

  • 空间需求低

缺点:

  • 时间需求高,多半不稳

方法2

利用性质:

  • \(\pi(n)\) ~ \(\dfrac{n}{\ln n}\)

流程:

  • 预处理 \(1\) ~ \(\sqrt{n}\) 内的质数(使用线性筛)

  • 分解时仅仅试除质数

时间复杂度: \(O(\sqrt{n})/O(\dfrac{\sqrt{n}}{\log n })\)

适用场景:

  • \(n \le 10^9\) ~ \(10^{14}\)

  • 时间限制比较紧,且算法1不稳的时候

优点:

  • 思路比较直白

  • 相对于大数据而言在时间方面提供了强有力的制裁

  • 记录质数可以直接使用线性筛里用来记录质数的数组

  • 大型数据范围

缺点:

  • 极限数据下非常不稳

  • 数据中小的情况下不能发挥时间上的制裁优势

关于线性筛法:

时间复杂度分析在这里的Chapter V

代码在这里的Chapter I

线性筛思路:

  • 每个合数被他的最小质因数筛去。

  • 如果一个数内部含有两个相同的质因数就可以滚蛋下一个了。

  • 第二条在代码里的实现即为i % p[j] == 0,也就是( i * p[j] ) % ( p[j] * p[j] ) == 0

方法3

利用性质:

  • 整数唯一分解定理

流程:

  • 线性筛的时候记录每个数最小的质因数

  • 分解时直接除掉最小质因数

时间复杂度:\(O(n)/O(\log n)\)

适用场景:

  • \(n \le 10^6\) ~ \(10^7\)

  • 分解次数较多,时间限制紧,极限数据下、算法2不稳的时候。

优点:

  • 耐分解,次数多不怕

  • 比较稳定

  • 思路比较直白(分解质因数的方法都™直白)

  • 中型数据范围

缺点:

  • 需要多开一个 minprime 数组来记录每个数的最小质因数

方法4

Phollard-Rho算法

  • 基于玄学随机化的质因数分解算法。

  • 一场胜率很大的赌博——很大的概率分解对。

  • 期望时间复杂度: \(O(n^\frac{1}{4})\)

  • 适用场景:\(n \le 10^{18}\)

同样随机化的素数检测算法是Miller-Rabin

  • 当判定16个质数时,只有\(\dfrac{1}{4\times 10^6}\)的概率判错

找约数

问题:如何高效地找到 \(n\) 的所有约数

\(\displaystyle d | n \Rightarrow \frac{n}{d} | n\)

方法1

利用性质:

流程:

  • 试除 \(1\) ~ \(\sqrt n\) 内的整数

时间复杂度: \(O(\sqrt n)\)

适用场景:

  • 其他方法写不了了

  • 空间卡的逆天

  • 题目的时间限制特别宽松,不值得在这个题上优化(优化约等于浪费时间的情况)

  • 脑子抽抽只会暴力了

优点:

  • 省事

  • 空间更少

缺点:

  • 时间功耗大

  • 同分解质因数方法1,特别不稳定

方法2

利用性质:

  • \(\sum\limits_{i=1}^{n} d_n = \sum\limits_{i=1}^{n}\) ~ \(n\ln n\)

流程:

  • 预处理 \(1\) ~ \(n\) 的每个约数

时间/空间复杂度:\(O(n\log n)\)

适用场景:

  • 多组询问

优点:

  • 预处理,多组询问不用怕

  • \(1\) ~ \(n\) 批量处理

缺点:

  • 如果询问少,数据范围又大,则在绝大部分情况下是不划算的,除非这道题的条件玄学地卡得你只能用这种方法找约数。

方法3

利用性质:

  • \(n = p_1^{r_1} p_2^{r_2}\dots p_n^{r_n}\)整数唯一分解定理

  • \(d | n \Rightarrow d = p_1^{a_1} p_2{a_2} \dots p_k^{a_k} (0 \le a_i \le r_i)\)

流程:

  • 分解质因数

  • dfs或者循环枚举指数

  • 时间复杂度 \(O(???) + O(d_n)\)

适用范围:

  • 较广泛

优点:

  • 运用了整数唯一分解定理,高级,可以同时套一些其他的东西

缺点:

  • 复杂度是个玄学问题

  • 如果其他的东西不用分解质因数,除非像方法2说的那样给玄学卡死了,用这个方法似乎血亏

找约数

一些算法的复杂度与 \(d_n\) 相关,分析复杂度的时候需要分析:

\(\max\limits_{x=1}^{n} d_x\)

上述式子取得最大值的最小 \(x\) 被称为反素数


Chapter III 线性筛总结

通过线性筛预处理数论函数,需要处理两个基本问题

  • 计算在质数处的取值 \(f_p\)

  • \(f_i\) 递推得到 \(f_{i\times p}\)

能正确求出数论函数的条件:每种不同的质因子贡献独立

复杂度线性的条件:添加一个质因子时,函数值能够快速递推

  • 质数处取值 \(f_p\) 要求 \(O(\log n)\) 内求出(素数定理)

  • \(f_i\) 递推得到 \(f_{i\times p}\) 的复杂度必须为 \(O(1)\)


有关同余和欧拉函数

前言

  • 集训笔只因

Chapter I 同余

设 $ a = pm + r , b = qm + r $ ,则 $ a $ 同余于 $ b $ ,记作 \(a \equiv b \pmod{m}\)

同余定理:

若 $ a \equiv b $ ,则

  • $ a \pm k \equiv b \pm k \pmod{m} $ 范围:$ k \in N$

  • $ a k \equiv b k \pmod{m} $ 范围:$ k \in N^+$

  • $ a^k \equiv b^k \pmod{m} $ 范围:$ k \in N^+$

  • $ \displaystyle \frac{a}{k} \equiv \displaystyle \frac{b}{k} \pmod{m}$ 范围:$ k \in N^+ $ 且 $ m \(为质数,\) k $的乘法逆元存在时

  • 同余的性质

  • 自反性,对称性,传递性

满足自反性,对称性,传递性,三种性质的关系,为等价关系

根据等价关系,可以把目标集合划分为若干个等价类

剩余类和剩余系

  • 对于模数 \(m\) ,利用同余关系(即 \(n=mk+r\) 中的余数 \(r\) ) 可以把整数集合 Z 划分为 \(m\) 个等价类,称作模 \(m\) 的剩余类,记作

\[[0],[1],\dots [m-1] \]

每类各取一个代表元构成的集合称为模 \(m\) 的剩余系,一般取

\[Z_m = {0,1,\dots,m-1} \]

简化剩余系

对模数 \(m\) ,在剩余类 \(Z_m\) 中取出与 \(m\) 互质的数构成的集合,称为模 \(m\) 的简化(既约)剩余系,记作 \(Z_m^*\)

显然 \(Z_m^*| = \varphi_m\),因此 \(Z_m^*\) 有时也叫做 \(\phi_m\)

这里有一个玄学的表达方式:\(\{x |\equiv k\pmod{m},k \in \{1,2,\dots,m-1\}\& (k,m)=1\}\),意思是当 \(k \in \{1,2,\dots,m-1\}\)\((k,m)=1\) 时,有 \(x |\equiv k\pmod{m}\)

  • 再探欧拉函数

定义:$\varphi_n $ 为 \(\le n\) 且与 \(n\) 互质的正整数的个数

有必要写出式子了:

\[\varphi_n = n\times (1-\dfrac{1}{p_1}) \times (1-\dfrac{1}{p_2}) \times \dots \times (1-\dfrac{1}{p_k}) \]

欧拉函数的重要玄学性质:

  • 欧拉函数是个积性函数:\(\varphi_n = \prod\limits_{i=1}^{k}\varphi(p_i^{r_i})\)

  • 其中 \(\varphi_{p^k} = p^k - p^{k-1}\)

  • 其他性质还有:

  • \(\varphi_n(n>2)\) 的所有元素之和为 \(\dfrac{n\varphi_n}{2}\)

  • \(n = \sum\limits_{d|n} \varphi_d\)

人类智慧思考题:运用欧拉函数,证明质数有无穷个

Chapter II 模运算

OI中常用的模运算,将运算对象集从整数集(\(Z\))缩减到了模 \(m\) 的剩余系 \(Z_m = {0,1,\dots,m-1}\)

  • 将无限转变为有限

  • 方便存储,运算,输出,验证

  • 通过循环彰显人类智慧

经典防负数化模运算:

(这里使用了 \% 而非 \mod {} 是为了避免式子又臭又长)

  • 加法:

\((a+b)\% m =(a \% m + b \% m) \% m\)

  • 减法:

\((a-b)\%m = (a \% m - b \% m + m ) \% m\)

  • 乘法:

\(a\times b \% m = (a \% m) \times (b \% m) \% m\)

加减法的取模非常的慢,尽量少在加减中用%运算。虽然优化比较简单,但是在该用的时候也不可避免。

  • 小震不用逃,大震逃不了

所以对于上述相对于乘法而言,可以看淡点(但是还是要重视)。

——而乘法则可能会溢出。\((a \% m) \times (b \% m)\) 也可能会爆掉存储范围。

  • 需要一些方法使得在运算乘法的时候不溢出

方法1

快速幂打临时工:仍然快速龟速乘法

利用性质:

  • 快速幂模板改造

流程:

  • 快速幂模板改造

时间复杂度:\(0(\log n)\)

适用范围:

  • 用一些玄学乘法也不行的时候

  • 急需数据稳定性

优点:

  • 时、空、数据稳定性极强

  • 真正意义上的万能模乘

缺点:

  • 慢就是慢,时间稳在非常慢的地步。

  • 容易敲错模板(ans的初始值为0不是1)

方法2

神秘乘法:

利用性质:

  • 一个没有学过的高级知识点——MSK

流程:

int mulmod(int x,int y,int m){
	static const int BLEN=20,BMSK=(1<<20)-1;
	int yH=y>>BLEN,yL=y&BMSK;
	int ret=yH?((x*yH%m)<<BLEN)%m:0;
	return (ret+x*yL)%m;
}
  • 其中的int可以换成各个类型的变量。

适用范围:

  • \(m \le {LONG\_MAX^{\frac{2}{3}}}\)

时间复杂度:\(O(1)\)

优点:

  • 复杂度感人(是真的感人!)

缺点:

  • \(m > {LONG\_MAX^{\frac{2}{3}}}\) 时仍然寄掉(虽然龟速乘也会逝世

方法3

玄学乘法

利用性质:

  • \(LONG_{MAX} = 9223372036854775807\)

  • \(LONG_{MIN} = -9223372036854775808\)

流程:

#define LL long long 
LL mulmod(LL x,LL y,LL p){
	LL ret=x*y-(LL)((long double) x*y/m + 1e-8)*m;
	return ret<0?ret+m:retl
}
  • 把数据压入long double中

  • 然后玄学算

  • 会溢出,但是溢出只会兜几圈,然后溢出之后的数据刚好等于正确答案

  • 只能是long long类型!!!否则溢出的时候就逝世不好说了

适用范围:

  • \(n \le 10^{18},LONG_{MAX}\) 范围内

时间复杂度:同样是真正感人的 \(O(1)\)

优点:

  • 适用范围广,不怕数据大,玄学溢出会给出答案

缺点:

  • 只能使用 long long 变量类型

方法4

__int128

优点:

  • 同样无脑

  • 时间复杂度居然也是\(O(1)\)

缺点:

  • 手写快读快输才能输入输出

  • 两个long long的内存,当#define int __int128的时候需要注意MLE事故

  • 常数有可能免费

乘法讲完了,那么除法呢?

\(b|a\) 时,如何计算 \(\dfrac{a}{b}\mod m\)

\((a\% m)\div (b\% m) \% m\) 肯定是错的(万一不满足消去律的话直接GG)

方法1

人类智慧公式:

\[\dfrac{a}{b}\mod p = \dfrac{a\mod (b\times p)}{b}\mod p \]

啊哈哈哈哈,证明略咯!

适用范围:\(b,m\) 互质与否都行

方法2

在下面:乘法逆元


Chapter III 乘法逆元

如果存在 \(a^{-1}\) 满足 \(a\times a^{-1} \equiv 1\pmod m\),则称 \(a^{-1}\)\(a\)\(m\) 意义下的逆元

有了逆元便能转除法为乘法。

\(\dfrac{a}{b}\mod m = (a\times b^{-1}) \mod m\)

乘法逆元存在条件:\((a,m)=1\)

乘法逆元的常用求法:

费马-欧拉定理

(又称欧拉定理)

  • 众所周知,费马小定理为

\(a^{p-1}\equiv 1\pmod m\)

  • 用决心提取机提取费马的灵魂,再让欧拉吸收这个灵魂,让他再次发现费马小定理,得到

\[{\mathsf{\color{black}\colorbox{white}{如果正整数 a,m 互质,则}}} \]

\[a^{\varphi_m}\equiv 1\pmod m \]

由这个定理可以得到

  • \(a^{-1} = a^{p-2}\)(求逆元方法1的原理)或者 \(a^{-1} = a^{\varphi_m-1}\)

证明费马欧拉定理略。

费马小定理的另外一种形式:\(a^p\equiv a\pmod{p}\)

  • 优势是不需要 \(a,p\) 互质,只需要 \(p\) 为质数即可。

Chapter IV 幂塔

\(b\ge \varphi_m\)

\(a^b \equiv a^{b\mod \varphi_m + \varphi_m}\mod m\)

  • 一个更加lip的定理

如果我们设

\(\varphi_{\varphi_{\dots_{\varphi_n}}}\)

(套 \(n\)\(\varphi\)恶俗玄学欧拉函数)

\({\varphi^k}_p\) ,则 \({\varphi^k}_p\)

\(\begin{cases}\varphi_{{\varphi^{k-1}}_p}&k>1\\\varphi_p&k=1\end{cases}\)

则当 \(k\ge 2\log_2 p\) 时,\({\varphi^k}_p = 1\)


有关方程

我又来写博客了哈哈嗨


Chapter I 方程

方程的基本定义:含有未知数的等式

发展路线:

1

  • 二元一次方程组 -> 多元一次方程组

  • 一元二次方程 -> 一元高次方程

  • 多项式方程 -> 超越方程

  • 方程的形式越来越复杂

2

特定空间下求解

  • e.g.一元二次方程

  • 实数域 \(R\) 内求解 -> 判别式

  • 复数域 \(C\) 内求解 -> 必有2根 \(x1,x2\)

不定方程:

在数论背景下,方程的解空间限制一般在整数集 \(Z\) 或者 有理数集 \(Q\)

这种方程称为丢番图方程。

这种方程大多数时候解不唯一,故又称不定方程。


Chapter II 二元一次不定方程

定义:

\(a,b,c\) 为非零整数,求关于 \(x,y\) 方程的整数解 \(ax+by=c\)

容易发现,方程左边 \(ax+by\) 必定为 \(d = \gcd(a,b)\) 的倍数。

因此立即得到该方程有整数解的一个必要条件是 \(d | c\)

而充分条件需要使用

\[{\color{black}\colorbox{white}{裴蜀定理}} \]

\[{\color{black}\colorbox{white}{关于 $x,y$ 的不定方程 $ax+by = \gcd(a,b)$ 必有正整数解}} \]

如果裴蜀定理成立,则必要条件 \(d | c\) 立即升级为充分必要条件

设有 \(ax_0 + by_0 = \gcd(a,b) = d\),则

\(\begin{cases}x = \dfrac{c}{d} \times x_0 \\ \\ y = \dfrac{c}{d} \times y_0\end{cases}\)

\(ax + by = c\) 的一组解


Chapter III 扩展欧几里得算法 exgcd

相当于给了裴蜀定理一个构造性的证明

利用辗转相除法过程中得到的等式 \(r_{k-2} = r_{k-1} q_{k-1} + r_k\)

不断地将较小的 \(r_k\) 表示为 \(r_{k-1}\)\(r_{k-2}\) 的线性组合

设原有 \(d = r_{k-1}x + r_k y\)

带入 \(r_{k-2} = r_{k-1} q{k-1} + r_k\)\(d = r_{k-1}x + (r_{k-2} - r_{k-1} q_{k-1})y\)

整理得递推式 \(\begin{cases}x' = y \\ y' = x - q_{k-1} y\end{cases}\)

代码在这里的Chapter III

用这份代码实现exgcd具有以下特点

  • 求解过程中 \(|x| \le |b| , |y| \le |a|\),因此不会溢出,大喜

  • \(|a| \ge |b|\),则求出的 \(x\) 满足 绝对值最小,即最小范数解

然后有了exgcd,就可以通过裴蜀定理求 \(ax+by=c\) 的全部解

  • exgcd求 \(ax+by=d\) 的一组解 \(x_0,y_0\)

  • 同时乘以 \(\dfrac{c}{d}\) 得到 \(ax+by=c\) 的一组解 \(x_1,y_1\)

  • 得到全部解为 \(x = x_1 + \dfrac{b}{d} \times k , y = y_1 - \dfrac{a}{d} \times k\)


Chapter IV 一些方程

  • 多元一次不定方程

\(a_1 x_1 + a_2 x_2 + \dots + a_n x_n = b\)

先解决

\(a_1 x_1 + a_2 x_2 = \gcd(a_1,a_2) = g_2\)

所有的 \(g_2\) 的倍数都可以用 \(a_1 x_1 + a_2 x_2\) 表示,反之亦然。

原方程化为 \(g_2 t_2 + a_3 x_3 + \dots a_n x_n = b\)

继续这样,每次将两个式子合并为一个式子,最后得到 \(g_n t_n = b\)

然后解出 \(t_n\) 后再递归回去即可解出全部解。

代码:

#include<bits/stdc++.h>
using namespace std;

long long a[10];
long long n,b;
long long exgcd(long long a,long long b,long long &x,long long &y){
	long long d=a;
	if(b==0){
		x=1;
		y=0;
		return a;
	}else{
		d=exgcd(b,a%b,y,x);
		y-=a/b*x;
	}
	return d;
}
long long gcd(long long a,long long b){
	return b==0?a:gcd(b,a%b);
}
stack<long long>s;
void getjie(long long a,long long b,long long c,long long &x,long long &y){
	long long d=exgcd(a,b,x,y);
	x=x*(c/d);
	y=y*(c/d);
	long long k;
	if(x>0){
		k=min((x/b),-(y/a));
		x-=k*b,y+=k*a;
	}
	else{
		k=min(-(x/b),(y/a));
		x+=k*b,y-=k*a;
	}
}
long long g[10];
long long t[10];
int main(){
	scanf("%lld%lld",&n,&b);
	for(long long i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	long long x,y;
	long long last=0;
	for(long long i=1;i<=n;i++){
		if(i==1){
			g[i]=a[i];
		}else{
			g[i]=gcd(g[i-1],a[i]);
		}
	}
	long long xxx;
	for(long long i=n;i>=2;i--){
		if(i==n){
			getjie(g[i-1],a[i],b,x,y);
			s.push(y);
		}else if(i==2){
			xxx=x;
			getjie(g[i-1],a[i],g[i]*xxx,x,y);
			s.push(y);
			s.push(x);
		}else{
			xxx=x;
			getjie(g[i-1],a[i],g[i]*xxx,x,y);
			s.push(y);
		}
	}
	while(!s.empty()){
		printf("%d ",s.top());
		s.pop();
	}

return 0;
}

\({\color{red}\colorbox{white}{警告:上述代码只能求得该不定方程的任意一个解}}\)

\({\color{red}\colorbox{white}{输入方式为如下}}\)

n b
a1 a2 a3 … an

因此,该方程有整数解的充分必要条件为

\(\gcd(a_1,a_2,\dots,a_n) | b\)

  • 多元不定方程组

高斯消元,暂不讨论。

  • 线性同余方程

含有未知数的同余式,且同余式中未知数次数为1,例如 \(ax\equiv b \pmod m\)

注意到同余式的其他等价写法,该同余方程与不定方程 \(ax - my = b\) 等价

因此可以用exgcd求解得 \(x = x_0 + m'k\)

通常也习惯将解也写为同余式 \(x \equiv x_0 \pmod {m'}\)

  • 利用exgcd求逆元

解同余方程 \(ax \equiv 1 \pmod m\) 即可得到 \(a\mod m\) 的乘法逆元。

相比于费马小定理+矩阵快速幂的方法,优势是不要求 \(m\) 是质数

int getinv(int a,int m){
	int x,y;
	int d=exgcd(a,m,x,y);
	if(d!=1)//不互质 
		return -1;//当场逝世
	else
		return (x%m+m)%m;//求解得到的x,mod一下 
}
  • 多元线性同余方程

\(a_1 x_1 + a_2 x_2 \dots + a_x x_n \equiv 1 \pmod m\)

解法和多元一次不定方程差不多。

  • 线性同余方程组

求解 \(\begin{cases}x \equiv 2 \pmod 3 \\ x \equiv 3 \pmod 5 \\ x \equiv 2 \pmod 7\end{cases}\)

答案: \(x = 2 \times 70 + 3 \times 21 + 2 \times 15 = 233 \times 23 \pmod 105\)

70为5和7的倍数且%3同余1
21为3和7的倍数且%5同余1
15为3和5的倍数且%7同余1

因此易验得 \(2\times 70 + 3\times 21 + 2\times 15\) 同时满足三个同余式。

下面则是这个问题的结论:


Chapter IV 中国剩余定理

  • China Recude Chinese Remainder Theorem,简称CRT

\(m_1,m_2,\dots ,m_n\) 两两互质,则关于 \(x\) 的线性同余方程组 \(\begin{cases}x\equiv b_1 \pmod {m_1} \\ x\equiv b_2 \pmod {m_2} \\ \dots\dots\dots\dots \\ x \equiv b_n \pmod {m_n}\end{cases}\) 对于任意正整数序列 \(b_1,b_2,\dots,b_n\) 均有正整数解且解集为 \(x\equiv x_0 \pmod {m_1,m_2,\dots ,m_n}\)

记作 $m = \prod\limits_{i=1}^{n} m_i $ , 且 $ M_i = \dfrac{m}{m_i}$

  1. \(u_i\times M_i \equiv 1 \pmod m_i\) 得到关键参数 \(e_i = u_i \times M_i\)

  2. 计算出解为 \(x\ \equiv e_1 b_1 + e_2 b_2 + \dots + e_n b_n \pmod m\)

中国剩余定理的本质\(\begin{cases}x \equiv 23 \pmod 3 \\ x \equiv 23 \pmod 5 \\ x \equiv 23 \pmod 7\end{cases} \Leftrightarrow x \equiv 23 \pmod {105}\)

既可以正向应用解方程,也可以逆向应用分解问题。也就是说,中国剩余定理存在逆定理

中国剩余定理及其构造性的解法要求模数两两互质

不互质时,可以逆用中国剩余定理,将其拆分为多个模 \(p^s\) 的方程,对于相同的 \(p\) 可以都合并为同一个方程,或者矛盾导致无解

e.g.

\(\begin{cases}x \equiv 7 \pmod {12} \\ x \equiv 1 \pmod {10} \end{cases} \Leftrightarrow\begin{cases}x \equiv 1 \pmod 3 \\ x \equiv 3 \pmod 4 \\ x \equiv 1 \pmod 2 \\ x \equiv 1 \pmod 5\end{cases} \Leftrightarrow \begin{cases}x \equiv 1 \pmod 3 \\ x \equiv 3 \pmod 4 \\ x \equiv 1 \pmod 5\end{cases}\)

这个方法实在太麻烦了,所以我们让CRT学习gcd同志,让他稍微ex一下,变成

exCRT 拓展/扩展中国剩余定理

将同余式 \(\begin{cases}x \equiv b_1 \pmod {m_1} \\ x \equiv b_2 \pmod {m_2}\end{cases}\) 改写成等式 \(\begin{cases}x = b_1 + m_1 k_1 \\ x = b_2 + m_2 k_2\end{cases}\),则 \(m_1 k_1 - m_2 k_2 = b_2 - b_1\)

\(m_1 k_1 - m_2 k_2 = b_2 - b_1\)

是关于 \(k_1\)\(k_2\) 的不定方程,有解的充要条件是 \(\gcd(m1,m2) \quad\!\!\! | \quad\!\!\!(b2-b1)\)

解除 \(k_1 = k_1' + \dfrac{m_2}{\gcd(m_1,m_2)}\times t\) 后代入得

\(x = b_1 + m_1 k_1 = b_1 + m_1 k_1' + \dfrac{m_1 m_2}{\gcd(m_1,m_2)}\times t\)

注意到 \(\dfrac{m_1 m_2}{\gcd(m_1,m_2)}\)\([m_1,m_2]\),也就是 \(lcm(m_1,m_2)\)

再次将解改为同余式

\(x \equiv b_1 + m_1 k_1' \pmod{[m_1,m_2]}\)

这样,我们做一次exgcd就可以把两个同余方程合并为一个

此外,拓展中国剩余定理分三种数据范围

  • \([m_1,m_2,m_3 \dots m_n] \le 10^{18}\)

  • 保证有解,且解不超过 \(10^{18}\)

  • 不保证有解,但有解的时候解不超过 \(10^{18}\)

Chapter V 高次方程

各种方程。

高次同余方程

\(x^n \equiv a \pmod m\)

如果 \(m\) 存在原根,设\(x = g^{x'},a=g^{a'}\) 则问题转换为 \(g^{x'n} \equiv g^{a'} \pmod m\)

也就是 \(x'n \equiv a\ \pmod {\varphi_m}\)

上述方程有解的条件显然为 \(\gcd(n, \varphi_m) | a'\)

且有解时解的数量为 \(\gcd(n,\varphi_m)\)

如果 \(x^n \equiv a \pmod m\) 中,\(m\) 不存在原根,设 \(m = p_1^{r_1} \times p_2^{r_2} \times \dots \times p_n^{r_n}\) ,用中国剩余定理拆分为 \(n\) 个方程,除了 \(2^s\) 外都有原根,则可以按照上述方法求解。

而$ \mod 2^s$ 也有专门的求解方法。这里不再深究。

高次不定方程

<= 这几把就是个没通用解法的东西 =>

不再深究。

Chapter VI 方程的应用

应用

勾股数

不定方程 \(x^2 + y^2 = z^2\) 的一组整数解,\(x,y,z\) 成为一组勾股数。

\(\gcd(x,y,z) = 1\) 时,\(x,y,z\) 称作本原勾股数\(x^2 + y^2 = z^2\)本原解

所有本原解可以唯一表示为 \(\begin{cases}x = m^2 - n^2 \\ y = 2mn \\ z = m^2+n^2 \end{cases}\) 其中 \(m>n\)\(m,n\) 互质,还必定一奇一偶

二平方和问题

解不定方程 \(x^2 + y^2 = C\)

\(C = 4\times k + 1 (k \in N^*)\) 且为质数时,该方程有唯一解(不考虑顺序与正负)

四平方和问题

解不定方程 \(a^2 + b^2 + c^2 + d^2 = n (n > 0)\)

这个东西看似结果应该很复杂,实际上很简洁:必定有正整数解

任意正整数可以分解为4个整数的平方之和

高斯整数和高斯质数

涉及虚数,不再深究

费马大定理

注意是定理不是小定理

关于 \(x,y,z\) 的不定方程 \(x^n + y^n = z^n (n\ge 3)\) 无解

各位可以去尝试感性证明一下,提示:勾股定理

至于理性证明,各位可以长逝。


关于组合

\[组合数 \]

\[基础数论中最智慧(最恶俗)的东西 \]

\[66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 \]

近期学习了什么?

  • 组合数

    • 基本排列数
    • 基本组合数
    • Lucas & Ex! Lucas
    • 万恶的组合恒等式
    • 可重集排列
    • 可重集组合
    • 圆排列
    • 错位排列
  • 抽屉原理

  • Ramsey(拉姆齐)数

以下是肝货

排列组合数基本定义

\(\displaystyle A_n^m = \frac{n!}{(n-m)!}\)

\(\displaystyle C_n^m = \frac{n!}{(n-m)!\,m!}\)

基本性质

\(C_n^0 = C_n^n = 1\)

\(C_n^m = C_n^{n-m}\)

杨辉三角

\(C_n^m = C_{n-1}^{m-1} + C_{n-1}^{m}\) (杨辉三角递推式,也是组合数的一个基本性质)

    1
  1 2 1
 1 3 3 1
1 4 6 4 1
   ………

二项式定理 \((a+b)^n = \displaystyle \sum\limits_{k=0}^{n}C_n^k a^k b^{n-k}\)

单行之和公式:\(\displaystyle \sum\limits_{k=0}^{n}C_n^k = 2^n\)

拓展:\(\displaystyle \sum\limits_{k=0}^{n}m^k C_n^k = (m+1)^n\)

容斥原理的另外一种形式:\(\displaystyle \sum\limits_{k=0}^{n}(-1)^k C_n^k = 0\)

杨辉三角奇数项之和等于偶数项之和: $ C_n0+C_n2+\dots = C_n1+C_n3+\dots = 2^{n-1}$

组合恒等式

\(\displaystyle \sum\limits_{k=0}^{n}k C_n^k = n 2^{n-1}\)

\(\displaystyle \sum\limits_{k=0}^{n}k^2 C_n^k = n(n+1)2^{n-2}\)

\(\displaystyle \sum\limits_{k=0}^{n} C_k^m = C_{n+1}^{m+1}\)

\(\displaystyle \sum\limits_{k=0}^{n} C_n^k C_m^{r-k} = C_{n+m}^{r}\)

\(C_n^k C_k^r = C_n^r C_{n-r}^{k-r}\)

可重集排列

可重集中有 \(m\) 类物品,数量无限,每样物品至少选一件,从中选出 \(n\) 件物品,有多少种方案?

  • 隔板法,问题等价于:

  • \(n\) 个物品排成一列,在 \(n-1\) 个空位中插入 \(m-1\) 个挡板,(即分为了 \(m\) 类)。方案数为:

\(C_{n-1}^{m-1}\)

可重集中有 \(m\) 类物品,数量无限,每样物品允许不选择,从中选出 \(n\) 件物品,有多少种方案?

  • 先给每个物品预分配一件

  • 问题转换为“选出 \(n+m\) 个物品”,方案数为:

\(C_{n+m-1}^{m-1}\)\(C_{n+m-1}^{n}\)

可重集中有 \(m\) 类物品,每类数量为 \(a_i\) ,从中选出 \(n\) 件物品,有多少种方案?

  • 考虑第\(i\)类物品超过限制的方案,此时其他物品不受限制,即当成无限来看。

  • 一件物品都违规了,还分开算其他物品是否超限干嘛?

  • 此时至少要先分配 \(a_i+1\) 件,剩余部分亦可当成无限看待,即问题转化为 \(n-a_i-1\)时的无约束问题。

可重集中有 \(m\) 类物品,每类数量为 \(a_i\) ,从中选出 \(n\) 件物品,求全排列数量。

  • 除法原理直接得到

\(\displaystyle \frac{n!}{\prod_{i=1}^{m}a_i!}\)

也可以通过组合数达到:

\(C_n^{a_1} C_{n-a_1}^{a_2}\dots C_{n-a_1-a_2-\dots a_{m-1}}^{a_m}\)

圆排列:

\(n\) 个物品排成一个环,在考虑循环同构的情况下有多少种方案

\((n-1)!\)

错位排列

\(n\) 个元素构成的序列中,第 \(i\) 号元素不在第 \(i\) 个位置的方案数。

容斥原理枚举恰好在自己的位置的元素数量 \(k\)

\(\displaystyle D_n = \sum\limits_{k=0}^n (-1)^k C_n^k (n-k)! = n!\sum\limits_{k=0}^n \frac{(-1)^k}{k!}\)

二阶递推式:

\(D_n = (n-1)(D_{n-1}+D_{n-2})\)

\(D_{n-2}\) 为放位置 \(n\)

\(D_{n-1}\) 为不放位置 \(n\)

一阶递推式:

\(D_n = n D_{n-1}+(-1)^n\)

抽屉原理

\(n+1\) 个苹果放入 \(n\) 个抽屉,至少有 \(1\) 个抽屉内放有不少于 \(2\) 个苹果

  • 但凡之前学过数学,狗都会记得这个东西

  • 这里不讲了

Ramsey 数

6个点的完全图:用两种颜色染边后,一定存在纯色三角形。

人话:6个人里一定有3个人互相认识或者互相不认识。

  • Ramsey数:

至少多少人可以保证其中一定存在\(n\)个人互相认识或存在\(m\)个人互相不认识,记作\(R(n,m)\)

e.g. \(R(3,3) = 6\)

  • Ramsey数非常难算!!!

  • 算出Ramsey(12+,12+),北大疯人院院长资深数学教授都佩服你

Lucas定理

之前写过,在这里


有关矩阵

这篇博文主要研究什么捏?

  • 向量 作者一已经弃坑该子栏目

  • 矩阵 (要细谈)


Chapter Former 代数框架

先阐明线性代数的范围:

算术:

\(\displaystyle 1+2\quad 1-2\quad 1\times 2\quad 1\div 2\quad 1^2\quad \frac{1}{2}\)

代数:

\(\displaystyle a+b\quad a-b\quad a\times b\quad a\div b\quad a^b\quad \frac{a}{b}(b\neq0)\)

总而言之就是这里讲述的第一部分

  • 线性代数:多元一次方程组 今日研究

  • 多项式代数:一元高次方程组


Chapter I 向量

tmd不写了。


Chapter II 矩阵

  • \(n\)\(m\) 列构成的数字表。

一般用大写字母表示矩阵,记 \(A \in R^{n\times m}\)

例如,\(A \in R^{n\times m}\) 是一个 \(2 \times 2\) 的实矩阵

则有可能 \(A=\begin{pmatrix}1\quad1\\1\quad1\end{pmatrix}\)

矩阵允许有重复的元素。

\(A=\begin{pmatrix}a_{11}\dots a_{1m}\\\vdots \;\;\;\ddots\;\;\;\ \vdots \\a_{n1}\dots a _{nm}\end{pmatrix}\)

对于 \(A=\begin{pmatrix}1\quad1\\1\quad1\end{pmatrix}\),第 \(i\)\(j\) 列的元素可以记作 \(a_{ij}\)\(A_{ij}\)

  • 矩阵加减法

相同行列的矩阵才能加减。

运算法则很简单:对应位置的元素相加减。

e.g.

\(\begin{pmatrix}1\quad1\\4\quad5\end{pmatrix} + \begin{pmatrix}1\quad9\\1\quad8\end{pmatrix} =\begin{pmatrix}2\quad10\\5\quad13\end{pmatrix}\)

  • 矩阵数乘

一个矩阵和一个数相乘。

矩阵的每个元素分别乘上这个数。

e.g.

\(\begin{pmatrix}1\quad1\\4\quad5\end{pmatrix} \times 6 = \begin{pmatrix}6\quad6\\24\quad30\end{pmatrix}\)

  • 矩阵乘法

\[{\color{red}\colorbox{maroon}{警告:前方高能,请做好心理准备}} \]

\[{\color{red}\colorbox{maroon}{Police Tell:Forward Block High Energy,please do well heart reason precise prepare}} \]

\[{\color{gold}\colorbox{orange}{乐}}{\color{seagreen}\colorbox{greenyellow}{乐}}{\color{cornflowerblue}\colorbox{cyan}{乐}} \]

\(A \in R^{n\times m} , B \in R^{m\times p}\),则 \(C = AB \in R^{n\times p}\) ,且 \(C_{ij}\sum\limits_{r=1}^{m}A_{ir}B_{rj}\)

左矩阵A的列数要等于右矩阵B的行数才能相乘。

且结果矩阵C中,第 \(i\)\(j\) 列元素的计算方式为:

取出左矩阵A中第 \(i\) 行与右矩阵B中第 \(j\) 列,对应项相乘再相加

e.g.

\(\begin{pmatrix}\;\;\ 1\quad0\quad2\\-1\quad3\quad1\end{pmatrix} \times \begin{pmatrix}3\quad1\\2\quad1\\1\quad0\end{pmatrix}=\begin{pmatrix}5\quad1\\4\quad2\end{pmatrix}\)

矩阵乘法大部分情况不满足交换律,但满足结合律与加法(乘法)分配律。

\(\mathtt{(AB)C=A(BC)}\)

\(\mathtt{(A+B)C=AC+BC}\)

\(\mathtt{C(A+B)=CA+CB}\)

  • 矩阵数除法:

同矩阵数字乘,直接乘以倒数即可。

至于除零我不管

  • 矩阵除法:

需要用到矩阵逆元,暂时不谈。

  • 矩阵转置:

互换行列。

转置矩阵:一个矩阵转置后得到的另外一个矩阵。

\(A\) 的转置矩阵为 \(A^T\)

\(\begin{pmatrix}1\quad 1\\4\quad 5\end{pmatrix}^T = \begin{pmatrix}1\quad 4\\1\quad 5\end{pmatrix}\)

根据定理不难得到一条臭名昭著的性质:

\((A+B)^T = A^T + B^T\)

而通过人类智慧想象可以想出下面这个性质:

\(A^T B^T = (AB)^T\)


特殊矩阵:

  • 零矩阵

元素全部为0的矩阵

一般就记作 \(0\)\(0^{n\times m}\)

显然有

\(A + 0 = A\)

\(A^{n\times m} \times 0^{m\times k} = 0^{n\times k}\)

  • 方阵:

行数等于列数的矩阵。

由于行数等于列数,方阵相乘无需担心行列匹配的问题。

故,多次乘一个方阵可以写成幂的形式。

(矩阵快速幂)

注意:

写代码运行矩阵快速幂时,如果使用大矩阵结构体传参,可能会莫名其妙地RE

原因:

\(\boxed{\mathsf{ Stack\;overflow\; is\; a\; part\; of\; OI.\quad Don't \;play \;if \;you're \;upset.}}\)

栈溢出是OI的一环,不爽不要玩。

  • 单位阵:

主对角线元素为1,其他元素全为0的 \(n\)方阵

单位阵记作 \(E\)\(I_n\),其中\(n\) 就是上面的那个 \(n\)

单位阵在矩阵乘法中的地位相当于1在数字乘法之中的地位。

\(A \in R^{n\times m}\) 则有\(AI_m = A\)\(I_nA = A\)

常见的矩阵快速幂的初始化写法有两类。

一类是初始化为单位阵。

另一类是直接初始化为作为底数的矩阵,然后直接少乘一次指数即可。

当然,大部分情况下lty2000狗都会选择第二种,但第一种确乎是万能的。

虽然我也不知道什么情况第二种写法会被卡掉

  • 对角阵

除了主对角线之外的元素全部为 \(0\) 的方阵。

可以记作 \(jiag(a_{11},a_{22},\dots a_{nn})\)

单位阵属于对角阵。

左乘对角阵相当于把第 \(i\) 行的元素全部乘以 \(a_{ii}\)

右乘对角阵相当于把第 \(i\) 列的元素全部乘以 \(a_{ii}\)

  • 三角阵

主对角线以下的元素全部为 \(0\) 的方阵为上三角阵。

主对角线以上的元素全部为 \(0\) 的方阵为下三角阵。

e.g.

\(\begin{pmatrix}1\quad 1\\0\quad 5\end{pmatrix}\) 为上三角阵。

\(\begin{pmatrix}1\quad 0\\4\quad 5\end{pmatrix}\) 为下三角阵。

对角阵既是上三角阵也是下三角阵。

上三角阵乘上三角阵还是上三角阵。

下三角阵乘下三角阵还是下三角阵。

  • 对称阵

满足 \(A^T = A\) 的方阵,即满足 \(a_{ij} = a_{ji}\)

\(A \in R^{n\times m}\),则\(AA^T\)\(A^TA\)都是对称阵。

posted @ 2023-06-29 17:23  几何微粒子  阅读(175)  评论(0编辑  收藏  举报