模的幂计算问题,为什么同样的算法用JAVA做就会越界?请教数论和JAVA高手
下面是我的程序,各位高手可以运行试一下,当我求2的10次方模1000或其它的数,以及其它较小的数的时候就会正确,但是当我用于求3的1234567次方模100000的时候就无法运算出来了,这个过程中应该是越界了,因为部分我调试时输出那些保存下来的每一步的模中有负数.
我同学与我使用相同的算法,但是他好像使用的是C语方中的unsigned类型数据.但是也只能算致34567这个数量级,像1234567就无法运算.我的这两个数都无法运算
public class Main {//建立项目主类,也是程序的运行的入口类
/** Creates a new instance of Main */
public static void main(String[] args) {
int a=5;//一般情况下,本程序适用于解所有int类型的相关运算
int b=1234;
int n=1000;//通过定义可以设定要求尾数的位数
FigureTail tail=new FigureTail(a,b,n);//初始化FigureTail类
System.out.println( "最后五位应该是: "+tail.tailOut());
for(int i=0;i <32;i++)
System.out.println(tail.y[i]);
}
}
class FigureTail{
public FigureTail(int a,int b,int n){//构造函数,初始化运算对象
as=a;
bs=b;
ns=n;
y[0]=1;//把初始的前两个模值定义好,方便递推运算
y[1]=as%ns;
}
public int tailOut(){
int tempB=bs;//把幂1234567化成二进制数
while(tempB!=1){
x[count]=(int)(tempB%2);
tempB=(int)(tempB/2);
count++;
}
x[count]=1;
for(int i=2;i <32;i++)
y[i]=(y[i-1]*y[i-1])%ns;
int itsTail=1;
for(int j=1;j <32;j++){
if(x[j-1]==1)
{ itsTail*=y[j];
itsTail%=ns;
}
}
return itsTail%ns;
}
private int as;
private int bs;
private int ns;
private int count=0;//记录化成二进制后的位数