blueqat news
量子コンピュータ関連銘柄 更新: 10/12 13:30(日本時間)
%は前日比・グラフは直近10営業日の推移 — 株価とニュースの突き合わせ / 業界の関係図
生成AIで始める量子ソフトウェア

【AIで量子アプリ】第6回 同じ操作を2回で、ランダムが消えた―ただしAIのコードは黙って間違えた

要約

量子ビットにHを1回かけると495対505とほぼ半々ですが、2回かけると1000回すべてが0に戻りました。コインは2回投げ直しても492対508のままです。あわせて、生成AIが書いたコードが例外を出さずに全部ゼロを返した原因も追います。

コインを投げると表か裏が半々で出ます。もう一度投げ直しても、やはり半々です。ランダムは、重ねてもランダムのままです。

量子ビットでは、そうなりません。同じ操作を2回すると、ランダムが消えて元に戻ります。今回はそれを実際に動かして確かめます。

生成AIに書かせる

この連載の決まりとして、コードは生成AIに書かせます。今回の注文はこれだけです。

1量子ビットに H を1回かけて1000回測り、0と1の回数を出す。同じものに H を2回かけて1000回測り、同じように出す。

返ってきたのがこちらです。

from blueqat import Circuit
for n in (1,2):
    c = Circuit(1)
    for _ in range(n):
        c.h[0]
    result = c.m[:].run(shots=1000)
    print(f"{n}H: 0={result[0]}, 1={result[1]}")

短くて、読みやすいコードです。これを走らせました。

1H: 0=0, 1=0
2H: 0=0, 1=0

⛔ エラーは出ていません。でも全部ゼロです

⚠️ ここが今回いちばん伝えたいところです。このコードは落ちていません。例外も警告も出さず、最後まで動いて、数字を出して終わっています。それなのに、1000回測ったはずの結果が全部ゼロです。

エラーが出るコードなら、誰でも気づきます。⛔ 落ちないまま間違った数字を出すコードが、いちばん厄介です。

何が起きていたのかを調べました。blueqat が返すものを、そのまま表示させます。

型: Counter
中身: Counter({'1': 7, '0': 3})
鍵: ['1', '0'] ['str', 'str']
r[0] = 0  / r['0'] = 3

⭐ 結果の入れ物の鍵は、文字列の '0' と '1' でした。生成AIは整数の 0 と 1 で引いていました。Counter は知らない鍵を引かれると、エラーを出さずに 0 を返します。だから落ちずに、ゼロが並んだわけです。

⚠️ 「測定結果を数字で引く」は、いかにも自然な書き方です。だから読んでも気づきにくい。走らせて、数字がおかしいと気づいて、初めて分かる種類の間違いです。

直したら、こうなりました

引き方を r['0'] に変えただけです。

from blueqat import Circuit

for n in (1, 2):
    c = Circuit(1)
    for _ in range(n):
        c.h[0]
    r = c.m[:].run(shots=1000)
    print(f"Hを{n}回: 0が{r['0']}回, 1が{r['1']}回")
Hを1回: 0が495回, 1が505回
Hを2回: 0が1000回, 1が0回

Hを1回かけると、ほぼ半々になりました(495対505)。コインを投げたのと同じです。

ところがHを2回かけると、1000回すべてが0でした。ランダムが、きれいに消えています。

コインではこうなりません

比べるために、同じことを普通のコインでやってみました。

import random
for n in (1, 2):
    zero = 0
    for _ in range(1000):
        v = 0
        for _ in range(n):
            v = random.choice([0, 1])
        zero += (v == 0)
    print(f"投げ直し{n}回: 表が{zero}回, 裏が{1000-zero}回")
投げ直し1回: 表が503回, 裏が497回
投げ直し2回: 表が492回, 裏が508回

⭐ コインは2回投げ直しても半々のままです(492対508)。量子ビットだけが、2回目で元に戻りました。

1回2回
量子ビット(H)495 : 5051000 : 0
コイン(投げ直し)503 : 497492 : 508

なぜ戻るのか

コインを投げた瞬間、表か裏かは決まってしまいます。決まったものをもう一度投げ直せば、また半々です。

量子ビットにHをかけた状態は、まだ決まっていません。0の側と1の側の両方が、打ち消し合える形で残っています。そこにもう一度Hをかけると、1になる道筋どうしが打ち消し合い、0になる道筋どうしが強め合います。その結果、必ず0に戻ります。

⚠️ 大事なのは、測ってしまうと戻せないことです。1回目のHのあとで測ると、そこで0か1に決まります。決まったあとにHをかけても、コインと同じで半々に散らばるだけです。測らずに2回かけたから戻ったのであって、順番を入れ替えると成り立ちません。

今回わかったこと

  • 量子ビットは、同じ操作を2回かけるとランダムが消えて元に戻る(1000回すべて0)
  • 同じことをコインでやっても戻らない(492対508)
  • ⚠️ ただし途中で測ると戻らない。測った時点で決まってしまうから
  • ⛔ そして、生成AIのコードは落ちないまま間違うことがある。今回は結果の引き方が違っていて、全部ゼロになった

⭐ この連載では、載せる出力を必ず実際に走らせた結果にしています。今回のように、走らせなければ気づけないものがあるからです。

※本記事のコードと出力は、すべて当サイトで実際に実行したものです。乱数を使うため、同じコードでも数字は毎回少しずつ変わります。

続きはメールでも受け取れます

新着記事のまとめを、毎日・週1回・月1回から選んでお届けします。 対談と教えて先生の続きも読めるようになります。登録も閲覧も無料です。

ログインしてメール配信を設定