Organize notes
정수론 1
-
설명: 수학의 한 분야로, 정수와 관련된 다양한 성질을 다루는 학문
- 암호학에서 사용되는 정수론에서는 모든 자연수나 정수 범위보다도, 특정 값으로 나누는 나머지 연산이 높은 비중을 차지함
-
유클리드 알고리즘(Euclidean algorithm) 혹은 유클리드 호제법
-
소인수분해 과정 없이도 두 수의 최대공약수(Greatest Common Divisor, GCD)를 구할 수 있음
-
다음과 같은 사실을 기반으로 함
- a > b인 양의 정수 a, b에 대하여 a를 b로 나눈 나머지를 r로 정의하면, a, b의 최대공약수와 b, r의 최대공약수는 동일하다.
- a > 0일때, a, 0의 최대공약수는 a로 정의된다.
-
-
확장 유클리드 알고리즘(Extended Euclidean algorithm)
-
최대공약수(GCD)를 구하는 동시에, ax + by = gcd(a, b)를 만족하는 x, y를 찾아내는 알고리즘
-
사용 방법
- g = gcd(a, b)로 정의할 경우, 다음의 조건을 만족하는 정수 x, y는 항상 존재함
- a * x + b * y = g -> 조건을 만족하는 정수해 x, y는 유클리드 알고리즘을 구하는 방식과 동일하게 재귀적으로 구할 수 있음
-
서로소
-
설명: 특별히 양의 정수 a, b의 최대공약수의 값이 1인 경우, a, b는 서로소(Coprime, Relatively prime) 관계에 있다고 표현함
-
확장 유클리드 알고리즘을 사용하면 서로소 관계에 있는 양의 정수 a, b에 대해, a * x + b * y = 1을 만족하는 정수쌍 x, y를 찾을 수 있음
- modulus에서의 역원을 구할 때 사용됨
-
-
-
합동식과 법
-
합동(Congruence)
-
두 정수 a, b를 각각 양의 정수 m으로 나눈 나머지가 동일할 경우, “a, b는 m에 대하여 합동”이라고 표현함
- 합동 관계를 작성한 수식을 합동식(Congruence relation)이라고 부름(a ≡ b (mod m))
- a ≡ b (mod m)꼴의 합동식에서 m을 법 혹은 Modulus라고 부름
-
암호학에서 중요한 합동식 규칙
- 교환법칙이 성립한다. 즉 a ≡ b (mod m)이 성립하면 b ≡ a (mod m)이 성립한다.
- a ≡ b (mod m), c ≡ d (mod m)이 성립하면 a ± c ≡ b ± d (mod m)이 성립한다.
- a ≡ b (mod m), c ≡ d (mod m)이 성립하면 a * c ≡ b * d (mod m)이 성립한다.
- a ≡ b (mod m)이 성립하면, 정수 k에 대하여 ak ≡ bk (mod m)이 성립한다.
-
-
Modulus에서의 항등원과 역원
-
덧셈의 항등원과 역원
-
항등원의 경우
- Modulus m 위에서 덧셈에 대한 항등원은 일반적인 덧셈에 대한 항등원과 동일한 0임. 물론, m, 2 * m, …등과 같이 표현 가능하지만, 모두 m으로 나눈 나머지는 0으로 동일하므로 생략함
-
역원의 경우
- a에 대한 역원은 -a, 를 포함해 m - a, 2 * m - a, …와 같은 값들이 될 수 있음. 이 값들은 Modulus m 위에서 모두 동일함
-
-
곱셈의 항등원과 역원
-
항등원의 경우
- Modulus m 위에서 곱셈에 대한 항등원은 일반적인 곱셈에 대한 항등원과 동일한 1임(a * 1 ≡ a (mod m))
-
역원의 경우
- 상황에 따라 존재하거나 존재하지 않을 수 있음
- a의 역원 a-1이 존재한다고 가정하면, 다음의 식이 성립해야 함 -> a * a-1 ≡ 1 (mod m)
- 역원이 존재하는 경우
-
a, m의 최대공약수를 g라고 정의할 때, 좌변 a * a-1은 a의 배수이므로 g의 배수임이 보장됨. 우변은 좌변에서 m을 정수 회 더하거나 뺀 값과 동일하고 m도 g의 배수이기 때문에 우변인 1도 g의 배수임이 보장됨
-
최대공약수 g가 1, 즉 a, m이 서로소 관계에 있는 경우에 역원이 항상 존재함
- 서로소인가? = 역원인가?
-
a, m이 서로소일 경우, 확장 유클리드 알고리즘을 사용하여 a * x + m * y = 1을 만족하는 정수쌍 x, y를 찾을 수 있음
- 이 때 a * x = 1 - m * y이고, 1 - m * y ≡ 1이기 때문에 ax ≡ 1 (mod m)에 대한 역원의 조건을 만족함
-
-
-
-
-
중국인의 나머지 정리(Chinese Remainder Theorem, CRT)
- 설명: 서로소인 두 modulus p,q 위에서 각각 x의 값이 유일하게 정해지는 경우, x는 modulus p * q 위에서도 항상 유일한 해가 존재한다.
-
해의 존재성
- 증명할 것: x ≡ a (mod p), x ≡ b (mod q)일 때, x ≡ c (mod p * q)의 c 값을 구하는 방법
- q * β ≡ 1 (mod p)
- p * α ≡ 1 (mod q)
- 이 때, c = a * q * β + b * p * α로 정의하면 c ≡ a (mod p), c ≡ b (mod q)이 성립함을 알 수 있음
- c ≡ a * q * β + b * p * α ≡ a * q * β ≡ a * (q * β) ≡ a * 1 ≡ a (mod p)
- c ≡ a * q * β + b * p * α ≡ b * p * α ≡ b * (p * α) ≡ b * 1 ≡ b (mod q)
- x ≡ c (mod p * q)일 때, x ≡ a (mod p), x ≡ b (mod q)를 만족하는 c가 항상 존재함
- 증명할 것: x ≡ a (mod p), x ≡ b (mod q)일 때, x ≡ c (mod p * q)의 c 값을 구하는 방법
-
해의 유일성
- 증명할 것: 해의 존재성에서 구한 c 이외의 다른 해는 존재하지 않고, c만이 유일한 해인 이유
- c0이라는 값이 존재하여 c와 c0는 p * q로 나눈 나머지가 서로 다르고, c0 ≡ a(mod p), c0 ≡ b (mod q)을 만족한다고 가정
- c0 ≡ a ≡ c (mod p)이고, c0 ≡ b ≡ c (mod q)이므로, c0 - c는 p, q의 배수임
- p, q가 서로소이기 때문에, c0 - c는 p * q의 배수이어야 하고, 이는 c와 c0는 p * q로 나눈 나머지가 서로 다르다는 가정에 모순이 있음
- 따라서 구한 c = a * q * β + b * p * α가 p * q의 modulus 위에서 유일한 해인 것이 증명됨
- 증명할 것: 해의 존재성에서 구한 c 이외의 다른 해는 존재하지 않고, c만이 유일한 해인 이유
-
Exponentiation by squaring
-
용도: 큰 지수에 대한 거듭제곱을 연산할 때 사용되는 방법
-
e >= n에 대하여 ne을 구하는 알고리즘
- e = 0인 경우: 곱셈의 항등원 반환
- e이 0보다 큰 짝수인 경우: ne/2의 값을 구하여 (ne/2)2 반환
- e이 0보다 큰 홀수인 경우: n(e-1)/2의 값을 구하여 n * (ne-1/2)2 반환
- 일반 정수 범위에서 큰 거듭제곱을 연산할 일은 없지만, modulus 위에서의 연산인 경우 메모리 관련 문제가 없고, 큰 지수에 대한 거듭제곱을 계산할 일이 굉장히 많기 때문에 modulus 위에서의 거듭제곱 연산은 Exponentiation by squaring을 사용하기 적합함
-
def gcd(a, b): # 유클리드 알고리즘 if b == 0: return a return gcd(b, a % b)
def xgcd(a, b): # 확장 유클리드 알고리즘 if b == 0: # a = g = a * 1 + b * 0 return a, 1, 0
g, x1, y1 = xgcd(b, a % b) # g = x1 * b + y1 * (a % b) x = y1 y = (g - a * x) // b assert a * x + b * y == g
return g, x, y
def inverse(a, m): # 역원 g, x, y = xgcd(a, m)
if g != 1: # Inverse doesn't exist. return None return x
def crt(rem, mod): # 중국인의 나머지 정리에서 해의 존재성을 증명 a, b = rem p, q = mod g, alpha, beta = xgcd(p, q) assert g == 1
c = a * q * beta + b * p * alpha final_mod = p * q c %= final_mod
assert c % p == a assert c % q == b
return c, final_mod
def crt_multi(rem, mod): # 중국인의 나머지 정리에서 해의 유일성을 증명 c = 0 final_mod = 1 for a, p in zip(rem, mod): c, final_mod = crt([c, a], [final_mod, p])
for a, p in zip(rem, mod): assert c % p == a
return c, final_mod
def mypow(n, e, m): # Exponentiation by squaring if e < 0: if gcd(n, m) == 1: return mypow(inverse(n, m), -e, m) else: # Inverse doesn't exist. return None
elif e == 0: return 1
elif e % 2 == 0: return mypow(n, e // 2, m)**2 % m
else: return n * mypow(n, (e - 1) // 2, m)**2 % m