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,intlen)
}
其中的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 均為...