模重复平方计算法

一、问题描述

在模算数计算中,我们常常要对大整数模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 }
posted @ 2017-10-24 14:52  Nipo  阅读(10167)  评论(0编辑  收藏  举报