跳到主要内容

WTF zk教程第5讲:模运算基础

这一讲,我们将探讨模运算(Modular Arithmetic),我们在密码学领域会经常用到。

1. 取模运算

取模运算(modulo)是一种整数运算,它通过对一个整数进行欧几里得除法获得余数,将结果限定在一个固定的范围内。

我们通常使用符号 mod\text{mod} 来表示取模/取余,例如 amodna \mod n 表示整数 aann 进行取模运算,也就是 aa 除以 nn 的余数。这里 nn 被称为模数(modulus)。

先举几个简单的例子:

17mod5217 \mod 5 \equiv 2

25mod7425 \mod 7 \equiv 4

69mod23069 \mod 23 \equiv 0

我们可以用python实现取模运算:

def mod(a, b):
remainder = a % b
if remainder < 0:
# 调整余数确保非负
remainder += abs(b)
return remainder

a = 17
b = 5
remainder = mod(a, b)
print(f'{a} mod {b} = {remainder}')
# 17 mod 5 = 2

a = 25
b = 7
remainder = mod(a, b)
print(f'{a} mod {b} = {remainder}')
# 25 mod 7 = 4

a = 69
b = 23
remainder = mod(a, b)
print(f'{a} mod {b} = {remainder}')
# 69 mod 23 = 0

我们使用的24小时计时法也是取模运算的应用。比如当前是12点,20小时过后是不是32点,而是 32mod24832 \mod 24 \equiv 8 点。大家可以算一下,再过69小时是几点呢?

2. 同余

同余是一种关系,在密码学中有广泛应用。在给定模数 nn 的情况下,如果两个整数 aabb 取模后的结果相等,我们就称它们在模 nn 下是同余的。记为:

ab(modn)a \equiv b \pmod{n}

比如在模数 33 下,4 和 7 的余数均为 1,因此它们在模 3 下是同余的,写为 47(mod3)4 \equiv 7 \pmod{3}。但是在另一个模数 55 下,它们就不同余了,因此确认同余关系时必须给出模数。

2.1 同余的性质

  1. 反身性:在任何模 n 下,整数 aa 与自己本身同余。可以写为 aa(modn)a \equiv a \pmod{n}

  2. 对称性:如果在模 n 下 aabb 同余,那么 bbaa 也同余。可以写为:如果 ab(modn)a \equiv b \pmod{n},那么 ba(modn)b \equiv a \pmod{n} 成立。举个例子, 47(mod3)4 \equiv 7 \pmod{3},同时 74(mod3)7 \equiv 4 \pmod{3}, 它们除以3的余数都是1。

  3. 传递性:如果 aabb 同余且 bbcc 同余,那么 aacc 也同余。可以写为:如果 ab(modn)a \equiv b \pmod{n}bc(modn)b \equiv c \pmod{n},那么有 ac(modn)a \equiv c \pmod{n}。举个例子, 47(mod3)4 \equiv 7 \pmod{3}710(mod3)7 \equiv 10 \pmod{3}, 那么有 410(mod3)4 \equiv 10 \pmod{3}

这三个性质都很好证明,大家可以试着写一下。提示:用欧几里得除法将 a,ba, b 展开,如果它们同余,则有:

a=pn+ra=pn+r
b=qn+rb=qn+r

2.2 剩余类

我们用符号 ZnZ_n 表示模 nn 的剩余类,它是 00n1n-1 所有整数的集合:

Zn={0,1,2,,n1}Z_n = \{0, 1, 2, \ldots, n-1\}

任何整数 aann 取模的结果都会落在 ZnZ_n 中。也就是说,对于任意整数 aa,都存在 bZnb \in Z_n,使得 ab(modn)a \equiv b \pmod{n}。利用同余关系,我们可以把无限个整数的模运算,映射到 n 个整数的 ZnZ_n 的运算中。

以24小时计时法为例,任何时间都会落在 Z24Z_{24} 中,比如 32mod24=832 \mod 24 = 856mod24=856 \mod 24 = 8

我们会在之后的教程中更系统的介绍剩余类,现在大家只要有个概念就可以。

3. 基础模运算

  1. 平移:对于任何整数 kk,如果 ab(modn)a \equiv b \pmod{n},那么 a+kb+k(modn)a+k \equiv b+k \pmod{n}。当 k<0k < 0 时,它的效果就是减法。

    例子: 47(mod3)4 \equiv 7 \pmod{3},两边同时加 4,我们得到 811(mod3)8 \equiv 11 \pmod{3},仍然成立。

  2. 缩放:对于任何整数 kk,如果 ab(modn)a \equiv b \pmod{n},那么 akbk(modn)a \cdot k \equiv b \cdot k \pmod{n}

    例子: 47(mod3)4 \equiv 7 \pmod{3},两边同时乘 4,我们得到 1628(mod3)16 \equiv 28 \pmod{3},仍然成立。

  3. 加法:如果 a1a2(modn)a_1 \equiv a_2 \pmod{n}b1b2(modn)b_1 \equiv b_2 \pmod{n},那么有 a1+b1a2+b2(modn)a_1 + b_1 \equiv a_2 + b_2 \pmod{n}

    例子: 47(mod3)4 \equiv 7 \pmod{3},且 25(mod3)2 \equiv 5 \pmod{3},我们将两边相加,得到 612(mod3)6 \equiv 12 \pmod{3},仍然成立。

  4. 乘法:如果 a1a2(modn)a_1 \equiv a_2 \pmod{n}b1b2(modn)b_1 \equiv b_2 \pmod{n},那么有 a1b1a2b2(modn)a_1 b_1 \equiv a_2 b_2 \pmod{n}

    例子: 47(mod3)4 \equiv 7 \pmod{3},且 25(mod3)2 \equiv 5 \pmod{3},我们将两边相乘,得到 835(mod3)8 \equiv 35 \pmod{3},仍然成立。

  5. 如果 d=gcd(k,n)d=\gcd(k,n),且 kakb(modn)k \cdot a \equiv k \cdot b \pmod{n},那么有 ab(modn/d)a \equiv b \pmod{n/d},即 aabb 在模 n/dn/d 下同余。

    例子: 202(mod6)20 \equiv 2 \pmod{6},且 gcd(2,6)=2\gcd(2, 6) = 2,我们将两边和模同除以 22,得到 101(mod3)10 \equiv 1 \pmod{3},仍然成立。

  1. 如果整数 kknn互质,即 gcd(k,n)=1\gcd(k,n) = 1,且 kakb(modn)k \cdot a \equiv k \cdot b \pmod{n} ,那么有 ab(modn)a \equiv b \pmod{n}

    例子:已知 814(mod3)8 \equiv 14 \pmod{3},且 gcd(2,3)=1\gcd(2, 3) = 1,我们将等式两边同除以 22,得到 47(mod3)4 \equiv 7 \pmod{3},仍然成立。

4. 二次剩余

在数论中,若整数 qq 与某个数的平方模 nn 同余,即存在 xx 满足 x2q(modn)x^2\equiv q\pmod{n} ,那么称 qqnn 的二次剩余(Quadratic Residues),否则是非二次剩余。通俗来讲,就是看 qq 在模 nn 的情况下会不会是某个数的平方?

那么如何找到 nn 的全部二次剩余呢?答案是枚举 1q11\sim q-1 ,计算他们在平方之后模 nn 是否等于 qq 。请看下面例子:

# 判断ints中的数是否是p的二次剩余,打印出其最小的模p平方根
p = 29
ints = [14, 6. 11]
qr = [a for a in range(p) if pow(a, 2, p) in ints]
print(min(qr))
  • 关于模 nn 的所有二次剩余

    注意到 x2modn(nx)2modnx^2\mod n\equiv (n-x)^2\mod n ,所以关于模 nn 的所有二次剩余不可能超过 n/21n/2-1 ,因为对称。

  • 关于 nn 为质数的情况,记 nnpp

    若 p=2 ,则所有的整数都是它的二次剩余。

    若 p 为奇质数,p 的二次剩余共有 (p+1)/2(p+1)/2 ,剩余的 (p1)/2(p-1)/2 是二次非剩余

二次剩余的性质:

  1. 两个二次剩余的乘积仍然是二次剩余。
  2. 二次非剩余乘以二次非剩余的结果是二次剩余。
  3. 二次剩余乘以二次非剩余的结果是二次非剩余

勒让德符号(Legandra symbol):

(an)={0,如果a0(modp)1,如果存在p的二次剩余1,如果不存在p的二次剩余(\frac{a}{n})=\begin{cases} 0,& 如果a\equiv 0\pmod p\\ 1,& 如果存在p的二次剩余\\ -1,& 如果不存在p的二次剩余 \end{cases}

欧拉判别准则:设 pp 是奇素数, aa 为整数且 gcd(a,p)=1gcd(a, p)=1 。则 (ap)ap12(modp)(\frac{a}{p})\equiv a^{\frac{p-1}{2}}\pmod p 。这样可以快速判断 a 是否是奇质数 p 的二次剩余。

5. 总结

这一讲,我们介绍了取模运算的定义,同余,基础模运算以及二次剩余。模运算看起来很陌生,但其实它在生活中无处不在,只是你没有发觉而已。你能说出几个模运算在生活中的应用呢?