密码学数学基础 笔记 1:从带余除法出发,讨论整除、素因数分解的存在性,以及素数的数量与筛法

整除与素数

这一部分的目标是理解算术基本定理:每个大于 11 的整数都可以分解为素数的乘积,且忽略因子的排列顺序后,分解是唯一的

我们先证明分解的存在性。唯一性的证明需要最大公因数和 Bézout 等式,放到后面讨论

带余除法

整数集合 Z\mathbb{Z} 对加法、减法和乘法封闭,但两个整数相除,结果未必是整数。因此,在整数范围内讨论除法时,需要同时考虑商和余数

带余除法定理:对任意整数 aa 和正整数 bb,存在唯一的一对整数 q,rq,r,使得

a=qb+r,0r<ba=qb+r,\qquad 0\leq r<b

其中 qq 是商,rr 是最小非负余数

存在性与唯一性

q=ab,r=aqbq=\left\lfloor\frac{a}{b}\right\rfloor,\qquad r=a-qb

由取整函数的定义,

qab<q+1q\leq\frac{a}{b}<q+1

两边乘以 b>0b>0,就得到 0r<b0\leq r<b,因此商和余数存在

再证明唯一性。假设

a=qb+r=qb+r,0r,r<ba=qb+r=q'b+r',\qquad 0\leq r,r'<b

相减得到

b(qq)=rrb(q-q')=r'-r

右侧的绝对值小于 bb,同时又是 bb 的倍数,因此只能为 00。于是 r=rr=r',进而 q=qq=q'

当被除数为负数时,余数仍按同样的范围选取,例如

23=(6)×4+1-23=(-6)\times 4+1

这里的商是向下取整得到的 6-6

最小绝对值余数

也可以允许余数为负数,以减小余数的绝对值。例如

23=6×4123=6\times 4-1

一种固定的约定是

b2<rb2-\frac b2<r\leq\frac b2

从普通余数 r0[0,b)r_0\in[0,b) 出发:若 r0b/2r_0\leq b/2,保持不变;若 r0>b/2r_0>b/2,则将商加 11,余数改为 r0br_0-b

这样总有 rb/2|r|\leq b/2。当 bb 为偶数、余数恰好落在边界时,约定保留 b/2b/2,排除 b/2-b/2,就能保证唯一性

整除

若存在整数 cc 使得

a=bca=bc

则称 bb 整除 aa,记为 bab\mid a。此时 bbaa 的因子,aabb 的倍数。不整除记为 bab\nmid a

b>0b>0 时,整除等价于带余除法的余数为 00

一些基本性质如下,涉及的变量均为整数:

  • 1a1\mid aaaa\mid aa0a\mid 0
  • aba\mid bbab\mid a,则 a=±ba=\pm b
  • aba\mid bbcb\mid c,则 aca\mid c
  • dad\mid a,则对任意整数 kk,都有 dkad\mid ka
  • k0k\neq 0 时,dad\mid a 等价于 kdkakd\mid ka
  • a0a\neq 0dad\mid a,则 da|d|\leq |a|

这些性质都可以从 a=bca=bc 的定义直接推出。例如,若 b=mab=mac=nbc=nb,则 c=nmac=nma,所以 aca\mid c

整数线性组合

后面最常用的性质是:公因子整除任意整数线性组合

dad\mid adbd\mid b,则对任意 u,vZu,v\in\mathbb{Z}

dua+vbd\mid ua+vb

证明很直接:写成 a=mda=mdb=ndb=nd 后,有

ua+vb=(um+vn)dua+vb=(um+vn)d

特别地,dd 同时整除 a,ba,b 时,也整除 a+ba+baba-b。因此,在等式 a+b=ca+b=c 中,若 dd 整除其中任意两项,就一定整除第三项

例如,考虑整数方程

7x2+11=21y7x^2+11=21y

如果存在整数解,则 77 整除 7x27x^221y21y,于是也应整除两者之差 1111,产生矛盾。因此方程没有整数解

素数与素因数分解

本文约定 N={1,2,3,}\mathbb{N}=\{1,2,3,\ldots\}。正整数分为三类:

  • 11:只有一个正因子
  • 素数:大于 11,正因子只有 11 和自身
  • 合数:存在满足 1<d<n1<d<n 的因子 dd

最小非平凡正因子一定是素数

nn 是合数,dd 是它大于 11 的最小正因子

如果 dd 也是合数,就存在 1<e<d1<e<d,使得 ede\mid d。由整除的传递性,ene\mid n,这与 dd 的最小性矛盾。因此 dd 必为素数

这里用到了良序原理:任何非空的非负整数集合都有最小元素。它也保证严格递减的正整数序列不可能无限延续

分解的存在性

对任意 n>1n>1

  1. 如果 nn 是素数,分解已经完成
  2. 如果 nn 是合数,取其最小非平凡正因子 p1p_1,则 p1p_1 是素数,可以写成 n=p1n1n=p_1n_1,其中 1<n1<n1<n_1<n
  3. n1n_1 重复上述过程

每次剩余的正整数都严格减小,所以过程必然终止,最终得到

n=p1p2ps,n=p_1p_2\cdots p_s,

其中每个 pip_i 都是素数。

将相同的素数合并,并按大小排列,可以写成标准分解

n=p1α1p2α2pkαk,p1<p2<<pk,αi>0n=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alpha_k}, \qquad p_1<p_2<\cdots<p_k,\quad \alpha_i>0

例如

10725=3×52×11×1310725=3\times 5^2\times 11\times 13

至此证明了每个 n>1n>1 都有这样的分解;不同分解过程是否会得到相同的结果,还需要证明唯一性(此处略)

素数有多少个

素数有无穷多个

假设素数只有有限个,分别为 p1,,pkp_1,\ldots,p_k,构造

N=p1p2pk+1.N=p_1p_2\cdots p_k+1.

因为 N>1N>1,由素因数分解的存在性,NN 至少有一个素因子 qq

但对每个 pip_iNN 除以 pip_i 都余 11,因此 qq 不在原来的素数列表中,与假设矛盾。

一个粗略的数量估计

pnp_n 为第 nn 个素数,π(x)\pi(x) 为不超过 xx 的素数个数。上面的构造还说明

pn+1p1p2pn+1p_{n+1}\leq p_1p_2\cdots p_n+1

由此可以归纳得到

pn22n1p_n\leq 2^{2^{n-1}}

初始情形 p1=2p_1=2 成立。若前 nn 项都满足结论,则

pn+121+2++2n1+1=22n1+122np_{n+1} \leq 2^{1+2+\cdots+2^{n-1}}+1 =2^{2^n-1}+1 \leq 2^{2^n}

x2x\geq 2,选择 nn 使得 22n1x<22n2^{2^{n-1}}\leq x<2^{2^n},就有

π(x)n>log2log2x\pi(x)\geq n>\log_2\log_2 x

这个下界很粗,但它把“素数有无穷多个”变成了一个具体的数量估计

更精确的结果是素数定理

π(x)xlnx,limxπ(x)x/lnx=1\pi(x)\sim\frac{x}{\ln x}, \qquad\text{即}\qquad \lim_{x\to\infty}\frac{\pi(x)}{x/\ln x}=1

例如,从 22 到一个很大的整数 NN 中均匀抽样,抽到素数的概率约为 1/lnN1/\ln N。如果每次独立抽样,找到素数所需的期望尝试次数约为 lnN\ln N;这是平均意义上的估计

试除与埃拉托斯特尼筛法

判断一个数是否为素数,只需尝试不超过 n\sqrt n 的素数

如果要一次找出不超过 NN 的所有素数,可以使用埃拉托斯特尼筛法

  1. 初始保留 2,3,,N2,3,\ldots,N
  2. 从小到大取尚未被划去的数 pp,将 p2,p2+p,p^2,p^2+p,\ldots 划去
  3. 处理到 p2>Np^2>N 时停止,剩下的数就是素数

p2p^2 开始,是因为 2p,3p,,(p1)p2p,3p,\ldots,(p-1)p 都有小于 pp 的素因子,已经在之前被划去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from math import isqrt


def primes_up_to(n):
if n < 2:
return []

is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False

for p in range(2, isqrt(n) + 1):
if is_prime[p]:
for multiple in range(p * p, n + 1, p):
is_prime[multiple] = False

return [p for p in range(2, n + 1) if is_prime[p]]

筛法适合批量生成一定范围内的素数。密码学中处理的大整数通常需要更高效的素性测试,例如 Miller–Rabin 等算法,会在后续内容中讨论


© 2024 本网站由 Ywang22 使用 Stellar主题 创建
总访问 次 | 本页访问
共发表 87 篇 Blog(s) · 总计 211.3k 字