μ•”ν˜Έν•™μ—μ„œ μ€‘μš”ν•˜κ²Œ μ‚¬μš©λ˜λŠ” 타원곑선에 λŒ€ν•΄ μ•Œμ•„λ³΄μž. μ™œ ν•΄λ‹Ή 곑선을 μ‚¬μš©ν• κΉŒ?

타원곑선

  • μœ„μ˜ λ°©μ •μ‹μ˜ ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚˜λŠ” 곑선
  • νƒ€μ›μ˜ λ‘˜λ ˆλ₯Ό κ΅¬ν•˜κΈ° μœ„ν•œ 적뢄, 이의 μ—­ν•¨μˆ˜λ₯Ό κ΅¬ν•˜λŠ” κ³Όμ •μ—μ„œ μœ λž˜ν–ˆλ‹€.
    • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 곑선 ν˜•νƒœλ§Œ λ΄μ„œλŠ” 타원과 연관이 μžˆλŠ”μ§€ λͺ¨λ₯΄κ² λ‹€.
  • 싀해석학, λ³΅μ†Œν•΄μ„ν•™, λŒ€μˆ˜κΈ°ν•˜ν•™, μ •μˆ˜λ‘  λͺ¨λ‘μ—μ„œ μ΄μ•ΌκΈ°λ˜λŠ” μ€‘μš”ν•œ λŒ€μƒμ΄λ‹€.
  • μ—„λ°€νžˆ λ§ν•˜λ©΄ 첨점, ꡐ차점과 같은 특이점이 μ—†λŠ” ν˜•νƒœμ—¬μ•Ό ν•œλ‹€.
    • , λŠ” λ™μ‹œμ— 0μ΄μ–΄μ„œλŠ” μ•ˆλœλ‹€.
    • κ·Έλ ‡κ²Œ 될 경우 (0, 0)μ—μ„œ νŠΉμ΄μ μ„ κ°–κ²Œλœλ‹€.
  • μžμ„Έν•œ λ‚΄μš©μ€ μœ„ν‚€λ₯Ό μ°Έκ³ ν•˜μž.

  • κ³„μˆ˜μ— 따라 λ‹€μ–‘ν•œ λͺ¨μ–‘이 κ°€λŠ₯ν•˜λ‹€.

secp256k1

  • λΉ„νŠΈμ½”μΈμ—μ„œ μ‚¬μš©λ˜λŠ” 타원 κ³‘μ„ μ˜ 이름이닀.

타원 κ³‘μ„ μ—μ„œ 그은 μ§μ„ μ˜ μ’…λ₯˜

  • λΉ„νŠΈμ½”μΈμ—μ„œ μ‚¬μš©ν•˜λŠ” νŠΉμ • 타원 곑선은 λ‚˜μ€‘μ— μ•Œμ•„λ³΄μž.
  • κ·Έ λŒ€μ‹ , 일반적인 타원 κ³‘μ„ μ—μ„œ 직선을 κ·Έμ—ˆμ„ λ•Œ,
  • λ‚˜μ˜¬ 수 μžˆλŠ” νŒ¨ν„΄λ“€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.
일반적인 경우
ν•œ μ μ—μ„œ λ§Œλ‚¨μ„Έ μ μ—μ„œ λ§Œλ‚¨
μ˜ˆμ™Έ 사항
두 μ μ—μ„œ λ§Œλ‚¨(yμΆ•κ³Ό 평행)두 μ μ—μ„œ λ§Œλ‚¨(μ ‘μ„ )

타원 곑선 μœ„μ˜ 두 점 λ§μ…ˆ

Note: μ»΄ν“¨ν„°μ—μ„œ μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” 것은, νŠΉμ • κ³‘μ„ μœ„μ— μžˆλŠ” 점의 μ„±μ§ˆμ΄λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μœ„μ˜ 타원 κ³‘μ„ μœ„μ— μžˆλŠ” 점자체λ₯Ό ν‘œν˜„ν•  수 μžˆλ„λ‘λ§Œ μ²˜λ¦¬ν•  μ˜ˆμ •μ΄λ‹€.

  • 타원 κ³‘μ„ μœ„μ— μžˆλŠ” 점듀에 κ΄€ν•΄ λ§μ…ˆ 연산을 μ •μ˜ν•΄λ³΄μž.

μ •μ˜

A+B = xμΆ• λŒ€μΉ­(A와 Bλ₯Ό μ§€λ‚˜λŠ” 직선이 λ§Œλ‚˜λŠ” μ„Έλ²ˆμ§Έ ꡐ점)

  • μ„Έ μ μ—μ„œ λ§Œλ‚˜λŠ” κ²½μš°μ—μ„œ μœ„μ™€ 같이 연산을 μ •μ˜ν•œλ‹€.
  • λ”°λΌμ„œ ν•œμ μ—μ„œ λ§Œλ‚˜λŠ” κ²½μš°μ—λŠ” μ—°μ‚° μ •μ˜κ°€ λΆˆκ°€ν•˜λ‹€.
  • μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” 것은 점 λ§μ…ˆμ˜ κ²°κ³Όλ₯Ό μ‰½κ²Œ μ˜ˆμΈ‘ν•  수 μ—†λ‹€λŠ” 것이닀.
  • λŠ” 쀑앙에, λŠ” μ™Όμͺ½μ— μžˆλ‹€.
  • 즉 λΉ„μ„ ν˜• 연산이닀.
    • μ„ ν˜• 연산이렀면, νŠΉμ • λŒ€μƒμ„ basis둜 λ”ν•˜κ³  κ³±ν•˜μ—¬ λ§Œλ“€ 수 μžˆμ–΄μ•Ό ν•œλ‹€.
    • 벑터, ν•¨μˆ˜ λ“±λ“±
    • 이 타원 곑선 λ§μ…ˆ 연산은 β€œμˆœν™˜β€ν•˜λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

점 λ§μ…ˆ μ„±μ§ˆ

μœ„μ—μ„œ μ •μ˜ν•œ 타원 κ³‘μ„ μ˜ 점듀 μ‚¬μ΄μ˜ λ§μ…ˆμ€ 일반 λ§μ…ˆκ³Ό 같이 λ‹€μŒμ˜ μ„±μ§ˆμ„ λ§Œμ‘±ν•œλ‹€.

  • 항등원 쑴재
  • 역원 쑴재
  • κ΅ν™˜ 법칙 성립
  • κ²°ν•© 법칙 성립

항등원

  • ν•­λ“±μ›μ΄λž€ μœ„λ₯Ό λ§Œμ‘±ν•˜λŠ” 점이 μžˆλ‹€λŠ” 말이닀.
  • 예컨데 일반 λ§μ…ˆμ΄λΌλ©΄ 0κ³Ό 같은 값이 될 것이닀.
  • μœ„ 타원 κ³‘μ„ μ—μ„œ μ •μ˜λœ μ—°μ‚°μ˜ 경우 β€œλ¬΄ν•œμ›μ β€ 이라고 μ •μ˜λœ 것을 항등원이라 ν•œλ‹€.
  • μ—₯? 이게 μ™œ λ¬΄ν•œλŒ€κ°€ 말이 λ˜λŠ”κ±°μ§€? μƒκ°ν•΄λ³΄μž.

λ¬΄ν•œ 원점

  • ν•­λ“±μ›μ˜ μ •μ˜μ— 따라 κ°€ 되기 μœ„ν•΄ μ–΄λ– ν•œ μƒνƒœκ°€ λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ μΆ”μ ν•΄λ³΄μž.
  • νŒŒλž€μƒ‰ ν™”μ‚΄ν‘œμ™€ 같은 λ°©ν–₯으둜 μ΄λ™ν•˜λŠ” 것이 λͺ©ν‘œμ΄λ‹ˆ, 결ꡭ은 yμΆ•κ³Ό ν‰ν–‰ν•œ 직선이 될 수 밖에 μ—†λ‹€.
  • μ΄λ ‡κ²Œ λ˜μ—ˆμ„ μ‹œ I의 μœ„μΉ˜λ₯Ό 보면 κ²°κ΅­ λ¬΄ν•œνžˆ λ–¨μ–΄μ Έ μžˆλŠ” 점이닀.
  • μ‹€μ œλ‘œ μžˆμ„μ§€ λͺ¨λ₯΄μ§€λ§Œ, μ΄λŸ¬ν•œ 점의 쑴재λ₯Ό μ„€μ •ν•œ 것이 β€œλ¬΄ν•œ 원점”이라고 ν•  수 μžˆλ‹€.

역원

  • μ—­μ›μ˜ 경우 μœ„μ˜ μ‹μ—μ„œ -Aλ₯Ό λ§Œμ‘±ν•˜λŠ” 것이 μžˆλŠ”μ§€ 확인해보면 λœλ‹€.
  • 이λ₯Ό μœ„ν•΄μ„œ ν•­λ“±μ›μ˜ 쑴재λ₯Ό νŒŒμ•…ν–ˆλ˜ 그림을 κ°€μ Έμ˜€μž.
  • λ¬΄ν•œ μ›μ μ˜ μœ„μΉ˜λ₯Ό νŒŒμ•…ν•˜κΈ°κ°€ μ–΄λ €μš°λ‹ˆ, λΉ¨κ°„ μ§μ„ μ˜ 기울기λ₯Ό μ•½κ°„ μ–‘μˆ˜, μ•½κ°„ 음수라고 λ§ˆμŒμ†μœΌλ‘œ μƒκ°ν•΄λ³΄μž.
  • 그럴 경우 각각의 μ–‘ 끝단에 λ¬΄ν•œ 원점이 μœ„μΉ˜ν•˜κ³ ,
  • μœ„μ˜ 연산을 λ§Œμ‘±ν•˜κΈ° μœ„ν•΄μ„œ -Aκ°€ μ§κ΄€μ μœΌλ‘œ μ •μ˜λ¨μ„ 확인할 수 μžˆλ‹€.

κ΅ν™˜λ²•μΉ™

  • 점 λ§μ…ˆμ˜ μ–‘ ν•­μ˜ μˆœμ„œλ₯Ό 변경해도 κ²°κ³Όκ°€ κ°™λ‹€.
  • μ΄λŠ” 쑰금만 선을 그어보면 확인할 수 μžˆμœΌλ‹ˆ μƒλž΅ν•œλ‹€.

결합법칙

  • 3개 μ΄μƒμ˜ λ§μ…ˆμ—μ„œ μ–΄λŠ 두항을 λ¨Όμ € 더해도 κ²°κ³ΌλŠ” λ™μΌν•˜λ‹€.
  • μœ„μ˜ μ˜ˆμ‹œλ₯Ό 보고 직접 ν™•μΈν•΄λ³΄μž.

μ½”λ“œ κ΅¬ν˜„

μ˜ˆμ™Έ μΌ€μ΄μŠ€κ°€ μ–΄λ–€ 것이 μžˆλŠ”μ§€λ₯Ό 확인해보고 κ³ λ €ν•΄μ•Όν•  것을 μ •λ¦¬ν•΄λ³΄μž.

λ”ν•˜λŠ” 두 점이 λ†“μ—¬μžˆλŠ” 상황은 λ‹€μŒμ˜ κ²½μš°κ°€ μ „λΆ€λ‹€.

  1. 두 점이 yμΆ•κ³Ό ν‰ν–‰ν•œ 직선 μœ„μ— μžˆλŠ” 경우
  2. 두 점이 yμΆ•κ³Ό ν‰ν–‰ν•œ 직선 μœ„μ— μžˆμ§€ μ•Šμ€ 경우
  3. 두 점이 같은 경우
    • μ ‘ν•˜λŠ” 경우

Code

  • λ¬΄ν•œλŒ€ ν‘œν˜„ 방법이 μ—†μ–΄ None을 λ¬΄ν•œ 원점이라고 κ°€μ •ν•  것이닀.
class Point:
 
    def __init__(self, x, y, a, b):
        self.a = a
        self.b = b
        self.x = x
        self.y = y
 
        if self.x is None and self.y is None:
            return
 
        if self.y**2 != self.x**3 + a * x + b:
            raise ValueError('({}, {}) is not on the curve'.format(x, y))
 
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y \
            and self.a == other.a and self.b == other.b
 
    def __ne__(self, other):
        return self.__eq__(other) == False
 
    def __repr__(self):
        if self.x is None:
            return 'Point(infinity)'
        else:
            return 'Point({},{})_{}_{}'.format(self.x, self.y, self.a, self.b)
 
    def __add__(self, other):
        if self.a != other.a or self.b != other.b:
            raise TypeError('Points {}, {} are not on the same curve'.format
            (self, other))
 
        # A + I = A (IλŠ” λ¬΄ν•œμ›μ  == None으둜 ν‘œν˜„)
        if self.x is None:
            return other
        if other.x is None:
            return self
 
        # 두 점이 λ‹€λ₯Έ 경우 (yμΆ• 평행 O)
        if self.x == other.x and self.y != other.y:
            return self.__class__(None, None, self.a, self.b)
 
        # 두 점이 λ‹€λ₯Έ 경우 (yμΆ• 평행 X)
        if self.x != other.x:
            x1, y1 = self.x, self.y
            x2, y2 = other.x, other.y
            s = (y2-y1)/(x2-x1)
            x3 = s**2-x1-x2
            y3 = s*(x1-x3)-y1
            return self.__class__(x3, y3, self.a, self.b)
 
        # 두 점이 같은 경우(μ ‘ν•˜λŠ” 경우)
        if self == other:
            x1, y1 = self.x, self.y
            x2, y2 = other.x, other.y
            a = self.a
            s = (3*x1**2+a)/(2*y1)
            x3 = s**2-2*x1
            y3 = s*(x1-x3)-y1
            return self.__class__(x3, y3, self.a, self.b)
        
        # 두 점이 같은 경우(μ ‘ν•˜λŠ”λ° κ·Έ 점이 yκ°€ 0인 경우 - Divied by zero)
        if self == other and self.y == 0:
            return self.__class__(None, None, self.a, self.b)
 
        raise NotImplementedError

Reference