平文の位置のイメージ図
CKKSの乗算
- BFVと違ってでわる必要がない
- を十分小さく取っていれば
- オーバフローを起こさないので割らなくてもいい
- で割ってはいけない理由もない気もしないでもないのだが割らないほうが主流という認識
- 個人的には割ったほうがノイズの増加が遅い気がするのだが......?
- はどんどん大きくなっていくのでも乗算回数に影響を及ぼす
- Relinearlizationも同じ
Rescale
- 高速化とノイズを抑えるために係数の桁を落とすだけの操作
- ノイズが大きくなってくると下の方の桁を保持する意味がない
- 桁が小さければ大抵の場合計算も高速
- 桁の大きさがそのままノイズの増幅率になるのでそれも抑えたい
- 各係数のbitの下から何bitかを丸めて捨てる
Packing
- CKKSのPackingはFFTをベースにしている
- 固定小数点が扱えるので, FFTをした結果に値を埋め込むことができる
- この場合は複素数係数として再解釈されるので複素数のベクトルを平文とする暗号文になる
- 実数としてはしか埋め込めない
- BFVでの分解の仕方は剰余環に対するものなのでCKKSでは扱いづらい
- Rescaleで下のbitを破壊するのが非線形な変換をかけてしまう場合がある
- Rescaleの仕方を工夫すればできる気がする?
Slot2Coeff/Coeff2Slot, Bootstrapping
- BFVではNTTだったのがFFTになっただけなのでSlot2CoeffとCoeff2Slotもだいたい同じ
- 複素数の計算をしないといけないのでちょっと面倒だったはずだが
- Bootstrappingはほとんど何も知らない......
- 確かSin関数を評価するのが一番ベーシックだったはずだが
- CKKSのBootstrappingは実装しようとしたことがない
- 最近高精度化が進んでいるらしいので持っている知識は多分古い
Residual Number System (RNS)
- BFVと共通の話
- を十分小さく取るにはを十分大きく取らないといけない
- を中国剰余定理で複数の素数に分解することで計算を高速化する
- この方法をRNSと呼ぶ
- なぜCRTじゃないのかはよくわからない
- RelinealizationのときはExtarnalProductと同様に基数で分解する
- RNSの表現からの表現に変換してから計算する
- これが地味に面倒なのでこのコストを下げようとする研究を見た記憶はある
RNSでのRescale
- RNSの場合, 下から何bitか捨てるという操作が定義しづらい
- RNSでのRescaleはを分解した法のうち一つを捨てる
- での表現に変換して捨てる法をとすると倍して丸めで剰余をとる
- これをするためには大体くらいの大きさの法に分解できるように選ぶ