4/15(水)~17(金) NexTech Week@ビッグサイトに出展します☆彡
量子ゲート

New!! 遊戯王でわかるグローバーのアルゴリズム(前編)

AI要約

量子コンピュータの代表的な探索アルゴリズム「グローバーのアルゴリズム」を、遊戯王のルールを借りて解説します。前編ではターゲットを特定する「オラクル」の役割を直感的に紐解きます。

はじめに

これまで「量子ゲートで7セグメントLEDを光らせる」「量子ゲートでピクセルアートを作る」というシリーズを公開してきました。

意気揚々と展示会でお披露目したところ、

「既知の答えから途中式を作るのはパズルとしては面白いが、役に立たないのではないか」

というツッコミが左心室の上あたりを貫通しました。ほぼ致命傷です。

「結局、量子コンピュータって何が計算できるの?」という質問は1000回くらい受けています。模範的な回答は、

  • 素因数分解ができる(ショアのアルゴリズム)
  • 高速検索ができる(グローバーのアルゴリズム)
  • 組合せ最適化ができる(QAOA)
  • 量子化学計算ができる(VQEなど)

どれどれ、一つ見てみようかな。と検索したら最後。複雑な行列式が画面を覆い尽くし、身は焦げ、燻ぶり、一死以て大悪を誅します()

そんなわけでこのシリーズでは、グローバーのアルゴリズムを無理やり「遊戯王カード」で説明し、ハッシュ化されたパスワードの解読にチャレンジします。

何がしたい?

まず3量子ビットを用意して、H(アダマール)ゲートで重ね合わせ状態にします。これをそのまま観測すると [000, 001, 010, 011, 100, 101, 110, 111] の8種類が均等な確率で観測されます。

ここに、「101だけ存在確率を上げる」という条件を追加すると、101だけが観測される。これが今回やりたい内容です。

 3量子ビット用意する
 ↓
 Hゲートで8通りに重ね合わせる
 ↓
 101の存在確率を上げる
 ↓
 観測すると101だけ観測される

これだけだと何の役に立つかわからないですが、次回、「ハッシュ化されたパスワードのハッシュ化前の状態を見つける」、すなわち生パスワードを解読するタスクに拡張します。

 3量子ビット用意する
 ↓
 Hゲートで8通りに重ね合わせる
 ↓
 ハッシュ化する
 ↓
 101の存在確率を上げる
 ↓
 ハッシュ化と逆の作業をする
 ↓
 観測すると「ハッシュ化すると101になるビット列」だけ観測される

なるほど、これこそ我々が求めていた「未知の答えを計算するタスク」ではないか。楽しみである。

遊戯王で流れを見る

「3ビットマン -000-」を召喚します。ステータスは「存在確率 1.0」です。

魔法カード「H(アダマール)・ゲート」を発動。自分フィールド上の「3ビットマン」1体を生け贄に捧げ、全8種(000~111)の「3ビットマン」を特殊召喚します。

ここで相手プレーヤーに直接攻撃(ダイレクトアタック)!

しかし相手はトラップカード「フェーズ・キックバック」を発動。フィールド上のモンスターのうち、特定のビット(この場合は101)を持つモンスターの存在確率の正負が反転します。

さらに相手はトラップカード「ディフュージョン」を発動。フィールド上のモンスターの存在確率の平均値を計算し、各モンスターの存在確率は「平均値の2倍」から「自身の存在確率」を引いた値になります。(特殊すぎるだろ)

まだバトルフェイズが終わっていない気もしますが、ここで1000回のサンプリング(観測)を行って終わりにします。各モンスターが観測される回数は、各々の存在確率の2乗に比例します。存在確率が0.5と2.5のモンスターは、0.25:6.25=1:25の回数で観測されるはずです。

コードで確認

一連の流れをPythonとQiskitで実行してみます。

from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator

#初期化 入力3 + 補助1
qc = QuantumCircuit(4)

#同時計算のため入力ビットを重ね合わせにする
qc.h([0, 1, 2])

#鏡の準備 お作法 
qc.x(3)
qc.h(3)

#鏡を特殊な向きに傾けて攻撃を反射させる 暗号文(この場合は'101')の存在確率だけを反転させる
qc.x(1)
qc.mcx([0, 1, 2], 3) # mcxはccxの拡張バージョン
qc.x(1)

#ディフュージョン 適当な1ビット(この場合は2番ビット)を標的にして増幅のおまじないをかける
qc.h([0, 1, 2])
qc.x([0, 1, 2])
qc.h(2)
qc.ccx(0, 1, 2)
qc.h(2)
qc.x([0, 1, 2])
qc.h([0, 1, 2])

#補助ビットの重ね合わせを解除して解の重複を避ける
qc.h(3)

#計算
qc.measure_all()
backend = AerSimulator(method='matrix_product_state')
t_qc = transpile(qc, backend) #トランスパイルが必要
result = backend.run(t_qc, shots=1000).result().get_counts()

#解の確認
for r in result:
    print(f'{r[::-1]} | {result[r]}/1000')
0011 | 25/1000
1011 | 771/1000
1101 | 25/1000
0111 | 32/1000
1001 | 33/1000
0101 | 38/1000
1111 | 38/1000
0001 | 38/1000

サンプリング結果は、手前の3ビットが主役、後ろの1ビットが補助ビットです。

あぶり出したかった「101」が771回、その他が30回くらいでした。たしかに指定したパターンが25倍の確率で観測されました。

おわりに

次回は、いくつかのカードを追加してハッシュ化前の値を見つける仕組みを解説します。

リアクションのお願い

「参考になった!」「刺激された!」と思ったらぜひリアクションをしましょう。エンジニアの世界はGive and Takeによって成り立っています。これからも無料で良質な情報にアクセスできるよう、Giveする人への感謝をリアクションで示しましょう!

この記事をシェアする

自身のブログ等で使用する場合は引用を忘れずに!

また、寄付も受け付けています。コーヒー1杯でとても喜びます(*˘︶˘*)

 Amazonでギフト券(アマギフ)を贈る

こちらのリンク から金額を指定してお贈りください。(デフォルトで10000円になっているのでご変更ください)

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 Amazonで食事券(すかいらーく優待券)を贈る

500円 1000円 2000円 5000円 からお贈りください。

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 その他、ギフト券やクーポン券をメールで贈る

デジタルのギフト券/クーポン券はメールアドレス(staffあっとvigne-cla.com)までお送りください。受領の返信をいたします。
紙のギフト券/クーポン券は 「郵便物はこちらへ」の住所 まで送付してください。名刺やメールアドレスを同封していただければ受領の連絡をいたします。
余った株主優待券等の処理におすすめです。
いずれも見返りはありませんのでご了承ください。

不明点はSNSでお気軽にご連絡ください

ビネクラのTwitter・Youtubeでコメントをください!


Slack・Discordの場合はこちらの公開グループに参加してShoya YasudaまでDMをください!


※当ブログに関することは何でもご相談・ご依頼可能です。

この記事を書いた人
Yasuda

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

タイトルとURLをコピーしました