알고리즘공부(Algorithm Study)/알고리즘이론(AlgorithmTheory)

Karatsuba 알고리즘

Chann._.y 2024. 8. 13.
728x90

Karatsuba 알고리즘이란?

Karatsuba 알고리즘은 큰 수의 곱셈을 더 효율적으로 수행하기 위한 알고리즘입니다. 이 알고리즘은 1960년에 안넨카롤로스 Karatsuba에 의해 처음 개발되었으며, 전통적인 곱셈 방법보다 계산 복잡도가 낮습니다.

1. 전통적인 곱셈의 문제점

일반적으로 두 자리수가 각각 n자리수일 때, 이들을 곱하기 위해서는 O(n^2)의 시간이 소요됩니다. 예를 들어, 두 개의 4자리수를 곱할 때는 각 자리수마다 곱셈과 덧셈을 반복하는 방식으로 총 16번의 곱셈을 수행하게 됩니다. 이 방식은 숫자가 커질수록 연산량이 급격히 증가하여 비효율적입니다.

2. Karatsuba 알고리즘의 기본 개념

Karatsuba 알고리즘은 '분할 정복(Divide and Conquer)' 접근 방식을 사용하여 곱셈을 더 효율적으로 수행합니다. 기본 아이디어는 큰 수를 절반으로 나누고, 이 작은 수들을 이용해 곱셈을 수행한 후 결과를 합치는 것입니다. 이 과정에서 전체 곱셈 연산의 수를 줄일 수 있습니다.

3. Karatsuba 알고리즘의 동작 과정

Karatsuba 알고리즘은 다음과 같은 단계로 동작합니다:

  1. 두 개의 큰 수를 각각 절반으로 나눕니다. 예를 들어, xy가 두 숫자라면 이들을 다음과 같이 나눕니다:
    • ( x = 10^{n/2} \cdot a + b )
    • ( y = 10^{n/2} \cdot c + d )
      여기서 a, b, c, d는 작은 숫자들입니다.
  2. 세 개의 부분 곱셈을 수행합니다:
    • ( ac = a \times c )
    • ( bd = b \times d )
    • ( ad + bc = (a + b) \times (c + d) - ac - bd )
  3. 이 세 개의 곱셈 결과를 사용해 최종 곱셈 결과를 계산합니다:
    • 최종 결과: ( ac \times 10^n + (ad + bc) \times 10^{n/2} + bd )

이 알고리즘은 전통적인 곱셈에서 요구되는 4개의 곱셈 대신 3개의 곱셈만으로도 곱셈을 수행할 수 있게 해줍니다.

4. Karatsuba 알고리즘의 장점

  • 연산 효율성: Karatsuba 알고리즘은 O(n^2) 복잡도의 전통적인 곱셈 알고리즘보다 효율적인 O(n^log3) 복잡도를 가집니다. 이것은 특히 숫자의 크기가 커질수록 그 차이가 크게 나타납니다.
  • 적용 용이성: 구현이 비교적 간단하고, 숫자가 클수록 성능 향상이 두드러지기 때문에 실용적인 알고리즘으로 널리 사용됩니다.

5. Karatsuba 알고리즘의 파이썬 구현

다음은 Karatsuba 알고리즘을 파이썬으로 구현한 예제입니다:

def karatsuba(x, y):
    # x 또는 y가 1자리 숫자가 될 때까지 재귀적으로 나눕니다.
    if len(str(x)) == 1 or len(str(y)) == 1:
        return x * y

    # 숫자를 반으로 나눕니다.
    n = max(len(str(x)), len(str(y)))
    half = n // 2

    # x와 y를 반으로 나눕니다.
    a = x // 10**half
    b = x % 10**half
    c = y // 10**half
    d = y % 10**half

    # 세 개의 부분 곱셈을 수행합니다.
    ac = karatsuba(a, c)
    bd = karatsuba(b, d)
    ad_plus_bc = karatsuba(a + b, c + d) - ac - bd

    # 최종 결과를 합칩니다.
    result = ac * 10**(2*half) + ad_plus_bc * 10**half + bd

    return result

# 예제 실행
x = 12345678
y = 87654321
print("Karatsuba 곱셈 결과:", karatsuba(x, y))

이 코드에서 Karatsuba 알고리즘이 재귀적으로 호출되며, 작은 부분 문제로 나눠서 처리됩니다. 이를 통해 큰 수의 곱셈을 전통적인 방식보다 빠르게 처리할 수 있습니다.

6. 결론

Karatsuba 알고리즘은 큰 수의 곱셈을 더 효율적으로 처리하는 데 중요한 역할을 합니다. 특히, 대규모 데이터나 암호화 등에서 큰 수를 다루는 경우 이 알고리즘을 사용하여 성능을 크게 향상시킬 수 있습니다.

728x90

댓글