模取幂运算a^b mod n的问题
小弟初学,下面是我在网上看到的一个模取幂的程序,有几个地方看不懂,请高手指点一下。
/**//****************************************************/
// 模取幂运算 计算a^b mod c
// 利用公式
// (a*b)mod(c) = ((a mod c )*b)mod c
/**//****************************************************/
int a_b_Mod_c(int a, int b, int c)
{//前提 a b c 都是正数
int digit[32]; //最好讲解一下为什么要把b转成2进制???这样有什么好处
int i, k, resualt = 1; //这里的reuslt存放什么数据的,为什么初始化值为1??????????
i = 0;
while(b)//把b化成2进制
{
digit[i++] = b%2;
b >>= 1;
}
//计算(a^b) mod c
for(k = i-1; k >= 0; k--)
{
resualt = (resualt * resualt) % c; //这句看不懂????????????
if(digit[k] == 1)
{
resualt = (resualt * a) % c; //这句也看不懂???????????
}
}
return resualt;
}
[解决办法]
http://blog.csdn.net/dremi/archive/2007/04/17/1568221.aspx,这里有解答
[解决办法]
这个是把转换为3进制的
- C/C++ code
int a_b_Mod_c(int a, int b, int c) {//前提 a b c 都是正数 int digit[32]; int i, k, resualt = 1; i = 0; while(b)//把b化成3进制 { digit[i++] = b%3; b /=3 ; } //计算(a^b) mod c for(k = i-1; k >= 0; k--) { resualt = (resualt * resualt * resualt) % c; //因为基数是3,所以要3个resualt相乘意 if(digit[k] == 1) { resualt = (resualt * a) % c; //因为3进制会出现0,1,2,当为1时就乘一个a } else if(digit[k]==2) { resualt = (resualt *a*a) % c;//当为2时乘两个a } } return resualt; }
[解决办法]
- C/C++ code
/ (((a^(b/2))%mod)^2)%mod b%2=0(a^b)%mod=| \ (((a^(b/2))%mod)^2*a)%mod b%2=1
[解决办法]
- C/C++ code
/**//****************************************************/ // 模取幂运算 计算a^b mod c // 利用公式 // (a*b)mod(c) = ((a mod c )*b)mod c /**//****************************************************/ int a_b_Mod_c(int a, int b, int c) {//前提 a b c 都是正数 int digit[32]; //最好讲解一下为什么要把b转成2进制???这样有什么好处 int i, k, resualt = 1; //这里的reuslt存放什么数据的,为什么初始化值为1?????????? i = 0; while(b)//把b化成2进制 { digit[i++] = b%2; b >>= 1; } //计算(a^b) mod c for(k = i-1; k >= 0; k--) { resualt = (resualt * resualt) % c; //这句看不懂???????????? if(digit[k] == 1) { resualt = (resualt * a) % c; //这句也看不懂??????????? } } return resualt; } 