首先抱歉长篇文章,我试图尽可能好地解释我的问题/误解。
对于我的学生项目,我必须实现一个简单的量子计算机的模拟。我现在想要了解的是,不同的盖茨如何逐渐应用于n-qubits。
例如,一个量子比特由两个复数(a1,a2)表示:
a1 |0> + a2 |1>
a1和a2是幅度 - 值可以确定的可能性。所有幅度平方和求和必须始终等于1。
所以我添加了一个Hadamard Gate,由2x2 Matrizes代表
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)));
}
现在我将使用带有Hadamard门的a1和a2进行Matrixmultiplication。
因此,我将寄存器设置为复数的二维数组,表示该位的状态为:
Register register = new Register(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,我不知道如何做到这一点。例如,在两个Qubits我会有
a1 |00> + a2 |01> + a3 |10> + a4 |11>
任何给定数字的四种不同状态(或2 ^(numberOfQubits)状态)。但是我怎么能将所有4个国家都用于我的Hadamard门?我必须做出所有可能的结果,其中我将a1乘以每个值,而不是a2等等?像这样:
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);
我真的对此毫无头绪,我认为我的网站存在一个根本性的误解,这使我的事情变得如此复杂。
任何以正确的方式/轨道引导我的帮助都会非常感激。
非常感谢。
答案 0 :(得分:0)
请注意https://en.wikipedia.org/wiki/Hadamard_transform#Quantum_computing_applications写道:
值得注意的是,由于Hadamard变换的张量积结构,计算量子Hadamard变换只是将Hadamard门单独应用于每个量子位。
因此,仅对单个门进行建模是有意义的,并多次实例化。
但我现在怎么能将所有4个国家都用于我的Hadamard门?
门将应用于2-qubit寄存器的所有4个状态。它将对系数对进行操作,即仅在一个位上不同的系数,对应于门应用的位位置。
如果你想要获得更大的图片,首先将Hadamard操作应用于左边的量子比特
((| 00> + | 10>)<00 | +(| 00> - | 10>)<10 | +(| 01> + | 11>)<01 | +(| 01> - | 11 >)<11 |)/ sqrt(2)
然后到正确的量子位
((| 00> + | 01>)<00 | +(| 00> - | 01>)<01 | +(| 10> + | 11>)<10 | +(| 10> - | 11 >)<11 |)/ sqrt(2)
将此作为矩阵写入您的系数顺序(第一步右矩阵和第二步左矩阵)
⎛1 1 0 0⎞ ⎛1 0 1 0⎞ ⎛1 1 1 1⎞
⎜1 -1 0 0⎟ ⎜0 1 0 1⎟ ⎜1 -1 1 -1⎟
½ ⎜0 0 1 1⎟ ⎜1 0 -1 0⎟ = ½ ⎜1 1 -1 -1⎟
⎝0 0 1 -1⎠ ⎝0 1 0 -1⎠ ⎝1 -1 -1 1⎠
如果您需要,可以用符号编码产品矩阵。但我宁愿找到一种方法来模拟将量子门操作应用于寄存器中的量子位子集,同时通过未经修改的其他位。这可以通过扩展矩阵,如上所述,从传统的2×2到我使用的4×4。或者它可能是你评估矩阵时间向量积的方式,以便更好地利用这些矩阵的稀疏性质。
查看您的代码,我对您register.entries[0][0]
中的两个索引感到有些担忧。如果第一个索引应该是量子比特的索引而第二个索引是该量子比特的值,则表示不适合模拟纠缠的情况。