密码学数学基础(一)整除

一、整除

1.1 自然数与整数

在数论中,自然数也叫作正整数,即\(1,2,3\cdots,n,n+1,\cdots\)整数指正整数、负整数和零。记\(\mathbb{Z}\)表示全体整数的集合,\(\mathbb{N}\)表示全体自然数的集合。

定理1.1(最小自然数原理):设\(T\)\(\mathbb N\)的一个非空子集,则必有\(t_0\in T\),使得对任意的\(t\in T\),有\(t_0\le t\),即\(t_0\)\(T\)中的最小自然数。

定理1.2(最大自然数原理):设\(M\)\(\mathbb N\)的一个非空子集,若\(M\)有上界,则必有\(m_0\in M\),使得对任意的\(m\in M\),有\(m\le m_0\),即\(m_0\)\(M\)中的最大自然数。

1.2 整除与素数

定义1.1:设\(a,b\in\mathbb{Z}\),如果存在\(q\in\mathbb{Z}\),使得\(b=aq\),那么就说\(a\)整除\(b\),或\(b\)\(a\)整除,记作\(a\mid b\),称\(b\)\(a\)的倍数,\(a\)\(b\)的因子;否则就说\(a\)不整除\(b\),或\(b\)不能被\(a\)整除,记作\(a\nmid b\)

对于非零整数\(b\),显然\(\pm1,\pm b\)\(b\)的因子,我们称其为显然因子,其他因子称为非显然因子或真因子

定义1.2:设整数\(p\ne0,\pm1\),如果\(p\)除了显然因子\(\pm1,\pm p\)外没有其他的因子,那么\(p\)就称为素数。若整数\(a\ne0,\pm1\),且\(a\)除显然因子外还有真因子,则称\(a\)合数

一般情况下,我们只考虑正的素数。

定理1.3:若\(a\)为合数,则\(a\)的最小真因子为素数。

证明:若\(a\)的最小真因子\(d\)不为素数,则\(d\)必有真因子\(d'\),显然\(d'\)也是\(a\)的因子,因此\(a\)存在更小的因子\(d'\),与假设不符。

定理1.4:素数有无穷多个。

证明:假设只有有限个素数,设为\(p_1,p_2,\cdots,p_k\),考虑\(a=p_1p_2\cdots p_k+1\),由定理1.3知,\(a\)的最小真因子一定为素数,记为\(p\)。既然\(p\)是素数,那么它就一定等于某个\(p_i\),所以\(p\mid a\)\(p\mid p_1p_2\cdots p_k\),从而\(p\mid 1\),这与\(p\)是素数矛盾。

定理1.5(带余除法):设\(a,b\)是两个给定的整数且\(a\ne0\),那么一定存在唯一的一对整数\(q\)\(r\),满足 \[ b=qa+r,0\le r<|a| \] 其中\(r\)称为余数,\(a\mid b\)的充要条件是\(r=0\)

1.3 最大公约数与最小公倍数

定义1.3:设\(a_1,a_2\)是两个整数,如果\(d\mid a_1\)\(d\mid a_2\),那么就称\(d\)\(a_1\)\(a_2\)的公约数(公因子);最大的那个\(d\)称为最大公约束(最大公因子),记作\((a_1,a_2)\)\(gcd(a_1,a_2)\)

定义1.4:设\(a_1,a_2\)是两个整数,若\((a_1,a_2)=1\),则称\(a_1\)\(a_2\)互素的(或既约的)。

定义1.5:设\(a_1,a_2\)是两个均不等于零的整数,如果\(a_1\mid l,a_2\mid l\),则称\(l\)\(a_1\)\(a_2\)的公倍数;最小的那个\(l\)称为最小公倍数,记作\([a_1,a_2]\)

1.4 欧几里得算法

也称辗转相除法,主要用于求解最大公约数。

定理1.6(欧几里得算法):设\(a,b\)是两个给定的整数,\(b\ne0\)\(b\)不整除\(a\),重复应用带余除法可得下面等式: \[ \begin{align} a&=q_0b+r_0&&(1)\\ b&=q_1r_0+r_1&&(2)\\ r_0&=q_2r_1+r_2&&(3)\\ &\cdots\cdots\\ r_{k-3}&=q_{k-1}r_{k-2}+r_{k-1}&&(k)\\ r_{k-2}&=q_kr_{k-1}+r_{k}&&(k+1)\\ r_{k-1}&=q_{k+1}r_k&&(k+2) \end{align} \]

证明:根据带余除法的性质,有\(|b|>r_0>r_1>\cdots>r_k>0\),因此只有有限个\(r\),上述等式的个数是有限的。不断迭代等式,最坏的情况下\(r_k=1\),此时等式\((k+2)\)必然成立,因此一定存在这样的\(r_k\),使得\(r_k\mid r_{k-1}\)

下面的定理非常重要,尤其是第二点,它是很多算法的基础。

定理1.7:在定理1.6的条件和符号下,有

  • \(r_k=gcd(a,b)\)
  • (裴蜀定理)存在整数\(x,y\),使得\(gcd(a,b)=ax+by\)

证明

  • 根据上述等式,\(gcd(a,b)=gcd(b,r_0)=gcd(r_0,r_1)=\cdots=gcd(r_{k-1},r_k)\),而\(r_k\mid r_{k_1}\),因此\(r_k\)就是最大公约数。
  • 由等式\((k+1)\)\(r_k\)可以表示为\(r_{k-1}\)\(r_{k-2}\)的线性组合,利用等式\((k)\)消去\(r_{k-1}\),则\(r_k\)又可以表示为\(r_{k-2}\)\(r_{k-3}\)的线性组合,不断这样带入上一个式子,直到将\(r_k\)表示为\(a\)\(b\)的线性组合。

举个计算的例子方便理解。

例1.1:求75和48的最大公约数,并将其表示成线性组合的形式。

\[ \begin{align} 75&=1\times48+27\\ 48&=1\times27+21\\ 27&=1\times21+6\\ 21&=3\times6+3\\ 6&=2\times3 \end{align} \] 因此最大公约数为3。上述逆过程如下: \[ \begin{align} 3&=21-3\times6\\ 3&=21-3\times(27-1\times21)=-3\times27+4\times21\\ 3&=-3\times27+4\times(48-1\times27)=4\times48-7\times27\\ 3&=4\times48-7\times(75-1\times48)=-7\times75+11\times48 \end{align} \] 验算一下确实成立,得到:\(3=-7\times75+11\times48\)

结合例子,下面来看算法:

  • 欧几里得算法求最大公约数

    # 求a和b的最大公约数
    def gcd(a, b):
        # return b if a % b == 0 else gcd(b, a % b)
        return a if b == 0 else gcd(b, a % b)

    注释的那一行很好理解,当b整除a时直接返回b,否则将b和余数继续带入函数。从逻辑上看a应该需要大于b,但实际上如果a小于b的话代入函数下一轮会交换ab,因此谁大谁小都无所谓。下面一行意思是一样的,当a % b == 0时,再多代入一轮函数,b就会传给a,因此最大公约数应该返回a,而b就等于0了。

  • 扩展欧几里得算法

    扩展欧几里得算法即找到这样一组线性组合,使得\(gcd(a,b)=ax+by\)

    # 求x、y满足:ax + by = gcd(a, b) = d
    def exgcd(a, b):
        if b == 0:
            x = 1
            y = 0
            return a, x, y
        d, x0, y0 = exgcd(b, a % b)
        x = y0
        y = x0 - a // b * y0
        return d, x, y

    递归的核心函数和gcd函数类似,当b==0时,a即为最大公约数,此时令系数x = 1, y = 0,满足ax + by = d。然后就需要一层一层反推系数,结合例1.1,有:

    正推(例) 正推 反推 反推(例)
    \(27=1\times21+6\) \(a=q_1b+r_1\)
    \(21=3\times6+3\) \(a_0=q_2b_0+r_2\)
    因为是递归这里还是用ab表示
    \(a_0=b,b_0=r_1\)
    \(d=a_0x_0+b_0y_0\) \(3=21-3\times6\)

    按顺序正推从①到②,然后上一层递归已经返回了③中的系数,现在要求④的表达式。根据正推的关系将\(a_0=b,b_0=r_1\)带入③得 \[ \begin{align} d&=bx_0+r_1y_0\\ &=bx_0+(a-q_1b)y_0\\ &=ay_0+(x_0-q_1y_0)b \end{align} \] 这里就将上一层的\(a_0,b_0\)代换为这一层的\(a,b\)了,按照\(a\)对应的系数是\(x\)\(b\)对应的系数是\(y\),那么新系数就是 \[ \begin{cases} x=y_0\\ y=x_0-q_1y_0=x_0-a//b\cdot y_0 \end{cases} \] 对应了代码中的两行赋值,至此代码就讲完了。

扩展欧几里得算法可以用来求解二元一次不定方程\(ax+by=c\),先看下面定理。

定理1.8:二元一次不定方程\(ax+by=c\)\(a,b\)为非零整数)有整数解的充要条件是\(gcd(a,b)\mid c\)

证明

  • 必要性:若方程有整数解\(x_0,y_0\),则\(ax_0+by_0=c\),因为\(gcd(a,b)\mid a,b\),所以\(gcd(a,b)\mid c\)
  • 充分性:若\(gcd(a,b)\mid c\),则存在整数\(k\)使得\(c=k\cdot gcd(a,b)\),由裴蜀定理,存在整数\(s,t\)使得\(as+bt=gcd(a,b)\),令\(x_0=ks,y_0=kt\),则有\(ax_0+by_0=k\cdot gcd(a,b)=c\),方程有解。

求解方程时,只需用exgcd求出系数\(s,t\),再扩大\(k\)倍就得到方程的特解\(x_0\)\(y_0\)了,通解为 \[ \begin{cases} x=x_0+\frac{b}{gcd(a,b)}t\\ y=y_0-\frac{a}{gcd(a,b)}t \end{cases} \]

1.5 最大公约数理论

定理1.9(最大公约数理论)

  • \(a_j\mid c(1\le j\le k)\)的充要条件是\([a_1,\cdots,a_k]\mid c\)

  • \(D\)是正整数,那么\(D=(a_1,\cdots,a_k)\)的充要条件是:

    (1)\(D\mid a_j(1\le j\le k)\);(2)若\(d\mid a_j(1\le j\le k)\),则\(d\mid D\)

  • \(m>0\),有\(m(b_1,\cdots,b_k)=(mb_1,\cdots,mb_k)\)

  • \((a_1,\cdots,a_{k+r})=((a_1,\cdots,a_k),(a_{k+1},\cdots,a_{k+r}))\)

  • \((m,a)=1\),则有\((m,ab)=(m,b)\)

  • \((m,a)=1\),那么若\(m\mid ab\),则\(m\mid b\)

  • \([a_1,a_2](a_1,a_2)=|a_1a_2|\)

  • \(a_1,\cdots,a_k\)是不全为零的整数,\(x_j\in\mathbb{Z}(1\le j\le k)\),有:

    • \((a_1,\cdots,a_k)=\min\{s=a_1x_1+\cdots+a_kx_k,s>0 \}\)
    • 一定存在这样的系数\(x_j\)使得:\((a_1,\cdots,a_k)=a_1x_1+\cdots+a_kx_k\)

证明

前7条仅给出理解,主要证明最后一条。

  • 公倍数一定是最小公倍数的倍数。

  • 公约数一定是最大公约数的约数。

  • 略。

  • 求若干个数的最大公约数可以任意分组。

  • \(m\)与另一个数的最大公约数时,可以把另一个数中与\(m\)互素的因数去掉。

  • 若一个数被\(m\)整除,把这个数中与\(m\)互素的因素去掉仍然被\(m\)整除。

  • 最大公约数乘以最小公倍数等于这两个数的乘积。

  • \(S=\{a_1x_1+\cdots+a_kx_k\}\)\(S>0\),即\(S\)表示\(a_1,\cdots,a_k\)的线性组合中的所有正整数。由最小自然数原理\(S\)中必有最小正整数\(s_0\)。对任一公约数\(d\mid a_j\),必有\(d\mid s_0\)(因为\(s_0\)\(a_j\)的线性组合),所以\(|d|\le s_0\)。另外,对任一\(a_j\),由带余除法可知 \[ a_j=q_js_0+r_j,\quad0\le r_j\le s_0 \] 因为\(a_j\)\(q_js_0\)都属于\(S\),所以\(r_j\)也属于\(S\)或为\(0\)。若\(r_j>0\),由于\(r_j\le s_0\),这与\(s_0\)的最小性矛盾,所以\(r_j=0\),即\(s_0\mid a_j\)\(s_0\)是公约数),结合前面的\(|d|\le s_0\),所以\(s_0\)是最大公约数。

特别地,\((a_1,\cdots,a_k)=1\)充要条件是存在整数\(x_1,\cdots,x_k\)使得\(a_1x_1+\cdots+a_kx_k=1\)

1.6 算术基本定理

定理1.10(算术基本引理):设\(p\)是素数,\(p\mid a_1a_2\),则\(p\mid a_1\)\(p\mid a_2\)中至少有一个成立。一般地,若\(p\mid a_1\cdots a_k\)\(p\mid a_1,\cdots,p\mid a_k\)中至少有一个成立。

证明

\(p\nmid a_1\),则\((p,a_1)=1\),由定理1.9第6条可得\(p\mid a_2\)。一般的情形只需多次使用该结论。

定理1.11(算术基本定理):设\(a>1\),那么必有 \[ a=p_1p_2\cdots p_s \] 其中\(p_j(1\le j\le s)\)是素数,且在不计次序的意义下,该表示唯一。将上述表示中,相同的素数合并,可得 \[ a=p_1^{\alpha_1}\cdots p_s^{\alpha_s},\ p_1<p_2<\cdots<p_s \] 该式称为正整数\(a\)标准素因数分解式

证明

首先,\(a\)一定能表示成素数的乘积。否则,则设不能表示成素数乘积的正整数的集合为\(T\),设\(t_0\)\(T\)中最小的正整数。显然\(t_0\)不可能是素数,则它为合数,那么\(t_0=t_1t_2\)\(t_1\)\(t_2\)都能被素数的乘积表示,那么\(t_0\)也能被素数的乘积表示,这与\(t_0\)的最小性矛盾。

下证唯一性。不妨设\(p_1\le p_2\le\cdots\le p_s\),若还有表达式 \[ a=q_1q_2\cdots q_r,\quad q_1\le q_2\le\cdots\le q_r \] 下面来证明必有\(r=s,p_j=q_j\)。不妨设\(r\ge s\),由算术基本定理可知,\(q_1\mid a=p_1p_2\cdots p_s\),则必有某个\(p_j\)满足\(q_1\mid p_j\),因为它们都是素数,所以\(q_1=p_j\)。同理,必有某个\(q_i\)满足\(p_1=q_i\)。由于\(q_1\le q_i=p_1\le p_j=q_1\),所以\(p_1=q_1\)。这样依次可得\(p_2=q_2,\cdots,p_s=q_s\),从而\(q_{s+1}\cdots q_r=1\),所以\(s=r\),证毕。

定义1.6:设\(x\)是实数,\([x]\)表示不超过\(x\)的最大整数,称为\(x\)整数部分。记\(\{x\}=x-[x]\),称为\(x\)小数部分

1.7 SageMath

# 是否整除
sage: 3.divides(9)
True
sage: 3.divides(7)
False
# 素数集合
sage: P = Primes()
sage: P
Set of all prime numbers: 2, 3, 5, 7, ...
sage: P.unrank(0)   # 第k个素数
2-
sage: P.unrank(10)
31
sage: P.next(31)    # 大于x的下一个素数
37
sage: prime_pi(100) # 小于等于x的素数个数
25
sage: gcd(75, 48)   # 最大公约数
3
sage: xgcd(75, 48)  # 扩展欧几里得
(3, -7, 11)
sage: lcm(6, 9)     # 最小公倍数
18
# 因式分解
sage: factor(60)
2^2 * 3 * 5

密码学数学基础(一)整除
https://shuusui.site/blog/2024/07/17/crypto-math-1/
作者
Shuusui
发布于
2024年7月17日
更新于
2024年12月7日
许可协议