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