算法C / C ++:使用n和d 32或64位整数计算(2 ^ n)%d的最快方法

时间:2012-01-22 18:56:08

标签: c++ algorithm 32bit-64bit

我正在搜索一种算法,允许我使用 n和d 32或64位整数计算 (2^n)%d

问题是,即使使用多精度库,也不可能将2^n存储在内存中,但可能存在仅使用32位或64位整数来计算(2^n)%d的技巧。

非常感谢。

1 个答案:

答案 0 :(得分:24)

查看Modular Exponentiation algorithm

我们的想法是不计算2^n。相反,您在启动时会多次减少模数dThat 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