<jupyter_start><jupyter_text>3量子ビットゲート前回までは1量子ビットと2量子ビットの演算を行なってきました。トフォリゲートは3量子ビットを利用する演算です。トフォリゲートはトマソ・トフォリによって作られ、二つのコントロールビットと一つのターゲットビットを持ちます。両方のコントロールビットが1の時にのみ、ターゲットビットにXゲートが適用されます。早速みてみましょう。まずはインストールをします。<jupyter_code>!pip install blueqat<jupyter_output><empty_output><jupyter_text>回路の作成トフォリゲートは利用するのは簡単です。.ccxもしくは.toffoliを使います。まずは単純に回路を書いてみましょう。ここでは*をコントロールビット、Xをターゲットビットとしています。トフォリゲートは、<jupyter_code>from blueqat import Circuit
Circuit().ccx[0,1,2].m[:].run(shots=1)<jupyter_output><empty_output><jupyter_text>もしくは、<jupyter_code>Circuit().toffoli[0,1,2].m[:].run(shots=1)<jupyter_output><empty_output><jupyter_text>のように書けます。どちらの書き方をつかっても大丈夫です。上記はコントロールビットが両方とも0なので、ターゲットビットには変化がありません。 コントロールビットを変化させてみるコントロールビットの片方を1にした時と、両方を1にした時とでどうなるかみてみましょう。最初にコントロールビットの両方を1にしてみます。1にするには反転ゲートのXゲートを使います。<jupyter_code>Circuit().x[0,1].ccx[0,1,2].m[:].run(shots=1)<jupyter_output><empty_output><jupyter_text>どうなったでしょうか。0番目と1番目の量子ビットを1にしたことにより、2番目の量子ビットが0から1に変化しました。このようにコントロールビットを両方とも1にするとターゲットビットが反転します。 コントロールビットの片方の量子ビットだけを1にしたときはどうでしょうか。<jupyter_code>Circuit().x[0].ccx[0,1,2].m[:].run(shots=1)<jupyter_output><empty_output><jupyter_text>こちらもターゲットビットは変化なしです。<jupyter_code>Circuit().x[1].ccx[0,1,2].m[:].run(shots=1)<jupyter_output><empty_output><jupyter_text>こちらもコントロールビットの片方だけが1なのでターゲットビットは反応なしです。 トフォリゲートの真理値表と行列表現トフォリゲートの入出力は真理値表というもので確認ができます。入力 | 出力--- | ---000 | 000001 | 001010 | 010011 | 011100 | 100101 | 101110 | 111111 | 110 これをみると、110と111の時だけターゲットビットが反転しています。ゲートの行列表現も見てみましょう。$\begin{bmatrix}1&0&0&0&0&0&0&0\\0&1&0&0&0&0&0&0\\0&0&1&0&0&0&0&0\\0&0&0&1&0&0&0&0\\0&0&0&0&1&0&0&0\\0&0&0&0&0&1&0&0\\0&0&0&0&0&0&0&1\\0&0&0&0&0&0&1&0\\\end{bmatrix}$ 最後のゲート演算でXゲートが見れます。真理値表とも合っているのが確認できます。 トフォリゲートの中身トフォリゲートは実は中身は1量子ビットゲートと2量子ビットゲートで構成されています。回路はHとCXとTで構成されます。ちょっと長いですががんばってかいてみましょう。<jupyter_code>from blueqat import Circuit
import numpy as np

Circuit().x[1:].h[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[:1].h[0].cnot[1,0].cnot[0,1].cnot[1,0].cnot[2,0].rz(-np.pi/4)[0].rz(np.pi/4)[2].cnot[2,0].m[:].run(shots=1)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1828978622327791, 'fraction_numerical': 0.09358669833729216, 'mean_word_length': 16.40495867768595, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '458233', 'license': 'Apache-2.0', 'n_tokens_mistral': 1634, 'n_tokens_neox': 1450, 'n_words': 31, 'path': 'tutorial-ja/007_3gate_ja.ipynb', 'repo_name': 'ryuNagai/Blueqat-tutorials', 'size': '2105'}