---
# System prepended metadata

title: SEAL

---

# SEAL & Dimension Type

- https://github.com/microsoft/SEAL

## 2023/12/01
- Dimension Type: https://link.springer.com/chapter/10.1007/3-540-57880-3_23
    - 速さを表すDimension Type: $[LT^{-1}] real$


## 2023/11/21
- `5_ckks_basics.cpp`を動かしてみたが
    - 正常に動かしてみた結果、期待される答えとDecodeされた答えが絶妙に異なっている
        - 「精度」の問題？
    - L197 に`evaluator.rescale_to_next_inplace(x1_encrypted);` を付け加えて動かしてみる
        - ビルド、実行は通る。
        - 答えは違う
- スケールが合っているかどうか、と、浮動小数が合っているか問題の２つがある。（Waga）
## 2023/11/15
- `EncryptionParameters`で準同型暗号の形式をセットするらしい
    - [CKKS](https://eprint.iacr.org/2016/421):`parms(scheme_type::ckks);`
        - これがわかりやすそう：https://zenn.dev/herumi/articles/ckks-ring-iso
    - SEALコードを追って何かが得られる類のものではない。
    - 準同型暗号というものをまず理解する必要がある。
- 暗号文のスケールがcoeff_modulusの総サイズにあまりにも近くならないようにする必要がある。
    - そうでないと、暗号文はスケールアップされた平文を格納するのに十分な空間が不足してしまう
- この問題に対処するために、CKKSスキームはrescale機能を提供している。この機能を使用することで、スケールを削減し、スケールの拡張を安定させることができる。
- つまり、乗算によって生じるスケールの増加を抑制し、計算の途中で暗号文のスケールを調整することが可能。
- これにより、暗号文が適切なサイズで保持され、計算が正しく行われることが確保される。
- 初期のスケールは任意に選択できるが、一般的な戦略として、初期のスケール$S$と`coeff_modulus`の素数$P_i$を互いに非常に近い値に設定する。
    - これにより、乗算前の暗号文がスケール$S$を持っていれば、乗算後は$S^2$となり、rescaling後は$S^2/P_i$となる。全ての$P_i$がSに近い場合、$S^2/P_i$も再び$S$に近い値になって、これにより、計算全体でスケールを安定化させることができる。

    
