早教吧作业答案频道 -->数学-->
求一个高效的指数取模运算算法
题目详情
求一个高效的指数取模运算算法
▼优质解答
答案和解析
由于一个整数的指数结果很大,可能远远超出计算机处理范围,故必须简化计算方式.这里采用快速取模方法.原理为:在4的5次方运算中,5能够化作2*2+1,这是因为5的2进制数为101.所以4的5次方运算便能写作((4)^2*1)^2*4,其中1表示的是4的0次方,^2表平方.再运用模的性质:(a*b)mod(m)=(amod(m)*bmod(m))mod(m),所以(4^5)mod(m)可先化为(((4)^2*1)^2*4)mod(m),再化为(((4)^2mod(m)*1)^2mod(m)*4)mod(m).举例子--(4^5)mod(3)=(((4)^2*1)^2*4)mod(3)=((1*1)^2mod(3)*4)mod(3)=(1*4)mod(3)=1.该函数运行方式取于上述算法思想,首先将幂分解成2进制数,得到一个从幂的最低位数开始01组成的栈:分解b为2进制数.记录下分解成的位数z,构造栈
for(;b!=1;b>>=1)
{
z++;
if(b%2==0) l[z]=0;
else l[z]=1;}
然后出栈进行"(a^b)mod(c)"的运算.这里用栈的原因是为了使幂的2进制数排列倒过来,实现最高位上的2进制数能够循环它的位数次,最低位上的2进制数只循环一次.每次的循环得到平方取模的值,一直到结束,取得一个值,即(a^b)mod(c).
for(;z>0;z--)
{
if(l[z]) y=(y*a%c)*(y*a%c)%c;
else y=y*y%c;
}
if(l[0]) y=(y*a%c);//最后次模
return y;
这是一个比较快的运算方法.
完整源程序:
//指数取模:a的b次方modc=x
_int64 mod(_int64 a,_int64 b,_int64 c)//(a)^bmod(c)//条件1:在rsa中a=1)//分解b为2进制数.记录下分解成的位数z,构造栈l
{
z++;
if(b%2==0) l[z]=0;
else l[z]=1;
}
//a%=c;//如果一开始数就很大,先模一次,防止过大,求逆
y=a*a%c;//第一次模
for(;z>0;z--)
{
if(l[z]) y=(y*a%c)*(y*a%c)%c;
else y=y*y%c;
}
if(l[0]) y=(y*a%c);//最后次模
return y;
}
C#改写的,在vs.net 2005下调试通过:
///
/// 指数取模:x=(a^b)%c (a的b次方mod)
/// 条件1:在rsa中a= 1)//分解b为2进制数.记录下分解成的位数z,构造栈l
{
z++;
if (b % 2 == 0)
l[z] = 0;
else
l[z] = 1;
}
//a%=c;//如果一开始数就很大,先模一次,防止过大,求逆
y = a * a % c;//第一次模
for (; z > 0; z--)
{
if (l[z]>0) y = (y * a % c) * (y * a % c) % c;
else y = y * y % c;
}
if (l[0]>0) y = (y * a % c);//最后次模
return y;
} (参考百度)
for(;b!=1;b>>=1)
{
z++;
if(b%2==0) l[z]=0;
else l[z]=1;}
然后出栈进行"(a^b)mod(c)"的运算.这里用栈的原因是为了使幂的2进制数排列倒过来,实现最高位上的2进制数能够循环它的位数次,最低位上的2进制数只循环一次.每次的循环得到平方取模的值,一直到结束,取得一个值,即(a^b)mod(c).
for(;z>0;z--)
{
if(l[z]) y=(y*a%c)*(y*a%c)%c;
else y=y*y%c;
}
if(l[0]) y=(y*a%c);//最后次模
return y;
这是一个比较快的运算方法.
完整源程序:
//指数取模:a的b次方modc=x
_int64 mod(_int64 a,_int64 b,_int64 c)//(a)^bmod(c)//条件1:在rsa中a=1)//分解b为2进制数.记录下分解成的位数z,构造栈l
{
z++;
if(b%2==0) l[z]=0;
else l[z]=1;
}
//a%=c;//如果一开始数就很大,先模一次,防止过大,求逆
y=a*a%c;//第一次模
for(;z>0;z--)
{
if(l[z]) y=(y*a%c)*(y*a%c)%c;
else y=y*y%c;
}
if(l[0]) y=(y*a%c);//最后次模
return y;
}
C#改写的,在vs.net 2005下调试通过:
///
/// 指数取模:x=(a^b)%c (a的b次方mod)
/// 条件1:在rsa中a= 1)//分解b为2进制数.记录下分解成的位数z,构造栈l
{
z++;
if (b % 2 == 0)
l[z] = 0;
else
l[z] = 1;
}
//a%=c;//如果一开始数就很大,先模一次,防止过大,求逆
y = a * a % c;//第一次模
for (; z > 0; z--)
{
if (l[z]>0) y = (y * a % c) * (y * a % c) % c;
else y = y * y % c;
}
if (l[0]>0) y = (y * a % c);//最后次模
return y;
} (参考百度)
看了 求一个高效的指数取模运算算法...的网友还看了以下:
高数种数列极限的定理3中的推论图中证明的第三行开始我看不懂书上证明的逻辑了,为什么那样说,求高数教 2020-05-16 …
高分求高数下册的几道题1.设y*为y'+p(x)y=Q(x)的一个特解,那么该方程的通解为y=2. 2020-05-17 …
同济6高数极限准则中例题四分之一圆1-32中,为什么X=弧AB,为什么扇形AOB面积=二分之一的X 2020-06-10 …
我想求高数高人帮我一下这几点思绪.真的有界与收敛的关系函数fx在x0可导与在x0可微我想求高数高人 2020-06-27 …
求高数高手,满意再加分一般的旋转体体积的那些我都会,但是球的体积和椭球的体积如何用旋求高数高手,球 2020-07-07 …
求函数的微积分y=e^(ax+bx^2),求高数人才. 2020-07-13 …
求高数高人解惑,五个初等函数迈克劳林的展开式,它们是以x等于零得到的,尤其是正弦和余弦展开式,一旦 2020-07-30 …
求高数题设函数g(r)有二阶导数,f(x,y)=g(r),r=根号下x平方加y平方,求证:f对x的 2020-07-30 …
积分1/根号下(1-9x^2)dx积分根号下(16-9x^2)dx求高数研究生、本科,或学过CIE 2020-07-31 …
求高数2导数用解题!题目是这样的y=arctan{(tan^2)x}的导数我把它分解为y=arcta 2020-12-13 …
相关搜索:求一个高效的指数取模运算算法