關於快速沃爾什變換(FWT)的一些個人理解

2022-05-03 18:42:08 字數 3866 閱讀 1961

fwt是一種快速完成集合卷積運算的演算法。

它可以用於求解類似

$c[i]=\sum\limits_a[j]*b[k]$

的問題。

其中⊗代表位運算中的|,&,^的其中一種。

設f(a)是對於a的一種變換。

並且f(a)要求滿足:      

$f(a)*f(b)=f(a⊗b)$

$k*f(a)=f(k*a)$

$f(a+b)=f(a)+f(b)$(a,b長度相同)

鑑於fwt和fft長得特別像(而且求解的問題也比較類似),我們可以借鑑一下fft的思路,採用分治的想法。

首先先把多項式的長度用0補到2n,即多項式a為a0+a1x+a2x2+.....+a2

n-1x2^n-1。

我們可以將多項式a拆成a0和a1。a0為多項式下標二進位制最高位為0的部分,a1即為多項式下標二進位制最高位為1的部分。

則a=(a0,a1)。  

(ps:此處的括號意為將a0,a1拼起來。)

我們猜測

f(a)=(k1*f(a0)+k2*f(a1),k3*f(a0)+k4*f(a1)),其

中當a的長度為1時,f(a)=a

對於②式證明如下:

假設a的長度為2

n,

由原式得

:(k1*f(a0)+k2*f(a1),k3*f(a0)+k4*f(a1))*k=

(k1*f(k*a0)+k2*f(k*a1),k3*f(k*a0)+k4*f(k*a1))

則若要證明k*f(a)=f(k*a),我們需要證明的是

f(k*a')=k*f(a'),

其中a'

的長度為2n-1。

按照此方法遞迴直到a的長度為1,因為k*a=k*a,所以k*f(a)=f(k*a)。證畢。

對於③式證明如下:(其實和②式的證明一樣的)

假設a,b的長度為2n。

由原式得:(k1*f(a0+b0

)+k2*f(a1+b1

),k3*f(a0+b0

)+k4*f(a1+b1

))=

(k1*f(a0)+k2*f(a1),k3*f(a0)+k4*f(a1))+(k1*f(b0)+k2*f(b1),k3*f(b0)+k4*f(b1))

則若要證明f(a+b)=f(a)+f(b),需要條件f(a'

+b')=f(a'

)+f(b'),其中a'

的長度為2n-1

照此方法遞迴,同理可證明。

如今我們證明了②③的正確性,以下計算是為了確保正確。

(以下計算以異或為例)

f(c)=f(a)*f(b)

c=a⊗b→ (a0,a1)(b0,b1)=(a0⊗b0+a1⊗b1,a1⊗b0

+a0⊗b1)

可以得出  (以下我們以k1,k2為例)

f(a)的前半部分                     f(b)的前半部分      f(c)的前半部分

↓↓↓

(k1*f(a0)+k2*f(a1))*(k1*f(b0)+k2*f(b1))

=k1*f(a0⊗b0+a1⊗b1)+k2*f(a1⊗b0

+a0⊗b1)

所以

k

1

2f(a0⊗b0)+k1k2*f(a0⊗

b1

)+k1k2*f(a1⊗

b0

)+k22f(a1⊗b1)

=k1*f(a0⊗b0)+k2*f(a0⊗b1)

+k2*f(a1⊗b0)

+k1*f(a1⊗b1)

可得k1

2=k1,k1k2=k2,k2

2=k1。

解得k1,k2為(0,0)或(1,1)或(1,-1)

由於我們的操作必須可逆,所以排除掉(0,0),並且(k1,k2)(k3,k4)不相等。所以我們可以令k1=k2=k3=1,k4=-1。

則逆變換的時候,k1=k2=k3=1/2,k4=-1/2(這個解一下方程就可以算出來了)。

如果是|或者&運算,將紅色部分修改為:

| :(a0,a1)⊗(b0,b1)=(a0⊗b0,a1⊗b0

+a0⊗b1+a1⊗b1

)& :(a0,a1)⊗(b0,b1)=(a0⊗b0+a1⊗b0

+a0⊗b1

,a1⊗b1

)

以下**都以異或為例

void fwt(int *a,int len)//

xor}

fwt逆變換**(以異或為例)

void ufwt(int *a,int

len)

}

其中的inv2為2的逆元。如果題目沒有要求將答案除以某數,也可以寫作:

a[k+j]=(x+y)/2,a[k+j+i]=(x-y)/2

學習fwt的時候我比較好奇乙個問題。在正變換的時候我們先處理f(a0),f(a1)後處理f(a),那為什麼我們在求逆變換的時候不需要先求f(a)的逆變換再處理f(a0),f(a1)的。。。

請大佬不吝賜教。

本篇部落格參考hy大佬的部落格對於其一些我不太理解的地方加了證明和改動。如果有錯誤之處還請多多包涵。

FFT 快速傅利葉變換 FWT 快速沃爾什變換

實在是 美麗的數學啊 關於傅利葉變換的部落格 講的很細緻 非常易於理解 大概能明白傅利葉變換是幹嗎的了 但是還是不能明白為什麼用傅利葉變換來算多項式求和 在多項式中,dft就是係數表式轉換成點值表示的過程。我們熟知的是多項式的係數表示法,通過給定一組 來確定乙個唯一的多項式 而多項式還可以有另一種表...

學習筆記 FWT 快速沃爾什變換

解決涉及子集配湊的卷積問題 就是解決一類問題 f k sum a i b j 基本思想和fft類似。首先轉化成為另乙個多項式 fwt a fwt b 使得 fwt a oplus b fwt a fwt b 這裡,是按位乘。這個是 o n 的。然後,再 ifwt 回去即可。類似於,直接過馬路不好走。...

學習筆記 快速沃爾什變換 FWT

目錄2.按位與卷積 3.按位異或卷積 4.高維前 字尾和與各類卷積的聯絡 5.題目小結 想要快速計算 c k a textb k sum j k a ib j 我們可以利用 mathtt 的思想 將係數多項式轉化成點值多項式,mathcal o n 求得答案後將其還原成係數多項式。假設 a,b 均為...