获得整数的2的幂

时间:2014-11-11 19:58:48

标签: algorithm integer exponentiation

我需要一种(相当)快速的方法来获取我的代码的以下内容。 背景:我必须使用数字及其产品的功能,所以我决定使用日志。 现在我需要一种方法将日志转换回整数。

我不能只拿2 ^ log_val(我正在使用log base 2)因为答案太大了。事实上,我需要给出给定M的答案mod M.

我试过这样做。我把log_val写为p + q,其中q是浮点数,q< 1是p,p是整数。 现在我可以使用log n指数和模数非常快地计算2 ^ p,但是我无法对2 ^ q做任何事情。我想做的是找到2的第一个积分幂,比如x,这样2 ^(x + q)非常接近整数,然后计算2 ^ p-x。

这对我来说太长了,因为在最坏的情况下我会采取O(p)步骤。 还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

虽然使用大量数据作为日志通常是一种很好的方法,但它在这里不起作用。问题是在日志空间中工作会丢弃最不重要的数字,因此您丢失了信息,并且无法返回。在mod空间中工作也会丢弃信息(否则你的数字会变得很大,正如你所说的那样),但它却抛弃了最重要的信息。

对于您的特定问题POWERMUL,我要做的是计算从1N的数字的主要因子分解。你必须小心谨慎,因为N相当大。

现在,如果您的号码为k且质数分解{2: 3, 5: 2},则k^m的因子分解为{2: m*3, 5:m*2}。分类同样变成减法。

一旦得到f(N)/(f(r)*f(N-r))的素数因子分解表示,就可以使用模乘法和取幂的组合重新创建整数。后者是一种很酷的查找技术。 (事实上​​,像python这样的语言内置了pow(3, 16, 7)=4

玩得开心:)

答案 1 :(得分:1)

如果您需要答案 mod N ,您通常可以执行整个计算 mod N 的每一步。这样,您永远不会超出系统的整数大小限制。