boost-multiprecision cpp_int 的最高限制是多少?

Posted

技术标签:

【中文标题】boost-multiprecision cpp_int 的最高限制是多少?【英文标题】:What is the highest limit for boost-multiprecision cpp_int? 【发布时间】:2019-06-13 14:31:19 【问题描述】:

我正在处理大型半素数的因式分解。我正在研究 Java,但我也很想探索其他选项。我知道 C++ Boost 多精度支持大数。

我从 Boost 页面找到了以下信息:

typedef number<cpp_int_backend<128, 128, unsigned_magnitude, unchecked, void> >   uint128_t;
typedef number<cpp_int_backend<256, 256, unsigned_magnitude, unchecked, void> >   uint256_t;
typedef number<cpp_int_backend<512, 512, unsigned_magnitude, unchecked, void> >   uint512_t;
typedef number<cpp_int_backend<1024, 1024, unsigned_magnitude, unchecked, void> > uint1024_t;

我的问题是,cpp_int 类型的最大数量限制是多少?在 Java 中,BigInteger 最多支持 2^Integer.MAX_VALUE。

谢谢。

【问题讨论】:

【参考方案1】:

cpp_int 没有 [理论] 最大值

请务必记住,在 Java 中,值的最大大小受 Java 虚拟机表示值的物理限制的限制。在底层实现中,Java(可能)用类似这样的方式实现BigInteger

public class BigInteger 
    private long[] bits;//limited by the maximum size of an array in Java
    /*...*/

免责声明:我不知道他们是使用long[]还是int[]来存储位。

类似地,在 C++ 中,cpp_int 是,一旦你刮掉抽象,用非常相似的结构实现:

class boost::multiprecision::cpp_int 
    uint64_t * bits;
    uint64_t * end; //Points to the element-after-the-last in bits
    /*...*/
;

再次声明:他们可能会做一些比这更聪明的事情。

Java 的理论限制是 JVM 对数组大小设置了硬上限 Integer.MAX_VALUE,因为数组是用 int 而不是 long 索引的。 C++ 可以直接使用指针,因此 C++ 中cpp_int 的最大大小与指针可以寻址的最大内存范围成正比——在 64 位架构中通常是但不总是 264-1;或者换句话说,cpp_int 的最大值是 2264-1-1,根据他们如何实现签名。

在支持更大指针(或可以寻址更大范围内存的指针)的环境中,最大值可能更大。

实际上,cpp_int(以及 Java 的BigInteger,就此而言)的最大值是允许您的运行时环境分配多少内存的实际限制。

【讨论】:

在这种情况下,uint128_t、uint256_t、uint512_t 和 uint1024_t 有什么区别? @Xirema @ManojBanik 这些名称似乎不言自明:它们都是大小为 X 位的无符号整数,其中 X 为 uintX_t,因此每个数字的最大值应为 2X-1

以上是关于boost-multiprecision cpp_int 的最高限制是多少?的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp leetcode_238.cpp

c_cpp esp8266_telegram.cpp

c_cpp 2d_matrix_2.cpp

如何从 cpp_dec_float_50 转换为 cpp_int?一般关于浮点数?

一个工程中cpp文件的编译顺序

C/C++18_mysql.h,_mysql.cpp