C++中RSA中算次方的那个怎么求余啊,他老提示小数不行
2个回答
展开全部
模幂运算无需将幂算出再取模,那样中间结果太大,效率很低。如果需要自己实现模幂算法,请参见高爷爷的大作《计算机程序设计艺术(第二卷)》,幂指数按二进制位扫描,可以从低到高,也可以从高到低,两者计算法略微不同,这里给出从低到高扫描的方法,遇到bit1,则执行if里面的运算,否则,a平方并模m
程序没做太多的参数检查,例如m为0的情况,也没做优化,比如a是0或者1的情况。因为不是大数模幂,没有做滑动窗口、蒙哥马利算法之类的优化,直来直去直接计算。程序功能是计算a ^ p mod m,前提是这三个数都是unsigned int能装得下的
unsigned int mod_exp(unsigned int a, unsigned int p, unsigned int m)
{
unsigned int res = 1;
for (a = a % m; p != 0; p >>= 1)
{
if ((p & 0x01) != 0)
{
res = (res * a) % m;
}
a = (a * a) % m;
}
return res;
}
如果a、p、m都是大数(64bits以上),还是借助大数库比较好,很多密码学的库、ssl库等等都带,比如openssl、crypto++等等
程序没做太多的参数检查,例如m为0的情况,也没做优化,比如a是0或者1的情况。因为不是大数模幂,没有做滑动窗口、蒙哥马利算法之类的优化,直来直去直接计算。程序功能是计算a ^ p mod m,前提是这三个数都是unsigned int能装得下的
unsigned int mod_exp(unsigned int a, unsigned int p, unsigned int m)
{
unsigned int res = 1;
for (a = a % m; p != 0; p >>= 1)
{
if ((p & 0x01) != 0)
{
res = (res * a) % m;
}
a = (a * a) % m;
}
return res;
}
如果a、p、m都是大数(64bits以上),还是借助大数库比较好,很多密码学的库、ssl库等等都带,比如openssl、crypto++等等
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询