我需要一种(相当)快速的方法来获取我的代码的以下内容。 背景:我必须使用数字及其产品的功能,所以我决定使用日志。 现在我需要一种方法将日志转换回整数。
我不能只拿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)步骤。 还有更好的方法吗?
答案 0 :(得分:2)
虽然使用大量数据作为日志通常是一种很好的方法,但它在这里不起作用。问题是在日志空间中工作会丢弃最不重要的数字,因此您丢失了信息,并且无法返回。在mod空间中工作也会丢弃信息(否则你的数字会变得很大,正如你所说的那样),但它却抛弃了最重要的信息。
对于您的特定问题POWERMUL
,我要做的是计算从1
到N
的数字的主要因子分解。你必须小心谨慎,因为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 的每一步。这样,您永远不会超出系统的整数大小限制。