본문 바로가기
A. 언어/Java

[암호수학] Euclidean Algorithm 구현

by E-HO 2018. 3. 30.
728x90

Euclidean Algorithm

(유클리드 알고리즘)




GCD(최대공약수)

를 구하기 위한 알고리즘으로 위의 규칙을 바탕으로 

이러한 식을 도출해 증명 할 수 있다.


자바에 익숙해져야 할 것 같아서 자바로 코딩 해 보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package 암호수학;
import java.util.*;
 
public class EuclideanAlgorithm {
    public void cal(int a, int b){
        int[] q = new int[50];
        int[] r = new int[50];
        int i = 0int cnt = 0int gcd = 0;
        int[] s = new int[50];
        int[] t = new int[50];
        s[0]=1; s[1]=0; t[0]=0; t[1]=1;
        r[0= a; r[1= b;
        while(true){
            cnt+=1;
            q[i+1]= r[i]/r[i+1];
            r[i+2= r[i]%r[i+1];
            if(i>=2){
                s[i]=s[i-2]-q[i-1]*s[i-1];
                t[i]=t[i-2]-q[i-1]*t[i-1];
            }
            if(r[i+2]==0){
                gcd = r[i+1];
                s[cnt]=s[cnt-2]-q[cnt-1]*s[cnt-1];
                t[cnt]=t[cnt-2]-q[cnt-1]*t[cnt-1];
                break;
            }
            i+=1;
        }
        for(i=0; i<cnt; i++){
            System.out.println(r[i]+" = "+r[i+1]+"*"+q[i+1]+"+"+r[i+2]+"       s= "+s[i+1]+"       t= "+t[i+1]);
        }
        System.out.println("gcd =  "+gcd+" => "+s[cnt]+"*"+r[0]+" + "+t[cnt]+"*"+r[1]);
    }
    
    public static void main(String[] args) {
        int a,b;
        EuclideanAlgorithm Al = new EuclideanAlgorithm();
        Scanner scan = new Scanner(System.in);
        System.out.print("a, b = ? ");
        a = scan.nextInt();
        b = scan.nextInt();
        Al.cal(a, b);    
    }
}
cs


(252, 198)


(9274, 4853)


완성

반응형