[밑바닥비트코인] 1. 유한체(Finite field)
2021. 7. 4. 16:24ㆍBlockchain
[밑바닥비트코인]이 붙은 게시물은 모두 <밑바닥부터 시작하는 비트코인, 송재준(Jimmy Song), 2019, 한빛미디어>를
참조하였음을 밝힙니다.
이번 장에서는 비트코인에서 쓰이는 암호화 기법을 이해하기 위해서 선행되어야하는
수학적 기반들에 대해서 살펴보도록 하겠다.
유한체(Finite field)
유한체의 조건은 다음과 같다.
1. 집합에서 +, * 연산에 대해서 닫혀있다.
2. 집합 내에 0으로 표기하는 원소가 존재하여, 집합 내의 원소 a에 대해 a+0 = a 를 만족한다. (+에 대한 항등원)
3. 집합 내에 1으로 표기하는 원소가 존재하여, 집합 내의 원소 a에 대해 a*1 = a 를 만족한다. (*에 대한 항등원)
4. a+b = 0 을 만족시키는 원소 b가 집합 내에 존재하고 이를 -a로 표기한다. (+에 대한 역원 존재)
5. a*b = 1 을 만족시키는 원소 b가 집합 내에 존재하고 이를 a^-1로 표기한다. (*에 대한 역원 존재)
6. 유한체에서 원소의 개수는 유한하다.
유한체는 유한하기 때문에 유한체의 크기를 나타내는 수 p가 존재한다. 이를 위수라고 한다.
위수는 반드시 소수여야 하는데, 이 이유는 나중에 설명하겠다.
출처 : https://medium.com/@blockchainabhi/division-and-fermat-9040147a1e7c
유한체는 표기하는 예시이다. F 옆에 위수를 , { } 내에 각 원소를 늘어놓는다. 0, 1, 2는 실제 원소의 값이 아니라
각기 다른 원소임을 나타낸 것이다. 0부터 16까지 총 17개의 원소가 존재한다.
유한체를 파이썬 코드로 나타내보자.
class FieldElement:
def __init__(self, num, prime):
if num >= prime or num < 0:
error = 'Num {} not in field range 0 to {}'.format(num, prime-1)
raise ValueError(error)
self.num = num
self.prime = prime
def __repr__(self):
return 'FieldElement_{}({})'.format(self.prime, self.num)
def __eq__(self, other):
if other is None:
return False
return self.num == other.num and self.prime == other.prime
유한체 원소를 나타내는 FieldElement 클래스는 num(원소)과 prime(위수)를 멤버변수로 갖는다.
생성자 함수에서 위수의 범위를 벗어나면 에러를 출력시킨다.
__repr__ 함수에서 위와 같이 위수와 원소를 표시해주고, __ep__ 함수로 == 연산자를 재정의한다.
다른 객체의 원소와 위수 둘다 일치하면 True를 반환한다.
from FieldElement import FieldElement
if __name__ == '__main__':
element1 = FieldElement(6, 17)
element2 = FieldElement(6, 17)
print(element1)
print(element2)
print(element1==element2)
결과값>>>
FieldElement_17(6)
FieldElement_17(6)
True
'Blockchain' 카테고리의 다른 글
[밑바닥비트코인] 4. 유한체와 타원곡선 (0) | 2021.07.12 |
---|---|
[밑바닥비트코인] 3. 타원곡선 (1) | 2021.07.04 |
[밑바닥비트코인] 2. 유한체의 연산 (0) | 2021.07.04 |
[블록체인] 2. 비트코인(Bitcoin) - 사토시 나카모토 논문 해석 (1) | 2021.07.03 |
[블록체인] 1. 블록체인, 암호화폐란 무엇인가? (2) | 2021.06.21 |