使用 Crypto++ 的模块化算术(加法/减法)
我们已经根据这个问题填补了一些缺失的文档空白,因此我不会讨论示例代码。改进后的文档可在 Integer Class Reference 和 Integer on the Crypto++ wiki 获得。
但是,使用ModularArithmetic class 可能会出现错误或(至少)意外结果。该类将自身描述为“模数同余类环”。在数学上,环是一个具有闭包和两个定义明确的操作的群。
断开是,这两个操作是ModularArithmetic<Integer> 中包含的操作。根据一些示例代码,它看起来像它的Multiply 和Exponentiate,这是最符合预期的(尽管它可能是Add 和Multiply)。
我不认为 Ring 的数学定义给了ModularArithmetic 产生意外结果的许可。然而,ModularArithmetic 是一种独特的,它可能会累积中间结果,然后必须使用Multiply 和Exponentiate 来减少这些结果。 (它确实会累积结果以加快操作)。
对我来说,悬而未决的问题是,我们该怎么做...我目前正在尝试就该问题征求一些反馈。
这是测试程序:
int main(int argc, char* argv[])
{
Integer m("4294967295"), n("0x1000000000000000000000000000000"), j;
j = 1999;
ModularArithmetic ma(j);
cout << "n+m mod j: " << ma.Add(n, m) << endl;
cout << " cross-check: " << (n+m) % j << endl;
cout << "n-m mod j: " << ma.Subtract(n, m) << endl;
cout << " cross-check: " << (n-m) % j << endl;
cout << "n*m mod j: " << ma.Multiply(n, m) << endl;
cout << " cross-check: " << (n*m) % j << endl;
cout << "n/m mod j: " << ma.Divide(n, m) << endl;
cout << " cross-check: " << (n/m) % j << endl;
cout << "n%m mod j: " << ma.Reduce(n, m) << endl;
cout << " cross-check: " << (n%m) % j << endl;
cout << "n^m mod j: " << ma.Exponentiate(n, m) << endl;
cout << " cross-check: " << a_exp_b_mod_c(n,m,j) << endl;
return 0;
}
结果如下:
$ ./test.exe
n+m mod j: 1329227995784915872903807064575309872.
cross-check: 1755.
n-m mod j: 1329227995784915872903807055985377281.
cross-check: 50.
n*m mod j: 266.
cross-check: 266.
n/m mod j: 599.
cross-check: 1997.
n%m mod j: 1329227995784915872903807055985377281.
cross-check: 1608.
n^m mod j: 1326.
cross-check: 1326.
编辑 1
断开连接是,ModularArithmetic<Integer>中包含哪两个操作...
所以我有机会浏览源代码和add more missing documentation。特别感兴趣的是AbstractRing< T > Class Template Reference,ModularArithmetic 继承自它。它确认了乘法和求幂是运算(它会产生辅助函数,例如 Square)。
我不清楚的是,为什么ModularArithmetic 提供Add、Subtract 和朋友却得到了意想不到的结果。很可能是它有效地累积结果并等待用Multiply 或Exponentiate 减少,但我在源代码中没有看到任何 cmets。
编辑 2
ModularArithmetic 似乎对Add、Subtract 和朋友产生错误结果的原因是该类旨在快速解决特定问题,并且它没有使用欧几里得扩展算法执行完全归约。相反,它最多执行一次减法。这意味着要减去模数p 的累加值n 必须在[0, 2p) 范围内。