1970年代にPaul Benioffが量子コンピュータの実現性に関する理論的な研究をし,1980年の論文にて量子チューリングマシンとして提案され,1982年にRichard Feynmanが量子力学における問題を解くために量子コンピュータを作ろうとした話が有名です. 化学反応の問題を解こうと考えた時に,従来のコンピュータでは膨大な数の電子配置を全てモデリングするのは,小さい反応を想定しても計算量が膨大になってしまう問題があります. Feynmanはこの問題に対して,量子力学の原理に従うコンピュータによってシミュレートすればいいと提案しました.これが量子計算と呼ばれるアイデアの始まりです.
"自然界をシミュレーションしようとするのならば,量子力学的にやるべきだろう. しかし,これは素晴らしい問題だ.なぜなら,それほど簡単にはみえないからだ." - Richard Feynman
上は前座で本来の始まりについては,1985年にDavid Deutschが提案した量子チューリングマシンだと個人的には思ってます.
量子計算は,従来のコンピュータとは異なる計算のパラダイムを提供します.従来のコンピュータ(以後,古典コンピュータと呼びます)は,0と1のビットを用いて計算を行いますが,量子コンピュータは量子ビットを用いて計算します. 古典コンピュータはチューリングマシンと同等のものであるといえます.状態として0と1の2つの状態を持ち,状態遷移を行うことで計算を行うやつですね.なんとなくイメージがつくと思います. 量子チューリングマシンはどうなのかというと,チューリングマシンでは0と1であった状態が,量子チューリングマシンではキュービット(量子ビット)と呼ばれる量子力学的な状態を持ちます. 量子力学的な状態?と言われると難しい感じがしますが,0と1の状態があり,それらは観測するまで確定しないということを考えればいいです.これを重ね合わせの状態といいます. 今,0から2^n-1までの入力に対し,ある関数f()を計算したいとしましょう.古典コンピューティングでは明らかにf()を2^n回呼び出さないといけません.プログラム的にはfor文を回して計算することを考えるといいでしょう.
for i in range(2**n):
f(i)
しかし,量子コンピュータでは重ね合わせの状態を用いることで,f()を1回呼び出すだけで計算ができます.
f(?)
ただ,今得られた状態から実際に値を読もうとすると,重ね合わせのうちの一つ(f(5)など)が確率的に観測されます.つまり,せっかく一度に2^n回分の並列計算ができたのに単純に取得してしまうと一回分の計算結果しか得られないことになります. これを解決するために,量子コンピュータでは量子アルゴリズムというものが提案されています.
量子アルゴリズムの話がくると思ったでしょう.具体的な量子アルゴリズムの前に,量子回路について説明させてください.
量子回路の可視化をするためにQiskitを用います.QiskitはIBMが提供している量子コンピュータのSDKです.
興味がある人はターミナルでやってみてください.
環境を汚したくないので,virtualenvを用いて環境を作ります.ここは自由です.
python3 -m venv /path/to/virtual/environment
source /path/to/virtual/environment/bin/activate
Qiskitをインストールします.今回は目で見たいのでvisualizationもインストールします.
```shell
pip install 'qiskit[visualization]'
入っているか確認します.
pip list
terminalでpythonを起動します.
python3
以下,pythonのコード.
import numpy as np
from qiskit import *
circ = QuantumCircuit(3)
circ.h(0)
circ.cx(0, 1)
circ.cx(0, 2)
circ.draw('mpl')
print(circ.draw(output='text'))
出力結果です.
┌───┐
q_0: ┤ H ├──■────■──
└───┘┌─┴─┐ │
q_1: ─────┤ X ├──┼──
└───┘┌─┴─┐
q_2: ──────────┤ X ├
└───┘
何を出力したか,
|ψ> = (|000> + |111>)/√2
(ディスプレイ数式に脳内で補完してください)
$$ |\psi\rangle = \frac{|000\rangle + |111\rangle}{\sqrt{2}} $$
この回路の簡単な説明をすると
この回路は3量子ビットを使用して構築されています.
1.初期状態:すべての量子ビットが|0⟩状態で初期化されています.
2.Hadamardゲート (H):Hゲートは量子ビットにアダマール変換を行います.回路中の最初の量子ビット(q_0)に対してHadamardゲートが適用されています.
量子状態:|000⟩ -> (1/√2) (|000⟩ + |100⟩).
3.CNOTゲート (CX):CNOTゲートは制御量子ビットと目標量子ビットの間で制御されたX(NOT)操作を行います.回路中の2番目の量子ビット(q_1)が制御量子ビットで、1番目の量子ビット(q_0)が目標量子ビットです.CXゲートが適用されると、制御量子ビットの状態に応じて目標量子ビットの値が反転します.
量子状態:(1/√2) (|000⟩ + |100⟩) -> (1/√2) (|000⟩ + |110⟩).
4.CNOTゲート (CX):同じように、回路中の3番目の量子ビット(q_2)が制御量子ビットで、1番目の量子ビット(q_0)が目標量子ビットです.再びCXゲートが適用されると、制御量子ビットの状態に応じて目標量子ビットの値が反転します.
量子状態:(1/√2) (|000⟩ + |110⟩) -> (1/√2) (|000⟩ + |111⟩).
最終的な量子状態は次のようになります:
|ψ> = (|000> + |111>)/√2
この回路は、HadamardゲートとCNOTゲートを組み合わせて、特定のエンタングル状態(ベル状態)を作成する量子回路となります.エンタングル状態は、量子コンピューティングや量子通信などの応用分野で重要な役割を果たしています.
次回は,細かい用語の話や量子コンピュータの実機で量子回路を実行する話をするかもしれません. 量子コンピュータの実機はありがたいことに無料で公開されているのですが,順番待ちで利用できます.
Hadamardゲート(またはアダマールゲート)は,量子コンピュータや量子回路において非常に重要なゲートの1つです.このゲートは,特定の量子ビットに対してアダマール変換を行い,量子状態をスーパーポジション状態(重ね合わせ状態)に変換するために使用されます.