+ All Categories
Home > Documents > math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@...

math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@...

Date post: 04-Jul-2019
Category:
Upload: lehuong
View: 212 times
Download: 0 times
Share this document with a friend
15
π
Transcript
Page 1: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.1 잉여류 연산 153

8. 정수론

정수는 이산 수학(discrete mathematics)의 핵심적인 요소이다. 정수의 성질에

관련된 수학의 중요한 줄기인 정수론을 공부하는 것은 이산수학의 기본적인 성질을 이

해하는데 도움을 준다. 이러한 정수론은 순수 수학적 목적뿐만 아니라 응용성의 측면에

서도 매우 중요하다. 현대 정보 통신 기술의 핵심은 정수론에 기반을 둔 것이 매우 많

다. 정수에 대한 기본적인 성질을 이해하고, 이를 이용하여 정보통신에 핵심적 역할을

하고 있는 공개키 암호 체계를 구현해 보도록 하자.

8.1 잉여류 연산

m과 n이 양수일 때, n을 m으로 나누었을 때 몫은 [n/m]으로 나타낸다. 이 때,

나누어지고 남은 수, 즉 나머지를 ‘n mod m'이라고 부른다. 즉,

n = [n/m] m + n mod m 몫 나머지

이고, n mod m은 n - m*[n/m]으로 표현할 수 있다. 이것은 실수에 대해서도 일반화

될 수 있다.

(1.1) x mod y = x - y[x/y], for y≠0.

이러한 ‘mod'를 이진 연산자로 정의하는데, 수학자들은 mod 10, mod 2π 등을 오랫동

안 사용해왔다. x, y가 양의 실수일 때, 둘레길이가 y인 원에 길이 x인 줄을 감는 것을

상상해보면, x mod y의 의미를 쉽게 알 수 있다. 길이 x인 줄은 출발점에서 x mod y

만큼 떨어진 위치에서 끝난다. 그리고 원을 돌 때 출발점을 지나는 횟수는 [x/y]이다.

x나 y가 음수이면, x를 y로 나눈 나머지의 뜻을 정확히 알기 위해서 정의를

주의 깊게 살필 필요가 있다. 다음은 몇 가지 정수에 대한 잉여류 연산의 예제들이다.

5 mod 3 = 5 - 3[5/3] = 2;

5 mod -3 = 5 - (-3)[5/(-3)] = 2;

-5 mod 3 = -5 - 3[-5/3] = -2;

-5 mod -3 = -5 - (-3)[-5/(-3)] = -2.

‘mod' 뒤의 수는 모듈러스(modulus)라고 불린다. 모듈러스는 대개 양수이지만, 만약

[n/m]을 n/m의 정수 부분이라고 정의하면, 모듈러스가 음수일 때도 잉여류의 정의는

완벽한 의미를 가진다. 경우에 따라서는 이와 다른 정의를 사용하는 컴퓨터 언어도 있

을 수 있다. 다음은 현재 사용되는 컴퓨터 환경에서 음의 모듈러스에 대한 잉여류 값을

출력하도록 하는 프로그램이다.

Page 2: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

154 8. 정수론

예제 1.1 (잉여류 표 작성)function mod_table(m, n)% Modulus Table : % mod_table(m, n) for numerator -m:m, denominator -n:n

for i=-m:m fprintf('%3d', i);endfprintf('\n');

for j=-n:n if j==0 continue; end for i = -m:m fprintf('%3d', rem(i,j)); end fprintf(' (mod %d)\n', j);end

>> mod_table(5,3) -5 -4 -3 -2 -1 0 1 2 3 4 5 -2 -1 0 -2 -1 0 1 2 0 1 2 (mod -3) -1 0 -1 0 -1 0 1 0 1 0 1 (mod -2) 0 0 0 0 0 0 0 0 0 0 0 (mod -1) 0 0 0 0 0 0 0 0 0 0 0 (mod 1) -1 0 -1 0 -1 0 1 0 1 0 1 (mod 2) -2 -1 0 -2 -1 0 1 2 0 1 2 (mod 3)

정의 (1.1)에 y=0인 경우, 0으로 나누는 것을 피하기 위해서 이러한 경우를 정의하지

않고 남겨 두었지만, 모든 수에 대해 경우를 확장하기 위해

(1.2) x mod 0 = x

라 정의하자. 이렇게 정의하면, x mod y가 항상 x와 y의 배수만큼 차이가 있다는 성질

을 보존한다.

x를 정수와 분수 부분으로 나누어 x = [x] + {x}와 같이 표시할 때, x = [x]

+ x mod 1이기 때문에, 분수 부분 {x}는 x mod 1로서 쓰여 질 수 있다. 이런 형태의

식에서 괄호는 필요치 않는데, mod가 덧셈이나 뺄셈보다 더 계산 순위가 우선되는 연

산으로 생각되기 때문이다.

분할 공식은 잉여류 연산의 가장 중요한 대수적 성질이다. 모든 실수 c, x, y

에 관해서,

(1.3) c (x mod y) = (cx) mod (cy).

정의 (1.1)로부터 이 법칙은 아래와 같이 쉽게 증명될 수 있다. 만약 cy≠0이면 ,

c (x - y[x/y]) = cx - cy [cx/cy] = cx mod cy

이고, 모듈러스 0인 경우는 당연히 참이기 때문이다.

Page 3: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.2 약수와 최대공약수 155

8.2 약수와 최대공약수

만약 m>0이고, n을 m으로 나눈 몫 n/m이 정수이면, “m이 n을 나눈다.” 또는

“n이 m에 의해 나누어진다.”고 말한다. 이러한 성질은 정수론의 중요한 기초가 되고,

그래서 그것에 대한 특별한 표현을 사용하는 것이 편리하다.

(2.1) m \ n ⇔ m>0이고, 임의의 정수 k에 대하여, n=mk .

(표시 ‘m|n'이 현재의 수학적 문법으로 ’m\n'보다 실질적으로 훨씬 더 일반적으로 쓰인

다. 그러나 수직선(|)은 절대 값이나 조건 확률들을 나타낼 때 등 너무 많이 쓰이지만,

백슬래쉬(\)는 훨씬 적게 쓰인다. 더욱이, 'm\n'은 m이 두 수의 비율에서 분모인 인상

을 준다. 그래서 가분성의 기호를 ‘\’로 사용하도록 하겠다.) 만약 m이 n을 나누지 않는

다면, ‘m∤n‘로 표시한다. 이것은 m이 양수일 조건을 생략하면 “n은 m의 배수이다.”와

거의 같은 의미이다. “n은 m의 배수이다.”라는 경우에는 단순히 어떤 정수 k에 대해서,

n = mk임을 의미한다. 예를 들어, 0의 배수는 단지 하나만 존재하지만(즉 0), 어떤 것

도 0에 의해 나누어지지 않는다.

두 개의 정수 m과 n의 최대공약수(GCD, greatest common divisor)는 그 둘

모두를 나누는 가장 큰 정수이다.

(2.2) gcd(m, n) = max{k | k\m and k\n}.

예를 들어, gcd(12, 18) = 6이다. 만약 n>0이면 gcd(0, n) = n인데, 어떤 양수가 0을 나

눌 수 있으므로 n은 0의 약수이고, 또한 n이 자신의 가장 큰 약수이기 때문이다.

gcd(0, 0)의 값은 정의되지 않는다.

또 다른 유사한 표시는 최소공배수(LCM, lest common multiple)

(2.3) lcm(m, n) = min{k| k>0, m\k and n\k}

이다. 만약 m≤0이거나 n≤0이면 정의되지 않는다. lcm은 gcd와 매우 유사하지만 gcd

가 더 좋은 성질들을 많이 가진다.

최대공약수는 2300년 전부터 사용했던 유클리드호제법(Euclid's algorithm)

을 사용하여, 쉽게 계산될 수 있다는 좋은 성질을 가지고 있다. gcd(m, n)을 계산하기

위해, 주어진 값 0≤m<n에 대해서, 유클리드 호제법은 점화식

(2.4) gcd(0, n) = n;

gcd(m, n) = gcd(n mod m, m), for m>0

을 사용한다. 예를 들어, gcd(12, 18) = gcd(6, 12) = gcd(0, 6) = 6이다. 어떤 m과 n의

공약수는 또한 n을 m으로 나눈 나머지 (n - [n/m]m)와 m의 공약수와 같기 때문에 위

Page 4: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

156 8. 정수론

의 점화식은 유효하다.

유클리드 호제법을 확장시키면,

(2.5) m'm + n'n = gcd(m, n)

을 만족하는 정수 m'와 n'를 계산할 수 있다. 만약 m=0이면, 간단히 m'=0이고 n'=1이

다. 그렇지 않으면, r = n mod m이라고 두고 m과 n 대신에 r과 m을 가지고 귀납적으

로 위 방법을 적용해서

r''r + m''m = gcd(r, m)

인 r''와 m''를 계산한다. r=n-[n/m]m이고 gcd(r,m)=gcd(m,n)이므로, 이 방정식은

r''(n - [n/m]m) + m''m = gcd(m, n)

이 된다. 왼편을 m과 n에 의존하도록 다시 쓰면,

(m'' - [n/m]r'')m + r''n = gcd(m, n)

이다. 따라서 m' = m'' - [n/m]r''와 n' = r''은 (2.5)에서 우리가 필요한 정수이다. 예

를 들어, m = 12, n = 18인 경우에, 이 방법을 적용하면, 6 = 0․0 + 1․6 = 1․6 +

0․12 = (-1)․12 + 1․18이 된다.

예제 2.1 (유클리드 호제법)

function n = gcd_mine(m, n)% mygcd(m, n) returns GCD by Euclid's algorithm while (m~=0) r = m; m = rem(n, m); n = r;end

function [mp, np] = gcd_eq(m, n)% gcdeq(m, n) returns [mp,np] such that mp m + np n = gcd(m,n) if (m==0) mp = 0; np = 1;else [rpp, mpp] = gcd_eq(rem(n,m), m); mp = mpp - floor(n/m) * rpp; np = rpp;end

% gcd_test.m ---------------------------------------------------while 1 in = input('Enter [m, n] '); if isempty(in) || in(1)<=0 || in(2)<=0; return; end

Page 5: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.3 소수와 소인수 분해 157

m = in(1); n = in(2); fprintf('gcd(%d,%d)=%d', m, n, gcd_mine(m,n)); [mp, np] = gcd_eq(m,n); fprintf(' : (%d) %d + (%d) %d = %d\n', mp,m,np,n,m*mp+n*np);end

>> gcd_testInput m, n = [12345 54321]gcd(12345, 54321)=3 : (3617) 12345 + (-822) 54321 = 3Input m, n = [23456 65432]gcd(23456, 65432)=8 : (3261) 23456 + (-1169) 65432 = 8Input m, n = [34567 76543]gcd(34567, 76543)=1 : (-24495) 34567 + (11062) 76543 = 1Input m, n = [-1 –1]

(2.5)를 이용한 중요한 결과로 다음의 정리를 생각해 볼 수 있다.

정리 2.2 k \ m이고 k \ n ⇔ k \ gcd(m, n)

((증명)) k가 m과 n 둘 다 나누면, 이것은 m'm+n'n을 나누고, 그래서 gcd(m, n)을 나눈

다. 역으로, k가 gcd(m, n)을 나누면 그것은 m의 약수와 n의 약수를 나누고, 그래서 m

과 n을 모두 나눈다. ▨

m과 n의 모든 공약수는 그것의 gcd보다 작거나 같다. 이것은 최대 공약수의 정의이기

도 하다. 그러나 사실 모든 공약수는 gcd의 약수이다.

8.3 소수와 소인수 분해

양의 정수 p가 두 개의 약수를 가지면, 즉 1과 p를 가지면, p를 소수(prime)

라고 부른다. 앞으로 이 절에서 등장하는 문자 p는 항상 소수를 나타낼 것이다. 관례에

의해, 1은 소수가 아니고, 소수의 수열은 다음과 같다.

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, ...

어떤 수들은, 91(=7․13)이나 161(=7․23)처럼, 소수처럼 보이지만 그렇지 않은 경우도

있다. 이와 같이 세 개 또는 그 이상의 약수를 가진 수들을 합성수(composite)라고

부른다. 1보다 큰 모든 정수들은 소수거나 합성수이지만, 둘 다일 수는 없다.

소수는 양의 정수의 기본적인 틀을 제공하기 때문에 매우 중요하다. 즉, 임의

의 양의 정수 n은,

(3.1) n=p 1...p m= ∏m

k= 1p k, p 1≤…≤p m

Page 6: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

158 8. 정수론

와 같이 소수의 곱으로 표시할 수 있다. 예를 들어, 12=2․2․3; 11011=7․11․11․13;

11111=41․271. (n=1은 m=0, 즉 소수의 곱이 하나도 없는 경우로 생각하자.) 만약 n>1

이 소수가 아니면 1<n1<n인 약수 n1을 가지기 때문에, 이런 인수 분해는 항상 가능하

다. 그러므로 n = n1․n2로 쓸 수 있고 (수학적 귀납법에 의해) n1과 n2도 소수의 곱으

로 쓸 수 있다. 더욱이, (3.1)의 표현은 유일하다. 즉 n을 감소하지 않는 순서의 소수들

의 곱으로서 쓰는 방법은 유일하다. 이러한 사실을 산술의 기본정리(Fundamental

Theorem of Arithmetic)라고 한다.

예제 3.1 (소인수 분해)

function val = fac(n)% fac(n) returns all prime factors of n val = []; p = 2;while (n >= p*p) if (rem(n,p) == 0) val = [val p]; n = n / p; elseif (p==2) p = p + 1; else p = p + 2; endend if (n>1) val = [val n]; end

>> fac(1234567)ans = 127 9721>> fac(7654321)ans = 19 402859>> fac(123456789)ans = 3 3 3607 3803>> fac(987654321)ans = 3 3 17 17 379721

그러면, 얼마나 많은 소수가 존재할까 하는 질문을 할 수 있을 것이다. Euclid는 다음

의 정리를 이용하여 소수가 무한히 많다는 사실을 증명하였다.

Page 7: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.3 소수와 소인수 분해 159

정리 3.2 소수는 무한히 많은 수가 존재한다.

((증명)) 양의 정수 k(k>0)에 대해서, 2, 3, 5, ..., pk가 유한히 많은 유일한 소수라고 가정

하자. 그리고 어떤 정수를 M = 2․3․5․...․pk + 1로 생각해보자. 각각의 소수는 M-1

을 나누기 때문에, k개의 소수 중 어떤 것도 M을 나눌 수 없다. 그러므로 M을 나누는

어떤 다른 소수가 존재하거나 M자체가 소수이어야 한다. 이것은 2, 3, 5, ..., pk만이 유

일한 소수라는 가정에 모순이다. 따라서 무한히 많은 소수가 존재함에 틀림없다. ▨

Euclid의 증명에 나오는 점화식

(4.1) en = e1 e2 ... en-1 + 1, when n≥1

에 의해 유클리드 수(Euclid number)를 정의할 수 있다. 이 수열은 다음과 같이 시작

한다.

e1 = 1 + 1 = 2;

e2 = 2 + 1 = 3;

e3 = 2․3 + 1 = 7;

e4 = 2․3․7 + 1 = 43;

위의 네 가지는 모두 소수이다. 그러나 다음 경우인 e5는 1807 = 13․139이다. e6 =

3263443은 소수이다. 반면에 e7 = 547․607․1033․21051; e8 = 29881․67003․911952

1․6212157481. e9, ..., e17은 합성수이고 나머지 en은 아마도 합성수일 것이다.

많은 사람들의 기대에도 불구하고, 아직 그 누구도 임의의 큰 소수만을 자동으

로 만들어 주는 어떤 유용한 공식도 알지 못한다. 그러나 Chevron Geosciences의 컴퓨

터 과학자들은 1984년에 수학적인 기름에 불을 붙였다. David Slowinski에 의해 발전

된 프로그램을 사용하여, 새로운 Cray X-MP 수퍼컴퓨터(supercomputer)를 테스트하

는 과정에서, 그 때까지 알려진 소수보다 더 큰 소수인 2216091-1을 발견했다. 현대의 컴

퓨터는 2진표기에 의해 작동하고 이 수는 간단히 (11...1)2이기 때문에, 가정용 컴퓨터로

단지 몇 백만분의 1초 만에 이 수를 쉽게 계산할 수 있다. 그것의 모든 216,091의 비트

(bits)는 ‘1‘이다. 그러나 이 수가 소수임을 증명하는 것은 훨씬 어렵다. 사실 소수임을

증명하는 가장 손쉬운 방법은 자기 자신보다 작은 모든 수로 나누어 보는 것이다. 그러

나 이러한 단순한 방법을 2216091-1과 같이 큰 수에 적용하려면 너무 많은 시간을 소비

하게 된다. 이 수가 얼마나 큰 수인지를 예를 들어보면, 매우 복잡한 알고리즘조차도

PC에서 2216091-1을 10진법으로 바꾸는데 몇 분이 걸리고, 출력되었을 때, 10진수로

65,050자리를 필요로 한다. 우연히, 2216091 -1는, 216,091개의 원반이 존재할 때, 하노이

탑 문제(Hanoi problem of Tower)를 풀기 위해 필요한 움직임의 수이다.

17세기에 Marin Mersenne이 2p - 1의 어떤 성질들을 발견한 이 후, 2p - 1의

형태의 수들을(이 장에서 p는 항상 소수) 메르센 수(Mersenne numbers)라고 부른

다. 현재까지 알려진 Mersenne 소수는 p = 2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127,

521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209,

44497, 86243, 110503, 123049, 216091, 756839에 대해 발생한다. 만약 n이 합성수이면,

Page 8: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

160 8. 정수론

2n - 1이 소수가 되는 것은 불가능한데, 2km - 1은 2m - 1이라는 인수를 가지기 때문

이다.

2km - 1 = (2m - 1)(2m(k-1) + 2m(k-2) + … + 1) .

그러나 2p - 1는 p가 소수일 때 항상 소수인 것은 아니다. 211 - 1 = 2047 = 23․89은

그러한 소수가 아닌 가장 작은 수이다. (Mersenne는 이것을 알고 있었다.)

n번째 소수를 표시하는 공식 뿐 만 아니라, 임의의 큰 소수를 자동으로 만들

어 주는 공식도 아직 모르고 있다. 그러나 n번째 소수 pn의 대략적 크기는 약 n 곱하

기 n의 자연 로그이다.

pn ~ n ln n

이다. 이때, 기호 ‘~’은 “근사적으로 ...과 동치이다(is asymptotic to)”로 읽을 수 있다.

이것은 비 pn / n ln n의 값이 n이 무한대로 갈 때 1이라는 의미이다. 보다 정확한 공

식은

pn = n ( ln n + ln ln n - c ); -3/2 < c < -1/2 for n>20

이다. 또한, x를 넘기지 않는 소수 π(x)의 수에 대하여 소수 정리(prime number

theorem)로 알려진 것이 있다.

π(x) ~ x / ln x

보다 정확한 공식은

π(x) ~ x / ( ln x - c ); -3/2 < c < -1/2 for x > 67

이다. 만약 “무작위로(random)" 정수 n을 선택했을 때, 그것이 소수가 될 기회는 ln n

중의 하나이다. 예를 들어, 만약 1016 가까이 있는 수를 생각해 보면, 소수를 찾기 전에

우선 16 ln10 ≃ 36.8임을 알아야 한다. 실제로 1016 - 370과 1016 - 1 사이에는 정확히

10개의 소수가 존재한다. 그러나 일반적인 소수의 분포는 매우 큰 불규칙성을 가진다.

예제 3.3 (소인수 분해)

% Pn.m ---------------------------------------------------if exist('nmax')==0 || nmax<2; nmax=2; end n=1; pn=2; fprintf('P_%d = %d ~ UNDEF\n', n, pn);n=2; pn=3; fprintf('P_%d = %d ~ UNDEF\n', n, pn);

for n = 3:nmax pn = pn + 2; d = 3; while (d*d<=pn) if rem(pn, d)==0 pn = pn + 2; d = 3; else d = d + 2; end; end

Page 9: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.4 잉여류 합동 관계 161

fprintf('P_%d = %d ~ %f\n', n, pn, n*(log(n*log(n))-1.0) );end

>> nmax=1000; PnP_1 = 2 ~ UNDEFP_2 = 3 ~ UNDEFP_3 = 5 ~ 0.577980P_4 = 7 ~ 2.851714P_5 = 11 ~ 5.426615P_6 = 13 ~ 8.249745P_7 = 17 ~ 11.281480P_8 = 19 ~ 14.492327P_9 = 23 ~ 17.859776P_10 = 29 ~ 21.366175......P_997 = 7883 ~ 7813.449581P_998 = 7901 ~ 7822.431932P_999 = 7907 ~ 7831.415410P_1000 = 7919 ~ 7840.400013

8.4 잉여류 합동 관계

x와 x mod m은 m의 배수만큼 다르기 때문에, 다음과 같은 합동관계

(congruences)를 생각할 수 있다.

(4.1) a ≡ b (mod m) ⇔ a - b는 m의 배수이다.

합동관계의 여러 성질들은 거의 등호와 유사하기 때문에, 합동 기호 ‘≡’은 ‘=’처럼 편리

하게 쓸 수 있다. 예를 들어, 잉여류 합동은 동치 관계(equivalence relation)이다.

즉, 반사 법칙(reflexive law) 'a≡a'와 대칭 법칙(symmetric law) 'a≡b ⇒ b≡a'와 전

이 법칙(transitive law) 'a≡b, b≡c ⇒ a≡c'를 만족한다. 합동관계는 덧셈, 뺄셈, 곱셈

과 지수승에 대하여 다음과 같은 관계를 만족한다.

a ≡ b 이고 c ≡ d ⇒ a+c ≡ b+d (mod m);

⇒ a-c ≡ b-d (mod m);

⇒ ac ≡ bd (mod m).

a ≡ b, for integer n≧0 ⇒ an ≡ bn (mod m).

예제 4.1 (잉여류 연산)

function result = pow_mod(a, n, m)

Page 10: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

162 8. 정수론

% pow_mod(a, n, m) = a^n (mod m) ap = a; result=1;while (n) if (rem(n,2)==1) result = rem(result*ap, m); end n = floor(n/2); ap = rem(ap*ap, m);end

>> pow_mod(2,11,1000)ans = 48

합동에 대해 나눗셈은 사용할 수 없지만, 나누는 수 d와 잉여류 m이 서로 소

(relatively prime)일 경우에 다음과 같은 나눗셈 공식을 쓸 수 있다.

(4.2) ad ≡ bd ⇔ a ≡ b (mod m), for integers a, b, d, m and d⊥m.

합동에 나눗셈을 적용하는 또 다른 방법은 다른 수들 뿐 만 아니라 모듈러스(modulus)

를 나누는 것이다.

(4.3) ad ≡ bd (mod md) ⇔ a ≡ b (mod m), for d≠0

위의 두 식을 통해 잉여류 연산에서의 일반적 나눗셈 법칙을 얻을 수 있다.

(4.4) ad ≡ bd (mod m) ⇔ a ≡ b (mod m/gcd(d, m))

모듈러스를 바꾸는 이러한 방법에 대해 좀 더 알아보자. 만약 a≡b (mod 100)

을 안다면, a≡b (mod 10)임을 알 수 있다. 왜냐하면, a-b가 100의 배수라는 것이 10의

배수라고 말하는 것보다 더 강하다. 일반적으로, md는 m의 배수이기 때문에,

(4.5) a ≡ b (mod md) ⇒ a ≡ b (mod m), for integer d .

역으로, 만약 2개의 작은 모듈러스에 관하여 a≡b를 안다면, 더 큰 하나의 모듈러스에

관해 a≡b를 결정할 수 있으며, 그 규칙은

(4.6) a ≡ b (mod m) 이고 a ≡ b (mod n) ⇔ a ≡ b (mod lcm(m, n))

로 주어진다. 예를 들어, 만약 a≡b(mod 12) a≡b(mod 18)이면, a≡b (mod 36)을 결정

할 수 있다. 그 이유는 만약 a-b가 m과 n의 공배수이면, lcm(m, n)의 공배수이기 때문

이다. 이것은 소인수분해 유일의 원칙으로부터 얻어진다. 이러한 법칙의 특별한 경우

m⊥n은 매우 중요한데, m과 n이 상대 소수일 때, lcm(m, n)=mn이기 때문이다. 이를

중국인의 나머지 정리(Chinese Remainder Theorem)이라고 부른다.

Page 11: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.5 페르마의 정리와 오일러 함수 163

8.5 페르마의 정리와 오일러 함수

페르마(Fermat, 1601-1665)는 미분적분학과 그 밖의 수학의 많은 부분을 발견

하는데 공헌한 위대한 수학자였다. 그는 증명 없이 진술한 많은 정리를 기록한 공책을

남겼다. 그 정리들의 각각은 나중에 증명되었지만, 하나만이 예외로 350년 동안 세계에

서 가장 위대한 수학자들을 좌절시켰기 때문에, 매우 유명한 정리가 되었다. 페르마의

마지막 정리(Fermat's Last Theorem, FLT)이라고 불리는 그 유명한 정리는 다음

과 같다.

an + bn ≠ cn , for all positive integers a, b, c, n>2 .

(a + b = c와 a2 + b2 = c2은 당연히 성립한다.) 1993년에 Andrew Wiles가 이 정리의

증명을 발표함으로써 오랜 세월 동안의 연구는 완결되었다.

1640년에 발표된 페르마의 작은 정리는 매우 쉽게 증명되었다. 그것은 지금

Fermat의 Last Theorem과 구별하기 위하여 Fermat's Little Theorem으로 불린다.

정리 5.1 (페르마, Fermat's Little Theorem) np-1 ≡ 1 (mod p), if gcd(n,p)=1.

((증명)) p가 소수를 나타낸다고 가정한다. p-1개의 수 n mod p, 2n mod p, ..., (p-1)n

mod p는 1, 2, ..., p-1의 순서로 다시 정렬할 수 있다. 그러므로 만약 이것들을 함께 곱

하면,

n․(2n)․...․((p-1)n)

≡ (n mod p)․(2n mod p)․...․((p-1)n mod p)

≡ (p-1)!, (mod p).

이것은

(p-1)! np-1 ≡ (p-1)! (mod p)

이고, (p-1)!은 p에 의해 나눌 수 없기 때문에, 양변의 (p-1)!는 소거할 수 있다. ▨

Fermat's theorem의 또 다른 형태로 때때로 다음과 같이 나타내는 것이 편리하다:

np ≡ n (mod p), for any integer n.

얼마나 많은 정수 {0, 1, ..., m-1}이 m과 상대 소수일까? 이 질문은 m의

“totient"라고 불리는 φ(m)이라는 것에 대해 설명하게 한다. Euler가 그것을 연구한 첫

번째 사람이기 때문에, φ 함수는 Euler's totient function이라고 불린다. 예를 들어,

Euler는 Fermat's theorem이 다음에서와 같이 소수가 아닌 잉여류 연산에 대해서도 일

반화될 수 있다는 것을 발견했다.

정리 5.2 (오일러): mφ(n) ≡ 1 (mod n), if m⊥n.

φ(1) = 1, φ(p) = p-1, 모든 합성수 n에 대해 φ(n) < n-1이다. 만약 n이 소수

거듭제곱 꼴(prime power) pk로 표시 가능하다면, n⊥pk ⇔ p∤n이기 때문에 φ(n)을

Page 12: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

164 8. 정수론

쉽게 계산할 수 있다. {0, 1, ..., pk-1}의 배수는 {0, p, 2p, .., pk-p}이다. 때문에 이 중에

pk-1이 존재하고, φ(pk)는 남은 것을 세면된다.

φ(pk) = pk - pk-1.

이 공식은 k=1일 때 φ(p)=p-1을 준다. 양의 정수의 함수 φ(n)은, 만약 φ(1)=1이고

(5.4) φ(n1 n2) = φ(n1) φ(n2) whenever n1⊥n2

이면 multiplicative라고 불린다. 특히, 이 공식을 이용하면 일반적인 n에 대해 Euler's

totient function의 값을 계산할 수 있다.

(5.5) \

\

.

예를 들어, φ(12) = (4-2)(3-1) = 12(1-1/2)(1-1/3)이다.

특히 n이 두 소수 p, q의 곱으로 표시되면, 오일러 정리는

m(p-1) (q-1) ≡ 1 (mod pq), 1≤m≤pq-1

와 같이 표시되고, 이식은 RSA라는 공개 암호방식에 의해 암호문을 주고받을 수 있

는 기본 방정식이 된다. 먼저 암호를 받고자 하는 영희는 두 개의 소수 p와 q에 대하

여, 비밀암호키 d를 선택하고 d e ≡ 1 (mod (p-1)(q-1))을 만족하는 공개암호키 e를

만들어(e d + t phi_n = gcd(d, phi_n) = 1), 모든 사람들에게 pq와 e를 공개한다. 이때,

철수가 영희에게 m이라는 내용을 비밀리에 보내고자 하면, 철수는 이미 공개되어 있는

e와 pq를 이용하여, 암호문 M=me (mod pq)을 영희에게 보낸다. 영희는 자신이 가진 d

를 이용하여 손쉽게 m을 복원할 수 있다.

Md ≡ (me)d ≡ m mk (p-1) (q-1) ≡ m (mod pq)

그러나 비밀키 d를 가지지 못한 사람이 공개되어진 정보 pq와 e로부터 d를 계산해 내

는 것은 매우 어렵다. 현재 알려진 방법은 pq로부터 p와 q를 각각 구하여야 하는데, 이

는 많은 양의 계산을 요구하여 p와 q가 각각 십진법으로 약 60자리 이상이면 현대 컴

퓨터로는 해결할 수 없을 정도로 오랜 시간이 소요된다.

예제 5.3 (RSA 암호/복호화)

% RSA.m ---------------------------------------------------p = primes(8);q = primes(8);n = p * q;phi_n = (p-1) * (q-1);fprintf('it is a secret data: p=%d, q=%d, phi(n)=%d\n', p, q, phi_n); d = input('Input passwd[1-9999] to generate pass-keys: ');while ( gcd(d,phi_n)~=1 ) d = d/gcd(d,phi_n); end [e, t] = gcd_eq(d, phi_n); if (e<0) e = e + phi_n; end

Page 13: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.5 페르마의 정리와 오일러 함수 165

fprintf('Keys: Public(n=%d,e=%d) Secrete(d=%d,phi=%d)\n', n,e, d,phi_n); % ---- Now time to get a message for ciper msg = input('\nInput Message string: ','s'); len = length(msg); ciper = zeros(1,len);for i = 1:len ciper(i) = pow_mod(msg(i), e, n); fprintf('msg(%d)=(%c) -> %d^%d=%d\n', i,msg(i), msg(i),e,ciper(i));end % ---- Now time to deciper the message d = input('Input passwd[1-9999] to de-ciper: ');while ( gcd(d,phi_n)~=1 ) d = d/gcd(d,phi_n); end for i = 1:len t = pow_mod(ciper(i), d, n); fprintf('ciper(%d)=%-5d -> %d^%d=%d(%c)\n', i,ciper(i), ciper(i),d,t,t);end

>> rsait is a secret data: p=173, q=197, phi(n)=33712Input passwd[1-9999] to generate pass-keys: 2357Keys: Public(n=34081,e=12701) Secrete(d=2357,phi=33712)

Input Message string: I Love You!msg[0]=(I) -> 73^12701=29274msg[1]=( ) -> 32^12701=5321msg[2]=(L) -> 76^12701=11416msg[3]=(o) -> 111^12701=16853msg[4]=(v) -> 118^12701=10778msg[5]=(e) -> 101^12701=25265msg[6]=( ) -> 32^12701=5321msg[7]=(Y) -> 89^12701=31204msg[8]=(o) -> 111^12701=16853msg[9]=(u) -> 117^12701=27876msg[10]=(!) -> 33^12701=32785

Input passwd[1-9999] to de-ciper: 2357ciper[0]=29274 -> 29274^2357=73(I)ciper[1]=5321 -> 5321^2357=32( )ciper[2]=11416 -> 11416^2357=76(L)ciper[3]=16853 -> 16853^2357=111(o)ciper[4]=10778 -> 10778^2357=118(v)ciper[5]=25265 -> 25265^2357=101(e)ciper[6]=5321 -> 5321^2357=32( )

Page 14: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

166 8. 정수론

ciper[7]=31204 -> 31204^2357=89(Y)ciper[8]=16853 -> 16853^2357=111(o)ciper[9]=27876 -> 27876^2357=117(u)ciper[10]=32785 -> 32785^2357=33(!)

8.6 연습문제

#1. 1부터 1000까지의 자연수 중에서 2, 3, 4, 5, 6으로 나눌 때 나머지가 모두 1인 수

를 출력하는 프로그램을 작성하여라.

#2. 입력받은 자연수 n의 모든 약수를 출력하는 프로그램을 작성하여라. (Hint: 2에서 n

까지의 자연수 중에서 n를 k로 나눈 나머지가 0인 모든 수가 n의 약수이다.)

#3. 예제 2.1 gcd_mine(m, n) 알고리즘을 적용하여, gcd_mine(48, 9) 값과 이 계산 위해

수행된 while문의 반복회수를 구하여라.

#4. 사용자로부터 세 자연수를 입력받아 최대공약수를 출력하는 프로그램을 작성하여

라. (Hint: gcd(k, m, n) = gcd( gcd(k,m), n)임을 이용한다. 이때, k≤m≤n 일 때 gcd

계산이 가장 빠르다.)

#5. gcd_mine(m, n)을 수정하여 두 자연수의 최소공배수를 구하는 함수 lcm_mine(m, n)

를 작성하고, 임의의 두 입력 값에 대하여 최소공배수를 출력하는 프로그램을 작성

하여라.

#6. 주어진 자연수의 가장 작은 소인수를 계산하는 함수 factor(n)을 작성하여라. (Hint:

모든 약수를 구하는 것이 아니므로, n보다 적은 모든 자연수에 대해 가분성을 조사

할 필요는 없다. fac.m을 참조한다.)

#7. 예제 4.1 pow_mod(a, n, m) 알고리즘을 적용하여, pow_mod(2, 73, 10)의 결과 값과

이 값을 얻기 위해 수행된 while문의 반복회수를 구하여라.

Page 15: math.ewha.ac.krmath.ewha.ac.kr/~jylee/Finite/TextBook-2017/Chap08.pdf · $% : {° 6@ 0#%! /]/@ ]"/@ ]#!%&(³È K @&'° (W Ì«¶ ( K3 . ° 8 !¦"6\ @ (.R W @,"6´Zµ õ&'@13° 8 ³

8.6 연습문제 167

#8. 오일러 phi-함수 φ(m)은 1에서 m까지의 수들 중에서 m과 상대 소수인 자연수의 개

수로 정의되어있다. 정의를 이용하여 phi(m)을 작성시오.

#9. 입력받은 n값에 대하여, 오일러 totient 함수 값 φ(n)을 출력하는 프로그램을 작성하

여라. (Hint: n의 소인수를 차례로 구하는 함수를 이용한다.)

#10. m과 n을 입력받아, mod n 을 출력하는 프로그램을 작성하고, 이 값이 1

인 예들과 1이 아닌 예들을 찾아보아라.


Recommended