使用 boost 库 (cpp_int) 时出现常量太大的错误

Posted

技术标签:

【中文标题】使用 boost 库 (cpp_int) 时出现常量太大的错误【英文标题】:Getting constant too big error while using boost library (cpp_int) 【发布时间】:2020-05-16 16:54:44 【问题描述】:

当我尝试使用大整数时,我安装了 boost 库,但是当我尝试调试时,我得到常量太大的错误,而我认为 cpp_int 可以处理它吗? 你能看看我的代码和错误吗? 这是错误:

错误 C2177 常量太大 HW7 C:\Users\hmffa\source\repos\HW7\HW7.cpp 34 Error (active) E0023 integer constant is too large HW7 C:\Users\hmffa\source\repos\HW7\HW7.cpp 34

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>

using namespace std;
using namespace boost::multiprecision;


cpp_int Remainder(cpp_int base, cpp_int exp, cpp_int mod) 
    cpp_int r = 1;
    if (base < 0)
        base += mod;
    if ((base % mod) == 0)
        return r = 0;
    if (exp >= mod) 
        base = base % mod;
        exp = exp % (mod - 1);
    
    while (exp > 0) 
        if (exp % 2 == 1) 
            r = (r * base) % mod;
        
        exp = exp >> 1;
        base = (base * base) % mod;
    
    return r;




int main()

    int B[3] =  2,3,5 , C[3] =  0,0,0 ;
    cpp_int input = 2, pow = input, exp = 0, powerInput;
    cpp_int p= 30903154482632612361920641803533;
    int i = 0;
    while (i < 3) 
        exp++;
        powerInput = Remainder(input, exp, p);
        while (powerInput % B[0] == 0)
            C[0]++;
        while (powerInput % B[1] == 0)
            C[1]++;
        while (powerInput % B[2] == 0)
            C[2]++;
        for (int j = 0; j < 2; j++) 
            if (C[j] != 0)
                cout << C[j] << " ";
        
        cout << endl;
        if (C[0] != 0 || C[1] != 0 || C[2] != 0)
            i++;
    


【问题讨论】:

不管库能做什么,30903154482632612361920641803533 永远不会是你的编译器可以处理的常量/数字——它太大了。该库必须提供一些其他方式来初始化大量数字。我不知道 boost 在这里做了什么,但GMP 提供了一些方法来初始化不需要编译器无法处理的常量的数字——我希望 boost 有类似的东西。 【参考方案1】:

改变

cpp_int p= 30903154482632612361920641803533;

cpp_int p"30903154482632612361920641803533";

【讨论】:

您应该解释这两行代码之间的区别(调用基于字符串的构造函数)。 @JesperJuhl:您的评论已经说明了这一点;要将您的评论合并到我的答案中吗? @user14717 和 Jesper Juhl 感谢您的友好回复

以上是关于使用 boost 库 (cpp_int) 时出现常量太大的错误的主要内容,如果未能解决你的问题,请参考以下文章

用 cpp_int 构建一个大的 boost unordered_map

具有两个 cpp_int 值的 boost::multiprecision::pow

PyBind11:boost::multiprecision::cpp_int 到 Python

为啥在这里使用 boost::multiprecision::cpp_int 会影响尾调用优化

提升多精度 cpp_int 乘以浮点数

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