Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【Blueqat Summit】Re:ゼロから始める量子プログラミング
Search
gyu-don
May 30, 2019
Programming
0
670
【Blueqat Summit】Re:ゼロから始める量子プログラミング
量子プログラミングは今日から始められる、という話をしました。
gyu-don
May 30, 2019
Tweet
Share
More Decks by gyu-don
See All by gyu-don
フロントエンド初心者がサクッとReactに入門する
gyudon
0
200
任意の2 qubitユニタリのゲートでの実装〜KAK分解を使って〜
gyudon
0
800
Shorのアルゴリズム
gyudon
23
7.8k
Blueqat♥量子化学
gyudon
0
1.2k
arXivQurationのご紹介
gyudon
0
190
偏光で理解する重ね合わせ状態
gyudon
0
1.4k
Other Decks in Programming
See All in Programming
定理証明プラットフォーム lapisla.net
abap34
1
1.8k
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
11
3.8k
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
6
4k
WebDriver BiDiとは何なのか
yotahada3
1
140
Conform を推す - Advocating for Conform
mizoguchicoji
3
690
Spring gRPC について / About Spring gRPC
mackey0225
0
220
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
9
1.8k
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
270
法律の脱レガシーに学ぶフロントエンド刷新
oguemon
5
740
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
130
昭和の職場からアジャイルの世界へ
kumagoro95
1
380
ARA Ansible for the teams
kksat
0
150
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
A Modern Web Designer's Workflow
chriscoyier
693
190k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
A better future with KSS
kneath
238
17k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
550
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
174
51k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Transcript
Re:ゼロから始める 量子プログラミング生活 MDR株式会社 加藤 拓己 GitHub/Qiita: gyu-don
About me 加藤 拓己 / GitHub/Qiita: gyu-don 現在: MDR株式会社でBlueqatの開発など 以前: プラント会社で鉄鋼のアニーリング (炉の計装制御)
某IT企業でエンジニア。深層学習とビットコインをちょっとかじる 学部/修士時代: 東北大学の量子光学の研究室で実験屋さん 好きなプログラミング言語: Rust, C, C++, Python, OpenQASM
前にも言いましたが。 とにかく、Blueqat始めましょう。
恐竜の話。 「恐竜に詳しい人」には、3種類います。 1. 恐竜のテレビをいっぱい見て、恐竜図鑑の内容をよく覚えている人 彼らは本当によく勉強してます。 大人顔負けの知識を持っている子供なんかもいますね。 すごいですね。賢いですね。 完全に理解した
恐竜の話。 「恐竜に詳しい人」には、3種類います。 1. 恐竜のテレビをいっぱい見て、恐竜図鑑の内容をよく覚えている人 2. 恐竜に関する研究をしている人 恐竜はどうやって生きてたのか、どんな姿をしていたのか。 そういったことを研究している人たちがいます。 恐竜図鑑作るのとかも、大抵そういう人が関わっています。 超すごいですね。ほんとリスペクトです。
なんもわからん
恐竜の話。 「恐竜に詳しい人」には、3種類います。 1. 恐竜のテレビをいっぱい見て、恐竜図鑑の内容をよく覚えている人 2. 恐竜に関する研究をしている人 3. 恐竜に会ったことがある人 あんまり勉強してない人も多いです。 生まれた時代によっては、誰でもなれます。
別にすごくないけど、 生きた経験と知識を持っています。 うぇーい ※人類誕生のときには、既に恐竜は絶滅していた、という説が主流です
量子プログラミングの話。 「量子プログラミングに詳しい人」には、3種類います。 1. 量子プログラミングの情報を集めていて、勉強会にもいっぱい出ている人 2. 量子プログラミングに関する研究をしている人 3. 量子プログラミングをしたことがある人 量子コンピュータは ありまぁす
実は「3.」には、すぐなれるんですが。 なってみませんか?
VB Quantum Computer Programming for Everyone https://github.com/Blueqat/Blueqat
[email protected]
https://mdrft.com
初めての人にBlueqatを勧める5つの理由 1. 覚えることが少ない Circuitクラスの使い方だけ覚えたら回路が作れる 2. 回路の手書きが直感的で簡単 メソッドチェーンやスライス表記で短い・分かりやすい 3. 安心の日本語コミュニティ MDRのSlackや勉強会で質問をいただければ開発者が直接答えます
4. 簡単QAOA/VQE NISQアルゴリズムの代表格ともいえるQAOAやVQEも簡単に動かせる 5. 環境構築らくらく NumPy/SciPyを使っていて、C++を直接書いたりしていないので、 依存関係やライブラリなどが原因でインストールに躓くことが少ない
あなたとBlueqat 今すぐインストー ル pip install blueqat
Hello, Quantum World ➔ 経験者は最初は退屈かもしれません 最後まで退屈だったら、ごめんなさい ➔ 理論は知ってるが、手を動かしたことはない方は… この機会にぜひ触ってみて下さい ➔
量子コンピュータなんもわからん方も… とりあえずやってみることが重要です “Hello World”のような基本から、 ちょっとした応用まで見ていきます
やってみよう Python (3.6以上)の入った環境で pip install blueqat コマンドを入力するとインストール完了 Jupyter Notebook や
Google Colabでは !pip install blueqat を入力して、Shift+Enterで実行
まずやること 1. 量子回路を作る 2. 回路(の0ビット目)にアダマールゲート(H)をひとつ付け加える 3. 実行して状態ベクトルを得る アダマールゲートは重ね合わせを作るゲート |0> →
1/√2 (|0> + |1>) |1> → 1/√2 (|0> - |1>) 量子回路の状態は最初は|0>で初期化されているので 1/√2 (|0> + |1>) が得られるはず H
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になっている
|1>にHをかけてみよう Xゲートはビットを反転するゲート なので、Hをかける前にXをかけると、 |1>にHをかけたことになる X |0> |1> X |1> |0>
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>)になった
観測してみよう アダマールゲートをかけると、|0>と|1>の重ね合わせ状態になる。 試しに100回、回路を動かして、観測結果を見てみる
観測をしよう 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乗」になっている。 なので、値がプラスでもマイナスでも変わらない
量子もつれを作ろう 量子ビット同士は、不思議な相関を持ちうる。 1/√2(|00> + |11>) という状態を考える。 これは、 ・0ビット目が0なら、1ビット目も0 ・0ビット目が1なら、1ビット目も1 という意味。
余談ですが。0ビット目と1ビット目を別々の人に渡して、 2人が遠く離れたところで、どちらかが観測したら、 光速を超えて瞬時に、相手が持っているビットの状態が変わるので、 それは相対論に反するのでは? という議論が昔あった (アインシュタイン=ポドルスキー=ローゼンのパラドックス)
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> よく、こういう記号で書かれます
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>) ややこしいですが、大切なので、丁寧に追ってください。
Blueqatで量子もつれを作ろう c = Circuit() c.h[0].cx[0, 1].m[:].run(shots=100) Hゲート、CXゲートをかけて、観測する。 回路を100回走らせる。 結果: |00>と|11>のみが、およそ同じ数だけ観測される
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つの量子ビットが相関を持っている
問題です。 次の量子回路は、どんな入力のときに出力が|111>になるでしょう? Circuit().x[2].cx[2, 1].cx[1, 2].x[1].cx[1, 0].cx[0, 2].x[0] X X X
分からんので、 Groverのアルゴリズム 使ってみましょう
今回は詳しい話は省くのですが…… Groverのアルゴリズムは: ・欲しい答えのときに位相が反転する量子回路 位相が反転するゲートは、 ビットが反転するゲートをHゲートで挟めば作れます。 今回|111>のときなので、CCXゲートをHゲートで挟んで作ります。 ・グローバーのDiffusion Operator 決まった形の回路で、状態ベクトルの平均を反転する作用をします。 を使うと、答えが求まるアルゴリズムです。
回路のマクロ登録 最近の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)
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)
やってみましょう 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の入力に。
(再掲) 問題です。 次の量子回路は、どんな入力のときに出力が|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のアルゴリズムを使わずに効率よくこの問題を解く方法はないか考えよ。
すごい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社員まで直接お声がけください