数论初步
这一页教你整数在除法之下的结构:整除、最大公因数、素数分解,以及由此建立的同余运算体系。学完之后,你能手工执行欧几里得算法与扩展欧几里得算法、判断线性同余方程是否有解并求解、用中国剩余定理和费马小定理化简大数模幂,并能完整走一遍 RSA 的小例子、说清它的安全性从哪里来。
1. 整除与带余除法
定义(整除)。 设 为整数且 。若存在整数 使 ,则称 整除 ,记作 ;否则记 。当 时,称 是 的因数(约数), 是 的倍数。
整除关系有几条直接由定义可验证的性质:若 且 ,则 (传递性);若 且 ,则对任意整数 有 (线性组合封闭)。第二条是后面一切论证的发动机:要证 整除某个复杂的式子,把它凑成 的两个已知倍数的线性组合即可。
定理(带余除法)。 对任意整数 与正整数 ,存在唯一的整数 (商)与 (余数),使得
存在性由”不断减 直到落入 “给出,唯一性用反证:若 且 ,则 ,右边绝对值小于 ,只可能是 。余数 也记作 。注意计算机语言里的 % 对负数的结果可能为负,数学上总取非负余数。
2. 最大公因数、互素与欧几里得算法
定义。 不全为零的两个整数的最大公因数 是同时整除 的最大正整数;最小公倍数 是同时是 倍数的最小正整数。若 ,称 与 互素(coprime)。两者由公式
联系起来,所以实际计算只需管 gcd。两个有用的推论:(差分不变),更一般地 ——这正是欧几里得算法的依据。
算法(欧几里得)。 反复取余替换:
序列严格递减且非负,必在有限步内到达余数 ,最后一个非零余数即答案。每步把一对数换成一个严格更小的数,至多 步。
定理。 对任意正整数 ,
证明。 只需证明两边的整除集相同,即 且 当且仅当 且 。写成带余除法 ,其中 ,。
- () 若 且 ,则 是 的线性组合,故 。
- () 若 且 ,则 是 的线性组合,故 。
两边整除集完全一致,最大的正公因数自然相等。
定理(Bézout)。 对任意不全为零的整数 ,存在整数 使
且 是 所有线性组合 中最小的正整数。证明思路:考虑所有正线性组合的集合,取其最小元 ,用带余除法证明 同时整除 和 (否则余数给出更小的正线性组合,矛盾),故 ;而 整除任何线性组合,故 。两者相等。
Bézout 的逆方向同样常用:若存在 使 ,则 ——找一个等于 的线性组合,就是证明互素的最直接办法。
算法(扩展欧几里得)。 欧几里得算法的每一步都是线性方程 ,把每个余数回代成 的线性组合,递推到末态即得所求的 。
例 1. 求 ,并求 使 。
解. 辗转相除:
最后一个非零余数是 ,故 。回代:
所以 ,即 。作为副产品,把等式两边除以 得 ,说明 与 互素。
扩展欧几里得是本章最该练熟的手艺:解线性同余方程、求模逆元、实现 RSA 的密钥生成,全部以它为子程序。
3. 算术基本定理
定理(算术基本定理)。 每个大于 的整数 都可以唯一地(不计因子顺序)分解为素数的乘积:
存在性由强归纳给出: 本身是素数则已;否则 且 ,归纳假设给出 各自的分解,拼起来即得 的分解。
唯一性的核心是下面这条引理(Euclid 引理):
若素数 ,则 或 。
引理的证明用 Bézout:若 ,则 (素数的正因数只有 ),于是存在 使 ;两边乘 得 。左边两项都被 整除( 已知),故 。
有了引理,唯一性用最小反例法:设 是有两种不同素因子分解的最小正整数,。则 ,由引理反复使用, 必整除某个 ;但 是素数,只能 。两边约去 得到比 更小的两种分解——与 的最小性矛盾。
算术基本定理解释了为什么 gcd 和 lcm 都能”按素因子位”计算: 取每个素因子指数的最小值, 取最大值。唯一性是整个定理的灵魂——它保证了”素因子多重集”是整数的一个良定义的内在特征,而不只是某种计算结果。
4. 素数
定义。 大于 且正因数只有 和自身的整数叫素数;大于 的非素数叫合数。 两个都不是,是乘法结构的单位元,单独分类。
定理(素数有无穷多个,欧几里得)。 存在无穷多个素数。
证明. 反设只有有限个素数 。构造
,由算术基本定理它必有素因子。但每个 除 都余 ( 比 多 ),所以没有任何一个 整除 ——矛盾。故素数无穷多。
注意这个证明不是”把所有已知素数相乘加 必得素数”:。它说的是 的素因子一定不在已知列表里。
素数判定。 若合数 有因子 满足 ,则 是小于 的因子。所以 是合数当且仅当它有一个不超过 的素因子。判定 是否为素数,只需用不超过 的素数试除——这就是试除法, 次整除。工程上使用的 Miller–Rabin 等概率性素性测试快得多,RSA 生成密钥时用它筛大素数。
两个著名的未解决问题(只提名字与含义):
- 梅森素数:形如 ( 为素数)的素数。是发现超大素数的主要渠道,但绝大多数 是合数,是否有无穷多个梅森素数未知。
- 孪生素数猜想:相差 的素数对(如 ;)是否有无穷多对,至今未证(2013 年张益唐证明了”有无穷多对间距有限”的弱化形式)。
5. 同余
定义。 设 为正整数, 为整数。若 ,称 与 同余模 ,记作
叫模。等价地, 当且仅当 被 除的余数相同。同余是整数集上的等价关系:自反()、对称()、传递()。于是全体整数被划分成 个同余类(等价类)
每个类里的数在模 意义下完全不可区分——这就是”模 算术”的论域,常记作 或 。
运算保持。 若 且 ,则
证明都是直接凑差:,右边两项都是 的倍数。注意:没有除法保持,“约分”有额外条件(见下)。同余保持加、减、乘,意味着任何整系数多项式也保持: 蕴含 。
消去律。 若 ,能推出 吗?先看反例:(两边都是 和 ,差 ),但 ……事实上 。问题出在 。准确的说法是:
若 ,则 。特别地,当 时可放心约去 ,得 。
证明. 即 。写 ,,,则 。条件变为 ,即 ;因 ,由 Euclid 引理得 ,即 。
直观地说:模 下唯一真正能”除以 “的元素,是与 互素的 ——此时存在 (见下节),乘过去就是合法的约分。
6. 线性同余方程
方程 是本章的核心对象。“解”指的是一个同余类,而非单个整数。
定理。 设 为整数, 为正整数,。方程
- 有解 当且仅当 ;
- 此时在模 下恰有 个互不相同的解;若 是一个解,全部解为 ,。
证明. 等价于存在整数 使 ,即二元一次不定方程。Bézout 定理说 ,所以方程有整数解当且仅当 。有解时设 为一解,通解为 ,(),其中 模 恰好取 个不同值。
求 的实操路径:用扩展欧几里得求出 使 (这里 就是 模 的”准逆元”),两边乘 得
所以 。当 时公式最干净:,其中 ,这个 称为 模 的逆元,记 ,是模算术里”除法”的替身。
例 2. 解 。
解. 先算 :,,,,得 ,故方程有唯一解模 。回代求逆元:
所以 ,即 。两边乘 :
检验: ,正确。
7. 中国剩余定理
定理(两模版本)。 设 为互素的正整数, 为任意整数。则同余方程组
在模 下有唯一解。
证明与构造. 由 Bézout,存在 使 。取
模 看:,而 ,故 ;同理 。存在性得证。唯一性:若 都是解,则 同时被 整除,故被 整除(互素时 gcd 为 ),即 。
互素条件不可去掉: 与 无解,因为前者要求 奇、后者要求 偶。
例 3. 解
解. 两模互素,模 下有唯一解。由第二个同余设 ,代入第一个:,得 ,取 ,得 。
检验: ,,全部解为 。
一般版(一句话): 对 个两两互素的模 和任意余数 ,方程组 在模 下有唯一解,构造取 ,其中 、 是 模 的逆元。它等价于环同构 :一个模大数的对象,可以无损拆成模若干小数的对象分别处理——这正是 RSA 解密用 CRT 加速、以及分布式计数里”分桶再合并”的数学原型。
8. 费马小定理与欧拉定理
定理(费马小定理)。 设 为素数, 为整数且 ,则
(对任意整数 也有变形 。)
证明思路. 模 的非零剩余 构成乘法群。对每个 ,集合 模 仍是同一集合( 蕴含 ,因为它们可约去 )。两集合元素各自相乘:
即 。 是素数,,可以约去阶乘,得 。
定理(欧拉定理)。 设 , 为整数且 ,则
其中 欧拉函数 等于 中与 互素的整数个数。 为素数时 ,费马小定理是它的特例。若 为两不同素数之积,则 ——这个公式下一节就要用到。
证明思路. 把费马小定理证明里的”全部非零剩余”换成”模 的简化剩余系”(即 个与 互素的代表元),用 保证乘 只是重排该集合,完全相同的论证给出 。
这两个定理的价值在于把巨大的指数压小:指数只需模 (或 )取余。配合快速幂(平方–乘, 次乘法), 可以在指数有几百位时照样秒算——这正是模幂能成为加密引擎的原因。
例 4. 计算 。
解. 是素数且 ,费马小定理给出 。把指数按 分解:,故
答案 。 若不用定理而硬算 ,那是一个 31 位的数;用定理只算了两次小乘法。快速幂的写法是相同的思想:,逐次平方取模,任何 都只需 步。
9. RSA:一次完整的加密与解密
RSA(Rivest–Shamir–Adleman, 1977)是第一个实用的公钥密码体制:加密密钥可以公开,解密密钥只有接收方持有。它的全部数学就是前面八节的组装。
密钥生成。
- 选两个大素数 ,计算 (公钥模数)和
- 选一个 满足 且 ,公开 作为公钥。
- 用扩展欧几里得求 使 ,,保留 作为私钥。 销毁或封存。
加密:消息 ()映射为 。解密:计算 。
为什么解密能还原? 因为 。若 ,欧拉定理直接给出
的少数情形用中国剩余定理拆到模 、模 上分别验证,结论一样。所以 ,而 ,两边相等。
例 5. 取 (实战里应是几百位的大素数,这里为了手算)。则
选 (,满足条件)。求私钥:扩展欧几里得,,,回代得 ,即 ,所以 。
公钥 ,私钥 。发消息 (要求 ):
加密: ,发出密文 。
解密: 。用快速幂:,。还原出 。也可以心算校验:、,由中国剩余定理只需验证 和 ,都对。
为什么安全? 攻击者知道 ,要算 或直接从 开 次方,都要知道 ;而 与 的差 一旦泄露就能解出 。所以从 分解出 是已知的攻击捷径——但对几百位的大数,大整数分解目前没有已知的多项式时间算法,经典计算机上不可行;模幂运算(加密、解密、窃听者做的任何事)却只要 次乘法,极其便宜。安全性就建立在”乘起来容易、拆回去难”这条不对称上。(Shor 的量子算法能分解大整数,所以量子计算成熟后 RSA 需被格密码等替代方案替换——这是选参数时要留意的长期风险。)
注意教科书常演示的另一方向隐患:同一条消息 用同一公钥加密多次会泄露统计信息,实际协议要加随机填充(如 OAEP)。另外模数 必须足够大(当前实践 位),小模数下试除法直接分解。
常见错误
- 同余两边随意约分。 推 只在 时成立;一般只能约到模 。正确做法:确认 后乘逆元 ,而不是”两边除掉 ”。
- 忽略线性同余方程的有解条件。 有解当且仅当 。拿到方程先算 gcd 判可解性,别直接套逆元公式——逆元只在 时存在。
- 中国剩余定理忘了互素前提。 模不互素时可能无解或解不唯一(判据:同余在模 下必须相容)。
- 费马小定理用错条件。 它要求模是素数且 ;模为合数时要用欧拉定理且 。比如 对,但 不能套”指数模 “以外的推广。
- RSA 手算例子里 与 不互素就求逆元。 选 前先验证 ,否则 根本不存在。
- 负数的余数符号混乱。 数学约定 ; 而不是 。
练习
-
用欧几里得算法求 ,并求整数 使 。 答案: ,,,故 gcd 为 。回代:,即 。
-
判断方程 是否有解;若有,写出全部解。 答案: ,,有解,共 个解模 。两边同除以 化简为 ;,故 ,。全部解:。
-
计算 。 答案: 费马小定理 ;,所以 。
-
一个正整数除以 余 ,除以 余 ,除以 余 ,求它的最小值。 答案: 三模两两互素,CRT 保证模 唯一解。由 与 得 ;设 ,代入 ,得 ,取 得最小值 。
-
取 RSA 参数 。写出公钥与私钥,并将消息 加密后解密,验证能还原。 答案: ,, 与 互素。由 得 。公钥 ,私钥 。加密:。解密:,,还原 。(此例中公钥私钥指数恰好相同,是参数太小的巧合;换 可得 亦然,换 则 ——因为 的自逆元多。实践里 大时不会这样。)