1. 程式人生 > >DFT和FFT詳解(演算法導論學習筆記)

DFT和FFT詳解(演算法導論學習筆記)

程式碼均為做嚴格測試,僅供參考

分治法基本原理

將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴的求解這些子問題。然後再合併這些子問題的解來建立原問題的解。遞迴求解這些子問題,然後再合併這些子問題的解來建立原問題的解。

分治法在分層遞迴時都有三個步驟:

  • 分解原問題為若干子問題,這些子問題是原問題規模較小的例項。
  • 解決這些子問題,遞迴的求解各個子問題。然而若子問題的規模足夠小。則直接求解。
  • 合併這些子問題的解成原問題的解。

問題描述

兩個N次多項式相乘,最直接的複雜度為O(n2),運用傅立葉變換,則可以吧多項式相乘的複雜度轉化為nlog(n)

輸入輸出均採用係數表達,假設n是2的冪,否則通過新增係數為0的高階係數。演算法準備過程如下:

  • 加倍次數界:通過新增n個係數為0的高階係數,把多項式A(x)和B(x)變為次數界為2n的多項式,並構造其係數表達。
  • 求值:通過應用2n階的FFT計算出A(x)和B(x)的長度為2n的點值表達。這些點值表示式中包含了兩個多項式在2n次單位根處的取值。
  • 逐點相乘:把A(x)和B(x)的值逐點相乘,可以計算出多項式C(x)=A(x)B(x)長度為2n的點值表達,這個表示中包含了C(x)在每個2n單位根處的值。
  • 插值:通過對2n個點值對應用fft,計算其逆DFT,就可以構造出多項式C(x)的係數表達。

基本概念和定理

  1. 單位複數根

    n次單位複數根是滿足ωn=1的複數ω,這些根正好有n個,分別是e

    2πikn(k=0,1,2...n1)

    其中e2πin被稱作主n次單位根。ωjωk=ω(k+j)modn

  2. 消去引理

    對於任意整數n>=0和k>=0,以及d>=0

    ωdkdn=ωkn

  3. 折半引理

    如果n>0為偶數,那麼n個n次單位複數根的平方的集合就是n/2個n/2次單位複數根的集合。

    對任意非負整數k,我們有(ωkn)2=ωkn/2

  4. 求和引理

    對任意整數n>=1和不能被n整除的非負整數k,有

    n1j=0(ωkn)j=0

演算法實現

DFT

我們希望計算次數界為n的多項式A(x)=n1j=0ajxj

在n個n次單位複數根處的值,假設A以係數形式給出:a

=(a0,a1,a2...an1)。接下來對k=0,1,2,..n-1,定義結果yk:

yk=A(ωkn)=n1j=0ajωkjn

向量y=(y0,y1,...yn1)就是係數向量a=(a0,a1,...,an1)的離散傅立葉變換DFT

FFT

通過使用快速傅立葉變換的方法,利用複數單位根的特殊性質,我們就可以在θ(nlgn)的時間內計算出DFT(a)。

首先分別定義兩個新的次數界為n/2的多項式

A[0](x)=a0+a2+...an2xn/21

A[1](x)=a1+a3+...an1xn/21

分別包含了所有偶數下標的係數和奇數下標的係數。

A(x)=A[0](X2)+xA[1](x2)

因而求A(x)在ω0n,ω1n,,ωn1n處的值得問題轉化為:

  1. 求次數界為n/2的多項式

    相關推薦

    DFTFFT演算法導論學習筆記

    程式碼均為做嚴格測試,僅供參考 分治法基本原理 將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴的求解這些子問題。然後再合併這些子問題的解來建立原問題的解。遞迴求解這些子問題,然後再合併這些子問題的解來建立原問題的解。 分治法在分層遞迴時都有三個步驟

    xxx.launch檔案部落格學習筆記

    ROS筆記(一)xxx.launch檔案詳解 .launch檔案是ROS中用於同時啟動多個節點的重要檔案,在大型的ROS專案中使用頻繁,所以掌握其主要元素與屬性對ROS系統的應用至關重要: launch標籤(元素)說明 launch拓展說明 parameter說明

    Android layer-list的屬性使用陰影、邊框效果

    layer-list用於多個圖層堆疊,可以完成陰影效果 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/

    深度學習 --- 模擬退火演算法Simulated Annealing, SA

    上一節我們深入探討了,Hopfield神經網路的性質,介紹了吸引子和其他的一些性質,而且引出了偽吸引子,因為偽吸引子的存在導致Hopfield神經網路正確率下降,因此本節致力於解決偽吸引子的存在。在講解方法之前我們需要再次理解一些什麼是偽吸引子,他到底是如何產生的? 簡單來說說就是網路動態轉

    Nginx反向代理配置正向代理、反向代理、負載均衡原理、Nginx反向代理原理配置講解

    nginx概述 nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外nginx可以作為反向代理進行負載均衡的實現。 Nginx是一款開原始碼的高效能HT

    CGI、FastCGIPHP-FPM區別關係包含圖解

    CGI、FastCGI和PHP-FPM區別和關係詳解(包含圖解) 轉載至:https://www.awaimai.com/371.html 在搭建 LAMP/LNMP 伺服器時,會經常遇到 PHP-FPM、FastCGI和CGI 這幾個概念。如果對它們一知半解,很難搭建出高效能的伺服器。

    靜態連結串列插入刪除操作C語言程式碼實現

    本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]

    匈牙利演算法含時間複雜度

    尋找二部圖最大匹配的匈牙利數學家埃德蒙德斯在1965年提出的一個簡化的最大流演算法。該演算法根據二部圖匹配這個問題的特點將最大流演算法進行了簡化,提高了效率。 普通的最大流演算法一般都是基於帶權網路模型的,二部圖匹配問題不需要區分圖中的源點和匯點,也不關心邊的方向,因此不需要複雜的網路圖模型,這就是匈牙利演

    C++類物件new與不new的區別

    一、"類" 的介紹     在C++中, 用 "類" 來描述"物件", 所謂的"物件"是指現實世界中的一切事物。那麼類就可以看做是對相似事物的抽象, 找到這些不同事物間的共同點, 如自行車和摩托車, 首先他們都屬於"物件", 並且具有一定得相同點, 和一些不同點, 相同點如

    Linux下MongoDB安裝配置

    一、MongoDB的安裝 1.下載安裝包 下載方式: curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.9.tgz 解壓縮壓縮包: tar zxvf mongodb-linux-x

    C++中繼承派生公有、私有、保護繼承的區別

    繼承和派生概述: 繼承和派生是同一個過程從不同角的度看 保持已有類的特性而構造新類的過程稱為繼承。 在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。 被繼承的已有類稱為基類(或父類)。 派生出的新類稱為派生類(

    各種音視訊編解碼學習之 編解碼學習筆記:Mpeg系列——Mpeg 1Mpeg 2

        最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyofbitbit

    中山大學演算法課程題目第十六週

    Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The v

    android開發 -- 檢視陰影 Material Design

    Material Design包含了很多內容,大致把它分為四部分: 主題和佈局——ANDROID L——Material Design詳解(主題和佈局) 檢視和陰影——ANDROID L——Material Design詳解(檢視和陰影) UI控制元件——ANDROID

    android開發 -- 對話方塊 Dialog DialogFragment Android 官方推薦 DialogFragment 建立對話方塊

     Android 官方推薦使用 : DialogFragment 建立對話方塊 ,不推薦直接使用Dialog建立對話方塊,所以能用寫對話方塊儘量用DialogFragment。自定義對話方塊也方便很多 推薦一篇DialogFragment的文章:http://blog.csdn.n

    中山大學演算法課程題目第十八週

    Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum

    Java類物件

    一、面向物件簡述 面向物件是一種現在最為流行的程式設計方法,幾乎現在的所有應用都以面向物件為主了,最早的面向物件的概念實際上是由IBM提出的,在70年代的Smaltalk語言之中進行了應用,後來根據面向物件的設計思路,才形成C++,而由C++產生了Java這門

    中山大學演算法課程題目第十七週

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons

    最大子段問題51Nod

    N個整陣列成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的連續子段和的最大值。當所給的整數均為負數時和為0。 例如:-2,11,-4,13,-5,-2,和最大的子段為:11,-4,13。和為20。 輸入 第1行:整

    MySQL配置檔案my.cnf引數優化中文

    原文地址:http://www.jb51.net/article/48082.htm 這篇文章主要介紹了MySQL配置檔案my.cnf引數優化和中文詳解,非常詳細的用中文註釋了各個引數的作用以及建議值,需要的朋友可以參考下 Mysql引數優化對於新手來講,是比較難懂的東