日期:2014-05-20  浏览次数:20601 次

模的幂计算问题,为什么同样的算法用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;//记录化成二进制后的位数