前置き
なんだかよくわからない量子コンピュータを理解するための記事です。
情報の正確性にはこだわっていません。わかったきになりたい人はつづきをどうぞ。
記事の目的
物理学の仕組みや難しい数学的論理はべつにしたい。不思議な属性をもつものを論理的に
組み合わせてどう計算しているかを理解したい。
量子コンピュータとは
現在のコンピュータとは仕組みが違う。ビットが違う。
0、1、その間がある。
答えは正しいときもあり、間違っているときもある。可能性で計算する。
可能性はゲートを使って操作する。
基礎構造
namespace Quantum.Example {
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Measurement;
// 1つの量子ビットにHadamardゲートを適用し、測定する操作
operation ApplyHadamardAndMeasure() : Result {
using (qubit = Qubit()) { // 1つの量子ビットを確保
H(qubit); // Hadamardゲートを適用して重ね合わせを作る
let result = M(qubit); // 量子ビットの測定
Reset(qubit); // 量子ビットを初期状態にリセット
return result; // 測定結果を返す
}
}
}
つまりやっていることは1と0とあいだをもつビットを使用し、
ゲートを使って確立を操作し、その後観測することで
計算をおこなっている。
量子ビット
0、1、その間がある。その間は無限に存在し、これが量子コンピュータの強力な計算能力の根源の一つである。
その間とは重ね合わせの状態といい。それを利用することで1度に複数の並列計算を行うことができる。
具体的には2bitの計算をするとしよう。従来型のコンピュータでは一つの入力に対して一つの結果が返ってくる。
def main(bit):
result = classicCal(bit)
return result
def classicCal(a):
# 計算を行う
result = a + 1
return result
# 2ビットの数値を定義します
a = 2 # 10
# 2ビットの足し算を実行して結果を表示します
result = main(a)
print("Result of classical calculation (2 bits):", result)
これに対して量子コンピュータでは
def main(bits):
results = quantumCan(bits)
return results
def quantumCal(inputs):
# 結果を格納する辞書を初期化します
results = [(0, 0), (0, 1), (1, 0), (1, 1)]
return results
# 入力値として2ビットの数値の組み合わせのリストを定義します
inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
# 2ビットの足し算の結果を計算します結果は[(0, 0), (0, 1), (1, 0), (1, 1)]
results = main(inputs)
このように複数の入力に対して、複数の計算結果が同時に出力される。
このコードイメージです。
でもこれでは使えないので量子もつれやゲート使用する。
量子もつれ
二つ以上の量子ビットが密接に結びついている状態のことで、一方の量子ビットの状態を測定すると、もつれている他の量子ビットの状態も即座に決定されます。この現象は、量子ビットが物理的に離れていても発生します。
観測したときにどちらか0ならもう片方は1になる。
もつれは2つ以上でもつくれる、これには種類がある
例えば3つの場合
000ならもう片方は111となる
このパターンや
001か010か100のどれかになるどれか一つが1となるパターン
011、110、101のパターンもある
つまりこれは自由にコントロールできる。011、110、101これのどれかになるかは確率だけど、
このどれかには必ずなるとは設定できる。
量子もつれをつかって、観測したとき、どのパターンになるかをコントロールできる。
namespace Quantum.TeleportationExample {
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Measurement;
// 量子テレポーテーションの操作を定義
operation QuantumTeleportation(msgQubit: Qubit, targetQubit: Qubit) : Unit {
using (auxQubit = Qubit()) { // 補助量子ビットの確保
// 1. 送信者と受信者間でもつれた量子ビットのペアを作成
H(auxQubit);
CNOT(auxQubit, targetQubit);
// 2. 送信者がメッセージ量子ビットと補助量子ビットに操作を適用
CNOT(msgQubit, auxQubit);
H(msgQubit);
// 3. 送信者が2つの量子ビットを測定
let msgResult = M(msgQubit);
let auxResult = M(auxQubit);
// 4. 測定結果に基づいて、受信者が目標量子ビットに操作を適用
if (msgResult == One) {
Z(targetQubit);
}
if (auxResult == One) {
X(targetQubit);
}
}
}
}
量子ゲート
とりうる値を操作する。さっきのW状態の場合
011、110、101このどれになるかの確率を操作するのが量子ゲートになる
import random
def simulate_w_state_with_weights():
# 出力する文字列
outcomes = ["011", "101", "110"]
# 各文字列が選ばれる確率の重み
weights = [0.5, 0.25, 0.25]
# 重みを考慮して1つの結果を選択
result = random.choices(outcomes, weights=weights, k=1)
return result[0]
# シミュレーションの実行と結果の出力
print(simulate_w_state_with_weights())
このweightsの部分がゲートなる。
ここまでのまとめ
量子ビットは0、1、そして0と1の重ね合わせの状態を取ることができる。
量子コンピュータは、確定的な結果ではなく、確率に基づいて計算を行う。
量子もつれは、2つ以上の量子ビットが密接に結びついている現象。
量子もつれは複数の形式で存在し、特定のもつれ状態を作り出すことができる。例えば、3つの量子ビットがもつれるW状態では、3つのうちどれか1つが必ず1となり、残りが0になります。このような状態は、量子ゲートを用いて精密にコントロールすることが可能。
量子ゲートは、量子ビットが取りうる状態の確率を変化させることができる
もしもの話
量子もつれが100億ビットあった場合。それとゲートを利用すれば、特定のアルゴリズムに特化した計算機をつくることができる。
それを利用すればどんな複雑な計算も、観測するだけの1度で計算が終わる。
従来型コンピュータとの違い
従来型はCPUのクロックサイクルやメモリアクセスなどに依存し、少なくとも何回かは計算するのに処理を行うことが必要。
量子コンピュータは観測する1度だけで計算が可能。
量子コンピュータの問題
1度だけで計算ができるが、その答えが正しいかどうかは確率でしかない。つまり、何回か観測を行い、正しい計算結果を求める必要がある。
一方、従来型では処理は何回か行うが計算結果はかならず正しくなる。
従来型と量子コンピュータではその問題によってどちらの方の計算が早いか選ぶ必要がある。
量子コンピュータは限定的に優れている
全ての種類の計算で従来のコンピュータを上回るわけではなく、量子コンピュータの優位性は特定の問題やアルゴリズムに限定される。
確率されたアリゴリズムがあるものについてはそれ専用の計算装置を作ることができ、それが量子コンピュータの計算力が早いということに繋がる。
参考サイト