首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从qiskit中的np.array创建统一网关?

如何从qiskit中的np.array创建统一网关?
EN

Stack Overflow用户
提问于 2019-12-25 03:06:24
回答 2查看 1.9K关注 0票数 3

Hi all: Cirq提供了一种从数组创建单一门的方法。我试着在Qiskit中做同样的事情,但没有完全做到。这是一个示例代码,其中包含我到目前为止可以组合在一起的内容。另外,有没有一种方法可以应用从Q到q1的么正运算呢?或者创建一个特定的标记门,以便在电路中使用?如果是这样的话,是怎么做的?非常感谢!

代码语言:javascript
复制
from qiskit.extensions import *
U2x2 = np.array([[0.998762, -0.049745], [-0.049745, -0.998762]])
# Still not sure how to use this, though it compiles
gate2x2 = UnitaryGate(U2x2)

# The best I could do so far was this:
# Create the quantum circuit
q = QuantumRegister(2)
c = ClassicalRegister(2)
qc = QuantumCircuit(q, c)

qc.unitary(U2x2, range(1))
qc.measure(q[0], c[0])
EN

回答 2

Stack Overflow用户

发布于 2019-12-31 22:33:51

如果你只想要一个来自数组的正规单位门,我相信你的qc.unitary(U2x2, range(1))实现是正确的。实例化UnitaryGate似乎已经在qc.unitary()调用中完成了,所以只需调用qc.unitary()就可以了。

但是,如果您想要这个单一门的受控版本,我发现手动实例化UnitaryGate,然后向该门添加控件可以很好地工作。类似这样的东西应该会起作用:

代码语言:javascript
复制
from qiskit.circuit.add_control import add_control

gate2x2 = UnitaryGate(U2x2)
gate2x2_ctrl = add_control(gate2x2, 1)

qc.append(gate2x2_ctrl, [q[0], q[1]])

如果您需要更多信息,Here也是add_control()的源代码。

票数 2
EN

Stack Overflow用户

发布于 2020-01-05 00:16:28

事实证明以下方法是有效的,但gate是以一种违反直觉的方式应用的。这可能是Qiskit中位排序的结果,这似乎导致了一个非常非标准的实现,所以要小心!具体来说,测试以下代码(您可以使用注释掉的x()门将量子位转换为|1> ):

代码语言:javascript
复制
q = QuantumRegister(2, 'q')
c = ClassicalRegister(2, 'c')

U4x4 = np.array( [[0, 1, 0, 0], [1, 0, 0, 0], 
                  [0, 0, 0, 1], [0, 0, 1, 0]] )

qc = QuantumCircuit(q,c)
qc.x(q[0])
#qc.x(q[1])

gate4x4 = UnitaryGate(U4x4)
qc.append(gate4x4, [q[0], q[1]] )
qc.measure(q[0],c[0])
qc.measure(q[1],c[1])
qc.draw()

仅通过查看矩阵,您就可以看到这应该具有以下输出:|00> -> |01>|01> -> |00>|10> -> |11>|11> -> |10>,其中第一位,即|ab>中的a表示q[0]上测量的值。换句话说,如果输入是q[0]=|1>q[1]=|0>,那么标准基数中的输入状态应该是(列向量) (0;0;1;0),所以输出将是(0;0;0;1)。但是通过在Aer上模拟它来尝试一下,你会发现事实并非如此。使用如图所示的qc.x(q[0]),输出为(0;0;0;0)。要获得预期的输出,您需要改为在[q[1], q[0]]上使用append。虽然这肯定可以由有意识的人来处理,但我认为这是完全令人困惑的。

这是这个门的受控版本。同样,请注意append指令中为了让第一个量子位q[0]充当控制而需要的量子位的逆序(非常不直观)。

代码语言:javascript
复制
q = QuantumRegister(3, 'q')
c = ClassicalRegister(3, 'c')

U4x4 = np.array( [[0, 1, 0, 0], [1, 0, 0, 0], 
                  [0, 0, 0, 1], [0, 0, 1, 0]] )
k = 4
# This makes a controlled variant of the matrix
C_U = np.vstack([np.hstack([np.eye(k),       np.zeros((k,k))]), 
                 np.hstack([np.zeros((k,k)), U4x4])])

qc = QuantumCircuit(q,c)
#qc.x(q[0])

gate3Q = UnitaryGate(C_U)
qc.x(q[0])
qc.append(gate3Q, [q[2], q[1], q[0]] )
qc.measure(q[0],c[0])
qc.measure(q[1],c[1])
qc.measure(q[2],c[2])
qc.draw()

通过运行这段代码(以及打开和关闭x(q[0])等),用户可以很容易地确认发生了什么。使用

代码语言:javascript
复制
backend = BasicAer.get_backend('qasm_simulator')
shots = 2048
results = execute(qc, backend=backend, shots=shots).result()
answer = results.get_counts()
print(answer)
plot_histogram(answer)

通过查看C_Uappend的定义,似乎第一个量子位,q[2],应该是控制。但事实并非如此,它是q[0]。为了进一步参考,下面是我正在运行的Qiskit版本:

代码语言:javascript
复制
{'qiskit-terra': '0.11.0',
 'qiskit-aer': '0.3.4',
 'qiskit-ignis': '0.2.0',
 'qiskit-ibmq-provider': '0.4.4',
 'qiskit-aqua': '0.6.1',
 'qiskit': '0.14.0'}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59472632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档