计算模m的k次根
快速幂可以在log时间内求得一个数模m的k次幂
那么反过来呢? 即计算模m的k次根
xk≡b mod mxk≡b mod m
已知k,b,mk,b,m,计算xx的值。
如果我们枚举的值,当m很大时,会耗费很长时间。
那么如何快速求解呢?
比如现在要求解同余式
x131≡758(mod 1073)x131≡758(mod 1073)
先求出φ(1073)=1008φ(1073)=1008, 构造一个不定方程131x−1008y=1131x−1008y=1
求解最小的正整数xx,得,即131∗731=1008∗y+1131∗731=1008∗y+1
将(2)式两边做731幂得,x∗x1008y=(x131)731≡758731(mod 1073)x∗x1008y=(x131)731≡758731(mod 1073)
而x1008y≡1 (mod 1073)x1008y≡1 (mod 1073) 这里x与1073要互质,即x,b与m要互质。
所以x≡758731 (mod 1073)x≡758731 (mod 1073)
可见欧拉定理在这里的应用很重要。
下面总结一下:
算法17.1 (计算模m的k次根原理) 设b,k,m是已知整数,满足
gcd(b,m)=1与gcd(k,φ(m))=1gcd(b,m)=1与gcd(k,φ(m))=1
求解步骤如下:
- 求解φ(m)φ(m)
- 求满足ku−φ(m)v=1ku−φ(m)v=1的正整数uu
- 用快速幂计算 所得值给出解xx
此算法的瓶颈在于第一步,即对的质因数分解,复杂度是O(n−−√)O(n)
当然也有Pollard_RhoPollard_Rho质因数分解算法
而大整数难以分解的特性,是许多密码设计的基础。