แสดงวิธีการทำ FFT ด้วยมือ


27

สมมติว่าคุณมีสองพหุนาม:และ23+x2x2+2

ฉันพยายามที่จะเข้าใจว่า FFT ช่วยให้เราคูณชื่อพหุนามทั้งสองนี้อย่างไร อย่างไรก็ตามฉันไม่พบตัวอย่างผลงานใด ๆ บางคนสามารถแสดงให้ฉันเห็นได้ว่าอัลกอริทึม FFT จะทวีคูณชื่อพหุนามทั้งสองนี้อย่างไร (หมายเหตุ: ไม่มีอะไรพิเศษเกี่ยวกับพหุนามเหล่านี้ แต่ฉันต้องการให้มันง่ายเพื่อให้ง่ายต่อการติดตาม)

ฉันได้ดูอัลกอริธึมใน pseudocode แต่ดูเหมือนว่าพวกเขาทั้งหมดจะมีปัญหา (อย่าระบุว่าอินพุตควรเป็นอะไร, ตัวแปรที่ไม่ได้กำหนด) และน่าประหลาดใจที่ฉันไม่สามารถหาได้ว่ามีใครบ้างที่เดินผ่าน (ด้วยมือ) ตัวอย่างการคูณพหุนามด้วย FFT


2
วิกิพีเดียช่วยให้นี้ภาพที่ดีสำหรับจำนวนเต็มคูณผ่าน FFT แต่ฉันคิดว่าแม้ที่ชัดเจนมากขึ้นขั้นตอนโดยขั้นตอนที่อาจจะเป็นประโยชน์
— Realz Slaw

คำตอบ:


27

สมมติว่าเราใช้รากที่สี่ของความสามัคคีซึ่งสอดคล้องกับการแทนสำหรับxนอกจากนี้เรายังใช้ decimation-in-time มากกว่า decimation-in-frequency ในอัลกอริทึม FFT (นอกจากนี้เรายังใช้การดำเนินการย้อนกลับแบบบิตอย่างราบรื่น)1,i,−1,−ix

เพื่อคำนวณการแปลงพหุนามครั้งแรกเราเริ่มต้นด้วยการเขียนสัมประสิทธิ์: ฟูริเยร์เปลี่ยนของค่าสัมประสิทธิ์แม้คือและค่าสัมประสิทธิ์แปลกคือ1,1(การแปลงนี้เป็นเพียง .) ดังนั้นการแปลงพหุนามครั้งแรกคือ นี้จะได้รับใช้ ,O_1 (จากการคำนวณตัวประกอบทวีคูณ)

3,1,0,0.
3,03,31,01,1a,b↦a+b,a−b
4,3+i,2,3−i.
X0,2=E0±O0X1,3=E1∓iO1

ลองทำเช่นเดียวกันกับพหุนามที่สอง ค่าสัมประสิทธิ์เป็น ค่าสัมประสิทธิ์แม้แปลงและค่าสัมประสิทธิ์แปลกแปลง0,0ดังนั้นการแปลงของพหุนามที่สองคือ

2,0,2,0.
2,24,00,00,0
4,0,4,0.

เราได้การแปลงฟูริเยร์ของพหุนามผลิตภัณฑ์โดยการคูณการแปลงฟูริเยร์ทั้งสองแปลงเป็นจุด: มันยังคงคำนวณการแปลงฟูริเยร์ผกผัน ค่าสัมประสิทธิ์แม้ผกผันเปลี่ยนไปและค่าสัมประสิทธิ์แปลกผกผันแปลง0,0(การแปลงผกผันคือ ) ดังนั้นการแปลงของพหุนามผลิตภัณฑ์คือ นี้จะได้รับใช้ , 2 เราได้รับคำตอบที่ต้องการ

16,0,8,0.
16,812,40,00,0x,y↦(x+y)/2,(x−y)/2
6,2,6,2.
X0,2=(E0±O0)/2X1,3=(E1∓iO1)/2
(3+x)(2+2x2)=6+2x+6x2+2x3.


คุณมาถึงที่ 6,2 6, 2 ได้อย่างไร
— ลาร์ส

ฉันกำหนดสูตร: ,โดยที่ ( ) เป็นสิ่งที่ตรงกันข้าม เปลี่ยนของค่าสัมประสิทธิ์แม้ (แปลก) ที่ได้รับผ่านสูตร 2 โปรดดูคำตอบอีกครั้ง - การคำนวณทั้งหมดอยู่ที่นั่น X0,2=(E0±O2)/2X1,3=(E1∓iO1)/2E0,E1O1,O2x,y↦(x+y)/2,(x−y)/2
— Yuval Filmus

ทำไมคุณถึงใช้สัมประสิทธิ์คู่ถึงสองครั้ง? 3,3 -> 3,3,3,3 -> 3 + 1, 3-i, 3 + -1,3 - i?
— Aage Torleif

สูตรเหล่านี้สำหรับและขยายไปถึงองศาที่สูงขึ้นได้อย่างไร เครื่องหมายบวก / ลบเพียงแค่พลิกต่อไปหรือไม่ ตัวอย่างเช่นอย่างไร X0,2X1,3X0,2,4
— Bobby Lee

@ BobLee ฉันแนะนำให้คุณอ่านวรรณกรรมบางเรื่องเกี่ยวกับ FFT
— Yuval Filmus

7

กำหนดพหุนามที่และdeg(A) = q deg(B) = pdeg(C) = q + p

ในกรณีdeg(C) = 1 + 2 = 3นี้

A=3+xB=2x2+2C=A∗B=?

เราสามารถหาค่า C ในเวลาได้อย่างง่ายดายโดยการคูณค่าสัมประสิทธิ์ของเดียรัจฉาน โดยใช้ FFT (และผกผัน FFT) เราสามารถบรรลุเป้าหมายนี้ในเวลา อย่างชัดเจน:O(n2)O(nlog⁡(n))

  1. แปลงการแทนค่าสัมประสิทธิ์ของ A และ B เป็นการแทนค่า กระบวนการนี้เรียกว่าการประเมินผล การแสดงแบ่งและพิชิต (D & C) สำหรับการนี้จะใช้เวลาเวลาO(nlog⁡(n))
  2. การคูณแบบหลายส่วนประกอบด้วยพหุนามในการแสดงค่าของพวกมัน ส่งคืนการแทนค่าของ C = A * B นี้ใช้เวลาเวลาO(n)
  3. Invert C โดยใช้ inverse FFT เพื่อรับ C ในการแทนค่าสัมประสิทธิ์ กระบวนการนี้เรียกว่าการแก้ไขและยังใช้เวลาเวลาO(nlog⁡(n))

เราจะแสดงพหุนามแต่ละอันเป็นเวกเตอร์ที่มีค่าเป็นสัมประสิทธิ์ เราแผ่นเวกเตอร์ด้วย 0 ขึ้นอยู่กับอำนาจที่เล็กที่สุดของทั้งสอง(C) ดังนั้น4 การเลือกพลังสองวิธีทำให้เราสามารถใช้อัลกอริทึมการหารและการชนะแบบเรียกซ้ำได้n=2k,n≥deg(C)n=4

A=3+x+0x2+0x3⇒a→=[3,1,0,0]B=2+0x+2x+0x3⇒b→=[2,0,2,0]

ให้เป็นค่าแทน A และ B ตามลำดับ ขอให้สังเกตว่า FFT (Fast แปลงฟูเรีย ) เป็นแปลงเชิงเส้น ( เส้นแผนที่ ) M ดังนั้นA′,B′M

A′=Ma→B′=Mb→

เรากำหนดโดยที่เป็นรากที่ซับซ้อนรากที่ซับซ้อนของความสามัคคี ขอให้สังเกตในตัวอย่างนี้ นอกจากนี้ยังแจ้งให้ทราบว่ารายการในที่แถวและคอลัมน์{} ดูเพิ่มเติมเกี่ยวกับเมทริกซ์ DFT ที่นี่M=Mn(ω)ωnthn = 4jthkthωnjk

M4(w)=[111...11ω1ω2...ωn−11ω2ω4...............ωjk...1ωn−1ω2(n−1)...ω(n−1)(n−1)]=[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=−1−i=ω3=ω3+n

เพื่อให้ขั้นตอนที่ 1 ( การประเมินผล ) เสร็จสมบูรณ์เราจะพบโดยดำเนินการA′,B′

A′=M∗a→=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+i23−i]B′=M∗b→=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][2020]=[2+22+2ω22+2ω42+2ω6]=[4040]

ขั้นตอนนี้สามารถทำได้โดยใช้อัลกอริธึม D&C (เกินขอบเขตของคำตอบนี้)

ทวีคูณส่วนประกอบที่ชาญฉลาด (ขั้นตอนที่ 2)A′∗B′

A′∗B′=[43+i23−i][4040]=[16080]=C′

ในที่สุดขั้นตอนสุดท้ายคือการแทน C 'ลงในค่าสัมประสิทธิ์ แจ้งให้ทราบ

C′=Mc→⇒M−1C′=M−1Mc→⇒c→=M−1C′

แจ้งให้ทราบล่วงหน้า 1และJ}Mn−1=1nMn(ω−1)ωj=−ωn/2+j

Mn−1=14[11111ω−1ω−2ω−31ω−2ω−4ω−61ω−3ω−6ω−9]=14[11111−i−1i1−11−11i−1−i]

ω−jสามารถมองเห็นได้โดยวนซ้ำของรากของหน่วยวงกลมในทิศทางตามเข็มนาฬิกา

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

ยิ่งกว่านั้นมันเป็นความจริงที่ว่าเมื่อรากของความสามัคคีความเท่าเทียมถือ (คุณเห็นสาเหตุไหม)nthω−j=ωn−j

จากนั้น

c→=M−1C′=1nMn(w−1)=14[11111−i−1i1−11−11i−1−i][16080]=[(16+8)/4(16−8)/4(16+8)/4(16−8)/4]=[6262]

ดังนั้นเราจึงได้พหุนาม 1 : สูตรผกผันหน้า 73, อัลกอริทึมโดย Dasgupta และ อัล (C) 2006

C=A∗B=6+2x+6x2+2x3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.