C++ PowerMod函数适用于小整数,但不适用于大整数

C++ PowerMod函数适用于小整数,但不适用于大整数,c++,math,biginteger,public-key-encryption,modular-arithmetic,C++,Math,Biginteger,Public Key Encryption,Modular Arithmetic,以下是我使用以下方法实现的PowerMod函数: #包括 #包括 使用名称空间std; 模板 整数iPowerMod(整数和n、整数和p、整数和b) { 如果(n>b){n.Div(b,n);} 整数iOut=“1”; 整数iOutk=n; 整数pref=“1”; 整数ptemp=p; 整数因子=“2”; while(ptemp!=0) { while((factor*pref)b){iOutk.Div(b,iOutk);} pref.Mul(2); } iOut.Mul(iOutk); 如果(

以下是我使用以下方法实现的PowerMod函数:

#包括
#包括
使用名称空间std;
模板
整数iPowerMod(整数和n、整数和p、整数和b)
{
如果(n>b){n.Div(b,n);}
整数iOut=“1”;
整数iOutk=n;
整数pref=“1”;
整数ptemp=p;
整数因子=“2”;
while(ptemp!=0)
{
while((factor*pref)b){iOutk.Div(b,iOutk);}
pref.Mul(2);
}
iOut.Mul(iOutk);
如果(iOut>b){iOut.Div(b,iOut);}
iOutk=n;
ptemp-=pref;
pref=“1”;
}
返回iOut;
}
int main()
{
ttmath::UInt n,p,b;
n=“52526321452369856214521”;
p=“731779601467”;
b=“40420472400259202128651”;

我敢打赌问题在于你经常使用:

  i.Div(b,i)
(如果我阅读正确)应该计算:

  i /= b

同时,

这可能适用于适合单个32位字的值,但对于多个字的值,这将是一个可怕的错误


我想找一个带文档的库。

这是一个练习,还是你真的打算用这个应用程序来保护机密?如果是后者,不要自己编写密码。有太多的方法会出错(请参阅OpenSSL中的最新漏洞以获取证据,这是一个由真正了解密码的人编写的库)。有趣的是!我只是感到紧张,以防人们认为他们可以正确地完成它(编写密码是安全工程中的一个简单部分).好的。不是答案,但请看这里://。我发布的代码适用于BigInteger(我在自己的BigInteger库中使用它),并且不能再使用任何技巧进行优化。它已经进行了大量优化。因此,也许您应该先尝试正确的方法(生成正确的结果)然后开始优化?不管怎样,Mathematica认为结果应该是什么,你得到了什么?对于多个字的值来说,这一点都不会错得可怕。我打赌大多数BigInteger实现都有这样的函数。我知道的那些都可以很好地工作。@RudyVelthuis:the(土生土长的)我在上一份工作中使用的一个不会很好地处理。任何严肃的BigInteger库都会很好地处理。我认为
ttmath
也应该能够处理。FWIW,我也有,而且它肯定没有问题(这里称为什么)<代码> DivMod < /代码>非常大的整数。@ SayaANTANSATRA:你看了我在我的评论中提到的链接吗?<代码> MODPOWER()/>代码描述的很好,我的代码是在Delphi中,主要是与C++不兼容的语言。我怀疑你能用它,除非你有NavaCabo C++ C++ Builder,它可以读取对象Pascal文件。
  i /= b
  i %= b;