具有 Hadamard 变换(叠加)量子位的 3 向量子纠缠
3 Way Quantum Entanglement with a Hadamard Transformed (superposition) Qubit
当运行对3个量子位进行以下操作时:
H(qubits[0]);
CNOT(qubits[0], qubits[1]);
CNOT(qubits[0], qubits[2]);
CNOT(qubits[1], qubits[2]);
我得到这些结果:
量子比特 0 处于叠加态
量子位 1 与量子位 0 相同
量子位 2 有一半时间与量子位 0 相同。例如类似叠加的值。
为什么在 运行 量子位 1 和量子位 0 上的 CNOT 之后 运行 量子位 2 上的 CNOT 和其他两个量子位导致量子位 2 进入量子位 0 和非量子位 0 之间的叠加状态?
如果你做一些量子计算数学,你会发现你最终处于以下状态:
|ψ 〉 = (|000〉 + |011〉) / √2
这本质上是量子位 0 与纠缠的量子位 1 和 2 之间的叠加。
|ψ 〉 = |0〉 ⊗ (|00〉 + |11〉) / √2
您可以使用 Python 中的 IBM QISKit 进行计算:
from qiskit import QuantumProgram
from math import sqrt
import numpy as np
qp = QuantumProgram()
cname = '3-qubit'
num_qubits = 3
qr = qp.create_quantum_register('qr', num_qubits)
cr = qp.create_classical_register('cr', num_qubits)
qc = qp.create_circuit(cname, [qr], [cr])
qc.h(qr[0])
qc.cx(qr[0], qr[1])
qc.cx(qr[0], qr[2])
qc.cx(qr[1], qr[2])
qc.measure(qr, cr)
results = qp.execute(cname)
print(results.get_counts(cname))
这将为您提供类似于以下内容的结果:
{'000': 530, '011': 494}
您还可以通过获取电路的酉矩阵并将其应用于初始状态 |000> 来显式获得此状态 |ψ>,即向量 [1,0,0,0,0,0,0,0]
:
results = qp.execute(cname, backend='local_unitary_simulator', shots=1)
data = results.get_data(cname)
u = np.real(data['unitary'] * sqrt(2.0)).astype(int)
psi = np.zeros(2**num_qubits, dtype=np.int_)
psi[0] = 1
u @ psi
结果是
array([1, 0, 0, 1, 0, 0, 0, 0])
第 0 个条目是 |000>,第 3 个条目是 |011>。
你可以把这个量子运算看成下面的按位运算符量子,
qubits[0]= a
qubits[1] = y
qubits[2] = z
让@是按位运算符,
x@x = 0 , 任何 p@0 = p
qubits[0] = H(a) = x (superposition state, final x )
CNOT(qubits[0], qubits[1]) = CNOT(x,y) = (x, x @ y) = (x, yy) (final qubits[1]=yy)
CNOT(qubits[0], qubits[2]) = CNOT(x,z) = (x, x @ z) = (x, zz)
CNOT(qubits[1], qubits[2]) = CNOT(yy,zz) = (yy, zz@ yy) = (x@y, x@z@x@y) = (x@y,z@y) (final qubits[2]=z@y)
(x,y,z) = (0,0,0) ==> (qubits[0],qubits[1],qubits[2]) = (0,0,0)
(x,y,z) = (0,0,1) ==> (qubits[0],qubits[1],qubits[2]) = (0,0,1)
(x,y,z) = (0,1,0) ==> (qubits[0],qubits[1],qubits[2]) = (0,1,1)
(x,y,z) = (0,1,1) ==> (qubits[0],qubits[1],qubits[2]) = (0,1,0)
(x,y,z) = (1,0,0) ==> (qubits[0],qubits[1],qubits[2]) = (1,1,0)
(x,y,z) = (1,0,1) ==> (qubits[0],qubits[1],qubits[2]) = (1,1,1)
(x,y,z) = (1,1,0) ==> (qubits[0],qubits[1],qubits[2]) = (1,0,1)
(x,y,z) = (1,1,1) ==> (qubits[0],qubits[1],qubits[2]) = (1,0,0)
当运行对3个量子位进行以下操作时:
H(qubits[0]);
CNOT(qubits[0], qubits[1]);
CNOT(qubits[0], qubits[2]);
CNOT(qubits[1], qubits[2]);
我得到这些结果: 量子比特 0 处于叠加态 量子位 1 与量子位 0 相同 量子位 2 有一半时间与量子位 0 相同。例如类似叠加的值。
为什么在 运行 量子位 1 和量子位 0 上的 CNOT 之后 运行 量子位 2 上的 CNOT 和其他两个量子位导致量子位 2 进入量子位 0 和非量子位 0 之间的叠加状态?
如果你做一些量子计算数学,你会发现你最终处于以下状态:
|ψ 〉 = (|000〉 + |011〉) / √2
这本质上是量子位 0 与纠缠的量子位 1 和 2 之间的叠加。
|ψ 〉 = |0〉 ⊗ (|00〉 + |11〉) / √2
您可以使用 Python 中的 IBM QISKit 进行计算:
from qiskit import QuantumProgram
from math import sqrt
import numpy as np
qp = QuantumProgram()
cname = '3-qubit'
num_qubits = 3
qr = qp.create_quantum_register('qr', num_qubits)
cr = qp.create_classical_register('cr', num_qubits)
qc = qp.create_circuit(cname, [qr], [cr])
qc.h(qr[0])
qc.cx(qr[0], qr[1])
qc.cx(qr[0], qr[2])
qc.cx(qr[1], qr[2])
qc.measure(qr, cr)
results = qp.execute(cname)
print(results.get_counts(cname))
这将为您提供类似于以下内容的结果:
{'000': 530, '011': 494}
您还可以通过获取电路的酉矩阵并将其应用于初始状态 |000> 来显式获得此状态 |ψ>,即向量 [1,0,0,0,0,0,0,0]
:
results = qp.execute(cname, backend='local_unitary_simulator', shots=1)
data = results.get_data(cname)
u = np.real(data['unitary'] * sqrt(2.0)).astype(int)
psi = np.zeros(2**num_qubits, dtype=np.int_)
psi[0] = 1
u @ psi
结果是
array([1, 0, 0, 1, 0, 0, 0, 0])
第 0 个条目是 |000>,第 3 个条目是 |011>。
你可以把这个量子运算看成下面的按位运算符量子,
qubits[0]= a
qubits[1] = y
qubits[2] = z
让@是按位运算符, x@x = 0 , 任何 p@0 = p
qubits[0] = H(a) = x (superposition state, final x )
CNOT(qubits[0], qubits[1]) = CNOT(x,y) = (x, x @ y) = (x, yy) (final qubits[1]=yy)
CNOT(qubits[0], qubits[2]) = CNOT(x,z) = (x, x @ z) = (x, zz)
CNOT(qubits[1], qubits[2]) = CNOT(yy,zz) = (yy, zz@ yy) = (x@y, x@z@x@y) = (x@y,z@y) (final qubits[2]=z@y)
(x,y,z) = (0,0,0) ==> (qubits[0],qubits[1],qubits[2]) = (0,0,0)
(x,y,z) = (0,0,1) ==> (qubits[0],qubits[1],qubits[2]) = (0,0,1)
(x,y,z) = (0,1,0) ==> (qubits[0],qubits[1],qubits[2]) = (0,1,1)
(x,y,z) = (0,1,1) ==> (qubits[0],qubits[1],qubits[2]) = (0,1,0)
(x,y,z) = (1,0,0) ==> (qubits[0],qubits[1],qubits[2]) = (1,1,0)
(x,y,z) = (1,0,1) ==> (qubits[0],qubits[1],qubits[2]) = (1,1,1)
(x,y,z) = (1,1,0) ==> (qubits[0],qubits[1],qubits[2]) = (1,0,1)
(x,y,z) = (1,1,1) ==> (qubits[0],qubits[1],qubits[2]) = (1,0,0)