c++ - boost-multiprecision cpp_int 的最高限制是多少?
问题描述
我正在努力分解大的半素数。我正在研究 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。
谢谢你。
解决方案
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++ 可以直接使用指针,因此cpp_int
C++ 中的最大大小与指针可以寻址的最大内存范围成正比——在 64 位体系结构中通常是但不总是 2 64 -1;或者换句话说, 的最大值cpp_int
是 2 2 64 -1 -1,根据他们如何实现符号来取舍一个数量级。
在支持更大指针(或可以寻址更大范围内存的指针)的环境中,最大值可能更大。
cpp_int
在实践中, (以及 Java 的)的最大值BigInteger
是允许运行时环境分配多少内存的实际限制。
推荐阅读
- python - Pandas ExcelWriter 断开了来自 web 的 excel 外部连接
- javascript - Async/Await 函数执行顺序
- excel - Excel:运行时错误 70 权限被拒绝
- java - Spring Boot + REST 应用程序出现 404 错误
- javascript - 将箭头表中的时间戳列转换为 JS 日期
- php - PHP - 浮点算术运算
- python - 根据 pandas 中的输入动态构建结果数据框
- c# - 将 ICollection 批量插入到 Oracle 表中
- python - 使用python格式动态格式化字符串
- javascript - 数据表长度菜单问题