我有一个数十万字符长的以 n 为底的(无符号)整数。
如何将此数字(从文件中读取的字符串)转换为 2-256 之间的任何基数?当然是在合理的时间内。
GMP 库仅支持碱基 2-62。
GMP 对非常大的整数使用聪明的分治基数变化算法。
使用相同的基本思想做一些事情并不难。调用您的基数r
和输入的数字x
。
让rp[i] = r^(2^i)
每个i
直到rp[i]
具有原始数字的一半左右的位数;叫最后一个rp[n-1]
。减少你的模数rp[n-1]
。那么高2^(n-1)
基数r
是x / rp[n-1]
转换为r
基数的基数,低基数r
是x % rp[n-1]
转换成基数的基数r
。请注意,您只需计算rp
一次。
这比一次提取单个数字更有效,因为我们将一个位数减少k
为两个大致k/2
位数,而不是一个log(r)
位数和一个k-log(r)
位数。