Algorithm 二的幂得到一个整数

Algorithm 二的幂得到一个整数,algorithm,integer,exponentiation,Algorithm,Integer,Exponentiation,我需要一个(相当)快速的方法来获得以下代码。 背景:我必须处理数字的幂和它们的乘积,所以我决定使用日志。 现在我需要一种将日志转换回整数的方法 我不能只接受2^log\u val(我正在使用logbase 2),因为答案太大了。事实上,我需要给出给定M的mod M的答案 我试过这么做。我把log_val写成p+q,其中q是一个浮点,q

我需要一个(相当)快速的方法来获得以下代码。 背景:我必须处理数字的幂和它们的乘积,所以我决定使用日志。 现在我需要一种将日志转换回整数的方法

我不能只接受2^log\u val(我正在使用logbase 2),因为答案太大了。事实上,我需要给出给定M的mod M的答案

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

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

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

虽然处理大量数据作为日志通常是一个好方法,但在这里不起作用。问题是在日志空间中工作会丢弃最低有效数字,因此您丢失了信息,无法返回。在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


玩得开心:)

M是固定的吗?根据您拥有的内存量和所需的精度,您可以将取整的
2^q
值存储在预先计算的表中。不,实际上,我有许多不同的M。q是一个浮点数,当所有的操作都完成时,浮点数仍然是32位的值,所以它们可以用作查找表的索引。但是,根据所需的精度,您可以将
p+q
存储为64位定点数字,其中包含32位分数部分和32位整数部分。更好的是,一旦这样做,您可以尝试此处解释的方法。您试图解决的原始问题是什么?也许日志不是朝着正确的方向迈出的一步。不,我需要mod M。是的,我需要这样做,但我如何将一个数字取为实幂模M?是的,确切地说:你将如何进行模幂运算?:-)一个整数到一个整数的模幂运算很容易,但是一个整数到一个浮点数的模幂运算呢?问题不在于幂运算,而在于除法。对n个数进行素数分解的最佳方法是什么?在10^5之前大约有10^4个素数,使用埃拉托斯烯筛通常是最快的。然而,多想想你的问题,你可能会想出一个更快的方法。考虑“2^2*4^4*6^6中有多少个二的因子…”等等。是的,但这仍然是10^5*10^4素数=O(10^9)步使用我之前评论的技巧,你没有得到
10^5
的因子。在固定时间内(用笔和纸),我计算出2除以“1^1*2^2*3^3*…*(10^5)^(10^5)”5000265024次。(实际上是logN time)。是的,但我还需要每隔一个素数除以它多少次,而10^5来自这样一个事实:对于所有r