首页 文章

GMP最重要的数字

提问于
浏览
1

我正在使用GNU Multiple Precision(GMP)库对任意精度整数进行一些计算 . 然后我需要结果的十进制数字 . 但不是全部:只是,比方说,一百个最重要的数字(即数字开头的数字)或数字中间的选定数字范围(例如1000的数字100..200) -数字) .

有没有办法在GMP中做到这一点?
我在文档中找不到任何函数来提取一系列十进制数字作为字符串 . 将 mpz_t 转换为字符串的转换函数始终转换整个数字 . 人们只能指定基数,而不能指定开始/结束数字 .

有没有更好的方法来做到这一点,除了将整个数字转换为一个巨大的字符串只是为了拿一小块而扔掉其余的?

Edit: 我需要的不是控制我的数字的精确度或将其限制为特定的固定数字位数,而是从任意精度数的数字串中选择数字的子集 .
这是我需要的一个例子:

7^1316831 = 19821203202357042996...2076482743

实际的数字有1112852位,我收缩到 ... .
现在,我只需要任意选择这个庞大的数字串的子串 . 例如,十个 most significant 数字(在这种情况下为 1982120320 ) . 或者从1112841到1112849的数字(在这种情况下为 21203202 ) . 或者只是位于1112841位置的单个数字(在这种情况下为 2 ) .

如果我首先将我的GMP号码转换为带有 mpz_get_str 的十进制数字字符串,我将不得不为这些数字分配大量内存,只使用它们中的一小部分并丢弃其余部分 . (更不用说二进制表示中的原始 mpz_t 数字已经吃了很多 . )

2 回答

  • 1

    如果您事先知道 x = 7^1316831 的小数位数,例如1112852.那么您得到的是较低的,例如10位数字:

    x % (10^10) ,以及上面的20位数字:

    x / (10^(1112852 - 20)) .

    注意,后者我得到 19821203202357042995 ; 5 在最后,而不是 6 .

  • 1

    我认为你不能在GMP中做到这一点 . 但是你可以使用Boost Multiprecision Library

    根据数字类型,精度可能是任意大的(仅受可用内存限制),在编译时固定(例如50或100个十进制数字),或由成员函数在运行时控制的变量 . 这些类型是启用表达式模板的,以提供比天真的用户定义类型更好的性能 .

    强调我的

    另一个替代方案是ttmath,其类型为 ttmath::Big<e,m> ,您可以控制所需的精度

    如果你只需要最有效的数字,那么这些解决方案就可以了,因为它们也会降低浮动和双倍工作的低有效数字 . 使用GMP计算全精度不仅浪费了大量时间,还浪费了内存 . 考虑将另一个操作的结果存储在2个bigints上以获得所需数字所需的内存量 . 如果您修复了精度,那么现在内存使用量也是固定的 .

    例如,如果你需要高20位数,那么使用一个可以存储20位数字和更多数字的类型,比如四倍精度浮点数,以便提供足够的数据以便以后进行正确的舍入 . 如果您需要第100到第200个高位数字,则使用具有足够空间容纳201位数字的类型,并在计算后提取这101个数字 .

相关问题