一、問題描述
在模算數計算中,我們常常要對大整數模m和大整數n,計算bn(mod m).如果遞歸計算bn = (bn-1(mod m))·b(mod m),這種計算較為費事,須作n - 1次乘法。而使用模平方計算法可以顯著降低算法復雜度。
二、算法描述
欲求bn(mod m),設a = 1
1. 先將n轉換為二進制,即n = n0 + n12 + n222 + ··· + nk-12k-1
2.從低位到高位對n的二進制表示進行遍歷
3.如果nk = 1,則a = a·b (mod m),b = b2(mod m);如果nk = 0,則a值保持不變,b = b2(mod m)
4.遍歷完成后得到的a值即為所求結果
三、JAVA代碼
1 import java.util.Scanner; 2 import java.util.ArrayList; 3 4 public class mod2 { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int n, m, b, a = 1; 9 String binary; 10 Scanner scan = new Scanner(System.in); 11 System.out.println("Please input args n, m, b:"); 12 n = scan.nextInt(); 13 m = scan.nextInt(); 14 b = scan.nextInt(); 15 scan.close(); 16 binary = Integer.toBinaryString(n); 17 for (int i = binary.length() - 1 ; i >= 0 ; i--){ 18 if (binary.charAt(i) == '1'){ 19 a = (a*b)%m; 20 b = (b*b)%m; 21 } 22 else{ 23 b = (b*b)%m; 24 } 25 } 26 System.out.println(a); 27 } 28 29 }