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