模重復平方計算法


一、問題描述

在模算數計算中,我們常常要對大整數模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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM