1 量子Fourier变换
离散Fourier变换以一一个复向量
x
0
,
.
.
.
,
x
N
−
1
{x_0},...,{x_{N - 1}}
x0,...,xN−1为输入,输出的数据是如下复向量
y
0
,
.
.
.
,
y
N
−
1
{y_0},...,{y_{N - 1}}
y0,...,yN−1:
y
k
≡
1
N
∑
j
=
0
N
−
1
x
j
e
2
π
i
j
k
/
N
{y_k} \equiv \frac{1}{{\sqrt N }}\sum\limits_{j = 0}^{N - 1} {{x_j}{e^{ 2\pi ijk/N}}}
yk≡N1j=0∑N−1xje2πijk/N
量子Fourier变换是与它严格相同的变换。量子Fourier变换定义为,在一组标准正交基
∣
0
⟩
,
.
.
.
,
∣
N
−
1
⟩
\left| 0 \right\rangle ,...,\left| {N - 1} \right\rangle
∣0⟩,...,∣N−1⟩上的一个线性算子,在基态上的作用为
∣
j
⟩
→
1
N
∑
k
=
0
N
−
1
e
2
π
i
j
k
/
N
∣
k
⟩
\left| j \right\rangle \to \frac{1}{{\sqrt N }}\sum\limits_{k = 0}^{N - 1} {{e^{2\pi ijk/N}}} \left| k \right\rangle
∣j⟩→N1k=0∑N−1e2πijk/N∣k⟩
我们将状态 j j j写成二进制形式 j = j 1 j 2 . . . j n j=j_1j_2...j_n j=j1j2...jn,用记号 0. j l j l + 1 . . . j m 0.j_lj_{l+1}...j_m 0.jljl+1...jm表示二进制分数。
容易推导出量子Fourier变换的积形式:
∣
j
1
,
.
.
.
,
j
n
⟩
→
1
2
n
/
2
[
(
∣
0
⟩
+
e
2
π
i
0.
j
n
∣
1
⟩
)
(
∣
0
⟩
+
e
2
π
i
0.
j
n
−
1
j
n
∣
1
⟩
)
.
.
.
(
∣
0
⟩
+
e
2
π
i
0.
j
1
.
.
.
j
n
−
1
j
n
∣
1
⟩
)
]
\begin{array}{l} \left| {{j_1},...,{j_n}} \right\rangle \to \\ \frac{1}{{{2^{n/2}}}}\left[ {\left( {\left| 0 \right\rangle + {e^{2\pi i0.{j_n}}}\left| 1 \right\rangle } \right)\left( {\left| 0 \right\rangle + {e^{2\pi i0.{j_{n - 1}}{j_n}}}\left| 1 \right\rangle } \right)...\left( {\left| 0 \right\rangle + {e^{2\pi i0.{j_1}...{j_{n - 1}}{j_n}}}\left| 1 \right\rangle } \right)} \right] \end{array}
∣j1,...,jn⟩→2n/21[(∣0⟩+e2πi0.jn∣1⟩)(∣0⟩+e2πi0.jn−1jn∣1⟩)...(∣0⟩+e2πi0.j1...jn−1jn∣1⟩)]
量子Fourier变换的有效线路实现如下:
其中门
R
k
R_k
Rk表示酉变换
使用交换运算逆转量子比特的顺序,量子比特的状态为
1
2
n
/
2
(
∣
0
⟩
+
e
2
π
i
0.
j
n
∣
1
⟩
)
(
∣
0
⟩
+
e
2
π
i
0.
j
n
−
1
j
n
∣
1
⟩
)
.
.
.
(
∣
0
⟩
+
e
2
π
i
0.
j
1
.
.
.
j
n
−
1
j
n
∣
1
⟩
)
\frac{1}{{{2^{n/2}}}} {\left( {\left| 0 \right\rangle + {e^{2\pi i0.{j_n}}}\left| 1 \right\rangle } \right)\left( {\left| 0 \right\rangle + {e^{2\pi i0.{j_{n - 1}}{j_n}}}\left| 1 \right\rangle } \right)...\left( {\left| 0 \right\rangle + {e^{2\pi i0.{j_1}...{j_{n - 1}}{j_n}}}\left| 1 \right\rangle } \right)}
2n/21(∣0⟩+e2πi0.jn∣1⟩)(∣0⟩+e2πi0.jn−1jn∣1⟩)...(∣0⟩+e2πi0.j1...jn−1jn∣1⟩)
量子Fourier变换可使用如下语句实现
from mindquantum.algorithm.library import qft
circ = qft([2,1,0])
circ.svg()
图中的PS门为相位旋转门PhaseShift。
需要注意的是,q0 q1 q2寄存器对应的量子态为 ∣ q 2 q 1 q 0 ⟩ \left| {{q_2}{q_1}{q_0}} \right\rangle ∣q2q1q0⟩。
2 量子加法器
若有
a
=
a
1
a
2
.
.
.
a
n
a=a_1a_2...a_n
a=a1a2...an和
b
=
b
1
b
2
.
.
.
b
n
b=b_1b_2...b_n
b=b1b2...bn,欲计算
c
=
a
+
b
c=a+b
c=a+b,根据量子Fourier变换的知识,我们可先制备出如下量子态
∣
c
f
⟩
|cf\rangle
∣cf⟩
1
2
n
/
2
(
∣
0
⟩
+
e
2
π
i
0.
c
n
∣
1
⟩
)
(
∣
0
⟩
+
e
2
π
i
0.
c
n
−
1
c
n
∣
1
⟩
)
.
.
.
(
∣
0
⟩
+
e
2
π
i
0.
c
1
.
.
.
c
n
−
1
c
n
∣
1
⟩
)
\frac{1}{{{2^{n/2}}}}\left( {\left| 0 \right\rangle + {e^{2\pi i0.{c_n}}}\left| 1 \right\rangle } \right)\left( {\left| 0 \right\rangle + {e^{2\pi i0.{c_{n - 1}}{c_n}}}\left| 1 \right\rangle } \right)...\left( {\left| 0 \right\rangle + {e^{2\pi i0.{c_1}...{c_{n - 1}}{c_n}}}\left| 1 \right\rangle } \right)
2n/21(∣0⟩+e2πi0.cn∣1⟩)(∣0⟩+e2πi0.cn−1cn∣1⟩)...(∣0⟩+e2πi0.c1...cn−1cn∣1⟩)
再利用逆Fourier变换即可得到
∣
c
1
c
2
.
.
.
c
n
⟩
|c_1c_2...c_n\rangle
∣c1c2...cn⟩。
2.1 不考虑最高位进位
观察到
于是可使用如下线路制备
∣
c
f
⟩
|cf\rangle
∣cf⟩,这里先不考虑最高位有进位的情况。
将这个线路记作MAdder(Modular Adder)。于是,量子加法器的线路如下(不考虑最高位进位):
2.2 考虑最高位进位
考虑 a = a 1 a 2 . . . a n a=a_1a_2...a_n a=a1a2...an, b = b 1 b 2 . . . b n b=b_1b_2...b_n b=b1b2...bn, c = a + b = c 1 c 2 . . . c n + 1 c = a + b = {c_1}{c_2}...{c_{n + 1}} c=a+b=c1c2...cn+1。 c 1 = 0 c_1=0 c1=0表示最高位无进位, c 1 = 0 c_1=0 c1=0表示最高位有进位。
若考虑最高位进位,则需要给
a
a
a增加一个量子比特存储进位项。
∣
a
⟩
=
∣
0
a
1
,
.
.
.
,
a
n
⟩
\left|a \right\rangle = \left| {0{a_1},...,{a_n}} \right\rangle
∣a⟩=∣0a1,...,an⟩
对
∣
a
⟩
\left|a \right\rangle
∣a⟩做量子Fourier变换后
观察到
于是制备
∣
c
f
⟩
|cf\rangle
∣cf⟩的线路如下
注意:红框里线路的旋转角相比于前面的线路均多除了一个2。
将上图线路记作Adder,完整的量子加法器线路如下
3 代码实现
导入一些用到的包
from mindquantum.algorithm.library import qft
from mindquantum.simulator import Simulator
from mindquantum.core.gates import X, PhaseShift
from mindquantum.core.circuit import Circuit,dagger
import numpy as np
定义受控相位旋转操作
def _rn(k):
return PhaseShift(2 * np.pi / 2 ** k)
def C_R(tq, cq, k):
circ = Circuit()
circ += _rn(k).on(tq, cq)
return circ
定义adder,这里考虑了进位项
def m_adder(qa, qb):
circ = Circuit()
qa_num = len(qa)
qb_num = len(qb)
for q in range(qb_num):
for i in range(qb_num - q - 1, qb_num):
circ += C_R(qa[qa_num - q - 1], qb[qb_num - i - 1], i - (qb_num - q - 1) + 1)
if qa_num > qb_num and q == (qb_num - 1): # 进位的控制
for i in range(qb_num - q - 1, qb_num):
circ += C_R(qa[qa_num - q - 1 - 1], qb[qb_num - i - 1], i - (qb_num - q - 1) + 1 + 1)
return circ
输入a和b的值(假设a,b都是3bit二进制数),并执行加法器
#定义存储a和b的寄存器qa,qb
qa = [3, 4, 5, 6]
qb = [0, 1, 2]
circ = Circuit()
# qa 输入a的值 001
# circ += X.on(5)
# circ += X.on(4)
circ += X.on(3)
# qb 输入b的值 111
circ += X.on(2)
circ += X.on(1)
circ += X.on(0)
#对qa执行量子Fourier操作
circ += qft([6, 5, 4, 3])
#执行加法操作
adder = m_adder(qa, qb)
circ += adder
#使用量子逆Four变换恢复出结果
circ += dagger(qft([6, 5, 4, 3]))
sim = Simulator('projectq', 7)
sim.apply_circuit(circ)
print(sim.get_qs(True))
circ.svg() #查看整个线路
1¦1000111⟩
结果保存在qa寄存器中即c=1000
qb寄存器中值不变,即b=111
参考资料
[1] Engin Şahin. Quantum arithmetic operations based on quantum fourier transform on signed integers. International Journal of Quantum Information. (2020) 2050035 (21 pages).