수론적 변환(NTT) 다항식 곱셈 계산기
FFT를 복소수 대신 소수 모듈로에서 하는 수론적 변환으로 다항식을 곱하고 중간 배열을 단계별로 보여 줍니다. 반올림 오차가 아예 없다는 것과, 998244353 같은 소수를 골라야 하는 이유를 함께 확인할 수 있습니다.
낮은 차수부터. 공백이나 쉼표로 나눕니다
낮은 차수부터
곱셈 결과
18x^4 + 27x^3 + 28x^2 + 13x + 4
변환 길이 8, 단위근 ω = 372528824입니다. 곧이곧대로 계산한 값과 같습니다.
고른 소수
단계별 배열
점값 표현에서는 곱셈이 «점마다 그냥 곱하기»가 됩니다. 다항식을 계수로 곱하면 O(n²) 인데 점값으로 바꾸면 O(n)이고, 오가는 변환이 각각 O(n log n)이라 전체가 O(n log n)이 됩니다.
연산 횟수 어림
항이 몇십 개 수준이면 곧이곧대로가 오히려 빠릅니다 — 상수가 작기 때문입니다. NTT가 이기는 것은 항이 수백·수천 개를 넘어갈 때입니다.
사용 방법
- 1두 다항식의 계수를 낮은 차수부터 넣습니다. "1 2 3"은 1 + 2x + 3x²입니다.
- 2쓸 소수를 고릅니다. 998244353이 가장 널리 쓰입니다.
- 3변환 길이 n과 그때의 단위근 ω가 나옵니다.
- 4두 다항식의 점값 표현, 점별 곱, 역변환 결과가 단계별로 나옵니다.
- 5계수가 소수를 넘어 접힐 수 있으면 경고합니다 — 그때는 결과가 틀립니다.
자주 묻는 질문
반올림 오차가 아예 없기 때문입니다. FFT는 복소수 단위근 e^(2πi/n)을 쓰는데 이것이 부동소수점이라 계수가 크면 오차가 답을 망칩니다. NTT는 같은 짜임새를 소수 모듈로 위에서 하므로 모든 연산이 정수이고 반올림이 생길 자리가 없습니다. 정수 계수를 정확히 곱해야 하는 곳에서는 NTT가 정답입니다.
길이 n짜리 변환을 하려면 n차 원시단위근이 있어야 하고, 그것은 n이 p−1을 나눌 때만 존재하기 때문입니다. 그래서 p = c·2ᵏ+1 꼴로 고릅니다. 998244353 = 119·2²³+1이라 길이 2²³ = 8388608까지 다룰 수 있고, 원시근이 3이라 계산도 간단합니다. 아무 소수나 쓰면 2의 거듭제곱 길이의 단위근이 없어 알고리즘이 돌지 않습니다.
접혀서 틀린 답이 나옵니다. 998244353을 쓸 때 계수가 최대 M인 다항식 두 개를 길이 n으로 곱하면 결과 항이 최대 n·M²이므로 이 값이 소수보다 작아야 합니다. 이 계산기는 그 한계를 넘을 수 있으면 미리 경고합니다. 실제로 넘어야 한다면 서로 다른 소수 여러 개로 계산하고 중국인의 나머지 정리로 합칩니다.
복잡도가 다릅니다. 카라츠바는 O(n^1.585)이고 NTT는 O(n log n)이라, 항이 수천 개를 넘어가면 NTT가 확실히 빠릅니다. 대신 NTT는 소수와 원시근을 골라야 하고 계수 크기에 한계가 있습니다. 항이 몇십 개 수준이면 곧이곧대로 O(n²)가 더 빠를 때도 많습니다 — 상수가 작기 때문입니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서만 이뤄지고, 입력값은 이 기기의 저장소에만 남습니다.
알아두면 좋은 점
- 계수 1024개까지 다룹니다. 설명을 위한 계산기라 중간 배열을 모두 들고 있기 때문입니다.
- 음수 계수도 넣을 수 있지만 결과는 0 이상 p 미만으로 나옵니다. 원래 부호로 보려면 p의 절반보다 큰 값에서 p를 빼면 됩니다.
- BigInt로 계산합니다. 실제 구현은 몽고메리 곱셈이나 배럿 리덕션으로 모듈러 곱셈을 빠르게 합니다.
- 무작위 다항식 2000쌍에서 O(n²) 곧이곧대로 합성곱과 대조했고, 변환 자체도 정의대로 구한 DFT와 맞췄습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.