可逆論理回路勉強ノート

## 目的

可逆論理回路勉強ノートです。間違っていたら指摘お願いします。

## 可逆ゲート

以下のゲートについて、古典論理回路に対応する可逆回路を示します。

* NOT
* XOR
* バッファ
* AND
* OR
* デコーダ

### NOT

論理反転です。

| $a$ | $\bar{a}$ |
|-----|-----------|
|  0  |     1     |
|  1  |     0     |

![c_invert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/e9a06dba-819a-8de7-f880-b2040e625e0c.png)

反転操作は可逆なので普通に反転するだけでも OK です。量子ゲートではパウリ X ゲートを使用します。

![q_invert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/6f5b4a89-9ae4-7d19-cbb4-f483bbd1b256.png)

### XOR

| $a$ | $b$ | $ a \oplus b $ |
|-----|-----|----------------|
|  0  |  0  |      0         |
|  0  |  1  |      1         |
|  1  |  0  |      1         |
|  1  |  1  |      0         |


![c_xor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/c5278e1d-cb47-50eb-8914-7a5e7eafcc70.png)

制御付きノットゲートは XOR としても解釈できます。
可逆性を保つためにどちらか一方の入力の情報は保存していなければなりません。

![q_xor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/048f5a0e-e9e0-de7e-d5f5-86bbcf031cf7.png)

### バッファ

![c_buffer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/01d6ebc7-faad-eddc-6386-1320e2512b60.png)

制御付きノットゲートの入力を 0 に固定するとバッファとして使えます。
これがなぜ重要なのかについては後で説明します。

![q_buffer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/08fdb5fa-cb51-de7a-21c6-a71ee0e8f2ee.png)

### AND

| $a$ | $b$ | $ a \land b $ |
|-----|-----|---------------|
|  0  |  0  |      0        |
|  0  |  1  |      0        |
|  1  |  0  |      0        |
|  1  |  1  |      1        |


![c_and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/14a68405-8907-1ddd-139e-fb7fce13e7c2.png)

トフォリゲートは入力を 0 に固定すると AND として使えます。
可逆性を保つために入力の情報は保存していなければなりません。

![q_and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/dc96f878-12db-c583-fa55-6ea9b5b2c2bb.png)

入力が多い場合も多入力のトフォリゲートを用いて同様に書けます。

![c_3and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/af1141a0-7351-b74b-6f30-e1258eb9409a.png)

![q_3and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/d34d4463-ebc7-96dc-625f-9f16c337e4ba.png)

### OR

AND の入出力を反転してやれば OR が得られます。

### デコーダ

トフォリゲートが AND として使える、ということから古典回路のデコーダをほぼそのまま可逆計算回路に焼き直すことができます。

| $a$ | $b$ | $ n=3 $ | $ n=2 $ | $ n=1 $ | $ n=0 $ |
|-----|-----|---------|---------|---------|---------|
|  0  |  0  |      0  |      0  |      0  |      1  |
|  0  |  1  |      0  |      0  |      1  |      0  |
|  1  |  0  |      0  |      1  |      0  |      0  |
|  1  |  1  |      1  |      0  |      0  |      0  |

![c_decoder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/e5471712-a07c-3e0e-0c5e-9af4097bdd5b.png)

![q_decoder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/e6f98b77-1466-d86b-a678-195bef789e98.png)

## ゴミの消去

可逆操作の組み合わせで計算しようとすると、多くの場合、情報の捨て場としてゴミが発生します。$∣0⟩$ を入力に使って AND を実現したりしていますが、なにか最終的な結果を得るために途中結果として用いたがもう不要である、もう一度 $∣0⟩$ に戻せるなら再利用もできるだろうに、というような場合です。あるいは入力ビットを破壊してしまうこともありえます。

可逆操作を組み合わせて作った計算回路を $U$ と書くことにします。

![q_unitary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/52daca7f-24ab-6eef-ffe4-680cfec35ab0.png)

$U$ で行った可逆操作を逆順にした操作を考えることもできて、これを $U^\dagger$ と書くことにします。

![q_unitary1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/b4c0fbd1-0c8d-dda7-7c0f-7939ea872bd5.png)

おもしろいことに、$U$ の結果にそのまま $U^\dagger$ を作用させるとゴミを含めてすべての操作を元に戻すことができます。

![q_unitary2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/536f4be1-2dc2-1d64-e063-32f4a1355b77.png)

これでゴミはきれいな状態に戻ります。しかし、これだけだとせっかく計算した内容まで元に戻ってしまってなにも行わなかったのと代わりがありません。そこで、制御ノットゲートを用いて計算結果を取り出してやります。

![q_unitary3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412308/3f19ed04-9bef-f71a-ac7a-420338fca0b9.png)

## まとめ

代表的な古典論理回路について、それに対応する可逆論理回路を並べてみました。また、計算の途中で発生するゴミを消去する方法についても記述しました。
量子計算も可逆計算の範囲ならなんとか数式を使わずに理解できそうです。