（リメイク）「プログラマブルブートストラップの原著論文を理解する回」を理解する回　4/4（後半）

この記事は [EAGLYS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/eaglys_adcal) の19日目の記事です

# はじめに
TFHEに触れ始めてから１年弱経ったこともあり，人に聞かれることも増え始めてきたこの頃，今回のアドカレでTFHE関連の話題を予備知識なしの状態から始めて，詳細までまとめようと思います

**突貫で書いてしまった部分もあるので，大いに誤りを含む可能性があります．誤字・脱字レベルでも構いませんので，ご指摘ください．
また，予告なしに内容の加筆や構成の変更を行うことがありますが，読みやすくするためのものですので，ご容赦ください**

今回のアドカレの関連記事（気になるところから読んでください）

#### TFHEの概要
１日目：[Torus・TLWEの概要](https://qiita.com/0917laplace/items/1c5f35e0397de2d19062)
５日目：[TRLWE・TFHEの概要](https://qiita.com/0917laplace/items/b9fd6603ad9fe0a23ec9)
10日目：[プログラマブルブートストラップの概要](https://qiita.com/0917laplace/items/ad1d9e1920d516086d9b)

#### TFHEの詳細
11日目:[TFHEの暗号化方式の詳細（前半）](https://qiita.com/0917laplace/items/0635aa2598a9528e3a7f)
12日目:[TFHEの暗号化方式の詳細（後半）](https://qiita.com/0917laplace/items/0dc6f6c9bb512425cc9a)
18日目：[プログラマブルブートストラップの詳細（前半）](https://qiita.com/0917laplace/items/efc5013a4d50fbae6ea4)
19日目(イマココ)（プログラマブルブートストラップの詳細（後半））：

#### TFHEの最新動向
20日目：[TFHEの最新動向（2022年版）](https://qiita.com/0917laplace/items/a24f24cb5f46a03f8b44)

前回の続きです．前回はbootstrapの概要・Rescaling・Blind Rotation・Sample Extractionを扱いました．
今回はKey Switching・bootstrapのまとめ・programmable bootstrapを扱います．

はじめに
この記事は，昨年のアドカレの記事

[「プログラマブルブートストラップの原著論文を理解する回」を理解する回　4/4](https://qiita.com/0917laplace/items/ceb802d74c9f9fa15ca8)

のリメイク版となります．

分かりづらかった箇所の修正を行なったり，構成を入れ替えたり，そのとき書けなかった話を加えています
＊具体例とか修正がない箇所もありますが，それはその都度明示します

1/4, 2/4 の記事は基本的に修正しません（と言っても今回の記事で一部リメイクします）が，それらの記事のサマリーは概要と称して，今回の1,5日目に載せていますので，そちらをご参照ください

# Key Switching

![KeySwitchin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298501/be3df6ce-fc5b-c852-93fd-321d35179f41.png)

gadget decomposition 自体は [「プログラマブルブートストラップの原著論文を理解する回」を理解する回　3/4](https://qiita.com/0917laplace/items/cd5b06067f2315944fb1#gadget-decompostion) を参照ください

長さ $\ell$ での $\beta$ 進展開する際の gadget decompoisiton の計算量は

- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $2 \ell$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $\ell$ 回

で，TLWE方式の計算量は 

- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $n + 1$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $n$ 回

になり，そのときの引数の計算量は

- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : 2回

です．よって，1-6行目でのループの計算量は

- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $k N \ell(n + 3)$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $k N \ell(n + 3)$ 回

です．7行目の計算量は

- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $k N \ell n$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $k N \ell (n + 1)$ 回

ですから，Key Switching トータルでの計算量は，

- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $k N \ell (2 n + 3)$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $2 k N \ell (n + 2)$ 回

となります．

# bootstrapのまとめ

![bootstrap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298501/0c5ec252-3a26-0494-3e2a-8b8605732e7d.png)

bootstrap での計算量を考えてみると，

Rescaling
- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : 0 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $3(n + N + 1)$ 回

Blind Rotation
- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $(k + 1) n \ell((k + 1)N^2 + (n + 1)N + (k + 1)) + n$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $(k + 1) n \ell (n + k + 1) N^2$ 回

Sample Extraction
- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : 0 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $k (N - 1)$ 回

Key Switching
- $\mathbb{Z} / q \mathbb{Z}$ での足し算 : $k N \ell (2 n + 3)$ 回
- $\mathbb{Z} / q \mathbb{Z}$ での掛け算 : $2 k N \ell (n + 2)$ 回

となるので，bootstrap を実行した際には，Blind Rotation の部分でかなり時間がかかりそうだということがこのことからもわかるし，
bootstrap の計算量を下げたいと思うなら，まず初めに Blind Rotation を削減しようと考えればOKなわけです

# programmable bootstrap

![lookup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298501/aad01533-aa40-3c64-9da1-7c279db0a651.png)

$\tilde{D}, \tilde{I}$ を $\mathbb{Z} / q \mathbb{Z}$ の部分集合とするとき，$f : \tilde{D} \rightarrow \tilde{I}$ とすると，$\tilde{D}, \tilde{I}$ は 任意の部分集合なので，暗号文に$\mathbb{Z} / q \mathbb{Z}$ 上の任意の関数を作用させることができます

# まとめ
リメイクでは bootstrap の計算量という観点から振り返ってみました

予想通りというか，Blind Rotation がかなりネックなことを理論的に示しました

今後もTFHEの理解を深めていきたいなと！話題ができたらリメイクのリメイクするかもです

----------------------
今回の内容はここまでです．ここまでご覧になってくださった方々ありがとうございます！