손으로 FFT를 수행하는 방법 표시


27

3+x 다항식이 있다고 가정하십시오 2x2+2.

FFT가 어떻게이 두 다항식을 곱하는 데 도움이되는지 이해하려고합니다. 그러나 해결 된 예제를 찾을 수 없습니다. 누군가 FFT 알고리즘이이 두 다항식을 곱하는 방법을 보여줄 수 있습니까? (참고 :이 다항식에는 특별한 것이 없지만 쉽게 따라갈 수 있도록 간단하게 유지하고 싶었습니다.)

의사 코드의 알고리즘을 살펴 보았지만 모두 문제가있는 것 같습니다 (입력이 정의되어 있지 않은 변수를 지정하지 마십시오). 놀랍게도, FFT를 사용하여 다항식을 곱하는 예를 누군가가 실제로 (손으로) 어디로 갔는지 찾을 수 없습니다.


2
위키 백과는 계속 FFT를 통해 정수 곱셈에 대한 좋은 이미지를,하지만 난 더욱 명시 적으로 단계별로 도움이 될 수 있다고 생각.
Realz Slaw

답변:


27

우리가 대응 대체 유니티의 네 번째 뿌리, 사용한다고 가정 해 1,i,1,i 위해 x . 또한 FFT 알고리즘에서 주파수 데시 메이션 대신 데시 메이션을 사용합니다. (비트 리버설 작업도 매끄럽게 적용합니다.)

첫 번째 다항식의 변환을 계산하기 위해 계수

3,1,0,0.
을 작성하여 시작 합니다. 짝수 계수 3,0 의 푸리에 변환 은 3,3 이고 홀수 계수 1,01,1 . (이 변환은 a,ba+b,ab 입니다.) 따라서 첫 번째 다항식의 변환은
4,3+i,2,3i.
이것은X0,2=E0±O0 , 얻습니다X1,3=E1iO1 . (트위들 팩터 계산에서).

두 번째 다항식에 대해서도 동일하게하겠습니다. 계수는

2,0,2,0.
짝수 계수 2,2 로 변환 4,0 , 및 홀수 계수 0,0 으로 변환 0,0 . 따라서 두 번째 다항식의 변환은
4,0,4,0.

우리는 두 개의 푸리에 변환에 포인트

16,0,8,0.
을 곱하여 곱 다항식의 푸리에 변환을 얻습니다 . 역 푸리에 변환을 계산하기 위해 남아 있습니다. 짝수 계수 16,8 에 역변환 12,4 , 및 홀수 번째 계수는 0,0 으로 역변환 0,0 . 역변환은 x,y(x+y)/2,(xy)/2 ) 곱 다항식의 변환은
6,2,6,2.
이것은X0,2=(E0±O0)/2 ,X1,3=(E1iO1)/2 . 우리는 원하는 답을 얻었습니다
(3+x)(2+2x2)=6+2x+6x2+2x3.


6,2 6, 2에 어떻게 도착 했습니까?
lars

나는 공식을 주었다 : , X 1 , 3 = ( E 1i O 1 ) / 2 , 여기서 E 0 , E 1 ( O 1 , O 2 )는 공식 x , y ( x + y )를 통해 얻은 짝수 (홀수) 계수의 역변환X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2 . 답을 다시 살펴보십시오-모든 계산이 있습니다. x,y(x+y)/2,(xy)/2
Yuval Filmus

왜 짝수 계수를 두 번 사용합니까? 3,3-> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3--i?
Aage Torleif

X 1 , 3에 대한 이러한 공식은 어떻게 더 높은 각도로 확장됩니까? 더하기 / 빼기 기호가 계속 뒤집어 집니까? 예를 들어 X 0 , 2 , 4는 무엇입니까? X0,2X1,3X0,2,4
Bobby Lee

@BobbyLee FFT에 관한 문헌을 읽어 보시기 바랍니다.
Yuval Filmus

7

위치 deg(A) = q와 다항식을 정의하십시오 deg(B) = p. deg(C) = q + p.

이 경우, deg(C) = 1 + 2 = 3.

A=3+xB=2x2+2C=AB=?

계수의 무차별 곱셈으로 O(n2) 시간에 C를 쉽게 찾을 수 있습니다 . FFT (및 역 FFT)를 적용하면 O(nlog(n)) 시간 내에이를 달성 할 수 있습니다. 명시 적으로 :

  1. A와 B의 계수 표현을 값 표현으로 변환합니다. 이 과정을 평가 라고 합니다. 이것을 분할 정복 (D & C)을 수행하는 단계 걸릴 O(nlog(n)) 시간.
  2. 값 표현에 다항식을 성분별로 곱하십시오. C = A * B의 값 표현을 리턴합니다. 이 작업에는 O(n) 시간 이 걸립니다 .
  3. 역 FFT를 사용하여 C를 반전하여 계수 표현에서 C를 구합니다. 이 과정을 보간 이라고 하며 O(nlog(n)) 시간 도 걸립니다 .

계속해서, 우리는 각 다항식을 그 값이 계수 인 벡터로 나타냅니다. 우리는 2의 가장 작은 제곱, n=2k,ndeg(C) 까지 0으로 벡터를 채 웁니다 . 따라서 n=4 입니다. 2의 거듭 제곱을 선택하면 분할 및 정복 알고리즘을 재귀 적으로 적용 할 수 있습니다.

A=3+x+0x2+0x3a=[3,1,0,0]B=2+0x+2x+0x3b=[2,0,2,0]

A,B 각각 A와 B의 값 표현 이라고하자 . FFT (고속 푸리에 변환 )는 선형 변환 ( 선형 맵 )이며 행렬 M 으로 나타낼 수 있습니다 . 그러므로

A=MaB=Mb

우리는 정의 M=Mn(ω)ω 복소수이고 nth 통일성을 복소수. n = 4이 예에서 주목하십시오 . 또한 jth 행 및 kth 열의 항목이 ωnjk 입니다. DFT 매트릭스에 대한 자세한 내용은 여기를 참조하십시오.

M4(w)=[111...11ω1ω2...ωn11ω2ω4...............ωjk...1ωn1ω2(n1)...ω(n1)(n1)]=[11111ωω2ω31ω2ω4ω61ω3ω6ω9]

ω4=4th 근이 주어지면 , 우리는 순서가 정해집니다.

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

이것은 단위 원의 뿌리를 시계 반대 방향 으로 반복하여 시각화 할 수 있습니다 .

mod nω6=ω6modn=ω2=1i=ω3=ω3+n

A,B

A=Ma=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+i23i]B=Mb=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][2020]=[2+22+2ω22+2ω42+2ω6]=[4040]

이 단계는 D & C 알고리즘을 사용하여 달성 할 수 있습니다 (이 답변의 범위를 벗어남).

AB

AB=[43+i23i][4040]=[16080]=C

마지막으로, 마지막 단계는 C '를 계수로 나타내는 것입니다. 주의

C=McM1C=M1Mcc=M1C

Mn1=1nMn(ω1)ωj=ωn/2+j

Mn1=14[11111ω1ω2ω31ω2ω4ω61ω3ω6ω9]=14[11111i1i11111i1i]

ωj

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

nthωj=ωnj

c=M1C=1nMn(w1)=14[11111i1i11111i1i][16080]=[(16+8)/4(168)/4(16+8)/4(168)/4]=[6262]

C=AB=6+2x+6x2+2x3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.