BFVの乗算
- ということは新しい暗号文として を与えれば乗算になる
- で割るので乗算は剰余を取らずに実数として考えて実行する
- Torusでも剰余環でもない値で除算計算していいのかというのは微妙
- 実際それで計算できてしまうので見逃されている感じがある
Relinearlization
- 見ての通り出力の暗号文は次元がになってしまう
- 乗算をこのまま続けていくとどんどん次元が増えてしまう
- 乗算で増えてしまった次数を減らすのがRelinearlization
- が計算できれば次数が元に戻る
- を計算するにはをで暗号化して送ってやればいい
- 乗算によるノイズ増加のトレードオフはTRGSWのExternalProductと一緒
- S[X]を平文とするTRGSWの下半分(の部分がなので)だけ用意すればいい
Packing
- Canonical Embeddingと呼ばれることもある
- Embeddingは日本語で言えば埋め込みでwikiによると数学的構造間の構造を保つような単射のことらしい
- BFVの特徴としてよく言われるもの
- (CKKSもだが)一般にはこちらの方式がよく使われる
- Packingは平文のエンコーディング方法の一つ
- RLWEに見られる性質として, 加算に関しては係数ごとに並列な演算ができる
- 乗算に関しても独立な計算ができたら便利そう
- を法とするNTTをかけてやればこれが達成できる
- CKKSだとFFT
- 厳密には次全てを使うのでなければNTTとして完全に分解できる必要はないのでをとかにとってもよい
- の下でが分解できる式の数が並列で扱えるスカラーの数
Slot2Coeff/Coeff2Slot
- Packingで値を詰めた場合の各値のことをSlotと呼ぶ
- しかしBootstrappingなどをするときには多項式の係数に対して考えたほうが楽な場合が多い
- 平文がNTTがかかってる状態のやつを暗号上でINTTをかけて係数に平文が来るようにしたい
- Nai"eveな実装はとても簡単
- NTTやINTTは行列(Vandermonde matrix)とベクトルの積として書ける
Lifting
- Bootstrappingをするにはノイズを消去する必要がある
- SampleExtractIndexしてTFHEでBootsrapingする方法も知られてはいる
- BFV固有のBootstrappingのアイデアとしてLiftingがある
- 平文を基数で分解できる()ものとして最下位を得る演算
- 最も単純なものはの場合
Liftingの疑似コード
Digit Extraction(z,e)
w₀,₀ ← z
For k ← 0 to e-1
y ← z
For j ← 0 to k
wⱼ,ₖ₊₁ ← (wⱼ,ₖ)ᵖ
y ← (y - wⱼ,ₖ₊₁)/p
wₖ₊₁,ₖ₊₁
return wₑ,ₑ
Page 1 of 11