我正在设置一个量子门库(单一算子)。 我想尽可能抽象地编写它们,以便将它们用于许多目的。
例如,哈达玛门。
想象一下,我们有一个n位的字符串:| abc ... n>。 这些字符串表示从0到2 ^ n的数字,并且出于计算基础,它们由元素| 00 ... 0>,| 00 ... 1>,...,| 11 ... 1>组成。 假设我们的状态是一些位字符串的线性组合,我们将其表示为2 ^ n个分量的向量:
state = [a00...0, ..., a11...1]
哈达玛门(Hadamard Gate)将当前状态和整数m <= n作为参数。 我们说哈达玛门正在对第m个量子比特起作用。
在一个实际例子中,假设我们正在处理3个量子位。 我们的计算基础是:
|000>, |001>, |010>, |011>,
|100>, |101>, |110>, |111>
我们的状态将是复杂的8维数组。
state = [a000, a001, a010, a011, a100, a101, a110, a111]
第一个量子位上的哈达玛门是什么:
H(state) = [b000, b001, b010, b011, b100, b101, b110, b111]
使用
b0XY = 1/sqrt(2) * (a0XY + a1XY)
b1XY = 1/sqrt(2) * (a0XY - a1XY)
对于任何X和Y。
例如,如果将Hadamard Gate应用于4量子位系统的第三个量子位,则会发生同样的情况:
state = [a0000, a0001, ..., a1111]
H(state) = [b0000, b0001, ..., b1111]
使用
bXX0X = 1/sqrt(2) (aXX0X + aXX1X)
bXX1X = 1/sqrt(2) (aXX0X - aXX1X)
这是我的代码,其中``大小''是尺寸,即量子位的数量。 初始状态为a00 ... 0 = 1,其他位置为0,但这并不是太重要,可以是任何东西。
from itertools import product
import numpy as np
import math
state = np.zeros(2**size, dtype=complex)
state[0] = 1.
def ii (self,i):
"""Computes a double index.
Args.
i (vector): array of bits with value 1 or 0.
Rets.
ii (int): base 10 representation of the bits array.
"""
l = len(i)
return np.dot(i,[2**(l-j-1) for j in range(l)])
def H(state, m):
"""Apply the Hadamard Gate to the m'th qubit.
Args.
state (dim=2**size vector): initial state.
m (int): what qubit are we applying our gate on.
Rets.
state (dim=2**n vector): new final state.
"""
for i in product([0,1], repeat=self.size):
# can improve, just looking for a working model
j = np.array(i)
j[m] ^= 1
if(j[m]):
state[ii(i)] += state[ii(j)]
else:
state[ii(i)] = state[ii(j)] - 2*state[ii(i)]
state /= math.sqrt(2)
return state
我该怎么做才能提高效率?
现在输出正确。 我想以更优雅的方式处理评论下的三行内容。 我还想知道如何使用句柄处理向量转换,因此不会浪费内存或时间。 (我来自C语言,但仍然不知道Python中的句柄是什么。)
谢谢,祝你生活愉快!