Slide 1

Slide 1 text

Re:ゼロから始める 量子プログラミング生活 MDR株式会社 加藤 拓己 GitHub/Qiita: gyu-don

Slide 2

Slide 2 text

About me 加藤 拓己 / GitHub/Qiita: gyu-don 現在: MDR株式会社でBlueqatの開発など 以前: プラント会社で鉄鋼のアニーリング (炉の計装制御)   某IT企業でエンジニア。深層学習とビットコインをちょっとかじる 学部/修士時代: 東北大学の量子光学の研究室で実験屋さん 好きなプログラミング言語:  Rust, C, C++, Python, OpenQASM  

Slide 3

Slide 3 text

前にも言いましたが。 とにかく、Blueqat始めましょう。

Slide 4

Slide 4 text

恐竜の話。 「恐竜に詳しい人」には、3種類います。 1. 恐竜のテレビをいっぱい見て、恐竜図鑑の内容をよく覚えている人 彼らは本当によく勉強してます。 大人顔負けの知識を持っている子供なんかもいますね。 すごいですね。賢いですね。 完全に理解した

Slide 5

Slide 5 text

恐竜の話。 「恐竜に詳しい人」には、3種類います。 1. 恐竜のテレビをいっぱい見て、恐竜図鑑の内容をよく覚えている人 2. 恐竜に関する研究をしている人 恐竜はどうやって生きてたのか、どんな姿をしていたのか。 そういったことを研究している人たちがいます。 恐竜図鑑作るのとかも、大抵そういう人が関わっています。 超すごいですね。ほんとリスペクトです。 なんもわからん

Slide 6

Slide 6 text

恐竜の話。 「恐竜に詳しい人」には、3種類います。 1. 恐竜のテレビをいっぱい見て、恐竜図鑑の内容をよく覚えている人 2. 恐竜に関する研究をしている人 3. 恐竜に会ったことがある人 あんまり勉強してない人も多いです。 生まれた時代によっては、誰でもなれます。 別にすごくないけど、 生きた経験と知識を持っています。 うぇーい ※人類誕生のときには、既に恐竜は絶滅していた、という説が主流です

Slide 7

Slide 7 text

量子プログラミングの話。 「量子プログラミングに詳しい人」には、3種類います。 1. 量子プログラミングの情報を集めていて、勉強会にもいっぱい出ている人 2. 量子プログラミングに関する研究をしている人 3. 量子プログラミングをしたことがある人 量子コンピュータは ありまぁす 実は「3.」には、すぐなれるんですが。 なってみませんか?

Slide 8

Slide 8 text

VB Quantum Computer Programming for Everyone https://github.com/Blueqat/Blueqat info@mdrft.com https://mdrft.com

Slide 9

Slide 9 text

初めての人にBlueqatを勧める5つの理由 1. 覚えることが少ない Circuitクラスの使い方だけ覚えたら回路が作れる 2. 回路の手書きが直感的で簡単 メソッドチェーンやスライス表記で短い・分かりやすい 3. 安心の日本語コミュニティ MDRのSlackや勉強会で質問をいただければ開発者が直接答えます 4. 簡単QAOA/VQE NISQアルゴリズムの代表格ともいえるQAOAやVQEも簡単に動かせる 5. 環境構築らくらく NumPy/SciPyを使っていて、C++を直接書いたりしていないので、 依存関係やライブラリなどが原因でインストールに躓くことが少ない

Slide 10

Slide 10 text

あなたとBlueqat 今すぐインストー ル pip install blueqat

Slide 11

Slide 11 text

Hello, Quantum World ➔ 経験者は最初は退屈かもしれません 最後まで退屈だったら、ごめんなさい ➔ 理論は知ってるが、手を動かしたことはない方は… この機会にぜひ触ってみて下さい ➔ 量子コンピュータなんもわからん方も… とりあえずやってみることが重要です “Hello World”のような基本から、 ちょっとした応用まで見ていきます

Slide 12

Slide 12 text

やってみよう Python (3.6以上)の入った環境で pip install blueqat コマンドを入力するとインストール完了 Jupyter Notebook や Google Colabでは !pip install blueqat を入力して、Shift+Enterで実行

Slide 13

Slide 13 text

まずやること 1. 量子回路を作る 2. 回路(の0ビット目)にアダマールゲート(H)をひとつ付け加える 3. 実行して状態ベクトルを得る アダマールゲートは重ね合わせを作るゲート |0> → 1/√2 (|0> + |1>) |1> → 1/√2 (|0> - |1>) 量子回路の状態は最初は|0>で初期化されているので 1/√2 (|0> + |1>) が得られるはず H

Slide 14

Slide 14 text

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になっている

Slide 15

Slide 15 text

|1>にHをかけてみよう Xゲートはビットを反転するゲート なので、Hをかける前にXをかけると、 |1>にHをかけたことになる X |0> |1> X |1> |0>

Slide 16

Slide 16 text

Circuitを作る c = Circuit() c.x[0].h[0] c.run() 回路を作る Xゲート、Hゲートを付け加える 回路を走らせて、状態ベクトルを得る 結果: array([0.70710678+0.j, -0.70710678+0.j]) → 1/√2 (|0> - |1>)になった

Slide 17

Slide 17 text

観測してみよう アダマールゲートをかけると、|0>と|1>の重ね合わせ状態になる。 試しに100回、回路を動かして、観測結果を見てみる

Slide 18

Slide 18 text

観測をしよう 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乗」になっている。  なので、値がプラスでもマイナスでも変わらない

Slide 19

Slide 19 text

量子もつれを作ろう 量子ビット同士は、不思議な相関を持ちうる。 1/√2(|00> + |11>) という状態を考える。 これは、 ・0ビット目が0なら、1ビット目も0 ・0ビット目が1なら、1ビット目も1 という意味。 余談ですが。0ビット目と1ビット目を別々の人に渡して、 2人が遠く離れたところで、どちらかが観測したら、 光速を超えて瞬時に、相手が持っているビットの状態が変わるので、 それは相対論に反するのでは? という議論が昔あった (アインシュタイン=ポドルスキー=ローゼンのパラドックス)

Slide 20

Slide 20 text

CNOT (CX)ゲートは相関を作るゲート Control-NOT、あるいはControl Xゲートは、 0ビット目(Control)が|1>のとき、1ビット目(Target)にXゲートをかけます 0ビット目 (Control) 1ビット目 (Target) →1ビット目   (Target) |0> |0> →|0> |0> |1> →|1> |1> |0> →|1> |1> |1> →|0> よく、こういう記号で書かれます

Slide 21

Slide 21 text

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>) ややこしいですが、大切なので、丁寧に追ってください。

Slide 22

Slide 22 text

Blueqatで量子もつれを作ろう c = Circuit() c.h[0].cx[0, 1].m[:].run(shots=100) Hゲート、CXゲートをかけて、観測する。 回路を100回走らせる。 結果: |00>と|11>のみが、およそ同じ数だけ観測される

Slide 23

Slide 23 text

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つの量子ビットが相関を持っている

Slide 24

Slide 24 text

問題です。 次の量子回路は、どんな入力のときに出力が|111>になるでしょう? Circuit().x[2].cx[2, 1].cx[1, 2].x[1].cx[1, 0].cx[0, 2].x[0] X X X

Slide 25

Slide 25 text

分からんので、 Groverのアルゴリズム 使ってみましょう

Slide 26

Slide 26 text

今回は詳しい話は省くのですが…… Groverのアルゴリズムは: ・欲しい答えのときに位相が反転する量子回路 位相が反転するゲートは、 ビットが反転するゲートをHゲートで挟めば作れます。 今回|111>のときなので、CCXゲートをHゲートで挟んで作ります。 ・グローバーのDiffusion Operator 決まった形の回路で、状態ベクトルの平均を反転する作用をします。 を使うと、答えが求まるアルゴリズムです。

Slide 27

Slide 27 text

回路のマクロ登録 最近の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)

Slide 28

Slide 28 text

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)

Slide 29

Slide 29 text

やってみましょう 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の入力に。

Slide 30

Slide 30 text

(再掲) 問題です。 次の量子回路は、どんな入力のときに出力が|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のアルゴリズムを使わずに効率よくこの問題を解く方法はないか考えよ。

Slide 31

Slide 31 text

すごい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社員まで直接お声がけください