量子软件开发包QPanda2学习之路(二)量子程序转化模块

2023-11-08

上一节中提到,QRunes文本是用于表述量子程序的指令集文本,所以在使用QPanda2的过程中不可避免的牵扯到量子程序的转化问题,在QPanda2中提供相关的函数接口支持转化功能的实现。

量子程序转化QRunes模块

欲使用这一功能,我们先进行量子程序的构建。具体看下面这一段简单的示例代码

    init();

    auto prog = CreateEmptyQProg();

    auto cir = CreateEmptyCircuit();

    auto q0 = qAlloc();
    auto q1 = qAlloc();
    auto q2 = qAlloc();
    auto c0 = cAlloc();

    cir << Y(q2) << CNOT(q0,q1) << H(q2);

    auto h1 = H(q1);
    h1.setDagger(true);

    prog << CZ(q0, q2) << H(q1) << CZ(q1, q2) << X(q2) << h1 <<RX(q1,2/PI);

    cout << qProgToQRunes(prog);

    finalize();
   

需要注意的是为了模拟量子计算环境,一定要在程序开始前用init()初始化全局系统资源,在程序结束后用finalize()释放系统资源。

通过CreateEmptyQProg()与CreateEmptyCircuit()创建空的量子程序与量子线路

通过qAlloc()与cAlloc()申请量子比特与经典内存,当然也可以用qAllocmany()与cAllocmany()一次性申请多个

接着就是构建量子程序,值得一提的是量子线路节点中仅包含量子逻辑门节点与其他量子线路节点

然后调用QPanda2的接口来输出量子程序指令集

输出的结果如下:

QINIT 3
CREG 1
CZ 0,2
H 1
CZ 1,2
X 2
DAGGER
H 1
ENDAGGER
RX 1,"0.636620"
Y 2
CNOT 0,1
H 2

量子程序转化QASM

QASM的语法格式与QRunes类似,但是存在些许不同,具体可以参考 QASM介绍 

它的转化过程可以参考如下示例代码

    init();

    auto prog = CreateEmptyQProg();

    auto cir = CreateEmptyCircuit();

    auto q0 = qAlloc();
    auto q1 = qAlloc();
    auto q2 = qAlloc();
    auto c0 = cAlloc();

    cir << Y(q2) << CNOT(q0, q1) << H(q2);

    auto h1 = H(q1);
    h1.setDagger(true);

    prog << CZ(q0, q2) << H(q1) << CZ(q1, q2) << X(q2) << h1<<RX(q1,2/PI) << cir;

    cout << qProgToQASM(prog);

    finalize();

同时转化的结果如下

openqasm 2.0;
qreg q[3];
creg c[1];
h q[1];
x q[2];
hdg q[1];
rx(0.636620) q[1];
y q[2];
rxdg(1.570796) q[0];
rydg(1.570796) q[0];
rxdg(-1.570796) q[0];
rzdg(3.141593) q[1];
rydg(1.570796) q[1];
cnotdg q[0],q[1];
rydg(-1.570796) q[1];
rzdg(-1.570796) q[1];
cnotdg q[0],q[1];
rzdg(-1.570796) q[1];
h q[2];

通过结果可以发现,输出结果较为复杂,这是因为QASM的语法规则对于某些量子逻辑门支持不完善,在QPanda2内部需要通过转化算法将不支持的量子逻辑门转化成支持的量子逻辑门。

QRunes转化量子程序

该功能相当于量子程序转化QRunes的逆过程,借助该功能可以直接书写QRunes量子程序文本文件,然后调用qRunesToQProg()接口完成转换,这样可以省去复杂的量子程序构建过程,提高开发效率

    init();

    auto prog = CreateEmptyQProg();

    qRunesToQProg("D:\\QRunes", prog);

    finalize();

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

量子软件开发包QPanda2学习之路(二)量子程序转化模块 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐