基于QFT的量子加法器的原理与实现-mindspore quantum

1 量子Fourier变换

离散Fourier变换以一一个复向量 x 0 , . . . , x N − 1 {x_0},...,{x_{N - 1}} x0,...,xN1为输入,输出的数据是如下复向量 y 0 , . . . , y N − 1 {y_0},...,{y_{N - 1}} y0,...,yN1
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}}} ykN 1j=0N1xje2πijk/N

量子Fourier变换是与它严格相同的变换。量子Fourier变换定义为,在一组标准正交基 ∣ 0 ⟩ , . . . , ∣ N − 1 ⟩ \left| 0 \right\rangle ,...,\left| {N - 1} \right\rangle 0,...,N1上的一个线性算子,在基态上的作用为
∣ 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 jN 1k=0N1e2πijk/Nk

我们将状态 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,...,jn2n/21[(0+e2πi0.jn1)(0+e2πi0.jn1jn1)...(0+e2πi0.j1...jn1jn1)]

量子Fourier变换的有效线路实现如下:
基于QFT的量子加法器的原理与实现-mindspore quantum_第1张图片其中门 R k R_k Rk表示酉变换
基于QFT的量子加法器的原理与实现-mindspore quantum_第2张图片
使用交换运算逆转量子比特的顺序,量子比特的状态为
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.jn1)(0+e2πi0.jn1jn1)...(0+e2πi0.j1...jn1jn1)

量子Fourier变换可使用如下语句实现

from mindquantum.algorithm.library import qft
circ = qft([2,1,0]) 
circ.svg()

基于QFT的量子加法器的原理与实现-mindspore quantum_第3张图片

图中的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.cn1)(0+e2πi0.cn1cn1)...(0+e2πi0.c1...cn1cn1)
再利用逆Fourier变换即可得到 ∣ c 1 c 2 . . . c n ⟩ |c_1c_2...c_n\rangle c1c2...cn

2.1 不考虑最高位进位

观察到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
于是可使用如下线路制备 ∣ c f ⟩ |cf\rangle cf,这里先不考虑最高位有进位的情况。
基于QFT的量子加法器的原理与实现-mindspore quantum_第4张图片
将这个线路记作MAdder(Modular Adder)。于是,量子加法器的线路如下(不考虑最高位进位):
基于QFT的量子加法器的原理与实现-mindspore quantum_第5张图片

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变换后
基于QFT的量子加法器的原理与实现-mindspore quantum_第6张图片
观察到
基于QFT的量子加法器的原理与实现-mindspore quantum_第7张图片
于是制备 ∣ c f ⟩ |cf\rangle cf的线路如下
基于QFT的量子加法器的原理与实现-mindspore quantum_第8张图片
注意:红框里线路的旋转角相比于前面的线路均多除了一个2。
将上图线路记作Adder,完整的量子加法器线路如下
基于QFT的量子加法器的原理与实现-mindspore quantum_第9张图片

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).

你可能感兴趣的:(量子计算)