参考文献:
假设 P P P 是素域,令 E E E 是 X m − 1 X^m-1 Xm−1 的在素域 P P P 上的分裂域,则 E / P E/P E/P 是代数单扩张:任意本原根 ζ m \zeta_m ζm,扩域 E = P ( ζ m ) E=P(\zeta_m) E=P(ζm),循环群 G = ( ζ m ) G=(\zeta_m) G=(ζm)
令 ϕ m ( x ) \phi_m(x) ϕm(x) 是分圆多项式, ζ m \zeta_m ζm 是本原单位根,分圆数域 K = Q ( ζ m ) ≅ Q [ x ] / ( ϕ m ( x ) ) K=\mathbb Q(\zeta_m) \cong \mathbb Q[x]/(\phi_m(x)) K=Q(ζm)≅Q[x]/(ϕm(x)),它的整数环是 O K = Z [ ζ m ] ≅ Z [ x ] / ( ϕ m ( x ) ) \mathcal O_K = \mathbb Z[\zeta_m] \cong \mathbb Z[x]/(\phi_m(x)) OK=Z[ζm]≅Z[x]/(ϕm(x)),其中 x = ζ m x=\zeta_m x=ζm,令 N = deg ϕ m ( x ) = ϕ ( m ) N=\deg\phi_m(x)=\phi(m) N=degϕm(x)=ϕ(m)
根据 Galois Theory, K K K 是可分多项式 x n − 1 x^n-1 xn−1 的分裂域,因此 K / Q K/\mathbb Q K/Q 是 Galois 扩张,并且 G a l ( K / Q ) ≅ Z m ∗ Gal(K/\mathbb Q) \cong \mathbb Z_m^* Gal(K/Q)≅Zm∗ 是阿贝尔群,于是 K / Q K/\mathbb Q K/Q 是阿贝尔扩张。全部的自同构都落在 Galois 群内 A u t ( K ) = G a l ( K / Q ) Aut(K) = Gal(K/\mathbb Q) Aut(K)=Gal(K/Q),形如 κ j : f ( x ) ↦ f ( x j ) , ∀ j ∈ Z m ∗ \kappa_j: f(x) \mapsto f(x^j),\forall j \in \mathbb Z_m^* κj:f(x)↦f(xj),∀j∈Zm∗
对于有限域 F = G F ( p d ) F=GF(p^d) F=GF(pd),它是可分多项式 x p d − x x^{p^d}-x xpd−x 的分裂域,因此 F / Z p F/\mathbb Z_p F/Zp 是 Galois 扩张,并且 G a l ( F / Z p ) = ( κ p ) Gal(F/\mathbb Z_p)=(\kappa_p) Gal(F/Zp)=(κp) 是循环群,其中 κ p : x ↦ x p \kappa_p:x \mapsto x^p κp:x↦xp 是 Frobenius 映射,此时 F / Z p F/\mathbb Z_p F/Zp 是循环扩张。
令 A = Z [ x ] / ( ϕ m ( x ) ) \mathbb A = \mathbb Z[x]/(\phi_m(x)) A=Z[x]/(ϕm(x)),我们令 A p \mathbb A_p Ap 是明文空间, A q \mathbb A_q Aq 是密文空间,其中 p p p 是较小素数(比如 32 比特素数),而 q q q 是很大的模数(可以是素数,也可以是一些素数乘积)。我们用 A q \mathbb A_q Aq 模拟 A \mathbb A A 的运算,对于明文 a ∈ A p a \in \mathbb A_p a∈Ap,在编码到 A q \mathbb A_q Aq 中的 a + p e a+pe a+pe,只要运算过程中 a + p e a+pe a+pe 的规模没有越过 q q q,那么 A q \mathbb A_q Aq 确实正确地模拟了 A \mathbb A A 上的运算,从而再模掉 p p p 即可得到 A p \mathbb A_p Ap 中的计算结果。
虽然 ϕ m ( x ) \phi_m(x) ϕm(x) 在 Q \mathbb Q Q 上不可约,但是在有限域 Z p \mathbb Z_p Zp 上是可约的: ϕ m ( x ) \phi_m(x) ϕm(x) 拥有次数 d d d 的素因子,当仅当 m ∣ p d − 1 m|p^d-1 m∣pd−1(此时扩域 G F ( p d ) GF(p^d) GF(pd) 中包含 m m m 次本原单位根),多项式分解为 ϕ m ( x ) = ∏ i = 1 l F i ( x ) ( m o d p ) \phi_m(x)=\prod_{i=1}^{l}F_i(x) \pmod p ϕm(x)=∏i=1lFi(x)(modp),其中 l = N / d l=N/d l=N/d, deg F i = d , ∀ i \deg F_i=d,\forall i degFi=d,∀i
整环 Z [ x ] \mathbb Z[x] Z[x] 的理想 p = ( p , ϕ m ( x ) ) \mathscr p=(p,\phi_m(x)) p=(p,ϕm(x)), p i = ( p , F i ( x ) ) \mathscr p_i=(p,F_i(x)) pi=(p,Fi(x)),易知 p = ⋂ i p i \mathscr p=\bigcap_i \mathscr p_i p=⋂ipi,根据 CRT 得到:
Z p [ x ] / ( ϕ m ( x ) ) ≅ ∏ i = 1 l Z p [ x ] / ( F i ( x ) ) \mathbb Z_p[x]/(\phi_m(x)) \cong \mathbb \prod_{i=1}^l \mathbb Z_p[x]/(F_i(x)) Zp[x]/(ϕm(x))≅∏i=1lZp[x]/(Fi(x))
由于 F i ( x ) F_i(x) Fi(x) 是不可约的,因此 L i = Z p [ x ] ( F i ( x ) ) ≅ G F ( p d ) \mathbb L_i=\mathbb Z_p[x](F_i(x)) \cong GF(p^d) Li=Zp[x](Fi(x))≅GF(pd) 都是同一个有限域。我们要求明文模数 p p p 足够大,使得槽的数量 l = N / d l=N/d l=N/d 足够多。
假设消息空间是子域 K n ≤ G F ( p d ) \mathbb K_n \le GF(p^d) Kn≤GF(pd),满足 [ K n : Z p ] = n ∣ d [\mathbb K_n:\mathbb Z_p]=n|d [Kn:Zp]=n∣d。定义映射 ψ n , i : K n → L i \psi_{n,i}: \mathbb K_n \to \mathbb L_i ψn,i:Kn→Li 是同态嵌入(当 d = n d=n d=n 时是自同构),编码函数 ψ n : K n l → A p \psi_n:\mathbb K_n^l \to A_p ψn:Knl→Ap 定义为
ψ n : ( m 1 , ⋯ , m l ) ↦ ( ψ n , 1 ( m 1 ) , ⋯ , ψ n , l ( m l ) ) \psi_n: (m_1,\cdots,m_l) \mapsto (\psi_{n,1}(m_1),\cdots,\psi_{n,l}(m_l)) ψn:(m1,⋯,ml)↦(ψn,1(m1),⋯,ψn,l(ml))
简记 A p = C R T p ( A p ) \mathbb A_p=CRT_p(A_p) Ap=CRTp(Ap),其中 A p A_p Ap 是 l l l 维向量空间,令 e ⃗ i ∈ A p \vec e_i \in A_p ei∈Ap 是单位向量,再令 π i = C R T p ( e ⃗ i ) \pi_i=CRT_p(\vec e_i) πi=CRTp(ei) 是对应的环元素。易知, π i ⋅ C R T p ( m ⃗ ) = C R T p ( 0 , ⋯ , m i , ⋯ , 0 ) \pi_i \cdot CRT_p(\vec m) = CRT_p(0,\cdots,m_i,\cdots,0) πi⋅CRTp(m)=CRTp(0,⋯,mi,⋯,0),于是 π i \pi_i πi 定义了投影映射。它可做为掩码,构造 Select 函数。
域自同构映射 κ j ∈ G a l ( K / Q ) \kappa_j \in Gal(K/\mathbb Q) κj∈Gal(K/Q),作用在整环 A p \mathbb A_p Ap 或者线性空间 A p A_p Ap 上(注意它们不是有限域),容易验证
κ j ( x ) ( m o d F i ) = κ j ( x ( m o d F i ) ) κ j ( C R T p ( x ⃗ ) ) = C R T p ( ⋯ , κ j ( x ( m o d F i ) ) , ⋯ ) \kappa_j(x) \pmod{F_i} = \kappa_j(x \pmod{F_i})\\ \kappa_j(CRT_p(\vec x)) = CRT_p(\cdots,\kappa_j(x \pmod{F_i}),\cdots) κj(x)(modFi)=κj(x(modFi))κj(CRTp(x))=CRTp(⋯,κj(x(modFi)),⋯)
因此 κ j \kappa_j κj 相对于 C R T p CRT_p CRTp 是可交换的。
由于整环 A p \mathbb A_p Ap 分解为 l = N / d l=N/d l=N/d 个有限域 G F ( p d ) GF(p^d) GF(pd) 的直积,因此 G a l ( K / Q ) Gal(K/\mathbb Q) Gal(K/Q) 包含循环子群 G = ( κ p ) \mathcal G=(\kappa_p) G=(κp),生成元是 Frobenius 映射 κ p : x ↦ x p \kappa_p:x \mapsto x^p κp:x↦xp。群 G \mathcal G G 是 p p p 的分解群。
定义商群 H = Z m ∗ / G \mathcal H = \mathbb Z_m^*/\mathcal G H=Zm∗/G,易知 o r d ( H ) = N / d = l ord(\mathcal H)=N/d=l ord(H)=N/d=l,且 H \mathcal H H 是阿贝尔群。根据有限阿贝尔群结构定理,可以分解为若干循环群的直积: H ≅ ∏ i = 1 t Z n i \mathcal H \cong \prod_{i=1}^t\mathbb Z_{n_i} H≅∏i=1tZni,并且满足 n i ∣ n i + 1 n_i|n_{i+1} ni∣ni+1 以及 ∏ i n i = l \prod_i n_i=l ∏ini=l,这些 n i n_i ni 称为不变因子。令 h i h_i hi 是循环群 Z n i \mathbb Z_{n_i} Zni 的陪集代表,那么 h = ∏ i = 1 t h i e i , 0 ≤ e i ≤ n i h=\prod_{i=1}^t h_i^{e_i},0 \le e_i \le n_i h=∏i=1thiei,0≤ei≤ni 就是全部的 H \mathcal H H 中陪集代表。
由于 ϕ m ( x ) = ∏ i F i ( x ) ( m o d p ) \phi_m(x)=\prod_i F_i(x) \pmod p ϕm(x)=∏iFi(x)(modp),我们将 ϕ m ( x ) \phi_m(x) ϕm(x) 的 ϕ ( m ) \phi(m) ϕ(m) 个根 { ζ m j : j ∈ Z m ∗ } \{\zeta_m^j: j \in \mathbb Z_m^*\} {ζmj:j∈Zm∗},根据素因子 F i F_i Fi 把根划分到 l = N / d l=N/d l=N/d 个集合中,集合 X i = { ( ζ m i ) p r : 1 ≤ r ≤ d } X_i=\{(\zeta_m^i)^{p^r}:1 \le r \le d\} Xi={(ζmi)pr:1≤r≤d} 是 F i F_i Fi 所有的根,它们相互共轭。因为 H \mathcal H H 大小是 l l l,且它在 l l l 个集合 X i X_i Xi 之间做迁移,我们令 ζ m \zeta_m ζm 是集合 X 1 X_1 X1 的代表,那么恰好存在唯一的 κ i ∈ H \kappa_i \in \mathcal H κi∈H 使得 κ i ( ζ m ) \kappa_i(\zeta_m) κi(ζm) 是集合 X i X_i Xi 的代表。
由于 κ j \kappa_j κj 和 C R T p CRT_p CRTp 交换,
我们说对称群子群 H ⊂ S l H \subset S_l H⊂Sl 是快速迁移的(sharply transitive),如果对于任意的 i , j ∈ [ l ] i,j \in [l] i,j∈[l],都存在唯一的 h ∈ H h \in H h∈H 使得 h ( i ) = j h(i)=j h(i)=j 成立。易知,单环置换的循环群是快速迁移的;容易证明,商群 H \mathcal H H 也是快速迁移的。
BGV 的 SIMD 技术中,提供了 component-wise l l l-Add and l l l-Mult,以及底层代数结构提供的 l l l 个简单的快速迁移置换。我们希望再实现任意的 l l l-Permute,从而获得数组运算的完备集(complete set of operations for arrays)
在第 i − 1 i-1 i−1 层的输出线有 w w w 条,打包在大约 w / l w/l w/l 个密文中(可能包含 empty slots)。第 i i i 层的输入线有 w ′ w' w′ 条,它们是来自上一层输出线的任意映射:不一定是置换,有着不同的扇出系数,并且跨越密文做所有槽的大置换。[GHS12] 首先将各个槽扩增到扇出系数,然后使用置换网络对高维立方做置换:
令集合 S = [ n 1 ] × ⋯ × [ n k ] S=[n_1] \times \cdots \times [n_k] S=[n1]×⋯×[nk] 是高维立方的索引集合,每个元素是 k k k-维向量。那么 S S S 上任意的置换 π \pi π,可以写成 π = π 2 k − 1 ∘ ⋯ ∘ π k ∘ ⋯ ∘ π 1 \pi = \pi_{2k-1} \circ \cdots \circ \pi_{k} \circ \cdots \circ \pi_1 π=π2k−1∘⋯∘πk∘⋯∘π1,其中 π i , ∀ i ≤ k \pi_i,\forall i \le k πi,∀i≤k 只对第 i i i 个坐标作用,而 π i , ∀ i > k \pi_i,\forall i>k πi,∀i>k 只对第 2 k − i 2k-i 2k−i 个坐标作用。特别地,对于二维数组,可以写成 π = π 3 ∘ π 2 ∘ π 1 \pi=\pi_3 \circ \pi_2 \circ \pi_1 π=π3∘π2∘π1,其中 π 1 , π 3 \pi_1,\pi_3 π1,π3 作用在各列,而 π 2 \pi_2 π2 作用在各行。
现在的问题是,如何实现一维数组上的置换,尤其是仅利用一些基本的置换(移位、旋转)组合出任意置换。[GHS12] 使用了 Benes 网络(大小受限为二的幂次),[HS14] 给出了更快速的推广版本。
每个密文中打包了一些明文,标记各个槽为 “full” 或者 “empty”。我们称密文是稀疏的(sparse),如果两个密文中包含的 “empty” 数量超过 l l l,此时可以把两个密文 merge 到单个密文中。
输入 v 1 , ⋯ , v w v_1,\cdots,v_w v1,⋯,vw 的打包密文(大小约为 w / l w/l w/l 的密文数组 A A A),同时输入对应的扇出系数 m 1 , ⋯ , m w m_1,\cdots,m_w m1,⋯,mw(允许取 0 0 0),令 M = log ( max i m i ) M=\log(\max_i m_i) M=log(maximi)
接下来,我们讨论如何在 k k k 个密文的全部 k ⋅ l k \cdot l k⋅l 个槽之间执行任意置换,将 clone 得到的数据放置到正确的位置上。
为了实现 π 1 , π 3 \pi_1,\pi_3 π1,π3,我们使用 Benes/Waksman Network(two back-to-back butterfly network),实现一维数组上的任意置换:指标集 I = [ 2 r ] I=[2^r] I=[2r](表示为 r r r 比特数),网络包含 2 r − 1 2r-1 2r−1 层,每一层有 2 r 2^r 2r 个节点;第 i − 1 i-1 i−1 层和第 i i i 层之间的边只有两种情况:一对指标 j , j ′ j,j' j,j′,它们只有第 k = ∣ r − i ∣ k=|r-i| k=∣r−i∣ 比特不同,即 j ′ = j + 2 k j'=j+2^{k} j′=j+2k,共有 2 r − 1 2^{r-1} 2r−1 对指标,
Benes Network:集合 I = [ 2 r ] I=[2^r] I=[2r] 上的任意置换 π \pi π,给出了 r r r 维 Benes 网络上的一组不交路径(node-disjoint path),使得 i → P i π ( i ) , ∀ i i \overset{P_i}{\to} \pi(i),\forall i i→Piπ(i),∀i 成立。换句话说,相邻层之间的每一对指标 j , j ′ j,j' j,j′,它们要么不交换(直边)、要么交换(叉边),可通过使用 control bit 控制 Switch Gate 来实现。
给定两个密文 A 0 = [ m 1 ( 0 ) , ⋯ , m l ( 0 ) ] A_0=[m_1^{(0)},\cdots,m_l^{(0)}] A0=[m1(0),⋯,ml(0)] 和 A 1 = [ m 1 ( 1 ) , ⋯ , m l ( 1 ) ] A_1=[m_1^{(1)},\cdots,m_l^{(1)}] A1=[m1(1),⋯,ml(1)],再令 S = [ s 1 , ⋯ , s l ] ∈ { 0 , 1 } l S=[s_1,\cdots,s_l] \in \{0,1\}^l S=[s1,⋯,sl]∈{0,1}l 是掩码,那么
S e l e c t S ( A 0 , A 1 ) = A d d ( M u l t ( A , S ˉ ) , M u l t ( A ′ , S ) ) Select_S(A_0,A_1) = Add(Mult(A,\bar S),\,\, Mult(A',S)) SelectS(A0,A1)=Add(Mult(A,Sˉ),Mult(A′,S))
得到密文 [ m 1 ( s 1 ) , ⋯ , m l ( s l ) ] [m_1^{(s_1)},\cdots,m_l^{(s_l)}] [m1(s1),⋯,ml(sl)],它根据 S S S 挑选 A 0 , A 1 A_0,A_1 A0,A1 的元素。进一步的,计算
S w i t c h S ( A 0 , A 1 ) = ( S e l e c t S ( A 0 , A 1 ) , S e l e c t S ˉ ( A 0 , A 1 ) ) Switch_S(A_0,A_1) = \left(Select_S(A_0,A_1),\,\, Select_{\bar S}(A_0,A_1)\right) SwitchS(A0,A1)=(SelectS(A0,A1),SelectSˉ(A0,A1))
那么 s i = 0 s_i=0 si=0 的那些位置不发生交换,而 s i = 1 s_i=1 si=1 的那些位置发生了交换。
对于 k × l k \times l k×l 的二维数组上的 π 1 , π 3 \pi_1,\pi_3 π1,π3 对于各个列分别置换,假设 k = 2 r k=2^r k=2r(通过填充),那么可以构建 r r r 维的 Benes 网络,为第 i − 1 i-1 i−1 层和第 i i i 层之间的 Switch Gate 设置 S j , j ′ S_{j,j'} Sj,j′,执行并行的(但是 control bit 独立)交换电路。Benes 网络的深度 2 r − 1 = O ( log k ) 2r-1=O(\log k) 2r−1=O(logk),交换节点的数量 k ( 2 r − 1 ) / 2 = O ( k log k ) k(2r-1)/2=O(k\log k) k(2r−1)/2=O(klogk),复杂度是 ploylog 的。
剩下的问题就是如何使用底层代数结构所给于的置换子集 H ⊆ G a l ( Q ( ζ m ) / Q ) \mathcal H \subseteq Gal(\mathbb Q(\zeta_m)/\mathbb Q) H⊆Gal(Q(ζm)/Q),实现单个密文上 l = N / d l=N/d l=N/d 个槽的任意置换。
对于特殊参数设置,商群 H \mathcal H H 中的元素作用在密文上导致了 slot rotation(单环置换)。我们假设循环群生成元是 σ \sigma σ,经过对槽的合理排序,映射 σ k \sigma^k σk 将 ( m 1 , ⋯ , m l ) (m_1,\cdots,m_l) (m1,⋯,ml) 映射为 ( m k , ⋯ , m l , m 1 , ⋯ , m k − 1 ) (m_k,\cdots,m_l,m_1,\cdots,m_{k-1}) (mk,⋯,ml,m1,⋯,mk−1),是个循环移位。
我们称 I = [ l ] I=[l] I=[l] 上的映射 π \pi π 是 i i i-offset swap,如果 π \pi π 可以分解为 1 1 1-cycles 和 2 2 2-cycles,并且这些 2 2 2-cycles 都形如 ( k , k + i ) ( m o d l ) (k,k+i) \pmod l (k,k+i)(modl)。那么,任意的 i i i-offset swap 可以通过两个 Batch Select,然后分别使用 σ i \sigma^i σi 和 σ l − i \sigma^{l-i} σl−i 旋转对应的槽,最后加起来即可。令 r = log l r=\log l r=logl,在 Benes 网络中只需要形如 ( j , j + 2 ∣ r − i ∣ ) ( m o d 2 r ) (j,j+2^{|r-i|}) \pmod{2^r} (j,j+2∣r−i∣)(mod2r) 的置换,因此使用 O ( log l ) O(\log l) O(logl) 个槽旋转即可完成任意置换。
然而,对于一般的参数设置, H \mathcal H H 仅仅是一个 Sharply Transitive Permutation Groups,不一定是由循环移位组成的循环群。将有限阿贝尔群写作循环群直积
H ≅ ∏ i = 1 k Z n i , ∀ i , n i ∣ n i + 1 , ∏ i n i = l \mathcal H \cong \prod_{i=1}^k\mathbb Z_{n_i},\,\, \forall i,n_i|n_{i+1},\,\, \prod_i n_i=l H≅i=1∏kZni,∀i,ni∣ni+1,i∏ni=l
于是元素 h ∈ H h \in \mathcal H h∈H 可以记为盒子 B = ∏ i = 1 k Z n i \mathcal B=\prod_{i=1}^k\mathbb Z_{n_i} B=∏i=1kZni 中的向量 h ⃗ \vec h h,群元素运算就等价于向量的加法。令 { e r } r = 1 t \{e_r\}_{r=1}^t {er}r=1t 是单位向量,易知它是 H \mathcal H H 的生成集。
因为 H \mathcal H H 是集合 I = [ l ] I=[l] I=[l] 上的快速迁移,我们固定某个索引 i 0 ∈ I i_0 \in I i0∈I(例如 i 0 = 1 i_0=1 i0=1),那么我们遍历 h ∈ H h \in \mathcal H h∈H(此时 h ( i 0 ) h(i_0) h(i0) 遍历 I I I),对每个 h ( i 0 ) h(i_0) h(i0) 标记上 h ⃗ \vec h h,这就把一维数组 I I I 转化为了高阶立方 B \mathcal B B
生成元 e r ∈ H e_r \in \mathcal H er∈H 作用在指标 i i i 上,假如 i = h ∗ ( i 0 ) i=h^*(i_0) i=h∗(i0), 那么得到
e r ( i ) = e r ( h ∗ ( i 0 ) ) = ( e r h ∗ ) ( i 0 ) e_r(i) = e_r(h^*(i_0)) = (e_r h^*)(i_0) er(i)=er(h∗(i0))=(erh∗)(i0)
于是 e r ( i ) e_r(i) er(i) 的标签是 e ⃗ r + h ⃗ ∗ ( m o d B ) \vec e_r+\vec h^* \pmod{\mathcal B} er+h∗(modB),这就是对第 r r r 个坐标执行了 ( m o d n r ) \pmod{n_r} (modnr) 的循环移位。因此,我们将 I I I 视为 t t t 阶立方 B \mathcal B B,
这个由 Benes 网络组合出来的置换网络,它的深度为 O ( log l ) O(\log l) O(logl),每层的 Rotate 和 Select 数量都是常数。
[HS14] 给出了移位网络的定义。对于 I = [ l ] I=[l] I=[l] 上的置换 π \pi π,移位列(shift-column) s h π [ i ] = π ( i ) − i ∈ [ − l + 1 , l − 1 ] sh_\pi[i]=\pi(i)-i \in [-l+1,l-1] shπ[i]=π(i)−i∈[−l+1,l−1] 是记录置换导致移动距离的列向量,令 m δ ∈ { 0 , 1 } l m_\delta \in \{0,1\}^l mδ∈{0,1}l 是那些 s h π [ i ] = δ sh_\pi[i]=\delta shπ[i]=δ 的掩码,那么 w = ∑ δ ∈ s h π ( m δ × v ) ≫ δ w = \sum_{\delta \in sh_\pi} (m_\delta \times v) \gg \delta w=∑δ∈shπ(mδ×v)≫δ,其中 × \times × 是阿达玛乘积, ≫ \gg ≫ 是移位。我们定义开销(cost)是 s h π sh_\pi shπ 中出现的不同的非零值的个数。移位网络(Shift Network)是 l × d l \times d l×d 形状的矩阵,网络深度为 d d d,它的每一列都是移位列,代表了 π 1 , ⋯ , π d \pi_1,\cdots,\pi_d π1,⋯,πd,网络对应的置换是 π = π d ∘ ⋯ ∘ π 1 \pi=\pi_d \circ \cdots \circ \pi_1 π=πd∘⋯∘π1。网络开销是所有移位列开销的加和。
Cheapest-shift-network Problem:给定 [ n ] [n] [n] 上的置换 π \pi π,以及深度上界 B B B,尝试给出一个深度至多为 B B B 的移位网络,使得网络开销最小化。易知,大多数置换拥有 cost- Ω ( n ) \Omega(n) Ω(n) depth- 1 1 1 的移位网络,全部的置换都有 cost- O ( n ) O(\sqrt n) O(n) depth-2 移位网络,以及 cost- O ( d ⋅ n 1 / d ) O(d \cdot n^{1/d}) O(d⋅n1/d) depth- d d d 的移位网络。
求解 CSN 被认为是困难的,但是足够给出一类足够优秀的网络:Benes Networks。设 n = 2 r n=2^r n=2r,它的深度为 2 r − 1 = O ( log n ) 2r-1=O(\log n) 2r−1=O(logn),开销是 4 r − 2 = O ( log n ) 4r-2=O(\log n) 4r−2=O(logn)。它被应用于交换机、电话交换网络。
[GHS12] 中使用 Benes 网络分别实现了 π 1 , π 2 , π 3 \pi_1,\pi_2,\pi_3 π1,π2,π3,但是文中没有给出 Benes 网络的具体构造方法。[HS14] 给出了方法。
给定 S = [ n ] , n = 2 r S=[n],n=2^r S=[n],n=2r 上的任意置换 π \pi π,将它分解为
π = σ r − 1 ∘ ⋯ ∘ σ 1 ∘ σ 0 ∘ τ 1 ∘ ⋯ ∘ τ r − 1 \pi = \sigma_{r-1} \circ \cdots \circ \sigma_1 \circ \sigma_0 \circ \tau_1 \circ \cdots \circ \tau_{r-1} π=σr−1∘⋯∘σ1∘σ0∘τ1∘⋯∘τr−1
其中 σ k , τ k \sigma_k, \tau_k σk,τk 把元素 i ∈ [ n ] i \in [n] i∈[n] 映射到三种可能: i , i + 2 k , i − 2 k i,i+2^k,i-2^k i,i+2k,i−2k
采用递归算法:
令 m = n / 2 = 2 r − 1 m=n/2=2^{r-1} m=n/2=2r−1,我们把 S S S 分为上下两部分, S 0 = [ 0 , ⋯ , m − 1 ] S_0=[0,\cdots,m-1] S0=[0,⋯,m−1], S 1 = [ m , ⋯ , n − 1 ] S_1=[m,\cdots,n-1] S1=[m,⋯,n−1]
做分解 π = σ ∘ ρ ∘ τ \pi=\sigma \circ \rho \circ \tau π=σ∘ρ∘τ,使得
构造二部图 G = ( L , R , E ) G=(L,R,E) G=(L,R,E),其中 ∣ L ∣ = ∣ R ∣ = n |L|=|R|=n ∣L∣=∣R∣=n,
容易看出 E E E 组成了汉密尔顿回路,并且 ( L , R ) (L,R) (L,R) 可以二染色(permutation edge 和 conflict edge 交替出现), C ( v ) ∈ { 0 , 1 } C(v) \in \{0,1\} C(v)∈{0,1}
根据点集 L L L 的染色情况,把它们分为上下两部分
于是 τ \tau τ 变换后, S 0 S_0 S0 中的点都是颜色 0 0 0, S 1 S_1 S1 中的点都是颜色 1 1 1,花费是 + m +m +m 和 − m -m −m 的两个 batch select + shift
根据点集 R R R 的染色情况,把它们分为上下两部分
于是 σ − 1 \sigma^{-1} σ−1 变换后, S 0 S_0 S0 中的点都是颜色 1 1 1, S 1 S_1 S1 中的点都是颜色 0 0 0,花费是 + m +m +m 和 − m -m −m 的两个 batch select + shift
可以看出 τ ( L ) \tau(L) τ(L) 和 σ − 1 ( R ) \sigma^{-1}(R) σ−1(R) 将图 G G G 分为了两个二部图 G 0 , G 1 G_0,G_1 G0,G1,两个子图之间没有 permutation edge(仅在 S 0 S_0 S0 和 S 1 S_1 S1 内部分别置换),因此我们就得到了中间的置换 ρ = ( π 0 ) ( π 1 ) \rho=(\pi_0)(\pi_1) ρ=(π0)(π1),递归分解。
它是 “背靠背” 的两个蝴蝶网络:以 n = 2 3 n=2^3 n=23 为例,两个深度 3 3 3 的网络,
注意,上图画的有些问题(没找到更好的网图。。。):左上、右上的那两对节点,缺少了直边!
[HS14] 给出了更加快速的 Benes 网络:假设 n n n 不是二的幂次,并非将它填充到 2 r 2^r 2r,而是将它分割为近似相等的两个子图。
如果 n n n 是偶数,那么 m = n / 2 m=n/2 m=n/2,于是 Benes 的分割流程是工作的
如果 n n n 是奇数,有两种设置: m = ( n − 1 ) / 2 m = (n-1)/2 m=(n−1)/2 或者 m = ( n + 1 ) / 2 m=(n+1)/2 m=(n+1)/2,我们令 S 0 = { 0 , ⋯ , m − 1 } S_0=\{0,\cdots,m-1\} S0={0,⋯,m−1}, S 1 = { m , ⋯ , n − 1 } S_1=\{m,\cdots,n-1\} S1={m,⋯,n−1},它们的大小差距为 1 1 1
为了保证分割后,同一个 level 中所有置换的移动距离相同,
注意, ⌊ ( ( n − 1 ) / 2 ) / 2 ⌉ ≠ ⌊ ( ( n + 1 ) / 2 ) / 2 ⌉ \lfloor ((n-1)/2)/2 \rceil \neq \lfloor ((n+1)/2)/2 \rceil ⌊((n−1)/2)/2⌉=⌊((n+1)/2)/2⌉,因此上述的偏移 m ′ , m ′ ′ , ⋯ m',m'',\cdots m′,m′′,⋯ 并不是以子图本身大小来计算的!必须根据整个图的大小 n n n 以及分解的 level 层级来计算。
最终得到了深度 2 ⌈ log n ⌉ − 1 2\lceil \log n \rceil-1 2⌈logn⌉−1 的移位网络,同一层的移位距离都是 ⌊ n / 2 k ⌉ \lfloor n/2^k \rceil ⌊n/2k⌉,因此只需要两个 batch select + shift
两种 m m m 的选择, S 0 , S 1 S_0,S_1 S0,S1 的大小差距 1 1 1,因此制作 conflict edge 的时候,会有一个指标 i ∗ i^* i∗ 剩余,我们特别地设置它的 conflict edge 是自己到自己。对应的二染色,如图所示: