WTF zk教程第5讲:模运算基础 这一讲,我们将探讨模运算(Modular Arithmetic),我们在密码学领域会经常用到。
1. 取模运算 取模运算(modulo)是一种整数运算,它通过对一个整数进行欧几里得除法获得余数,将结果限定在一个固定的范围内。
我们通常使用符号 mod \text{mod} mod 来表示取模/取余,例如 a m o d n a \mod n a mod n 表示整数 a a a 对 n n n 进行取模运算,也就是 a a a 除以 n n n 的余数。这里 n n n 被称为模数(modulus)。
先举几个简单的例子:
17 m o d 5 ≡ 2 17 \mod 5 \equiv 2 17 mod 5 ≡ 2
25 m o d 7 ≡ 4 25 \mod 7 \equiv 4 25 mod 7 ≡ 4
69 m o d 23 ≡ 0 69 \mod 23 \equiv 0 69 mod 23 ≡ 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 } ' ) a = 25 b = 7 remainder = mod ( a , b ) print ( f' { a } mod { b } = { remainder } ' ) a = 69 b = 23 remainder = mod ( a , b ) print ( f' { a } mod { b } = { remainder } ' )
我们使用的24小时计时法也是取模运算的应用。比如当前是12点,20小时过后是不是32点,而是 32 m o d 24 ≡ 8 32 \mod 24 \equiv 8 32 mod 24 ≡ 8 点。大家可以算一下,再过69小时是几点呢?
2. 同余 同余是一种关系,在密码学中有广泛应用。在给定模数 n n n 的情况下,如果两个整数 a a a 和 b b b 取模后的结果相等,我们就称它们在模 n n n 下是同余的。记为:
a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) 比如在模数 3 3 3 下,4 和 7 的余数均为 1,因此它们在模 3 下是同余的,写为 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) 。但是在另一个模数 5 5 5 下,它们就不同余了,因此确认同余关系时必须给出模数。
2.1 同余的性质 反身性:在任何模 n 下,整数 a a a 与自己本身同余。可以写为 a ≡ a ( m o d n ) a \equiv a \pmod{n} a ≡ a ( mod n ) 。
对称性:如果在模 n 下 a a a 与 b b b 同余,那么 b b b 与 a a a 也同余。可以写为:如果 a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) ,那么 b ≡ a ( m o d n ) b \equiv a \pmod{n} b ≡ a ( mod n ) 成立。举个例子, 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) ,同时 7 ≡ 4 ( m o d 3 ) 7 \equiv 4 \pmod{3} 7 ≡ 4 ( mod 3 ) , 它们除以3的余数都是1。
传递性:如果 a a a 与 b b b 同余且 b b b 与 c c c 同余,那么 a a a 与 c c c 也同余。可以写为:如果 a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) 且 b ≡ c ( m o d n ) b \equiv c \pmod{n} b ≡ c ( mod n ) ,那么有 a ≡ c ( m o d n ) a \equiv c \pmod{n} a ≡ c ( mod n ) 。举个例子, 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) 且 7 ≡ 10 ( m o d 3 ) 7 \equiv 10 \pmod{3} 7 ≡ 10 ( mod 3 ) , 那么有 4 ≡ 10 ( m o d 3 ) 4 \equiv 10 \pmod{3} 4 ≡ 10 ( mod 3 ) 。
这三个性质都很好证明,大家可以试着写一下。提示:用欧几里得除法将 a , b a, b a , b 展开,如果它们同余,则有:
2.2 剩余类 我们用符号 Z n Z_n Z n 表示模 n n n 的剩余类,它是 0 0 0 到 n − 1 n-1 n − 1 所有整数的集合:
Z n = { 0 , 1 , 2 , … , n − 1 } Z_n = \{0, 1, 2, \ldots, n-1\} Z n = { 0 , 1 , 2 , … , n − 1 } 任何整数 a a a 对 n n n 取模的结果都会落在 Z n Z_n Z n 中。也就是说,对于任意整数 a a a ,都存在 b ∈ Z n b \in Z_n b ∈ Z n ,使得 a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) 。利用同余关系,我们可以把无限个整数的模运算,映射到 n 个整数的 Z n Z_n Z n 的运算中。
以24小时计时法为例,任何时间都会落在 Z 24 Z_{24} Z 24 中,比如 32 m o d 24 = 8 32 \mod 24 = 8 32 mod 24 = 8 , 56 m o d 24 = 8 56 \mod 24 = 8 56 mod 24 = 8 。
我们会在之后的教程中更系统的介绍剩余类,现在大家只要有个概念就可以。
3. 基础模运算 平移:对于任何整数 k k k ,如果 a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) ,那么 a + k ≡ b + k ( m o d n ) a+k \equiv b+k \pmod{n} a + k ≡ b + k ( mod n ) 。当 k < 0 k < 0 k < 0 时,它的效果就是减法。
例子: 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) ,两边同时加 4,我们得到 8 ≡ 11 ( m o d 3 ) 8 \equiv 11 \pmod{3} 8 ≡ 11 ( mod 3 ) ,仍然成立。
缩放:对于任何整数 k k k ,如果 a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) ,那么 a ⋅ k ≡ b ⋅ k ( m o d n ) a \cdot k \equiv b \cdot k \pmod{n} a ⋅ k ≡ b ⋅ k ( mod n ) 。
例子: 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) ,两边同时乘 4,我们得到 16 ≡ 28 ( m o d 3 ) 16 \equiv 28 \pmod{3} 16 ≡ 28 ( mod 3 ) ,仍然成立。
加法:如果 a 1 ≡ a 2 ( m o d n ) a_1 \equiv a_2 \pmod{n} a 1 ≡ a 2 ( mod n ) 且 b 1 ≡ b 2 ( m o d n ) b_1 \equiv b_2 \pmod{n} b 1 ≡ b 2 ( mod n ) ,那么有 a 1 + b 1 ≡ a 2 + b 2 ( m o d n ) a_1 + b_1 \equiv a_2 + b_2 \pmod{n} a 1 + b 1 ≡ a 2 + b 2 ( mod n ) 。
例子: 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) ,且 2 ≡ 5 ( m o d 3 ) 2 \equiv 5 \pmod{3} 2 ≡ 5 ( mod 3 ) ,我们将两边相加,得到 6 ≡ 12 ( m o d 3 ) 6 \equiv 12 \pmod{3} 6 ≡ 12 ( mod 3 ) ,仍然成立。
乘法:如果 a 1 ≡ a 2 ( m o d n ) a_1 \equiv a_2 \pmod{n} a 1 ≡ a 2 ( mod n ) 且 b 1 ≡ b 2 ( m o d n ) b_1 \equiv b_2 \pmod{n} b 1 ≡ b 2 ( mod n ) ,那么有 a 1 b 1 ≡ a 2 b 2 ( m o d n ) a_1 b_1 \equiv a_2 b_2 \pmod{n} a 1 b 1 ≡ a 2 b 2 ( mod n ) 。
例子: 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) ,且 2 ≡ 5 ( m o d 3 ) 2 \equiv 5 \pmod{3} 2 ≡ 5 ( mod 3 ) ,我们将两边相乘,得到 8 ≡ 35 ( m o d 3 ) 8 \equiv 35 \pmod{3} 8 ≡ 35 ( mod 3 ) ,仍然成立。
如果 d = gcd ( k , n ) d=\gcd(k,n) d = g cd( k , n ) ,且 k ⋅ a ≡ k ⋅ b ( m o d n ) k \cdot a \equiv k \cdot b \pmod{n} k ⋅ a ≡ k ⋅ b ( mod n ) ,那么有 a ≡ b ( m o d n / d ) a \equiv b \pmod{n/d} a ≡ b ( mod n / d ) ,即 a a a 和 b b b 在模 n / d n/d n / d 下同余。
例子: 20 ≡ 2 ( m o d 6 ) 20 \equiv 2 \pmod{6} 20 ≡ 2 ( mod 6 ) ,且 gcd ( 2 , 6 ) = 2 \gcd(2, 6) = 2 g cd( 2 , 6 ) = 2 ,我们将两边和模同除以 2 2 2 ,得到 10 ≡ 1 ( m o d 3 ) 10 \equiv 1 \pmod{3} 10 ≡ 1 ( mod 3 ) ,仍然成立。
如果整数 k k k 和 n n n 互质,即 gcd ( k , n ) = 1 \gcd(k,n) = 1 g cd( k , n ) = 1 ,且 k ⋅ a ≡ k ⋅ b ( m o d n ) k \cdot a \equiv k \cdot b \pmod{n} k ⋅ a ≡ k ⋅ b ( mod n ) ,那么有 a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) 。
例子:已知 8 ≡ 14 ( m o d 3 ) 8 \equiv 14 \pmod{3} 8 ≡ 14 ( mod 3 ) ,且 gcd ( 2 , 3 ) = 1 \gcd(2, 3) = 1 g cd( 2 , 3 ) = 1 ,我们将等式两边同除以 2 2 2 ,得到 4 ≡ 7 ( m o d 3 ) 4 \equiv 7 \pmod{3} 4 ≡ 7 ( mod 3 ) ,仍然成立。
4. 二次剩余 在数论中,若整数 q q q 与某个数的平方模 n n n 同余,即存在 x x x 满足 x 2 ≡ q ( m o d n ) x^2\equiv q\pmod{n} x 2 ≡ q ( mod n ) ,那么称 q q q 是 n n n 的二次剩余(Quadratic Residues),否则是非二次剩余。通俗来讲,就是看 q q q 在模 n n n 的情况下会不会是某个数的平方?
那么如何找到 n n n 的全部二次剩余呢?答案是枚举 1 ∼ q − 1 1\sim q-1 1 ∼ q − 1 ,计算他们在平方之后模 n n n 是否等于 q q q 。请看下面例子:
p = 29 ints = [ 14 , 6. 11 ] qr = [ a for a in range ( p ) if pow ( a , 2 , p ) in ints ] print ( min ( qr ) )
关于模 n n n 的所有二次剩余
注意到 x 2 m o d n ≡ ( n − x ) 2 m o d n x^2\mod n\equiv (n-x)^2\mod n x 2 mod n ≡ ( n − x ) 2 mod n ,所以关于模 n n n 的所有二次剩余不可能超过 n / 2 − 1 n/2-1 n /2 − 1 ,因为对称。
关于 n n n 为质数的情况,记 n n n 为 p p p
若 p=2 ,则所有的整数都是它的二次剩余。
若 p 为奇质数,p 的二次剩余共有 ( p + 1 ) / 2 (p+1)/2 ( p + 1 ) /2 ,剩余的 ( p − 1 ) / 2 (p-1)/2 ( p − 1 ) /2 是二次非剩余
二次剩余的性质:
两个二次剩余的乘积仍然是二次剩余。 二次非剩余乘以二次非剩余的结果是二次剩余。 二次剩余乘以二次非剩余的结果是二次非剩余 勒让德符号(Legandra symbol):
( a n ) = { 0 , 如果 a ≡ 0 ( m o d p ) 1 , 如果存在 p 的二次剩余 − 1 , 如果不存在 p 的二次剩余 (\frac{a}{n})=\begin{cases} 0,& 如果a\equiv 0\pmod p\\ 1,& 如果存在p的二次剩余\\ -1,& 如果不存在p的二次剩余 \end{cases} ( n a ) = ⎩ ⎨ ⎧ 0 , 1 , − 1 , 如果 a ≡ 0 ( mod p ) 如果存在 p 的二次剩余 如果不存在 p 的二次剩余 欧拉判别准则:设 p p p 是奇素数, a a a 为整数且 g c d ( a , p ) = 1 gcd(a, p)=1 g c d ( a , p ) = 1 。则 ( a p ) ≡ a p − 1 2 ( m o d p ) (\frac{a}{p})\equiv a^{\frac{p-1}{2}}\pmod p ( p a ) ≡ a 2 p − 1 ( mod p ) 。这样可以快速判断 a 是否是奇质数 p 的二次剩余。
5. 总结 这一讲,我们介绍了取模运算的定义,同余,基础模运算以及二次剩余。模运算看起来很陌生,但其实它在生活中无处不在,只是你没有发觉而已。你能说出几个模运算在生活中的应用呢?