선형합동

Linear Congruences

A congruence of the form axb (modm), where m is a positive integer, a and b are integers, and x is a variable, is called a linear congruence.

  • 양의 정수 m, 정수 a,b 에 대하여,
    • axb (modm) 형태의 합동을 선형합동(linear congruence)이라 부른다.

a 모듈로 m 의 역 (inverse)

  • ˉaa1 (modm) 인 정수 a가 존재한다면,
    • 정수 ˉaa 모듈로 m의 역(inverse)이라 부른다.

If a and m are relatively prime integers and m>1, then an inverse of a modulo m exists. Furthermore, this inverse is unique modulo m. (That is, there is a unique positive integer ˉa less than m that is an inverse of a modulo m and every other inverse of a modulo m is congruent to ˉa modulo m.)

  • ˉaa1 (modm) 에 대하여
    • a,m 이 서로소이고 m>1 이면
      • a 모듈로 m의 역이 존재한다.
      • 이런 경우, 0<ˉa<ma 모듈로 m의 역 ˉa는 하나 밖에 없다.
      • 그 외의 다른 모든 a 모듈로 m 의 역은 ˉa 모듈로 m과 합동이다.

예를 보며 이해하자.

  • ˉa×21(mod5).
    • 2와 5는 서로소이고 5>1 이므로, '2 모듈로 5'의 역 ˉa는 존재한다.
    • 정수 3, 8, 13, 18, … 등은 '2 모듈로 5의 역'이다.
      • m=5 보다 작은 '2 모듈로 5의 역' 은 3 하나뿐이다.

예제 1

베주의 계수를 찾는 방법으로, 3 modulo 7 의 역을 찾아라.

ˉa×3=1 (mod7)
  • 3과 7의 최대공약수는 1이다.
    • 2×3+1=7 이므로
    • 베주의 항등식으로 표현하면 gcd(3,7)=1=2×3+1×7
      • 따라서 베주의 계수는 2,1이다.
    • 잘 살펴보면 3 modulo 7 의 역이 2 라는 것을 알 수 있다.
    • 0보다 크고 m 보다 작은 역은 5 이다.

예제 2

101 모듈로 4620 의 역을 찾아라.

ˉa×101=1 (mod4620)

먼저 유클리드 호제법을 사용해 gcd(101,4620)을 찾자.

4620=45×101+75101=1×75+2675=2×26+2326=1×23+323=7×3+23=1×2+12=2×1gcd(101,4620)=1

베주의 항등식을 만들자.

1=s×101+t×4620

형태가 나오도록 위의 호제법 과정의 계산식을 적당히 가져다 끼워 맞추면 된다.

1=31×2=32 (2 제거) =3(237×3)=23+8×3=23+8×(2623) (3 제거) =9×23+8×26=9×(752×26)+8×26 (23 제거) =9×75+26×26=9×75+26×(10175) (26 제거) =35×75+26×101=35×(462045×101)+26×101 (75 제거) =35×4620+(35×45+26)×101=35×4620+1601×101

따라서 101 모듈로 4620 의 역 ˉa=1601 이다.

예제 3

  • a 모듈로 m 의 역 ˉa를 알고 있으면 합동 axb (modm) 을 풀 수 있다.
    • 양 변에 ˉa 를 곱하면 된다.

선형합동 3x4(mod7) 의 해를 구하라.

먼저 3 모듈로 7 의 역을 찾아보자.

ˉa×31 (mod7)

베주의 항등식을 이용하면 1=72×3 이므로,

3 모듈로 7 의 역은 2 이다.

합동식의 양 변에 2를 곱하자.

3x4 (mod7)2×3x2×4 (mod7)6x8 (mod7)

그런데 61 (mod7) 이고, 86 (mod7) 이다.

우변과 나머지를 맞추기 위해 x6 (mod7) 이라 가정하자.

6x8 (mod7)1×66 (mod7)

대입해보면 들어맞는다.

3x4 (mod7)3×64 (mod7)184 (mod7)

따라서 x6 (mod7) 인 정수 x, 즉 8,1,6,13,20,... 등이 합동의 해이다.

중국인의 나머지 정리

The Chinese Remainder Theorem

Let m1,m2,...,mn be pairwise relatively prime positive integers greater than one and a1,a2,...,an arbitrary integers. Then the system
xa1(modm1),xa2(modm2),xan(modmn) has a unique solution modulo m=m1m2...mn. (That is, there is a solution x with 0x<m, and all other solutions are congruent modulo m to this solution.)

  • m1,m2,...,mn가 모두 서로소인 양의 정수이고, a1,a2,...,an가 모두 임의의 정수라 할 때,
    • 다음의 연립 합동식은 유일한 해를 갖는다.
xa1(modm1),xa2(modm2),xan(modmn)
  • 그리고 그 해는 모듈로 m=m1m2...mn 이다.
    • 0x<m 인 해 x가 있고, 모든 다른 해는 이 해에 모듈로 m 합동이다.

증명

m=m1m2...mn 이므로, Mk 를 다음과 같이 정의하자.

Mk=mmk

그런데 m1,m2,m3,...,mn 은 모두 서로소이므로 mkMk의 최대공약수는 1 이다.

gcd(mk,Mk)=1

mkMk 가 서로소이고, mk>1 이므로, 위에서 언급한 정리에 의해 Mk 모듈로 mk의 역이 존재할 것이다.

Mk 모듈로 mk의 역을 yk 라 하자.

Mkyk1 (modmk)

연립해를 구성하기 위해 다음과 같은 합을 꾸며보자.

x=a1M1y1+a2M2y2+...+anMnyn

이 합이 왜 엽립해가 되는가?

jk 일 때 Mj0 (modmk) 이므로 k 번째 항을 제외한 모든 항이 0 모듈로 mk 에 합동이기 때문이다.

xakMkykak (modmk)

예제 4

알려지지 않은 숫자가 있다. 3으로 나누면 2가 남고 5로 나누면 3이 남고 7로 나누면 2가 남는 수는 무엇인가?

이 문제는 다음의 연립 합동식으로 생각할 수 있다.

x2(mod3),x3(mod5),x2(mod7)

그리고 m=3×5×7=105 이므로,

M1=m3=35M2=m5=21M3=m7=15

35 modulo 3의 역 y1, 21 modulo 5의 역 y2, 15 modulo 7의 역 y3를 구하자.

  • 35y11 (mod3) 이므로 y1=2
  • 21y21 (mod5) 이므로 y2=1
  • 15y31 (mod7) 이므로 y3=1

xa1M1y1+a2M2y2+a3M3y3 이므로, 값을 대입해 계산해 보면…

a1M1y1+a2M2y2+a3M3y3=2352+3211+2151=140+63+30=233

233 이 문제의 답에 해당되긴 하지만 더 작은 수를 찾아보면 좋을 것 같다.

x233(mod105)128(mod105)23(mod105)

따라서 문제의 조건에 들어맞는 가장 작은 자연수는 23 이다.

예제 5

알려지지 않은 숫자가 있다. 5로 나누면 1이 남고 6으로 나누면 2가 남고 7로 나누면 3이 남는 수는 무엇인가?

예제 4와 똑같이 풀어보자. 다음과 같은 연립 합동식을 생각할 수 있을 것이다.

x1(mod5),x2(mod6),x3(mod7)

m=5×6×7=210 이므로…

M1=m5=2105=42M2=m6=2106=35M3=m7=2107=30

이제 42 modulo 5 의 역 y1, 35 modulo 6 의 역 y2, 30 modulo 7 의 역 y3 을 구하자.

  • 42y11 (mod5) 이므로 y1=3
  • 35y21 (mod6) 이므로 y2=5
  • 30y31 (mod7) 이므로 y3=4

xa1M1y1+a2M2y2+a3M3y3 이므로, 값을 대입해 계산해 보면…

a1M1y1+a2M2y2+a3M3y3=1423+2355+3304=126+350+360=836

이제 값을 좁혀 나가면 된다.

x836(mod210)206(mod210)

206 은 5 로 나누면 1 이 남고, 6 으로 나누면 2 가 남고, 7 로 나누면 3 이 남는 가장 작은 양의 정수이다.

예제 6

back substitution 방법을 사용하여 x1(mod5),x2(mod6),x3(mod7)을 만족하는 모든 x를 찾아라.

위의 예제 5를 다른 방식으로 풀어보는 문제다.

x1(mod5)x=5t+1 과 같이 표현할 수 있다(단, t는 정수).

이를 이용하자.

x=5t+1 를 두 번째 합동식에 대입해보자.

5t+12(mod6)5t1(mod6)

이제 t 를 구하자. t 는 5 모듈로 6 의 역이다.

gcd(5,6)=1 이고, 1=1×61×5 이므로 5 모듈로 6 의 역이 -1 임을 알 수 있다.

t 는 6 을 주기로 순환할 것이므로 6u1 과 같이 표현할 수 있을텐데, 모듈로 6 에 대해 생각해야 하므로 6을 더해 -1 을 없애주자.

따라서 t=6u+5 이다(단, u는 정수).

그렇다면 x를 다음과 같이 u 로 표현할 수 있다.

x=5t+1=5(6u+5)+1=30u+26

이제 이 x 를 세번째 합동식에 대입하자.

x3(mod7)30u+263(mod7)30u+(3×7+5)3(mod7)30u+53(mod7)30u2(mod7)30u5(mod7)

u 를 조사하기 위해 30 모듈러 7 의 역을 구하자.

30=4×7+27=2×3+1

gcd(30,7)=1 이다.

1=72×3=7(304×7)×3=73×30+12×7=3×30+13×7

7 로 나누었을 때 1 이 나머지가 되어야 하므로 모양을 잘 살펴보면 역의 후보는 13 이 아니라 -3 이라는 것을 알 수 있다.

-3 에 7 을 더하면 4 이므로 30 모듈러 7 의 역은 4 이다.

30u5(mod7)4×30u4×5(mod7)120u20(mod7)u6(mod7)

따라서 u=7v+6 이다(단, v 는 정수).

그러므로 x=30u+26

x=30u+26=30(7v+6)+26=210v+206

세 합동식을 모두 사용해여 만든 x206(mod210) 이다.

즉, x206,416,626,... 이다.

응용: 큰 정수를 컴퓨터로 계산하기

중국인의 나머지 정리를 응용하면 어떤 수 a(amodm1,amodm2,...,amodmn) 과 같은 방법으로 유일하게 표현할 수 있다.

가령 0 부터 11 까지의 모든 수를 mod3, mod4 를 써서 다음과 같이 유일하게 나타낼 수 있다.

0=(0mod3,0mod4)=(0,0)1=(1mod3,1mod4)=(1,1)2=(2mod3,2mod4)=(2,2)3=(3mod3,3mod4)=(0,3)4=(4mod3,4mod4)=(1,0)5=(5mod3,5mod4)=(2,1)6=(6mod3,6mod4)=(0,2)7=(7mod3,7mod4)=(1,3)8=(8mod3,8mod4)=(2,0)9=(9mod3,9mod4)=(0,1)10=(10mod3,10mod4)=(1,2)11=(11mod3,11mod4)=(2,3)
  • 아주 커다란 정수를 "다른 방식으로" 표현하는 방법의 하나로 고려할 수 있다.
  • 큰 정수에 대한 연산이 필요할 때, n 쌍의 각 요소에 해당 연산을 수행하고, 모듈로 mi 합동식을 풀어서 값을 회복하는 방법으로 결과를 얻을 수 있다.
    • 이 방법은 병렬 처리가 가능하기 때문에 큰 수를 효율적으로 다룰 수 있다.

예를 들어 99,98,97,95 를 계수로 사용한다 하자.

그렇다면 m 값은 다음과 같을 것이다.

m=99×98×97×95=89403930

이제 89403930 보다 작은 모든 양의 정수는 99,98,97,95 로 표현하는 것이 가능하다.

구체적으로 만약 구하려는 수가 x=123684+413456 라면 다음과 같이 계산을 수행할 수 있다.

(123684mod99,123684mod98,123684mod97,123684mod95)=(33,8,9,89)(413456mod99,413456mod98,413456mod97,413456mod95)=(32,92,42,16)

이제 두 튜플의 합을 구한다.

(33,8,9,89)+(32,92,42,16) =((33+32)mod99,(8+92)mod98,(9+42)mod97,(89+16)mod95) =(65mod99,100mod98,51mod97,105mod95) =(65,2,51,10)

이제 x를 다음과 같은 합동식으로 표현할 수 있다.

x65(mod99)x2(mod98)x51(mod97)x10(mod95)

0<x<98403930 이면서 이 합동식의 해가 되는 x는 하나 밖에 없다.

책에 이 합동식의 풀이는 안 나왔지만 하는 김에 풀어보자.

다음 식을 풀면 된다.

x(a1M1y1+a2M2y2+a3M3y3+a4M4y4)(mod89403930)

일단 ai 는 이미 나와 있으므로 또 계산할 필요는 없다.

a1=65a2=2a3=51a4=10

다음은 Mi,yi 차례. 계산이 좀 짜증나긴 하지만 큰 수의 연산을 위해 이 99,98,97,95 합동식을 사용하는 컴퓨터 시스템이라면 Mi,yi 와 같은 숫자들은 미리 계산해놓고 상수로 쓰고 있을 것이다.

M1=99×98×97×9599=903070M2=99×98×97×9598=912285M3=99×98×97×9597=921690M4=99×98×97×9595=941094

이제 각 Mi 의 역을 구하면 된다.

903070×y1=1(mod99)912285×y2=1(mod98)921690×y3=1(mod97)941094×y4=1(mod95)

역은 예제 4예제 5에서 많이 연습했으니 구하는 과정은 생략하자. (컴퓨터도 처음에 계산해둔 역을 사용할 것이다.)

계산해보면 다음과 같이 나온다.

y1=37y2=33y3=24y4=4

따라서 다음과 같은 중간 결과를 얻을 수 있다.

a1M1y1=65×903070×37a2M2y2=2×912285×33a3M3y3=51×921690×24a4M4y4=10×941094×4

구하고자 하는 x 의 값은 다음과 같으므로

x(a1M1y1+a2M2y2+a3M3y3+a4M4y4)(mod89403930)

덧셈으로 연결된 각 aiMiyi 는 병렬로 따로 계산할 수 있을 것이다.

a1M1y1mod89403930=2171883350mod89403930=26189030a2M2y2mod89403930=60210810mod89403930=60210810a3M3y3mod89403930=1128148560mod89403930=55301400a4M4y4mod89403930=37643760mod89403930=37643760

이제 나머지만 구하면 된다.

x26189030+60210810+55301400+37643760(mod89403930)179345000(mod89403930)537140

따라서 x=123684+413456=537140 이다.

유사난수

pseudorandom numbers

알고리즘을 통해 생성된 난수는 진정한 난수라 부르기 어렵다. 따라서 유사난수라 부른다.

선형합동방법

linear congruential method

선형합동방법은 유사난수를 만들 때 흔히 사용하는 방법이다.

다음과 같은 방법을 따른다.

4개의 정수를 선택한다.

  • modulus로서, m.
  • multiplier로서, a.
  • increment로서, c.
  • seed로서, x0.

단, 위의 네 정수들은 다음 조건을 만족해야 한다.

2a<m0c<m0x0<m

그리고 다음 합동식을 사용하면,

xn+1=(axn+c)modm

x0으로 x1 을구하고 x1x2를 구해낼 수 있다.

이 방법으로 {x0,x1,...,xn} 을 구한다.

(단, 0xi<m 이라는 점에 주의한다.)

프로그래밍을 할 때 구하곤 하는 일반적인 난수처럼 0과 1 사이의 값이 필요하면 선형합동방법을 통해 얻은 수를 m 으로 나누면 된다.

예제

선형합동방법으로 m=9,a=7,c=4,x0=3 을 사용해 유사난수의 수열을 구하라.

일단 합동식에 값을 채워보자. xn+1=(axn+c)modm 이므로…

xn+1=(7xn+4)mod9

순서대로 계산해 보자.

x0=3x1=(7×x0+4)mod9=25mod9=7x2=(7×x1+4)mod9=53mod9=8x3=(7×x2+4)mod9=60mod9=6x4=(7×x3+4)mod9=46mod9=1x5=(7×x4+4)mod9=11mod9=2x6=(7×x5+4)mod9=18mod9=0x7=(7×x6+4)mod9=4mod9=4x8=(7×x7+4)mod9=32mod9=5x9=(7×x8+4)mod9=39mod9=3

x9 에서 x0 과 똑같이 나오고, 이후로는 9를 주기로 순환하게 된다.

따라서 유사난수의 수열은 다음과 같다.

{3,7,8,6,1,2,0,4,5,3,7,8,6,...}

검사 숫자

Check Digits

  • 합동을 사용해 숫자 배열의 오류를 검사할 수 있다.
    • 보통 수열의 마지막에 검사용 숫자를 더하는 방식이다.
    • 검사용 숫자는 알고리즘을 사용해 만들어낸다.

패리티 검사 비트

parity check bits

  • 비트열을 저장하거나 전송하기 전에 패리티 검사 비트 하나를 뒤에 붙이는 방식.
  • 패리티 비트는 전체 비트열의 1이 짝수 개가 되도록 조절하는 비트이다.

예를 들어 11010110을 전송하려면 1이 5개이므로 패리티 비트 1을 붙여서 110101101 로 만든 다음 전송한다.

  • 전송받은 쪽에서 비트열을 받아봤더니 010101101 가 나왔다고 하자.
    • 1의 수를 세어보면 5개이다.
    • 5mod2는 짝수가 아니므로 잘못 전송되었다는 것을 알 수 있다.

보내는 쪽에서 어떤 수를 보냈는지 전혀 모르는 상태이지만, 항상 1의 수가 짝수가 되도록 패리티 비트를 붙여 보내기로 했으므로 잘못 전송되었다는 것을 알 수 있다. 이제 재전송을 요청하면 된다.

  • 이 방식의 문제점: 잘못 전송된 비트가 홀수 개일 때에만 잘못 전송되었다는 사실을 깨달을 수 있다.

참고문헌

  • Rosen의 이산수학 / Kenneth H. Rosen 저 / 공은배 등저 / 한국맥그로힐(McGraw-Hill KOREA) / 2017년 01월 06일

함께 읽기