量子加法器

量子加法器(QAdder)是在量子线路中实现量子态加法的运算器。

接口介绍

在QPanda中我们实现了上述算法,使用该算法必须包含QPanda命名空间 QPanda,详见 ArithmeticUnit.h 。 主要接口包括量子加法器 QAdder 、判断最终结果是否有进位项 isCarry 以及忽略最终进位项的加法器 QAdderIgnoreCarry

在量子线路中实现加法功能的接口 QAdder 如下:

prog << QAdder(a, b, c, is_carry);

可以看出,QAdder接受4个参数,a为加数1(多量子比特)、b为加数2(多量子比特)、c为辅助比特,用于保存运算过程中的进位项、 is_carry为辅助比特,用于保存最终结果的进位项;返回值为量子线路(QCircuit)。

除此之外,还有判断最终结果是否有进位项的接口 isCarry

prog << isCarry(a, b, c, is_carry);

isCarry 也是接受4个参数,a为加数1(多量子比特)、b为加数2(多量子比特)、c为辅助比特,用于保存运算过程中的进位项、 is_carry为辅助比特,用于保存最终结果的进位项;返回值为量子线路(QCircuit)。

还有忽略最终进位项的加法器 QAdderIgnoreCarry 的接口:

prog << QAdderIgnoreCarry(a, b, c);

QAdderIgnoreCarry 接受3个参数,a为加数1(多量子比特)、b为加数2(多量子比特)、c为辅助比特,用于保存运算过程中的进位项;返回值为量子线路(QCircuit)。

实例

|a> = |011>, |b> = |111>

  • QAdder: |a> + |b> -> |1010>;
  • isCarry: |a> + |b> -> |1>;
  • QAdderIgnoreCarry: |a> + |b> -> |010>;

实例代码如下:

运用接口量子加法器的示例代码

#include "QPanda.h"
#include "Components/ArithmeticUnit/ArithmeticUnit.h"
using namespace std;

int main(int argc, char **argv) {

    auto qvm = initQuantumMachine();

    auto a = qvm->allocateQubits(3);
    auto b = qvm->allocateQubits(3);
    Qubit *c = qvm->allocateQubit();
    Qubit *is_carry = qvm->allocateQubit();
    QProg prog;
    prog << X(a[0]) << X(a[1])
        << X(b[0]) << X(b[1]) << X(b[2])
        << QAdder(a, b, c, is_carry);
        //<< isCarry(a, b, c, is_carry);
        //<< QAdderIgnoreCarry(a, b, c);

    qvm->directlyRun(prog);
    auto temp = dynamic_cast<IdealMachineInterface *>(qvm);

    //auto result = temp->quickMeasure(b , 1000);
    //auto result = temp->quickMeasure({ is_carry }, 1000);
    auto result = temp->quickMeasure(a, 1000);
    for (auto &val : result)
    {
        std::cout << val.first << ", " << val.second << std::endl;
    }

    destroyQuantumMachine(qvm);

    system("pause");
    return 0;
}

计算结果:

010, 1000

注解

由于量子加法器QAdder是可逆线路,最后除去进位项(如果有)的结果保存在加数1(adder1)对应的比特上面,加数2(adder2)保持不变,辅助比特is_carry用于保存最终结果的进位项。