Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【Blueqat Summit】Re:ゼロから始める量子プログラミング

【Blueqat Summit】Re:ゼロから始める量子プログラミング

量子プログラミングは今日から始められる、という話をしました。

gyu-don

May 30, 2019
Tweet

More Decks by gyu-don

Other Decks in Programming

Transcript

  1. About me 加藤 拓己 / GitHub/Qiita: gyu-don 現在: MDR株式会社でBlueqatの開発など 以前: プラント会社で鉄鋼のアニーリング (炉の計装制御)

      某IT企業でエンジニア。深層学習とビットコインをちょっとかじる 学部/修士時代: 東北大学の量子光学の研究室で実験屋さん 好きなプログラミング言語:  Rust, C, C++, Python, OpenQASM  
  2. 初めての人にBlueqatを勧める5つの理由 1. 覚えることが少ない Circuitクラスの使い方だけ覚えたら回路が作れる 2. 回路の手書きが直感的で簡単 メソッドチェーンやスライス表記で短い・分かりやすい 3. 安心の日本語コミュニティ MDRのSlackや勉強会で質問をいただければ開発者が直接答えます

    4. 簡単QAOA/VQE NISQアルゴリズムの代表格ともいえるQAOAやVQEも簡単に動かせる 5. 環境構築らくらく NumPy/SciPyを使っていて、C++を直接書いたりしていないので、 依存関係やライブラリなどが原因でインストールに躓くことが少ない
  3. Hello, Quantum World ➔ 経験者は最初は退屈かもしれません 最後まで退屈だったら、ごめんなさい ➔ 理論は知ってるが、手を動かしたことはない方は… この機会にぜひ触ってみて下さい ➔

    量子コンピュータなんもわからん方も… とりあえずやってみることが重要です “Hello World”のような基本から、 ちょっとした応用まで見ていきます
  4. まずやること 1. 量子回路を作る 2. 回路(の0ビット目)にアダマールゲート(H)をひとつ付け加える 3. 実行して状態ベクトルを得る アダマールゲートは重ね合わせを作るゲート |0> →

    1/√2 (|0> + |1>) |1> → 1/√2 (|0> - |1>) 量子回路の状態は最初は|0>で初期化されているので 1/√2 (|0> + |1>) が得られるはず H
  5. Circuitを作る from blueqat import Circuit c = Circuit() c.h[0] c.run()

    BlueqatのCircuitをインポート 回路を作る アダマールゲートを付け加えてみる 回路を走らせて、状態ベクトルを得る 結果: array([0.70710678+0.j, 0.70710678+0.j]) →0.70710678を2乗すると、だいたい0.5にな るので、1/√2になっている
  6. 観測をしよう c = Circuit() c.h[0].m[0].run(shots=100) # |1>にHゲートをかけたもの c.x[0].h[0].m[0].run(shots=100) 回路を作る Hゲートをかけて、観測する。

    回路を100回走らせる。 結果: 0と1がほぼ同じ回数観測された。 (例: Counter({'0': 49, '1': 51}) この数字は、実行する度に変わる) |1>にHゲートをかけても、同じような観測結果になった。 →実は、観測確率は状態ベクトルの値の「絶対値の2乗」になっている。  なので、値がプラスでもマイナスでも変わらない
  7. 量子もつれを作ろう 量子ビット同士は、不思議な相関を持ちうる。 1/√2(|00> + |11>) という状態を考える。 これは、 ・0ビット目が0なら、1ビット目も0 ・0ビット目が1なら、1ビット目も1 という意味。

    余談ですが。0ビット目と1ビット目を別々の人に渡して、 2人が遠く離れたところで、どちらかが観測したら、 光速を超えて瞬時に、相手が持っているビットの状態が変わるので、 それは相対論に反するのでは? という議論が昔あった (アインシュタイン=ポドルスキー=ローゼンのパラドックス)
  8. CNOT (CX)ゲートは相関を作るゲート 0ビット目にHゲートをかけてから、CXゲートをかけると、 元々: |00> = |0>|0> Hゲート: 1/√2 (|0>

    + |1>) |0> = 1/√2 (|0>|0> + |1>|0>) CXゲート: 1/√2 (|0>|0> + |1>|1>) = 1/√2 (|00> + |11>) ややこしいですが、大切なので、丁寧に追ってください。
  9. Hゲートのみでの重ね合わせと量子もつれの違い Circuit(2).h[:].m[:].run(shots=100) Circuit().h[0].cx[0, 1].m[:].run(shots=100) H H H |00>, |01>, |10>,

    |11>がそれぞれ約1/4ずつ →ただコイン2枚投げたのと同じ状態 |00>, |11>がそれぞれ約1/2ずつ |01>, |10>→出ない 2つの量子ビットが相関を持っている
  10. 回路のマクロ登録 最近のBlueqatは、回路をマクロとして登録できるようになりました。 from blueqat import BlueqatGlobalSetting def problem(c): # 問題の回路

    return c.x[2].cx[2, 1].cx[1, 2].x[1].cx[1, 0].cx[0, 2].x[0] def problem_dag(c): # 問題の回路を逆順にしたもの return c.x[0].cx[0, 2].cx[1, 0].x[1].cx[1, 2].cx[2, 1].x[2] BlueqatGlobalSetting.register_macro(‘problem’, problem) BlueqatGlobalSetting.register_macro(‘problem_dag’, problem_dag) def oracle(c): # 問題の回路を通して|111>のときのみ位相反転する回路 return c.problem().h[2].ccx[0, 1, 2].h[2].problem_dag() BlueqatGlobalSetting.register_macro(‘oracle’, oracle)
  11. Diffusion Operator, Grover Operator 3量子ビットの場合のdiffusion operatorを定義します。 def diffusion(c): return c.h[:].x[:].h[2].ccx[0,

    1, 2].h[2].x[:].h[:] BlueqatGlobalSetting.register_macro(‘diffusion’, diffusion) oracleとdiffusionを組み合わせたのがGrover Operatorです。 def grover(c): return c.oracle().diffusion() BlueqatGlobalSetting.register_macro(‘grover’, grover)
  12. やってみましょう Circuit().h[:].grover().m[:].run(shots=100) 結果: Counter({'110': 90, '101': 4, '000': 3, '010':

    1, '011': 1, '001': 1}) |110>が一番多い 確認: Circuit().x[0, 1].problem().m[:].run(shots=100) Counter({'111': 100}) ←確かに、|110>を入力すると|111>が出てくる 0番目、1番目の量子ビットを反転させて|110>をproblemの入力に。
  13. (再掲) 問題です。 次の量子回路は、どんな入力のときに出力が|111>になるでしょう? Circuit().x[2].cx[2, 1].cx[1, 2].x[1].cx[1, 0].cx[0, 2].x[0] X X

    X |1> |1> |0> |1> |0> |1> |1> |0> |1> |1> |1> |1> |1> 発展課題: Groverのアルゴリズムを使わずに効率よくこの問題を解く方法はないか考えよ。
  14. すごいBlueqatたのしく学ぼう • 量子プログラミングは今日からでも始められる • Blueqatは量子プログラミングをこれから始める人におすすめ ◦ 量子プログラミングを完全に理解した人にもおすすめ • 超特急で、Groverのアルゴリズムを使う方法について説明しました ◦

    答えがさっぱり分からないものと向き合うための量子アルゴリズムです • もっと学びたい人は: ◦ チュートリアル: https://github.com/mdrft/Blueqat_tutorials_ja ◦ AI Academy 量子コンピュータ入門編 (無料): https://aiacademy.jp/texts/#quantum ◦ MDRの勉強会: https://qnn.connpass.com/ ◦ Slack: https://blueqat.slack.com (招待リンク: https://bit.ly/2JNvbOg) ◦ 他、MDR社員まで直接お声がけください