我正在搜索一种算法,允许我使用 n和d 32或64位整数计算 (2^n)%d
。
问题是,即使使用多精度库,也不可能将2^n
存储在内存中,但可能存在仅使用32位或64位整数来计算(2^n)%d
的技巧。
非常感谢。
答案 0 :(得分:24)
查看Modular Exponentiation algorithm。
我们的想法是不计算2^n
。相反,您在启动时会多次减少模数d
。 That keeps the number small.
将该方法与Exponentiation by Squaring结合使用,您只需(2^n)%d
步即可计算O(log(n))
。
以下是一个小例子:2^130 % 123 = 40
2^1 % 123 = 2
2^2 % 123 = 2^2 % 123 = 4
2^4 % 123 = 4^2 % 123 = 16
2^8 % 123 = 16^2 % 123 = 10
2^16 % 123 = 10^2 % 123 = 100
2^32 % 123 = 100^2 % 123 = 37
2^65 % 123 = 37^2 * 2 % 123 = 32
2^130 % 123 = 32^2 % 123 = 40