天天看點

今天的密碼學作業,求模的幂運算題.使用JAVA時發現的幾個問題

JAVA确實是一種強類型的語言,今天在做這個題目"3的1234567次方的後五位數是多少"的時候就碰到了這個問題,首先是把所有資料類型都定義為int類型,但是發現隻能求較小的數值,因為int型隻有32位,而本題中要進行模運算的數在都應該是四位以上的十進制數,是以在平方後可能會越界.因而比較好的處理辦法就是把在存各次模的數組定義為long型,也就是64位.這樣問題就解決了. 另外就是JAVA對類型的要求很強,在進行非同類型數值運算的時候要記得強制轉換. java 代碼

  1. public class Main {//建立項目主類,也是程式的運作的入口類   
  2.     public static void main(String[] args) {   
  3.         int a=3;//一般情況下,本程式适用于解所有int類型的相關運算   
  4.         int b=1234567;   
  5.         long n=100000;//通過定義可以設定要求尾數的位數   
  6.        FigureTail tail=new FigureTail(a,b,n);//初始化FigureTail類   
  7.        System.out.println("最後五位應該是:"+tail.tailOut());   
  8.     }   
  9.   }   
  10. class FigureTail{   
  11.     public FigureTail(int a,int b,long n){//構造函數,初始化運算對象   
  12.     as=a;   
  13.     bs=b;   
  14.     ns=n;   
  15.     y[0]=(long)1;//把初始的前兩個模值定義好,友善遞推運算   
  16.     y[1]=(long)(as%ns);   
  17.     }   
  18.     public long tailOut(){   
  19.         int tempB=bs;//把幂1234567化成二進制數   
  20.         while(tempB!=1){   
  21.             x[count]=(int)(tempB%2);   
  22.             tempB=(int)(tempB/2);   
  23.             count++;   
  24.         }   
  25.       x[count]=1;   
  26.         for(int i=2;i<32;i++)   
  27.         y[i]=(y[i-1]*y[i-1])%ns;   
  28.         long itsTail=(long)1;   
  29.         for(int j=1;j<32;j++){   
  30.             if(x[j-1]==1)   
  31.             {  itsTail*=y[j];   
  32.                itsTail%=ns;   
  33.             }    
  34.         }      
  35.         itsTail%=ns;   
  36.        return itsTail ;   
  37.     }   
  38.     private int as;   
  39.     private int bs;   
  40.     private long ns;   
  41.     private int count=0;//記錄化成二進制後的位數   
  42.     private long itsTail;//最後算出來的尾數    
  43.     //JAVA中integer對象的值最高為32位   
  44.     //JAVA很不友善的一個地方就是數組必須初始化并隻能使用下面的方法指派   
  45.     public long[] y=new long[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};   
  46.     private int[] x=new int[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};   
  47. }