목차

고속 푸리에 변환 (Fast Fourier Transform, FFT)

개념

응용

큰 수의 곱셈

All possible sums

다항식의 빠른 나눗셈

Multi-point Evaluation

구현

코드

def fft(a: Iterable[complex], inverse: Optional[bool] = False) -> List[complex]:
    """Returns the (inverse) discrete Fourier transform of the given sequence.

    The length of the sequence should be power of 2.
    """
    a = list(a)
    n = len(a)
    if n & (n - 1):
        raise ValueError(f'len(a) ({len(a)}) is not power of 2.')
    j = 0
    for i in range(1, n):
        bit = n >> 1
        while j >= bit:
            j -= bit
            bit >>= 1
        j += bit
        if i < j:
            a[i], a[j] = a[j], a[i]

    p = (-2 if inverse else 2) * math.pi
    s = 2
    while s <= n:
        ws = cmath.exp(complex(0, p / s))
        for i in range(0, n, s):
            w = 1 + 0j
            for j in range(i, i + (s >> 1)):
                tmp = a[j + (s >> 1)] * w
                a[j + (s >> 1)] = a[j] - tmp
                a[j] += tmp
                w *= ws
        s <<= 1
    return [x / n for x in a] if inverse else a

FFT를 사용하지 않는 FFT

Teflib FFT

Q. CPython 구현은 커다란 수에서 빠릅니까?

A. 예. CPython 과 PyPy3 구현에서, decimal 모듈의 C/CFFI 버전은 임의의 정밀도로 올바르게 자리 올림 되는 십진 부동 소수점 산술을 위한 고속 libmpdec 라이브러리를 통합합니다 1. libmpdec는 중간 크기의 숫자에는 카라추바 곱셈(Karatsuba multiplication)을 사용하고 매우 큰 숫자에는 수론적 변환(Number Theoretic Transform)을 사용합니다.

코드

한계점

NTT

[To be filled]