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
650
【Blueqat Summit】Re:ゼロから始める量子プログラミング
量子プログラミングは今日から始められる、という話をしました。
gyu-don
May 30, 2019
Tweet
Share
More Decks by gyu-don
See All by gyu-don
フロントエンド初心者がサクッとReactに入門する
gyudon
0
180
任意の2 qubitユニタリのゲートでの実装〜KAK分解を使って〜
gyudon
0
750
Shorのアルゴリズム
gyudon
23
7.7k
Blueqat♥量子化学
gyudon
0
1.2k
arXivQurationのご紹介
gyudon
0
190
偏光で理解する重ね合わせ状態
gyudon
0
1.3k
Other Decks in Programming
See All in Programming
Jakarta EE meets AI
ivargrimstad
0
240
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
130
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
770
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
190
暇に任せてProxmoxコンソール 作ってみました
karugamo
2
720
return文におけるstd::moveについて
onihusube
1
1.1k
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
330
Spatial Rendering for Apple Vision Pro
warrenm
0
110
Symfony Mapper Component
soyuka
2
730
MCP with Cloudflare Workers
yusukebe
2
220
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
From Translations to Multi Dimension Entities
alexanderschranz
2
130
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Code Review Best Practice
trishagee
65
17k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Done Done
chrislema
181
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
How GitHub (no longer) Works
holman
311
140k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
GitHub's CSS Performance
jonrohan
1030
460k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
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社員まで直接お声がけください