コインを投げると表か裏が半々で出ます。もう一度投げ直しても、やはり半々です。ランダムは、重ねてもランダムのままです。
量子ビットでは、そうなりません。同じ操作を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 : 505 | 1000 : 0 |
| コイン(投げ直し) | 503 : 497 | 492 : 508 |
なぜ戻るのか
コインを投げた瞬間、表か裏かは決まってしまいます。決まったものをもう一度投げ直せば、また半々です。
量子ビットにHをかけた状態は、まだ決まっていません。0の側と1の側の両方が、打ち消し合える形で残っています。そこにもう一度Hをかけると、1になる道筋どうしが打ち消し合い、0になる道筋どうしが強め合います。その結果、必ず0に戻ります。
⚠️ 大事なのは、測ってしまうと戻せないことです。1回目のHのあとで測ると、そこで0か1に決まります。決まったあとにHをかけても、コインと同じで半々に散らばるだけです。測らずに2回かけたから戻ったのであって、順番を入れ替えると成り立ちません。
今回わかったこと
- 量子ビットは、同じ操作を2回かけるとランダムが消えて元に戻る(1000回すべて0)
- 同じことをコインでやっても戻らない(492対508)
- ⚠️ ただし途中で測ると戻らない。測った時点で決まってしまうから
- ⛔ そして、生成AIのコードは落ちないまま間違うことがある。今回は結果の引き方が違っていて、全部ゼロになった
⭐ この連載では、載せる出力を必ず実際に走らせた結果にしています。今回のように、走らせなければ気づけないものがあるからです。
※本記事のコードと出力は、すべて当サイトで実際に実行したものです。乱数を使うため、同じコードでも数字は毎回少しずつ変わります。



