密码学数学基础 笔记 3:从对加减法封闭的整数集合出发,证明素因数分解的唯一性,再讨论最大公因数与最小公倍数
整数模与算术基本定理
前面已经证明,每个大于 1 的整数都可以分解为素数的乘积。这一篇补上唯一性的证明
关键是先理解整数线性组合构成的集合,由此得到 Bézout 等式,再证明一个素数整除乘积时,必然整除其中某个因子
整数模
讲义中的 modulus 指一个对加法、减法封闭的非空整数集合,本文称为整数模。这里的“模”是集合的名称,需要与同余式中“模 n”的整数 n 区分
具体来说,非空集合 S⊆Z 是整数模,要求
m,n∈S⟹m+n∈S, m−n∈S
例如:
- {0},称为零模
- 全体整数 Z
- 某个正整数 d 的所有整数倍,即 dZ={dk:k∈Z}
用群论的语言说,这些集合就是整数加法群的子群
基本性质
由于 S 非空,可以取 a∈S。于是
0=a−a∈S,−a=0−a∈S
继续做有限次加法、减法,便得到 a 的任意整数倍都属于 S。因此,对 a,b∈S 和任意整数 u,v,
ua+vb∈S
反过来,固定整数 a,b,它们所有整数线性组合构成的集合
S={ax+by:x,y∈Z}
也是整数模:它包含 0,且两个线性组合的和、差仍然是同样形式的线性组合
每个非零整数模都是倍数集合
定理:若 S={0},则存在唯一的正整数 d,使得
S=dZ
证明分为两步
首先,S 中有非零元素,又对取负封闭,所以一定有正元素。由良序原理,取 S 中最小的正整数为 d。由于整数模包含其元素的所有整数倍,有 dZ⊆S
其次,对任意 n∈S 做带余除法:
n=qd+r,0≤r<d
由于 n,qd∈S,所以 r=n−qd∈S。若 r>0,它就是比 d 更小的正元素,产生矛盾。因此 r=0,即 d∣n,所以 S⊆dZ
两者合起来得到 S=dZ。其中 d 就是 S 的最小正元素,因此也唯一
从整数模得到最大公因数
设整数 a,b 不同时为 0,考虑
S={ax+by:x,y∈Z}
由上一节,存在正整数 d 使得 S=dZ。下面说明这个 d 恰好就是 gcd(a,b)
一方面,取 (x,y)=(1,0) 和 (0,1),可知 a,b∈S,所以
d∣a,d∣b
另一方面,d∈S,因此存在整数 u,v,使得
d=au+bv
如果 e 是 a,b 的任意公因子,那么 e∣au+bv=d。所以 d 是公因子,且每个正公因子都不超过它,即
d=gcd(a,b)
我们同时得到三个结论:
{ax+by:x,y∈Z}gcd(a,b)au+bv=gcd(a,b)Z,=min{ax+by:ax+by>0, x,y∈Z},=gcd(a,b)对某些整数 u,v 成立
最后一条就是 Bézout 等式。上一讲通过欧几里得算法构造它,这里通过集合的最小正元素证明它
例如
6=−2×42+3×30,
所以 42x+30y 的全部可能取值恰好是 6 的所有整数倍
互素与缩放
若 gcd(a,b)=1,则称 a,b 互素。由 Bézout 等式,互素等价于存在整数 u,v,使得
au+bv=1
对于非零整数 c,所有 acx+bcy 构成的集合是
c{ax+by:x,y∈Z}=cgcd(a,b)Z
它的最小正元素为 ∣c∣gcd(a,b),因此
gcd(ac,bc)=∣c∣gcd(a,b)
特别地,若 d=gcd(a,b),则
gcd(da,db)=1
欧几里得引理
欧几里得引理:若 p 为素数,且 p∣ab,则
p∣a或p∣b
如果 p∣a,结论已经成立。否则,由于 p 的正因子只有 1,p,有 gcd(a,p)=1。于是存在整数 x,y,使得
ax+py=1
两边乘以 b:
abx+pby=b
左侧两项都被 p 整除,所以 p∣b,证毕
素数条件很关键。例如 6∣2×3,但 6 既不整除 2,也不整除 3
对引理反复应用,可得:若素数 p 整除有限个整数的乘积,则它至少整除其中一个因子
算术基本定理:唯一性
算术基本定理:每个整数 n>1 都存在唯一的标准分解
n=p1α1p2α2⋯pkαk,p1<p2<⋯<pk,αi>0
存在性已在第一篇中证明。现在假设 n 有两种素因数分解,先将重复因子全部展开:
n=p1p2⋯pr=q1q2⋯qs
由于 p1 整除右边的乘积,由欧几里得引理,它整除某个 qj。但 p1,qj 都是素数,因此 p1=qj
将这对相同的因子约去,对剩下的乘积重复上述过程。两边的因子必然一一配对:如果一边先被约完,另一边还剩素因子,就会得到 1 等于若干个大于 1 的整数之积,矛盾
因此两边素因子的种类及出现次数完全相同。将同类素数合并、按大小排序后,标准分解唯一
这也解释了为什么把 1 排除在素数定义之外:任意插入因子 1 都不会改变乘积,却会破坏“只允许交换因子顺序”的唯一性表述
最大公因数与最小公倍数
有了唯一分解,整除关系就可以转化为对素因数指数的比较
设 a,b 为正整数,把二者出现过的素数统一列为 p1,…,ps,写成
a=i=1∏spiαi,b=i=1∏spiβi
这里允许指数为 0,表示该素数没有出现在对应整数的分解中。于是
a∣b⟺αi≤βi对所有 i 成立
指数取最小值与最大值
公因子在每个素数上的指数都不能超过 αi,βi,所以
gcd(a,b)=i=1∏spimin(αi,βi)
a,b 的最小公倍数记为 lcm(a,b),是同时被二者整除的最小正整数。因为 ab 就是一个正公倍数,它总是存在
公倍数在每个素数上的指数都不能小于 αi,βi,所以
lcm(a,b)=i=1∏spimax(αi,βi)
这个数本身是公倍数,而且整除任意其他公倍数,因此确实最小。其他公倍数即使包含额外的素因子,也不影响这个整除关系
例如
72=23×32,120=23×3×5,
于是
gcd(72,120)=23×3=24,lcm(72,120)=23×32×5=360
GCD 与 LCM 的乘积
由
min(αi,βi)+max(αi,βi)=αi+βi,
逐个比较素数的指数,得到
gcd(a,b)lcm(a,b)=ab
因此,计算最小公倍数时可以先用欧几里得算法求 GCD,再计算
lcm(a,b)=gcd(a,b)ab
这样不需要先分解 a,b,且先除后乘可以减小中间结果
多个整数的情形
对于多个正整数,GCD 和 LCM 仍然是在每个素数上分别取所有指数的最小值、最大值。因此可以逐个合并,例如
gcd(a,b,c)lcm(a,b,c)=gcd(gcd(a,b),c),=lcm(lcm(a,b),c)
但两个数的乘积公式不能直接照搬。例如 2,4,8 的 GCD 为 2、LCM 为 8,两者之积为 16,而三个数的乘积为 64
例题:用素因数指数计算对数
讲义最后的例题把唯一分解用于计算。思路是:乘法对应素因数指数相加,取对数后又变成线性组合
本节重新用 a,b,c,d,e 表示五个对数:
abcde=log1010241025,=log101023×102510242,=log1080×82812,=log10124×1261252,=log1098×100992
这些分数都很接近 1,所以对数很小,适合用级数近似。目标是用它们表示 log102、log103 和 log1041
把乘法转化为指数运算
正有理数的素因数指数允许为负数,表示分母中的因子。例如
10a=10241025=2−1052×41
类似地,对 10,10a,…,10e 分解,得到各个素数的指数:
| 素数 |
10 |
10a |
10b |
10c |
10d |
10e |
| 2 |
1 |
−10 |
20 |
−5 |
−3 |
−3 |
| 3 |
0 |
0 |
−1 |
8 |
−2 |
4 |
| 5 |
1 |
2 |
−2 |
−1 |
6 |
−2 |
| 7 |
0 |
0 |
0 |
0 |
−1 |
−2 |
| 11 |
0 |
0 |
−1 |
0 |
0 |
2 |
| 31 |
0 |
0 |
−1 |
0 |
−1 |
0 |
| 41 |
0 |
1 |
−1 |
−1 |
0 |
0 |
给这六列依次乘以 59,5,8,−3,−8,4 再相加,得到的指数向量为
(196,0,0,0,0,0,0)T
例如 2 的指数为
59−50+160+15+24−12=196,
其他素数的指数均为 0。由唯一分解,
1059(10a)5(10b)8(10c)−3(10d)−8(10e)4=2196
两边取以 10 为底的对数,就得到
196log102=59+5a+8b−3c−8d+4e
要计算另外两个对数,只需让目标指数向量分别只在素数 3、41 的位置非零,再解相应的线性方程组。结果为
392log10349log1041=187+69a+32b+37c−32d+16e,=79+64a+24b−9c−24d+12e
用小量的级数近似求值
对 0<x<1,有
ln(1+x)=x−2x2+3x3−⋯
保留前三项,截断误差的绝对值不超过 x4/4。上面五个分数对应的小量分别为
10241,1023×10251,80×821,124×1261,98×1001
其中最大的也小于 10−3,因此前三项已经能给出很精确的近似。再由换底公式
log10(1+x)=ln10ln(1+x),
使用讲义给定的 ln10≈2.3025850930,计算这五个小对数,代入前面的线性组合,得到
log102≈0.3010299957
即保留小数点后十位的结果
这个例子把“求一个对数”拆成了两步:先通过素因数指数找到精确的代数关系,再对接近 1 的数使用快速收敛的级数