ベイビーステップ ジャイアントステップ&準同型 DFT

参考文献:

  1. [CT65] Cooley J W、Tukey J W. 複素フーリエ級数の機械計算用アルゴリズム [J]。計算の数学、1965、19(90): 297-301。
  2. [Shoup95] Shoup V. 新しい多項式因数分解アルゴリズムとその実装[J]。記号計算ジャーナル、1995、20(4): 363-397。
  3. [HS14] Halevi S、Shoup V. helib のアルゴリズム[C]//暗号学の進歩 – CRYPTO 2014: 第 34 回年次暗号会議、米国カリフォルニア州サンタバーバラ、2014 年 8 月 17 ~ 21 日、議事録、パート I 34. Springerベルリン ハイデルベルク、2014: 554-571。
  4. [CHKKS18] Cheon J H、Han K、Kim A 他近似準同型暗号化のためのブートストラッピング[C]//暗号学の進歩 – EUROCRYPT 2018: 暗号技術の理論と応用に関する第 37 回年次国際会議、イスラエル、テルアビブ、2018 年 4 月 29 日から 5 月 3 日まで議事録、パート I 37. Springer International出版、2018: 360-384。
  5. [CHH18] Cheon J H、Han K、Hhan M。 より高速な準同型離散フーリエ変換とブートストラップの改良 [J]。暗号学 ePrint アーカイブ、2018 年。
  6. [HHC19] Han K、Hhan M、Cheon J H. 準同型離散フーリエ変換とブートストラップを改良しました [J]。 IEEE Access、2019、7: 57361-57370。
  7. Nussbaumer 変換および償却済み FHEW ブートストラップ
  8. キメラ: ハイブリッド RLWE-FHE スキーム
  9. クイック掛け算テクニック: カラツバ、トゥーム、グッド、シェーンハーゲ、ストラッセン、ヌスバウマー
  10. パターソン・ストックマイヤー多項式評価アルゴリズム

ベイビーステップ ジャイアントステップ

ショップ95

記事 [Shoup95] では、一変量多項式を既約因数に分解するための BSGS 因数分解法を研究および実装しています。 CRT と FFT は多項式の表現に使用され (GHS12 の Doube-CRT よりも古い)、高速な乗算、除算、逆算、二乗、GCD およびその他の多項式演算が実装されています。

多項式分解は 3 つのステップに分けることができます。

  1. square-free factorization:将多项式分解为 f = ∏ i f i f = \prod_i f_i f=i fi ,其中的 f i f_i fi 正方形は無料です
  2. 個別次数因数分解: 自由平方多項式を f i = ∏ j f i , j f_i = \prod_j f_{i,j} に分解します。 fi =j fij ,其中的 f i , j f_{i,j} fij はある程度です j j j
  3. 等次数分解: 既約因数は同じ次数の正方自由多項式です f i , j f_{i,j} あ>fij 、これらの既約多項式に分解されます。

主要なステップはステップ 2 に集中しています。[Shoup95] は次の事実を観察しました。 a , b ∈ Z + a,b \in \mathbb Z ^+ ab+,多项式 h a , b ( x ) = x p a − x p b ∈ G F ( p ) [ x ] h_{a,b} (x) = x^{p^a} - x^{p^b} \in GF(p)[x] hab (x)=バツpあるバツpbGF(p)[x] 以所有的满足 deg ⁡ f ∣ ( a − b ) \deg f|(a-b) gf(ab) 的不可约多项式 f f f 为因式。

度 ⁡ f ≤ n \deg f \le n gfn の自由平方多項式の真の因子次数は n / 2 n/2 n/2、不等式 f d , 1 ≤ d ≤ n f_d,1 \le d \le n fd 1dn 是它的全部 d d d 倍の既約因数の積。すべての 1 ≤ a − b ≤ n 1\le a-b\le n 1あるbn,计算出 h a , b ( x ) h_{a,b}(x) hab (x),再设计 gcd ⁡ ( h a , b , f ) \gcd(h_{a,b},f) gcd(hab f) 从而获得这些 f d f_d fd

[Shoup95] 使用 BSGS 算法来计算这些 h a , b h_{a,b} hab 、真の因子の次数の上限を設定します B B B、分は B = l ⋅ m B=l \cdot m B=m,ベイビーステップ 就是 { i : 1 ≤ i ≤ l } \{i:1 \le i \le l\ } { :1l},ジャイアント ステップ ステップ { l ⋅ j : 1 ≤ j ≤ m } \{l \cdot j:1 \le j \le m\} { lj:1jm}

ここに画像の説明を挿入します

ただし、単純に直接計算すると h i , H j h_i,H_j hi Hj の場合、上記のアルゴリズムはまだ実用的ではありません。 [Shoup95] 反復的に計算します: h i + 1 = h i ( h 1 ) ( mod d f ) h_{i+1} = h_i(h_1) \pmod f hi+1 =hi (h1 )(modf) H j + 1 = H j ( H 1 ) ( mod d f ) H_ {j+1} = H_j(H_1) \pmod f Hj+1 =Hj (H1 )(modf)、ここでの問題は、モジュラー構成、形式は g ( h ) ( mod d f ) g(h) \pmod f g(h)(modf)

[Shoup95] は引き続き BSGS アルゴリズム ([PS73] 多項式評価アルゴリズムと同様) を採用し、パラメータを選択します< a i =3> t ≈ n t \およそ \sqrt n tn ,定義 h i ( mod f ) , 0 ≤ i ≤ t h^i \pmod f , 0 \le i \let h(modf),0t 表格,那么:
g ( x ) = ∑ j = 0 n / t g j ( x ) ⋅ y j , y = x t ,度 ⁡ g j < t g(x) = \sum_{j=0}^{n/t} g_j(x) \cdot y^j,\,\, y=x^t,\,\, \deg g_j <; tg(x)=j=0n/t gj (x)そしてjそして=バツtggj <;t
したがって、事前計算テーブルの内容を直接使用して、単純に加算 (および乗算) を計算します。
g j ( h ) = ∑ i = 0 t g j , i ⋅ h i ( mod d f ) g_j(h) = \sum_{i=0}^t g_{j,i} \cdot h^i \pmod f gj (h)=i=0t gji h(modf)
続いて、取ホーナー法则、计算出
g ( x ) = ( ( g n / t ⋅ h t + ⋯ ) ⋅ h t + g 1 ) ⋅ h t + g 0 g(x) = ((g_{n/t} \ cdot h^t + \cdots)\cdot h^t +g_1)\cdot h^t + g_0 g(x)=((gn/t ht+)ht+g1 )ht+g0
多項式演算はすべて Double-CRT モードで計算され、合計複雑さは O ( n 2.5 + n log ⁡ n log ⁡ log ⁡ n log ⁡ p ) O です。 (n^{2.5}+n \log n \log\log n\log p) O(n2.5+ngnggngp)

CT65

[CT65] は、 再帰形式の DFT 分解を提供します。これは、実際には FFT アルゴリズムの BSGS バージョンとみなすことができます。 DFT の式は次のとおりです。
A j : = ∑ k = 0 N − 1 a k ⋅ ζ j k A_j := \sum_{k=0}^{N-1} a_k \cdot \zeta ^ {jk} j :=k=0N1 あるk gjk
は BSGS アルゴリズムを採用しており、 N = N 1 ⋅ N 2 N=N_1 \cdot N_2 N=N1 N2 ,設定インデックス
j : = N 1 ⋅ j 1 + j 0 , j 0 ∈ [ N 1 ] , j 1 ∈ [ N 2 ] k : = N 2 ⋅ k 1 + k 0 , k 0 ∈ [ N 2 ] , k 1 ∈ [ N 1 ] \begin{aligned} j &:= N_1 \cdot j_1 + j_0,\,\, j_0 \in [N_1], j_1 \in [N_2]\\ k &:= N_2 \cdot k_1 + k_0,\,\, k_0 \in [N_2], k_1 \in [N_1]\\ \end{aligned} jk :=N1 j1 +j0 j0 [N1 ]j1 [N2 ]:=N2 k1 +k0 k0 [N2 ]k1 [N1 ]
自由
j 1 , j 0 : = ∑ k 0 ∈ [ N 2 ] ∑ k 1 ∈ [ N 1 ] a k 1 , k 0 ⋅ ζ j k = ∑ k とします。 0 ∈ [ N 2 ] ( ∑ k 1 ∈ [ N 1 ] a k 1 , k 0 ⋅ ζ N 2 j k 1 ) ⋅ ζ j k 0 = ∑ k 0 ∈ [ N 2 ] ( ∑ k 1 ∈ [ N a k 1 , k 0 ⋅ ξ N 2 j k 1 ) ⋅ ξ j 0 k 0 ⋅ ξ N 1 j 1 k 0 \begin{aligned} A_{j_1,j_0} &:= \sum_{k_0 \in [N_2 } \sum_{ k_1\in[N_1]} a_{k_1,k_0} \cdot \zeta^{jk}\\ &= \sum_{k_0\in[N_2]}\left(\sum_{k_1\in[ N_1]} a_ {k_1,k_0} \cdot \zeta^{N_2jk_1}\right) \cdot \zeta^{jk_0}\\ &= \sum_{k_0 \in [N_2]} \left(\sum_{k_1 \in [N_1 ]} a_{k_1,k_0} \cdot \zeta^{N_2jk_1}\right) \cdot \zeta^{j_0k_0} \cdot \zeta^{N_1j_1k_0}\\ \end{aligned} j1 j0 :=k0 [N2 ] k1 [N1 ] あるk1 k0 gjk=k0 [N2 ] k1 [N1 ] あるk1 k0 gN2 jk1 gjk0 =k0 [N2 ] k1 [N1 ] あるk1 k0 gN2 jk1 gj0 k0 gN1 j1 k0
于是,将 a N a_N あるN 行優先順 N 1 × N 2 N_1 \times N_2 の形で配置されます。 N1 ×N2 的矩阵 a N 1 × N 2 a_{N_1 \times N_2} あるN1 ×N2

  1. k 0 k_0 k0 ,利用形状 N 1 × N 1 N_1 \times N_1 N1 ×N1 の行列
    W 1 := { ζ j 0 k 1 } j 0 , k 1 W_1:=\{\zeta^{j_0k_1}\}_{j_0,k_1 } 1 :={ ζj0 k1 }j0 k1
    計算された長さは N 1 N_1 です。N1 的各个列矢 a k 0 a_{k_0} あるk0 NTT 变换(单位根为 { ζ N 1 j 0 , j 0 ∈ [ N 1 ] } \{\zeta_{N_1}^{j_0},j_0 \in [N_1]\} { ζN1 j0 j0 [N1 ]}),得到形状 N 1 × N 2 N_1 \times N_2 N1 ×N2 的行列
    W 1 × a N 1 × N 2 = { A j 0 , k 0 ' : = ∑ k 1 ∈ [ N 1 ] a k 1 , k 0 ⋅ ζ N 2 j k 1 } j 0 , k 0 W_1 \times a_{N_1 \times N_2} = \left\{A_{j_0,k_0}' := \sum_{k_1 \in [N_1]} a_{k_1,k_0} \cdot \zeta^{N_2jk_1}\right\}_{j_0,k_0} 1 ×あるN1 ×N2 = j0 k0 ' :=k1 [N1 ] あるk1 k0 gN2 jk1 j0 k0

  2. 利用形状 N 1 × N 2 N_1 \times N_2 N1 ×N2 の行列
    W 2 := { ζ j 0 k 0 } j 0 , k 0 W_2 := \{\zeta^{j_0k_0}\}_{j_0,k_0 } 2 :={ ζj0 k0 }j0 k0
    对它做 Hadamard 乘积,扭曲矩阵 A ′ A' ' は次の演算を標準 NTT にします (そうしないと、後続の NTT で使用される単位根を適切に歪ませる必要があります)。このときの結果は N 1 × N 2 N_1 \times N_2 N1 ×N2 的行列
    W 2 ⊙ A N 1 × N 2 ' = { A j 0 , k 0 ' ' : = ζ j 0 k 0 ⋅ ∑ k 1 ∈ [ N 1 ] a k 1 , k 0 ⋅ ζ N 2 j k 1 } j 0 , k 0 W_2 \odot A_{N_1 \times N_2}' = \left\{A_{j_0,k_0}'' := \zeta^{j_0k_0} \cdot\sum_{k_1 \in [N_1]} a_{k_1,k_0} \cdot \zeta^{N_2jk_1}\right\}_{j_0,k_0} 2 N1 ×N2 ' = j0 k0 '' :=gj0 k0 k1 [N1 ] あるk1 k0 gN2 jk1 j0 k0

  3. 对于每一个 j 1 j_1 j1 ,利用形状 N 2 × N 2 N_2 \times N_2 N2 ×N2 定義
    W 3 : = { ζ N 2 j 1 k 0 } j 1 , k 0 W_3 := \{\zeta_{N_2}^{j_1k_0}\} _ {j_1,k_0}3 :={ ζN2 j1 k0 }j1 k0
    計算された長さは N 2 N_2 です。N2 的各个行矢 A j 0 ′ ′ A_{j_0}'' j0 '' NTT 变换(单位根为 { ζ N 2 j 1 , j 1 ∈ [ N 2 ] } \{\zeta_{N_2}^{j_1},j_1 \in [N_2]\} { ζN2 j1 j1 [N2 ]}),得到形状 N 2 × N 1 N_2 \times N_1 N2 ×N1 的行列
    W 3 × ( A N 1 × N 2 ' ' ) T = { A j 1 , j 0 } j 1 , j 0 W_3 \times (A_{N_1 \times N_2}'')^T = \{A_{j_1,j_0}\}_{j_1,j_0} 3 ×(AN1 ×N2 '' )T={ Aj1 j0 }j1 j0

对于形状 N 2 × N 1 N_2 \times N_1 N2 ×N1 的矩阵 A N 2 × N 1 A_{N_2 \times N_1} N2 ×N1 ,按照行主序读取为 A N = N T T ( a N ) A_N = NTT(a_N) N =NTT(aN )

总之, a N , A N a_N, A_N あるN N はすべて行優先順 (さまざまな形状) で行列に配置されており、次のようになります。
A N 2 × N 1 = W 3 × ( W 2 ⊙ ( W 1 × a N 1 × N 2 ) ) T A_{N_2 \times N_1} = W_3 \times \Big(W_2 \odot \big(W_1 \times a_{N_1 \times N_2}\big)\Big)^T N2 ×N1 =3 ×(W2 (W1 ×あるN1 ×N2 ))T
実際、このプロセスはヌスバウマー変換
F [ x ] / ( x N − 1 ) の環準同型性によって表現できます。 ≅ ( F [ y ] / ( y N 1 − 1 ) ) [ x ] / ( x N 2 − y ) ≅ ( F [ y ] / ( y N 1 − 1 ) ) [ z ] / ( z N 2 − 1 ) \mathbb F[x]/(x^N-1) \cong \Big(\mathbb F[y]/(y^{N_1}-1)\Big)[x]/(x^{N_2} -y ) \cong \Big(\mathbb F[y]/(y^{N_1}-1)\Big)[z]/(z^{N_2}-1) F[x]/ (xN1)(F[y] /(yN1 1))[x ]/(xN2 y)(F[y] /(yN1 1))[z ]/(zN2 1)

CHKKS18

初期の [HS14] は、行列とベクトルの乗算のための対角アルゴリズムを提案しました: SIMD テクノロジーを使用しましたアダマール および回転 演算は準同型線形演算を実現します。 [CHKKS18] は、それらを計算するために BSGS トリックを採用しました。デフォルトのインデックスは自動です ( mod n ) \pmod n (modn) 的,基本符号:

  • 任意の線形変換の場合 M ∈ C n × n M \in \mathbb C^{n \times n} MCn×n,简记 di a g i ( M ) = [ M 0 , i , M 1 , i + 1 , ⋯ , M n , i + n ] diag_i(M) = [M_{0,i}, M_{1,i+1},\cdots,M_ {n,i+n}] diagi (M)=[M0i M1i+1 Mni+n ] 是第 i ∈ Z i \in \mathbb Z Z 対角線 (負の場合もあります − i -i ni 条对角线)
  • 任意のベクトルの場合 v ∈ C n v \in \mathbb C^{n} Cn,简记 r o t i ( v ) = [ v i , v i + 1 , ⋯ , v i + n − 1 ] rot_i(v ) = [v_i,v_{i+1},\cdots,v_{i+n-1}] i (v)=[vi i+1 i+n1 ] 是循环左移 i ∈ Z i \in \mathbb Z Z 距离(可以是负数 − i -i i,循环右移 i i i 距离)

BSGS アルゴリズムを使用して分解する n = l × k n=l \times k n=×k、線形変換は次のように表すことができます:

ここに画像の説明を挿入します

最適化中に選択 k ≈ n k \about \sqrt n kn ,计算复杂度为: O ( n ) O(\sqrt n) (n ) 次 Rotate 运算(关于 v v v 的密文), O ( n ) O(n) O(n) 次 Hadamard 运算。对于公开的固定矩阵 M M M,其中的 r o t − k i ( d i a g k i + j ( M ) ) rot_{-ki}(diag_{ki+j}(M)) オフ (diag+j (M)) は、事前に計算された定数多項式 (InvDFT でエンコード) です。 CKKS 暗号文での回転操作が必要です。

ここに画像の説明を挿入します

[CHKKS18] 上記の線形変換をスロット パッキング CKKS での準同型計算に変換し、それを使用して係数からスロットへのバッチ CKKS ブートストラップを実装します。使用される線形変換は DFT と InvDFT で、[CHKKS18] はこれらを一般的な線形変換として扱い、この準同型行列乗算を使用して実装します。

ただし、パブリックな線形変換の場合は、TFHE によって提案されたファンクション キー スイッチを直接使用する方がはるかに効率的です。秘密の線形変換については、TFHE も M M に従って提案しました。M は、プライベート ファンクション キー スイッチをサポートする M の KS-Key を構築します。ただし、この M 用の特別な KS-Key が提供されていない場合は、代わりに M M M は一般的な CKKS 暗号文に暗号化されているため、上記の準同型行列の乗算を使用し、Rotate と Hadamard を使用してゆっくり計算することしかできません。

より高速な準同型 DFT

[CHH18] は、DFT 行列がスパース分解していることを観察しました(つまり、バタフライ アルゴリズム)。したがって、この特殊な線形変換では、次のようになります。 [CHKKS18] の一般的な行列乗算と比較して、複雑さは 1 つ軽減されます。 n n n 要素。 [CHKKS18] の CKKS バッチ ブートストラップに適用すると、計算速度が数百倍向上します。 [HHC19] (IEEE Access で公開) のコンテンツは、基本的に [CHH18] (eprint に掲載) のコンテンツであり、名前が異なるだけです。

疎対角行列の因数分解

[CHH18] [CT65] の再帰的 FFT によれば、DFT 行列は次のようにスパースに分解できると言われています。

ここに画像の説明を挿入します

前者を繰り返し分解し続けると、最終的に次のものを得ることができます。

ここに画像の説明を挿入します

容易看出, d i a g i ( D 2 i ( n ) ) ≠ 0 ⃗    ⟺    k ∈ { 0 , ± n 2 i } diag_i(D_{2^i}^{(n)}) \neq \vec 0 \iff k\in \{0,\pm \dfrac{n}{2^i}\} diagi (D2(n))=0 k{ 0±2n }、非ゼロの対角線は 3 つだけなので、傾きの乗算によって計算するのが非常に効率的です。
D 2 i ( n ) ⋅ v = ∑ k ∈ { 0 , ± n / 2 i } d i a g k ( D 2 i ( n ) ) ⊙ r o t k ( v ) D_{2^i}^{(n)} \cdot v = \sum_ {k\ \{0,\pm n/2^i\}} で diag_k(D_{2^i}^{(n)}) \odot rot_{k}(v) D2(n)=k{ 0±n/ 2i} diagk (D2(n))k (v)
算法为:

ここに画像の説明を挿入します

注意到 r o t 0 ( v ) = v rot_0(v)=v 0 (v)=v 不必计算,对于特殊情况 i = 1 i=1 =1 に基づく r o t n / 2 i ( v ) = ro t − n / 2 i ( v ) rot_{n/2^i} (v)=rot_{-n/2^i}(v) n/2i (v)=n/2i (v) 可节约计算。最终, D F T ⋅ v = ∏ i = 0 log ⁡ 2 n D 2 i ( n ) ⋅ v DFT \cdot v = \prod_{i=0}^{\log_2 n} D_{2^i}^{(n)} \cdot v DFT=i=0log2 n D2(n)v 的复杂度为 O ( log ⁡ 2 n ) O(\log_2 n) O(g2 n)

逆変換の場合、DFT の逆行列はまさにそのエルミート行列であるため、

ここに画像の説明を挿入します
したがって、上記の GS バタフライと同様に、CT バタフライもまばらに対角的であるため、同様に高速な行列乗算が存在することは明らかです。

基数-r

ただし、上記の演算数は非常に少ないですが、計算の深さは log ⁡ 2 ( n ) \log_2(n) です。g2 (n) にはマルチレイヤの Rotate および CMult シリアル化が必要であり、ノイズ制御の問題が発生する可能性があります。 。 質問。特定の連続する k k k 行列の場合、深さは log ⁡ r n , r = 2 k \log_r n, r=2^k < に減ります。 /span>gr nr=2k の場合、その代償として計算の複雑さが増加します。

ここに画像の説明を挿入します

対角行列の乗算特性によると、2 つの対角行列の積は依然として対角行列です。
d i a g i ( a ) ⋅ d i a g j ( b ) = d i a g i + j ( a ⊙ r o t i ( b ) ) diag_i(a) \cdot diag_j(b) = diag_{i+j}(a \odot rot_i(b)) diagi (a)diagj (b)=diagi+j (ai (b))
可以证明,连续 k k k 行列
のマージ D k , s = D 2 s + k ( n ) ⋯ D 2 s + 2 ( n ) ⋅ D 2 s + 1 ( n ) D_{k,s} = D_{2^{s+k}}^{(n)} \cdots D_{2^{s+2}}^{(n)} \ cdot D_{2^{s+1}}^{(n)} Dks =D2s+k(n)D2s+2(n)D2s+1(n)
の非ゼロ対角のインデックスは
e 1 ⋅ n 2 s + 1 + e 2 ⋅ n 2 s + 2 + ⋯ + e t ⋅ n 2 s + k e_1 \cdot \dfrac{n}{2^{s+1}} + e_2 \cdot \dfrac{n}{2^{s+2}} + \cdots + e_t \cdot \dfrac{n}{2 ^ {s+k}} それは1 2s+1n +それは2 2s+2n ++それはt 2s+kn
其中 e i ∈ { 0 , ± 1 } e_i \in \{0,\pm1\} それはi { 0±1},易知这些 index 都是 n 2 s + k \dfrac{n}{2^{s+k}} 2s+kn の倍数、絶対値の上限は ( 2 k − 1 ) n 2 s + k \dfrac{(2^k-1)n}{2 ^{s +k}} 2s+k(2k1)n の場合、これらのインデックスの数は最大 2 k + 1 − 1 2^{k+1}-1 です。2k+11

この時点での DFT の複雑さは次のとおりです。 O ( r log ⁡ r n ) O(r \log_r n) O(rgr n) 次 Rotate 和 Hadamard,深度为 O ( log ⁡ r n ) O(\log_r n) O(gr n)

ハイブリッド方式

上記の分解のゼロ以外のインデックスは等差級数を表すため (両方 n 2 s + k \dfrac{n}{2^{s+k}} < /a >2s+kn そのため、BSGS 技術を使用して共通の計算部分を抽出し、計算効率をさらに向上させることができます。

ここに画像の説明を挿入します

最適化設定 k 2 ≈ t k_2 \about \sqrt t k2 t 、この時点での DFT の複雑さは次のとおりです: まだ O ( r log ⁡ r n ) O(r \log_r n) O(rgr n) 次 Hadamard,但是只需 O ( r log ⁡ r n ) O(\sqrt r \log_r n) (r gr n) 次 Ratate(但 r r r 是常数),深度也还是 O ( log ⁡ r n ) O(\log_r n) O(gr n)

結果

準同型DFTの実行時間:数秒程度

ここに画像の説明を挿入します

CKKS ブートストラップ時間: 2 分の遅延、4 ミリ秒で償却

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_44885334/article/details/134672030