我对此很新,但我尝试使用Crypto ++ Library以模块化格式添加两个整数。
我的程序很简单,
AutoSeededRandomPool prng;
Integer r0, m;
m = Integer( prng, 64);
r0 = Integer( prng, 64);
cout << "m: " << std::hex << m << endl;
cout << "r0:" << std::hex << r0 << endl;
Integer n1(r0 + m);
但这根本行不通。它很好,但是当我试图运行它时崩溃了。
任何人都可以使用Crypto ++提供加/减的示例代码
答案 0 :(得分:1)
使用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
继承自{{3}}。它证实了乘法和取幂是操作(并且它产生了帮助,如Square
)。
我不清楚的是ModularArithmetic
提供Add
,Subtract
和朋友,但却达到了意想不到的结果的原因。很可能是它有效地累积了结果并等待Multiply
或Exponentiate
减少,但我在源代码中看不到任何注释。
编辑2
ModularArithmetic
似乎会为Add
,Subtract
和朋友产生不正确的结果的原因是该类对于特定问题是快速的,并且它不会使用完全减少欧几里德扩展算法。相反,它最多执行 一次减法。这意味着要由模数n
减少的累计值p
必须在[0, 2p)
范围内。