如何以 \(o(n \log n)\) 的效率將係數多項式轉換為點值多項式。
眾所周知,\(x^n=1\)的根有n個,而且它們分別是\(e^}\),即在復平面內的座標為\((cos(2πi),sin(2πi))\)。
我們分別用\(ω_n^0~ω_n^\)來描述這n個根。而且等會我們要算的,就是多項式a在這n個點處的點值。
為了方便計算,我們設n為2的冪次。
由複數的性質可以得到一些公式:
\((ω_^)=ω_n^k\)
\((ω_n^k)^2=ω_n^=ω_^\)
\(ω_n^}=-ω_n^k\)
假設我們有乙個長度為n的多項式\(a(x)=a_0+a_1x...a_x^\),現在我們設乙個過程\(f(a)\)來遞迴地計算\(a(x)\)的點值多項式(而且點值的自變數就是上述n個單位複數根)。
簡單地把\(a(x)\)拆分成兩個多項式,即設:
\(a_0(x)=a_0+a_2x+a_4x^2...+a_x^-1}\)
\(a_1(x)=a_1+a_3x+a_5x^2...+a_x^-1}\)
容易發現\(a(x)=a_0(x^2)+x*a_1(x^2)\)
我們要求的是對於所有k,\(ω_n^k\) 處的點值。
且\(a(ω_n^k)=a_0((ω_n^k)^2)+ω_n^k*a_1((ω_n^k)^2)\)
先求所有的k滿足\(k∈[0,n/2)\)
化簡易得\(a(ω_n^k)=a_0(ω_}^k)+ω_n^k*a_1(ω_}^k)\)
而且對於\(k∈[0,n/2)\),我們也可以得到
\(a(ω_n^})=a_0(ω_n^)+ω_n^}*a_1(ω_n^)\)
\(=a_0(ω_n^)-ω_n^*a_1(ω_n^)=a_0(ω_}^k)-ω_n^*a_1(ω_}^k)\)
此時我們已經能求出所有的點值了,而且我們要用到的條件就是:
\(a_0(ω_}^k)\) 和 \(a_1(ω_}^k)\)
\(k∈[0,n/2)\)
容易發現這就是子問題,我們只需直接遞迴 \(f(a_0)\) 和 \(f(a_1)\) 即可。
由主定理,得效率為\(t(n)=o(n)+2*t(\frac)=o(n \log n)\)
離散傅利葉變換 快速傅利葉變換C 實現
傅利葉變換是將時域訊號變換為頻域訊號的一種方式,我主要用它來做兩件事情 1 求一段資料的週期性。2 通過傅利葉變換及其逆變換,進行低通濾波 去躁 首先需要做幾點說明 1.快速傅利葉變換是離散傅利葉變換的快速演算法,當資料來源較大時 大於1000 快速傅利葉變換有明顯優勢。2.快速傅利葉變換的訊號源長...
快速傅利葉變換C 遞迴演算法實現
快速傅利葉變換c 遞迴演算法實現 網上有些演算法資料經測試執行結果是錯誤的,雖然 的使用的是非遞迴形式。為了方便驗證快速傅利葉變換的準確性,我提供了自己設計的遞迴演算法。基於時域抽取的 基 2 快速傅利葉變換演算法 fouier.h 檔案 pragma once include complex.h ...
Python 實現簡單的快速傅利葉變換
相比於matlab自帶的fft函式以及詳盡的官方文件來說,python在傅利葉變換這個方面相比就不是那麼簡單了,處處需要使用help檢視相關函式的定義。但是本質來說,都是傅利葉變換,只是程式語言不同而已。import numpy as np from scipy.fftpack import fft...