N
的因数分解,那么计算浮点数 1/N
最快(最高效)的方法是什么?需要使用大浮点数(或整数)算术。我想在 C++ 中完成这个任务(或者在 Python 中进行实验运行)。
我的
N
非常庞大,大小为千兆/兆位。得到的浮点数 N
也应具有巨大的精度,约为初始 N
的位数。需要精确的浮点值,这意味着如果我请求浮点精度为
Log2(N)
位,则结果的至少 95%
的前导位应该是精确的(与理想值相同)。当然,如果有帮助和/或简化任务,可以计算整数除法
4^Ceil(Log2(N)) / N
,而不是浮点计算。对于我来说,这两个任务(整数和浮点)本质上是相同的,因为整数表示可转换为浮点表示,反之亦然。一个重要的注意事项是,
N
的因数分解只有小的素因子,它们都是 32 位大小(最多可能是 64 位)。我想知道是否拥有
N
的因数分解以及因子很小的事实,是否可以在解决任务时有所帮助?当然,我会首先尝试使用高度优化的GMP库来实现这个任务,而不是自己实现除法,但是(据我所知),它没有利用已经因式分解的事实。如果我要实现自己的函数来解决这个问题,并想通过实验弄清楚它是否比GMP更快,那么有人可以建议我使用什么样的算法吗?
我发现这里有3种算法可以使用:1)长除法,这是一种学校级别的算法。2)Barrett约减。3)Montgomery约减。
实际上,我不知道还有其他算法。你能推荐另外的算法吗?无论是Barrett还是Montgomery约减都只有在相同的质因子重复多次时才有帮助,否则单次除法不值得为Barrett和Montgomery预计算所需的工作量。
此外,Barrett/Montgomery约减仍然需要一次性计算
4^Ceil(Log2(N)) / PrimeDivisor
。所以它们并不能避免使用长除法算法。肯定对于长除法算法,我将使用基数
2^64
而不是学校里的基数10
。我已经使用长除法和其他整数算法以及椭圆曲线算法实现了自己的实验性库。目前它是通用的,因此不比GMP更快。现在我需要一种特殊的除法算法,它至少可以比GMP快几倍。
当然,在长除法中,如果有任何提升,我可以使用蒙哥马利和巴雷特,因为每一步都需要短除法(128位整数除以64位整数)。
此外,在长除法的每个步骤中,我可以使用快速傅里叶变换或数论变换进行乘法运算。
以上是我知道的唯一优化方法。是否还有其他可能的优化方式?也许FFT可以用于直接进行除法(而不仅仅是用于乘法)?
O(N Log(N))
的时间复杂度,这比学校级别的O(N^2)
算法要好得多,如果你有太比特位数的数字,那么这是一个非常巨大的改进。但是FFT只对大数字快速。也许类似地,对于长除法,存在真正快速的算法,比朴素的长除法更快,但仅适用于非常大的数字。我不知道是否存在这样的算法,但不久之前我也不知道FFT的存在。所以等待数学/算法大师的回复! - Arty