int value=1;
int mul=1764434;
int index=1839;
int mod=356295;
while(index)
{
if(index&1){
value*=mul;
value%=mod;
}
mul*=mul;
mul%=mod;
index>>=1;
}
return value;
下面这个算法求解模取幂更快一点:
Modular-Exponentiation(a, b, n) // 求 a^b mod n
1. c <- 0;
2. d <- 1;
3. 设<b[k],b[k-1],..b[0]>是b的二进制表示;
4. for i <- k downto 0
5. do c <- 2c;
6. d <- (d*d) mod n
7. if b[i] = 1
8. then c <- c+1;
9. d <- (d*a) mod n;
10.return d;
算法中的变量c其实可以省略,引入c只是为了让算法更容易理解。当c成倍增加时算法保持条件d = a^c mod n不变,直至c=b。如果输入a,b,n都是k位的数,则算法总共需要执行的算术运算次数为O(k),总共需要执行的位操作为O(k^2)。
下面是该算法的C代码,其中的BitLength可以用log函数代替。
/*********************************************
返回x的二进制长度
*********************************************/
int BitLength(int x)
{
int d = 0;
while (x > 0) {
x >>= 1;
d++;
}
return d;
}
/*********************************************
返回x的二进制表示中从低到高的第i位
,最低位为第一位
*********************************************/
int BitAt(int x, int i)
{
return ( x & (1 << (i-1)) );
}
/*********************************************
模取幂运算 计算a^b mod n
*********************************************/
int Modular_Expoent(int a,int b,int n)
{
int i, y=1;
for (i = BitLength(b); i > 0; i--)
{
y = (y*y)%n;
if (BitAt(b,i) > 0)
y = (y*a)%n;
}
return y;