1. 程式人生 > 資訊 >股價大跌 79%,網際網路健身鼻祖 Peloton 測試新定價模式:只需支付月費,旨在吸引新使用者

股價大跌 79%,網際網路健身鼻祖 Peloton 測試新定價模式:只需支付月費,旨在吸引新使用者

一、快速莫比烏斯變換

快速莫比烏斯變換簡稱 \(FMT\) ,用於快速計算位運算卷積。

我們定義 \(A\) 的莫比烏斯變換為 \(FMT(A)\)\(A_i\)\(A\) 的第 \(i\) 項。

1、或卷積

我們要求:\(\large C_x=\sum\limits_{i\cup j=x}A_iB_j\)

若有 \(\large FMT(A)_i\times FMT(B)_i=FMT(C)_i\) ,我們就能通過逆變換快速求出 \(C\) 出來。

定義:\(\large FMT(A)_n=\sum\limits_{i\in n}A_i\) ,其中 \(i,n\) 都是二進位制表示的集合。

\(\large FMT(A)_x\times FMT(B)_x=\sum\limits_{i\in x}A_i\sum\limits_{j\in x}B_j=\sum\limits_{i\in x}\sum\limits_{j\in x}A_iB_j=\sum\limits_{k\in x}\sum\limits_{i\cup j=k}A_iB_j=\sum\limits_{k\in x}C_k=FMT(C)_x\)

所以利用子集和可以加速求出或卷積。

那如何快速求出子集和捏?不就是高維字首和了捏!

高維字首和:\(\large S_i=\sum\limits_{i\cup j=i}A_j\)

code:

void FMT(int *f,int n,int op)//op=1為正變換,op=-1為逆變換
{
    for(int i=0;i<n;++i)
    	for(int j=0;j<(1<<n);++j)
        	if(j&(1<<i))f[j]+=f[j^(1<<i)]*op;
}

2、與卷積

我們要求:\(\large C_x=\sum\limits_{i\cap j=x}A_iB_j\)

若有 \(\large FMT(A)_i\times FMT(B)_i=FMT(C)_i\) ,我們就能通過逆變換快速求出 \(C\)

出來。

定義:\(\large FMT(A)_n=\sum\limits_{n\in i}A_i\) ,其中 \(i,n\) 都是二進位制表示的集合。

\(\large FMT(A)_x\times FMT(B)_x=\sum\limits_{x\in i}A_i\sum\limits_{x\in j}B_j=\sum\limits_{x\in i}\sum\limits_{x\in j}A_iB_j=\sum\limits_{x\in k}\sum\limits_{i\cap j=k}A_iB_j=\sum\limits_{x\in k}C_k=FMT(C)_x\)

這不就是高維字尾和了捏!

高維字尾和:\(\large S_i=\sum\limits_{i\cap j=i}A_j\)

code:

void FMT(int *f,int n,int op)//op=1為正變換,op=-1為逆變換
{
    for(int i=0;i<n;++i)
    	for(int j=0;j<(1<<n);++j)
        	if(j&(1<<i))f[j^(1<<i)]+=f[j]*op;
}

二、快速沃爾什變換

快速沃爾什變換簡稱 \(FWT\) ,同樣用於快速計算位運算卷積。

我們定義 \(A\) 的沃爾什變換為 \(FWT(A)\)\(A_i\)\(A\) 的第 \(i\) 項。

1、異或卷積

定義:\(\large FWT(A)_x=\sum\limits_{k=0}^{2^n-1}(-1)^{|x\wedge k|}A_k\)

\(\large FWT(C)_x=\sum\limits_{k=0}^{2^n-1}(-1)^{|x\wedge k|}C_k\)

\(\large ~~~~~~~~~~~~~~~~~~=\sum\limits_{k=0}^{2^n-1}(-1)^{|x\wedge k|}\sum\limits_{i=0}^{2^n-1}\sum\limits_{j=0}^{2^n-1}[i\oplus j=k]A_iB_j\)

\(\large ~~~~~~~~~~~~~~~~~~=\sum\limits_{i=0}^{2^n-1}\sum\limits_{j=0}^{2^n-1}(-1)^{|(i\oplus j)\wedge x|}A_iB_j\)

\(\large ~~~~~~~~~~~~~~~~~~=\sum\limits_{i=0}^{2^n-1}\sum\limits_{j=0}^{2^n-1}(-1)^{|x\wedge i|}A_i·(-1)^{|x\wedge j|}B_j\)

\(\large ~~~~~~~~~~~~~~~~~~=(\sum\limits_{i=0}^{2^n-1}(-1)^{|x\wedge i|}A_i)(\sum\limits_{j=0}^{2^n-1}(-1)^{|x\wedge j|}B_j)\)

\(\large ~~~~~~~~~~~~~~~~~~=FWT(A)_x \times FWT(B)_x\)

和高維字首和相似,我們對每一位依次考慮。對於第 \(i\) 位和一個不包含 \(i\) 的集合 \(S\) ,設 \(x=a_S,y=a_{S+2^i}\) ,則有新的 \(a_S=x+y,a_{S+2^i}=x-y\)

code:

void FWT(int *f,int n,int op)
{
	for(int i=1;i<(1<<n);i<<=1)
		for(int j=0;j<(1<<n);j+=(i<<1))
			for(int k=j;k<j+i;++k)
			{
				int x=f[k],y=f[k+i];
				if(op==1)f[k]=x+y,f[k+i]=x-y;
				else f[k]=(x+y)/2,f[k+i]=(x-y)/2;
			}
}

是不是很簡單

當然,\(FMT\) 也可以計算或卷積和與卷積,但懶得打了(咕咕咕

2、子集卷積

咕咕咕

3、子集卷積 exp

咕咕咕

4、多項式複合集合冪級數