查看原文
其他

QPanda 2教程资源 | 算法组件之泡利算符类

OriginQ 本源量子 2021-02-13

hi~好久不见

上篇为大家推送了

量子程序转化为QRunes、Quil

今天小编要介绍的是

泡利算符类

跟我们一起来学习吧!



在上一篇文章中,小编为大家介绍了量子程序如何转化为QRunes、Quil的。

量子程序转化为QRunes即通过该功能模块,你可以解析通过QPanda 2构建的量子程序,将其中包含的量子比特信息以及量子逻辑门操作信息提取出来,得到按固定格式存储的QRunes指令集。

Quil指令集语法与QRunes基本相似。也是采用了指令集加参数列表的设计方法。

接下来介绍的是QPanda 2的算法组件之一:泡利算符类

泡利算符类

泡利算符是一组三个2×2的幺正厄米复矩阵,又称酉矩阵。我们一般都以希腊字母σ(西格玛)来表示,记作σx,σy,σz。在QPanda中我们称它们为X门,Y门,Z门,它们对应的矩阵形式,如下表所示。


泡利算符的运算规则如下:

1.泡利算符与自身相乘得到是单位矩阵

2.泡利算符与单位矩阵相乘,无论是左乘还是右乘,其值不变

3.顺序相乘的两个泡利算符跟未参与计算的泡利算符是 ii 倍的关系

4.逆序相乘的两个泡利算符跟未参与计算的泡利算符是 −i−i 倍的关系

接口介绍

根据泡利算符的上述性质,我们在QPanda中实现了泡利算符类PauliOperator。我们可以很容易的构造泡利算符类,例如:

using namespace QPanda;


// 构造一个空的泡利算符类

PauliOperator p1;


// 2倍的"泡利Z0"张乘"泡利Z1"

PauliOperator p2("Z0 Z1", 2);


// 2倍的"泡利Z0"张乘"泡利Z1" + 3倍的"泡利X1"张乘"泡利Y2"

PauliOperator p3({{"Z0 Z1", 2},{"X1 Y2", 3}});


// 构造一个单位矩阵,其系数为2,等价于PauliOperator p4("", 2);

PauliOperator p4(2);

其中PauliOperator p2("Z0 Z1", 2)表示的是 2σz0⊗σ1z。

注解

构造泡利算符类的时候,字符串里面包含的字符只能是空格、 X ,Y ,Z 中的一个或多个,包含其它字符将会抛出异常。另外,同一个字符串里面同一泡利算符的比特索引不能相同,例如:PauliOperator("Z0 Z0", 2)将会抛出异常。

泡利算符类之间可以做加、减、乘等操作,计算返回结果还是一个泡利算符类。

using namespace QPanda;


PauliOperator a("Z0 Z1", 2);

PauliOperator b("X5 Y6", 3);


PauliOperator plus = a + b;

PauliOperator minus = a - b;

PauliOperator muliply = a * b;

泡利算符类支持打印功能,我们可以将泡利算符类打印输出到屏幕上,方便查看其值。

using namespace QPanda;


PauliOperator a("Z0 Z1", 2);


std::cout << a << std::endl

我们在实际使用的时候,常常需要知道该泡利算符类操作了多少个量子比特,这时候我们通过调用泡利算符类getMaxIndex接口即可得到。如果是空的泡利算符类调用getMaxIndex接口则返回0,否则返回其最大下标索引值加1的结果。

using namespace QPanda;


PauliOperator a("Z0 Z1", 2);

PauliOperator b("X5 Y6", 3);


// 输出的值为2

std::cout << a.getMaxIndex() << std::endl;

// 输出的值为7

std::cout << b.getMaxIndex() << std::endl;

如果我们构造的的泡利算符类,其中泡利算符的下标索引不是从0开始分配的,例如PauliOperator b("X5 Y6", 3)调用getMaxIndex接口返回的使用的比特数是7,其实 只使用了2个比特。我们如何才能返回其真实用到的比特数呢。我们可以调用泡利算符类里面remapQubitIndex接口,它的功能是对泡利算符类中的索引从0比特开始分配映射, 并返回新的泡利算符类,该接口需要传入一个map来保存前后下标的映射关系。

using namespace QPanda;


PauliOperator b("X5 Y6", 3);


std::map<size_t, size_t> index_map;

auto c = b.remapQubitIndex(index_map);


// 输出的值为7

std::cout << b.getMaxIndex() << std::endl;

// 输出的值为2

std::cout << c.getMaxIndex() << std::endl;

实例

以下实例主要是展示PauliOperator接口的使用方式。

#include "Operator/PauliOperator.h"


int main()

{ 

     QPanda::PauliOperator a("Z0 Z1", 2); 

     QPanda::PauliOperator b("X5 Y6", 3); 

     

     auto plus = a + b; 

     auto minus = a - b; 

     auto muliply = a * b; 


     std::cout << "a + b = " << plus << std::endl << std::endl; 

     std::cout << "a - b = " << minus << std::endl << std::endl; 

     std::cout << "a * b = " << muliply << std::endl << std::endl; 


     std::cout << "Index : " << muliply.getMaxIndex() << std::endl << std::endl;      

    

     std::map<size_t, size_t> index_map; 

     auto remap_pauli = muliply.remapQubitIndex(index_map);  


     std::cout << "remap_pauli : " << remap_pauli << std::endl << std::endl;                     

std::cout << "Index : " << remap_pauli.getMaxIndex() << std::endl; 


     return 0;

}

★以上即为QPanda 2泡利算符类部分的详细内容介绍。

★感兴趣的欢迎加入"QPanda 2开发交流群"。(关注“本源量子”公众号,回复“加群”,联系小编即可)

★PC端学习量子计算请登录learn-quantum.com 

★掌上学习请下载"本源溯知APP"

★如有疑问可上量子互动论坛,与我们的大神进行交流讨论。



往期精彩回顾

量子程序序列化以及解析量子程序的二进制文件

逻辑门以及量子程序时钟周期统计

量子门的有效性及判断方法

量子比特的测量方法:量子测量和概率测量

QPanda 2最常用的量子计算模型——量子线路

嗨玩本源QPanda 2,从量子逻辑门实例开始学起!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存