量子计算(7)pyqpanda编程2循环与条件判断

news2024/9/22 1:56:22

   

目录

一、QWhile

二、QIf


        各位读者老爷们,大家好呀,前些时忙着学校的期末考试,小编好久没更新量子计算的文章啦,这段时间也有读者私信小编,问了一些问题。我知道大家都很急,但大家先别急。这不,小编刚考完就来更新量子计算的文章啦,感谢大家的支持!

       谈到量子计算,这里就不得不提一部电影了。相信很多读者在寒假春节档看过《流浪地球2》这部电影(可能还有《流浪气球3》),未来的计算机550A、550C与550w(最后化身为MOSS)都是量子计算机,其计算速度一代比一代快,我相信这也是各位读者想要学好量子计算的原因。这是一部科幻片,它思考了人类的未来是怎么样的,科技水平是怎么样的,而我们负责将这些幻想一个一个实现,尽管有一定的困难。革命尚未成功,各位读者们还需努力!

 

一、QWhile

        在c语言与python中,我们可以构造一个while或者for来构造循环。我们在量子程序中用QWhile实现循环控制操作,输入参数为条件判断表达式,功能是执行while循环操作。其构造方式如下:

qwile = QWhileProg(ClassicalCondition, QNode)

        上述函数需要提供两个参数,即ClassicalCondition量子表达式与QNode节点 可以传入的QNode类型有: QProg、QCircuit、QGate、QWhileProg、QIfProg、QMeasure。

        我知道大家看到上面这些话会感觉到特别懵,啥玩意儿,小编你这不是念课本吗,听君一席话,胜似一席话,说了等于没说。别急,如果只是这么干巴巴的讲知识点,就会略显无聊,我们上一个例子,让大家感受一下。

from pyqpanda import *

if __name__ == "__main__":

    qvm = CPUQVM()
    qvm.init_qvm()
    qubits = qvm.qAlloc_many(3)
    cbits = qvm.cAlloc_many(3)
    cbits[0].set_val(0)
    cbits[1].set_val(1)

    prog = QProg()
    prog_while = QProg()

    # 构建QWhile的循环分支
    prog_while << H(qubits[0]) << H(qubits[1])<< H(qubits[2])\
            << measure_all(qubits, cbits)

    # 构建QWhile
    qwhile = QWhileProg(cbits[1], prog_while)

    # QWhile插入到量子程序中
    prog << qwhile

    # 运行,并打印测量结果
    result = qvm.directly_run(prog)
    print(result)
    print(cbits[1].get_val())

        看不懂没事的哈,听小编给你说道说道。不过小编在这里给大家提一个小小的要求,听完小编的分析后,请大家算一算输出的结果是多少

        首先前几行,小编只想通俗易懂的说一个字:略。详情看小编上一篇量子计算的文章。不过小编像先请读者们思考一下,为什么qubits的数量要与经典寄存器cbits的数量一致。这个问题困扰了小编一阵子,直到今天查阅资料的时候,才真正解决掉。

        然后再是set_val()函数,它的作用是赋值,即cbits[0]赋值为0,cbits[1]赋值为1。到这里都不难理解。紧接着就是构建了一个while的量子程序。我们先看qwhile=xxx的这一行。首先判定条件为cbits[1],而在计算机中0代表着False,1代表着True。也就是说cbits[1]为0时,才会执行prog_while循环。

        接着,我们就要看看prog_while是何方神圣,如何执行这一循环了。

        结果乍一看,这不就是在三条量子线路上分别加了一个H门吗,然后再进行测量,而H门的作用是使|1>态与|0>态的概率各占一半。但是,cbits[1]为0时我们才能跳出循环,而小编通过查阅资料发现measure_all操作是测量所有的量子比特并将其存储到对应的经典寄存器上。也就是说只有qubits[1]为|0>时才能跳出循环,此时cbits[1]被赋值为0。所以qubits[1]最后测量的结果一定是|0>。如果是|1>则会不断重复循环,直到某一次测量结果为|0>。

        这也是为什么qubits的数量与cbits的数量一致的原因,正所谓一个萝卜一个坑,这样做是为了我们测量结果着想。如果不一致会报错,如下图:

 

        那么问题来了,有没有哪位读者能告诉我,最后程序跑出的结果是多少?小编将答案写在评论区。

    

二、QIf

        QIf表示量子程序条件判断操作,输入参数为条件判断表达式,功能是执行条件判断。具体形式有以下两种:

qif = QIfProg(ClassicalCondition, QNode)
qif = QIfProg(ClassicalCondition, QNode, QNode)

        它需要我们提供两种类型参数,即ClassicalCondition量子表达式与QNode节点, 当传入1个QNode参数时,QNode表示正确分支节点,当传入2个QNode参数时,第一个表示正确分支节点,第二个表示错误分支节点。

        其中QNode可以传入QProg、QCircuit、QGate、QWhileProg、QIfProg、QMeasure。

        我们用代码举一个小小的例子:

from pyqpanda import *

if __name__ == "__main__":

    qvm = CPUQVM()
    qvm.init_qvm()
    qubits = qvm.qAlloc_many(3)
    cbits = qvm.cAlloc_many(3)
    cbits[0].set_val(0)
    cbits[1].set_val(3)

    prog = QProg()
    branch_true = QProg()
    branch_false = QProg()

    # 构建QIf正确分支以及错误分支
    branch_true << H(qubits[0])<< H(qubits[1]) << H(qubits[2])
    branch_false << H(qubits[0]) << CNOT(qubits[0], qubits[1]) << CNOT(qubits[1], qubits[2])

    # 构建QIf
    qif = QIfProg(cbits[0] > cbits[1], branch_true, branch_false)

    # QIf插入到量子程序中
    prog << qif

    # 概率测量,并返回目标量子比特的概率测量结果,下标为十进制
    result = qvm.prob_run_tuple_list(prog, qubits, -1)

    # 打印概率测量结果
    print(result)

        乍一看,看不大懂,对吧?别急,小编也是刚开始学量子编程,我按照自己的理解一点一点为读者们解读。

        首先前面几行,都是老生常谈的内容。无非就是上一篇文章我们说的导入pyqpanda包、创建量子虚拟机以及申请量子比特以及量子寄存器。而cbits[0].set_val(0)的意思是,给cbits[0]设置初值为0,同理cbits[1]的初值为3。

        我们先跳过branch_true与branch_false这两行,直接看qif=xxx这一行,它代表着如果cbits[0]>cbits[1],那么就执行branch_true的量子程序指令,否则就执行branch_false的量子程序指令。显然0不可能大于3,所以我们执行branch_false的量子程序指令。

        再来看看branch_false做了什么操作。首先将qubits[0]转变为|+>态,并且通过qubits[0]去控制qubits[1],用qubits[1]去控制qubits[2]。我们不难发现,qubits[0]为|1>时,才能让qubits[1]变为|1>,qubits[2]才能跟着变为|1>。且qubits[0]为|0>或者|1>的概率各占一半。

        所以最终测量|000>与|111>的概率各占一半。结果如下图(转换为了十进制):

        好的,本期的量子计算编程教学就到这里啦,感兴趣的读者们可以私下自己设计设计量子线路,编编程,希望小编的文章能给大家带来帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】——队列

文章目录前言一.什么是队列&#xff0c;队列的特点二、队列相关操作队列的相关操作声明队列的创建1.队列的初始化2.对队列进行销毁3.判断队列是否为空队列4.入队操作5.出队操作6.取出队头数据7. 取出队尾数据8.计算队伍的人数总结前言 本文章讲述的是数据结构的特殊线性表——…

Python3 错误和异常实例及演示

作为 Python 初学者&#xff0c;在刚学习 Python 编程时&#xff0c;经常会看到一些报错信息&#xff0c;在前面我们没有提及&#xff0c;这章节我们会专门介绍。 Python 有2种错误很容易辨认&#xff1a;语法错误和异常。 Python assert&#xff08;断言&#xff09;用于判断…

通信算法之一百零四:QPSK完整收发仿真链路

1.发射机物理层基带仿真链路 1.1 % Generates the data to be transmitted [transmittedBin, ~] BitGenerator(); 2.2 % Modulates the bits into QPSK symbols modulatedData QPSKModulator(transmittedBin); 2.3 % Square root Raised Cosine Transmit Filter %comm…

SpringBoot参数请求处理

一、请求映射 请求映射原理 DispatcherServlet 继承了 FrameworkServlet(抽象类&#xff0c;继承了 HttpServletBean&#xff0c;实现了 ApplicationContextAware 接口)&#xff0c;重写了 doService() 方法 在 doService() 方法里定义了 doDispatch() 方法&#xff1b;doDi…

概论_第7章_参数估计_真题__求置信区间

真题 2014.10 第30题 测量某物体的质量9次&#xff0c; 测得平均值 x‾15.4\overline x 15.4x15.4 g, 已知测量数据 XXX ~ N(μ,0.09)N(\mu, 0.09)N(μ,0.09) (1) 求该物体质量的置信度为0.95 的置信区间&#xff1b; &#xff08;2&#xff09;为了使置信度为0.95 的置信区间…

20 堆排序

文章目录1 堆排序的概念2 堆排序基本思想3 堆排序步骤图解说明4 堆排序的代码实现1 堆排序的概念 1) 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为 O(nlogn)&#xf…

Spring中BeanPostProcessor与循环依赖的问题

Spring中后置处理器与循环依赖的问题 在Spring的bean生命周期中, 我们可以通过实现BeanPostProcessor来对bean初始化前后做操作, 在网上的许多帖子博客中, 不乏可以看见说Spring的AOP是在后置处理器中实现的, 这个理解显然有失偏颇, 很容易误导一般人在后置处理器中对原先的be…

Android 一帧绘制流程分析笔记

和你一起终身学习&#xff0c;这里是程序员Android经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点:一、显示一帧流程概览二、生产者&#xff0c;消费者 BufferQueue 流转图三、App &#xff0c;SF Buffer 交互图四、SF 跟 HWC 交互图一、显示一帧流程概览…

16.CSS中使用颜色

使用颜色 在计算机中&#xff0c;传统的模型之一为RGB模型&#xff0c;所有颜色都是通过红色、蓝色、绿色三种颜色进行组合&#xff1b;我们通过数值去表示 例如&#xff1a; 红色&#xff08;255.0.0&#xff09;、蓝色&#xff08;0.0.255&#xff09;、绿色&#xff08;0.…

在IDEA中配置jeesite-(文章链接汇总)

建议按照文章顺序操作 原文里可以下载geesite项目 jeesite-github原文链接 jeesite-gitee原文链接–国内推荐 可 直 接 跳 到 此 步 骤 环境准备&#xff1a;JDK 1.8 or 11、17、Maven 3.6、使用 MySQL 5.7 or 8.0 数据库 1-Maven的下载安装配置教程&#xff08;详细图文&am…

Vue3之循环渲染

1.何为循环渲染 在Vue3中&#xff0c;当我们需要渲染一个数组中的数据到dom元素上时&#xff0c;就需要使用循环渲染。循环渲染可以节约我们大量重复冗余的工作&#xff0c;比如我们去渲染一个下拉菜单的时候&#xff0c;如果不使用循环渲染&#xff0c;那么我们需要手动一项一…

2023美赛C代码思路结果【全部更新完毕】注释详尽

C题已完成全部代码&#xff0c;注释详尽&#xff0c;并增加扰动项&#xff0c;保证大家的结果不会撞 需要全部问题的可以点击&#xff1a;https://www.jdmm.cc/file/2708697/ 下面贴出核心代码&#xff1a; -- coding: utf-8 -- TODO: 入口函数 import numpy as np from…

Mr. Cappuccino的第43杯咖啡——Kubernetes之Pod控制器(二)

Kubernetes之Pod控制器Horizontal Pod Autoscaler&#xff08;HPA&#xff09;安装metrics-server创建Pod创建HPA压力测试JobCronJobHorizontal Pod Autoscaler&#xff08;HPA&#xff09; 上篇文章中所说的ReplicaSet和Deployment&#xff0c;我们已经可以通过手动执行kubec…

Shiro1.9学习笔记

文章目录一、Shiro概述1、Shiro简介1.1 介绍1.2 Shiro特点2、Shiro与SpringSecurity的对比3、Shiro基本功能4、Shiro原理4.1 Shiro 架构(外部)4.2 shiro架构(内部)二、Shiro基本使用1、环境准备2、登录认证2.1 登录认证概念2.2 登录认证基本流程2.3 登录认证实例2.4 身份认证源…

WordPress网站伪静态及固定链接设置教程

WordPress网站伪静态及固定链接设置教程-解决404错误问题!搭建好WordPress网站之后我个人建议首先要做的就是设置好固定链接&#xff0c;WordPress的固定链接也就是网站各个页面的链接格式&#xff0c;默认的方式不太符合现代化网站&#xff0c;推荐使用自定义的方案。既然涉及…

良许翻天覆地的2022年

大家好&#xff0c;我是良许&#xff0c;新年快乐呀~ 在我女室友坚持不懈的努力之下&#xff0c;2022年的最后一天我终于被她传染了&#xff0c;阳了~ 此时的我&#xff0c;正顶着37多度的低烧写下这篇年终总结。 2022年&#xff0c;对于大多数人而言&#xff0c;封控是主旋…

Git使用小乌龟克隆与推送代码Gitee--零命令行(组员版本)

目录 上一篇文章&#xff08;必读&#xff01;&#xff01;&#xff01;&#xff09; 概述 分支概念&#xff08;权限分配&#xff09;&#xff1a; 总体操作思想&#xff1a; 操作步骤 一、组员第一天上班&#xff08;云端仓库代码克隆到本地仓库进行代码编写&#xff…

网日志处理中的应用架构-《大数据时代的IT架构设计》

用户的上网行为中蕴含着大量的客户特征和客户需求信息&#xff0c;这些信息至关重要,这就要求用户的上网日志记录必须被保存&#xff0c;而且还需要进行数据分析挖掘处理&#xff0c;然后根据处理结果定义用户的行为习惯&#xff0c;为电信运营商实现精细化运营提供重要的营销依…

【数据库】Clickhouse 实践之路

文章目录背景Clickhouse简介为什么选择ClickhouseClickhouse特性Clickhouse建设整体架构数据接入层数据存储层数据服务层数据应用层Clickhouse运维管理平台配置文件结构元数据管理自动化运维用户管理集群操作监控与报警Clickhouse应用BI查询引擎核心诉求选型对比集群构建问题及…

基于jeecgboot的flowable流程设计器的几个bug修复

因为今天在用任务监听器的时候&#xff0c;出现几个bug&#xff0c;所以一并修复与处理。 一、建立任务监听器后&#xff0c;删除不了 主要有两个原因&#xff0c;一个是点击删除没反应&#xff0c;实际上是弹出框跑到后面去了&#xff0c;说明还是z-index问题&#xff0c;调整…