为什么使用 GMP 的mpz_class铸造一个大的素数会导致不同的数字?



很简单,我已经将一个大字符串作为输入传递给GMP的mpz_class构造函数,该值是一个不同的整数。这些值是通过vs代码的调试器获取的。

来自主文件:

User john(1024, "340282366920938463463370103832140841039", "340282366920938463463370103832140841051", 17);

用户构造函数:

User::User(const int k, std::string p, std::string q, const int e) 
{
this->m_k = k;
this->m_p = mpz_class(p);
this->m_q = mpz_class(q); 
this->m_e = e;
this->m_N = this->m_p*this->m_q;
this->m_phi = (this->m_p - 1)*(this->m_q - 1);
}

预期的m_p值:340282366920938463463370103832140841039实际:18442240474082181199

预期m_q值:340282366920938463463370103832140841051实际:18442240474082181211

看起来这两个数字之间的差值仍然是12,但它们不是预期值。应当提及的是,ke都被正确地设置。

这种情况会变得更糟。

User monica(k, 
"79769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536000572708014448059344998673038813914022686832575861451235712608115812630507553330258219736187415555294488994451070856629343158126535469257597644947476477135408478542176849830316880553240227849994894682804453799",
"79769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536000572708014448059344998673038813914022686832575861451235712608115812630507553330258219736187415555294488994451070856629343158126535469257597644947476477135408478542176849830316880553240227849994894682804454189", 
65537);

在这种情况下,m_p == 423m_q == 813是非常遥远的!

我犯了一个简单的错误吗?谢谢你的帮助!

编辑:添加一个可重复的最小示例。

std::string pp = "79769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536000572708014448059344998673038813914022686832575861451235712608115812630507553330258219736187415555294488994451070856629343158126535469257597644947476477135408478542176849830316880553240227849994894682804453799";
mpz_class p(pp);
std::cout << p << 'n';

打印出来会得到原始数字,但vscode显示了某种压缩值。我想实际的问题在代码的其他地方。但是为什么VSCode会显示这样大的数字呢?

这似乎是一个vscode的事情,因为打印出mpz_class会得到原始数字,但在调试器中,我得到了一个奇怪的值。

我仍然不知道vscode为什么会这样做(可能与输入的大小有关(。

相关内容

  • 没有找到相关文章

最新更新