まず、長文で申し訳ありませんが、私の問題/誤解を可能な限り説明しようとしました。
私の学生プロジェクトでは、単純な量子コンピューターのシミュレーションを実装する必要があります。私が今理解しようとしているのは、どのように異なるゲートが n-キュービットに少しずつ適用されているかということです。
たとえば、1 つの量子ビットは 2 つの複素数 (a1、a2) で表されます。
a1 |0> + a2 |1>
ここで、a1 と a2 は振幅、つまり値が測定される可能性です。すべての振幅の 2 乗と合計は、常に 1 に等しくなければなりません。
そこで、2x2 マトリゼーションで表されるアダマール ゲートを追加しました。
public void Hadamard(){
gate.entries[0][0] = new ComplexNumber(1,0);
gate.entries[0][1] = new ComplexNumber(1,0);
gate.entries[1][0] = new ComplexNumber(1,0);
gate.entries[1][1] = new ComplexNumber(-1,0);
gate = (Matrix.scalarMultiplication(gate,Math.pow(2,-0.5)));
}
ここで、アダマール ゲートを使用して a1 と a2 を使用して行列乗算を行います。
そこで、ビットの状態を次のように表す複素数の 2 次元配列としてレジスタを設定します。
Register register = new Register(1);
数値は量子ビットの数を表します。すべての状態を保持する行を 1 つだけ作成し、列のインデックスは状態と等しくなります。だから例えば
[0][0] = |0> and [0][1] = |1>
a1=1+0i および a2=0+0i と言うと、乗算は次のようになります。
cmplx1 = cmplxMultiplicate(gate.entries[0][0],a1);
cmplx2 = cmplxMultiplicate(gate.entries[0][1],a2);
cmplx3 = cmplxMultiplicate(gate.entries[1][0],a1);
cmplx4 = cmplxMultiplciate(gate.entires[1][1],a2);
register.entries[0][0] = cmplxAddition(cmplx1,cmplx2); // 0.70710678118
register.entries[0][1] = cmplxAddition(cmplx3,cmplx4); // 0.70710678118
ここで質問です。複数の Qubit がある場合、これを行う方法がわかりません。たとえば、2 つのキュービットでは、
a1 |00> + a2 |01> + a3 |10> + a4 |11>
4 つの異なる状態 (または任意の数に対して 2^(numberOfQubits) 状態)。しかし、どうすれば 4 つの状態すべてをアダマール ゲートに適用できますか? a2などよりもa1にすべての値を掛けた場合、すべての可能な結果を作成する必要がありますか? このような :
cmplx1 = cmplxMultiplicate(gate.entries[0][0],a1);
cmplx2 = cmplxMultiplicate(gate.entries[0][1],a2);
cmplx3 = cmplxMultiplicate(gate.entries[1][0],a1);
cmplx4 = cmplxMultiplciate(gate.entries[1][1],a2);
cmplx1 = cmplxMultiplicate(gate.entries[0][0],a1);
cmplx2 = cmplxMultiplicate(gate.entries[0][1],a3);
cmplx3 = cmplxMultiplicate(gate.entries[1][0],a1);
cmplx4 = cmplxMultiplciate(gate.entries[1][1],a3);
私はこれについて本当に無知であり、私のサイトには根本的な誤解があり、それが私にとって物事を非常に複雑にしていると思います.
私を正しい道/軌道に導く助けがあれば、本当に感謝しています.
どうもありがとうございました。