模取幂运算a^b mod n的有关问题

模取幂运算a^b mod n的问题小弟初学,下面是我在网上看到的一个模取幂的程序,有几个地方看不懂,请高手指点

模取幂运算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; }