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
640
【Blueqat Summit】Re:ゼロから始める量子プログラミング
量子プログラミングは今日から始められる、という話をしました。
gyu-don
May 30, 2019
Tweet
Share
More Decks by gyu-don
See All by gyu-don
フロントエンド初心者がサクッとReactに入門する
gyudon
0
170
任意の2 qubitユニタリのゲートでの実装〜KAK分解を使って〜
gyudon
0
730
Shorのアルゴリズム
gyudon
23
7.6k
Blueqat♥量子化学
gyudon
0
1.2k
arXivQurationのご紹介
gyudon
0
190
偏光で理解する重ね合わせ状態
gyudon
0
1.3k
Other Decks in Programming
See All in Programming
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
330
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.2k
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
みんなでプロポーザルを書いてみた
yuriko1211
0
260
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
920
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
1.4k
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
210
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
860
Code Reviewing Like a Champion
maltzj
520
39k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Speed Design
sergeychernyshev
25
620
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
Six Lessons from altMBA
skipperchong
27
3.5k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
It's Worth the Effort
3n
183
27k
Facilitating Awesome Meetings
lara
50
6.1k
Rails Girls Zürich Keynote
gr2m
94
13k
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社員まで直接お声がけください