ぱらぱらめくる『高校数学からはじめる量子コンピュータ』

第1章 量子コンピュータへの誘い

  • 量子ビットは、nビットで2^n通りを表せる
  • nビットが一度にもてる値も2^n通り(量子力学による重ね合わせの原理が働いているから)
  • ただし、測定で得られる結果は確率的に出てきて、その値は1回に1個。1測定で状態は変わってしまう。何度も測定することもあり。求める解が出る確率を高める工夫をする必要が実用上は大事

第2章 1量子ビットの世界

  • 量子ビットは、複素数の組で、2つの複素数の絶対値の二乗の和が1
  • Q:=\{\begin{pmatrix} a\\b \end{pmatrix} \in \mathbf{C}^2 | |a|^2 + |b|^2 = 1\}
  • 古典ビットは0か1か。それを|0>, |1>と書くことにすると、\begin{pmatrix} a\\b \end{pmatrix} = a \times |0> + b \times |1>; a,b \in \mathbf{C}, |a|^2 + |b|^2 =1と表せる
  • 複素ベクトルの内積<\psi | \psi> = (a^* \\ b^*) \begin{pmatrix} a\\ b \end{pmatrix} = a^* a + b^* b = |a|^2 + |b|^2と書くことにすると
  • Q = \{ |\psi > \in \mathbf{C}^2 | <\psi | \psi > =1\}と書ける
  • 量子ビットを測定すると、|0>または|1>が得られる。それぞれが得られる確率が|a|^2,|b|^2である
  • 古典コンピュータでは、0,1の値を変化させる。コンピュータの内部的には、AND, OR, XORなどの基礎的演算ですべてのプログラムは動いている
  • 量子コンピュータでは、量子状態を発展させる。このとき、状態発展なので、測定して得られる確率が全部で1、を守るような発展をすることが必要で、そのような発展がユニタリ発展
  • 具体的にはユニタリ行列によって状態ベクトル(重ね合わせ)は発展する
  • ユニタリ行列は U^{\dagger} U= I
  • 古典コンピュータでは、0,1の値を取って、0,1の値を返す基礎演算を電子回路で作成した
  • 量子コンピュータでは、ユニタリ発展をハードウェアとして実装する
  • 量子状態の区別。量子状態は、確率を測定してみて、初めてわかるもの(らしい)。したがって、測定して確率情報を得ることで状態についての知識が得られる。確率情報が同じだが、異なる量子状態は区別できない。ある状態では確率が同じだが、ユニタリ発展させると確率が変わるような量子状態は、ユニタリ発展させてみることで区別が可能になる。他方、ユニタリ発展させても、区別できないような異なる量子状態というものも存在する。ある量子状態に絶対値1の複素数をかけてできる量子状態は、この「区別できない量子状態」である
  • RにQuantumOpsというパッケージがある。それを使って、上記のことをやってみる。資料はこちら
# install.packages("QuantumOps")
library(QuantumOps)
k1 <- ket(1,2)
k1 # |k1|^2 = 1に標準化される
k2 <- ket(1i, 2*1i)
k2 
# k1と同じになる。c(1i,2*1i) = 1i * (1,2) であり、絶対値1の複素数(この場合は1i)をかけてできる量子状態は区別できないことに対応する
    • Multi-qubit Kets
      • 2^n要素で作ることができる
ket(1,1,3,1)
k1 <- ket(0,1)
k2 <- ket(1,1)
k1k2 <- tensor(k1,k2)
k1k2
k1k2k2 <- tensor(k1k2,k2)
k1k2k2
# tensor()関数はqubitsを3個以上も取れる
tensor(k1,k2,k2)
      • Dirac 記法(\sqrt{2} |00> + \sqrt{2} |10>のような)も用意されている
dirac(k1)
dirac(k1k2)
dirac(k1k2k2)
> dirac(k1k2)
[1] "0.707|10> + 0.707|11>"
> dirac(k1)
[1] "1|1>"
> dirac(k1k2)
[1] "0.707|10> + 0.707|11>"
> dirac(k1k2k2)
[1] "0.5|100> + 0.5|101> + 0.5|110> + 0.5|111>"
      • input registerの情報に基づき、target registerの値を変える。RのQuantumOpsパッケージのUf()関数の仕様確認は→こちらの記事

第3章 1量子ビットの量子回路

  • 量子回路にはユニタリ発展に相当するユニタリ行列を配置する。入力と出力を持つ
  • 量子回路からの測定は、量子回路から、古典回路に値をコピーする、という形式で表す
    • RのQuantmuOpsパッケージでは、I(),X(),Y(),Z(),H(),R(),S(),T()という、1量子ビット用の演算関数が用意されている。その演算の行列表示は
X
    • のようにすると、関数の中身が見られる

第4章 2量子ビットの世界

第5章 2量子ビットの量子回路

  • 量子ビットのユニタリ発展は4x4行列が必要。規模が大きくなると行列が大きくなる
  • それを防ぐのに次のルールがある
    • (U \otimes V) (|\psi> \otimes |\phi>) = (U |\psi>) \otimes (V |\phi>)
  • このようなことができるのは、量子がもつれていないとき

第6章 量子プログラミング・入門編

  • QiskitをローカルPCで実行する環境を作る
    • こちらに従って、Anacondaインストール後に
    • Windows10のスタートアップメニューからAnaconda promptを立ち上げ、そこで
conda create -n myHoge python=3
activate myHoge
    • すると、プロンプトにmyHogeに入っている、と見える。そのうえで
pip install qiskit
    • 長くかかるが…。終わったら
pip install qiskit-terra[visualization]
    • これで準備ができたはず
    • そのまま、myHogeのプロンプトで、
jupyter notebook
    • とjupyter notebookを起動し、新しい、python3 ノートを開けば
import qiskit
    • がきちんと(ちょっとロードに時間がかかるが)回る
    • Macではターミナルから
conda create -n myHoge python=3
activate myHoge
pip install qiskit
pip install qiskit-terra[visualization]
jupyter notebook
    • とする
  • というわけで準備ができたので、本のサイト(こちら)のjupyter notebookをダウンロードして、この環境で開けばなぞれる

第7章 量子プログラミング・実機編

  • IBMのサイトに行って、そのアカウントにTokenを使ってローカルからアクセスして…というのは、本が書かれた時から仕様変更があるらしく、難航
  • それよりはIBMのサイト上で遊ぶのがよいかも
  • いずれにしてもtutorialはこちら

qiskit.org

Appendix