模重复平方计算法
一、问题描述
在模算数计算中,我们常常要对大整数模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 }