公钥密码学的一个核心:
x
e
m
o
d
m
x^e \bmod m
xemodm
大名鼎鼎的RSA算法即使用该公式代表的大素数分解问题,在一般应用场景中,x、e和m都是非常大的整数,比如2048个bit位,下面用一个简单的例子说明计算过程。
Example:
2
8
m
o
d
7
2^8\bmod 7
28mod7
计算
3
8
3^8
38在模数7中等价类中最小的正数,一种方式是直接计算:
2
8
=
256
≡
4
m
o
d
7
2^8=256\equiv 4 \bmod 7
28=256≡4mod7
显然,这样计算是十分困难的,因为首先需要计算2的8次幂,然后除7得到余数。因此,可以利用模运算中等价类的性质,即对于一个给定模数m,选择等价类中任何一个元素用于计算的结果都是一样的。
那么,首先执行两个部分指数运算:
2
8
=
2
4
⋅
2
4
=
16
⋅
16
2^8=2^4\cdot2^4=16\cdot16
28=24⋅24=16⋅16
然后将中间结果16替换为同一等价类中的其他元素,对16来说,在模7中最小的正等价元素是2,因为
16
=
2
⋅
7
+
2
16=2\cdot7+2
16=2⋅7+2,有:
2
8
=
16
⋅
16
≡
2
⋅
2
=
4
m
o
d
7
2^8=16\cdot16\equiv2\cdot2=4\bmod7
28=16⋅16≡2⋅2=4mod7
现在,我们可以轻而易举地算出,最后结果为
4
≡
4
m
o
d
7
4\equiv4\bmod7
4≡4mod7
然而,为何等价类中所有成员的行为等价,具体到例子中,为何可以让2代替16进行运算呢?话不多说,直接上图,数形结合:
两个16相乘,得到16个16,其中包含16个2和32个7,在模运算中,7可以直接去掉了,剩下16个2,也就是14个2和2个2相加,此时14个2可以看作4个7,又可以去掉了,最后剩2个2,也就是4,即最终结果。
如果您能清楚地认识到这一点,这将为您的模运算能力更上一层,我用另一个角度再次阐述这个特性:
1.如果是模运算中的加法,很显然,各个等价类得到的结果相同,任何一个数都可以拆分为
n
⋅
m
+
a
n\cdot m+a
n⋅m+a其中m为模数,a 为余数。可以把所有的加法施加到余数a上去,当和数超过模数时,减去模数的整数倍直到和数低于模数。
2.模运算中的乘法,
(
n
⋅
m
+
a
)
⋅
k
(n\cdot m + a) \cdot k
(n⋅m+a)⋅k显然相乘时乘数
k
k
k 不仅仅要作用于被乘数中的余数
a
a
a ,还要作用于模数的整数倍
n
⋅
m
n\cdot m
n⋅m ,但对于模数的整数倍部分,乘后得数
k
⋅
n
⋅
m
k\cdot n \cdot m
k⋅n⋅m依然是模数
m
m
m 的整数倍,也就是说我们只需要关注余数
a
a
a 和 乘数
k
k
k 得数的部分。现在,请考虑这个问题,余数
a
a
a 是不是就是原数
n
⋅
m
+
a
n\cdot m + a
n⋅m+a 的一个等价类?进一步延伸,其余的等价类是否可以写为
(
n
+
b
)
⋅
m
+
a
(n+b)\cdot m + a
(n+b)⋅m+a,其余等价类再乘
k
k
k 是否能得到同样的结果呢?