在超过十亿位的任意精度浮点算法中,在两个基数之间进行转换的最快方法

Fastest way to convert between two bases in arbitary precision floating point arithmetic for over a billion digits

目前将 2 ^ 64 转换为任何其他基数的最快方法是什么? "any other base",我的意思是 任何 小于 2 ^ 64 本身的基数。我认为它使用基于分而治之的方法和 Bernstein 缩放的剩余树?
更多细节:我特别想为 IsItNormal 的未来版本转换不同基数的超过 10 亿位的一些著名常量。 我可以使用两种方法:
1. 在我希望的每个基数中计算该常数的十亿位。
2. 从某处(例如 y-cruncher)获取数字,然后转换为我希望的每个基数。
我打算使用方法 #2,因为它看起来更快。

据我所知,它可以在 O(N*log(N)) 操作中完成,使用 FFT 进行大整数乘法和快速 sqrt 算法。基本思路如下。

step 1. 对于基数b1的k位大整数X,求出两个整数Y&Z,使得Y&Z的位数都不超过k/2,且X=Y*Y+ Z. (注意 Z 可以是负数)。这可以简单地通过执行 sqrt(X) 操作来完成,然后让 Y 是 sqrt(X) 的最接近整数,Z 是余数。

步骤 2。使用步骤 1 递归地将 Y 和 Z 从基数 b1 转换为基数 b2。

步骤 3. 再次使用公式 X=Y*Y+Z 计算基数 b2 中的 X;

那么剩下的就是如何在O(N*log(N))时间内对X进行sqrt(X),方法如下:

让 x0 = sqrt(X) 的估计; 继续做 x0 = (X/x0 + x0)/2 直到收敛;

这里又出现了另一个问题:如何在 O(N*log(N)) 时间内计算 1/X ?方法是:

令 x0 = 1/X 的估计值; 一直做 x0 = (2-X*x0)*x0 直到收敛;

使用 FFT 在 O(Nlog(N)) 中计算大数乘法然后整个算法可以优化为 O(Nlog(N)).