TN Tutorial(0-1):建立量子态,演化门实例等

2024-01-18 22:10

本文主要是介绍TN Tutorial(0-1):建立量子态,演化门实例等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 本节是注解搭建ADQC必要的基础模块:

* 初始化量子态:Library.QuantumState.TensorPureState ( ) 要传参建立实例,MF只能建立参数

   (1)Psi = TensorPureState( psi_ ):psi_作为一个 2**num_qbits 交由MF建立的参数张量

        psi_ = qs.state_all_up( n_qubits = 3,d = 2) 返回一个|000>态

          

        psi_ = qs.state_ghz( n_qubit = 3) 返回一个\frac{1}{\sqrt2} (|000> + |111>) 态

             

        up = tc.tensor([1.0,0.0]).to( dtype = tc.float64 ) + psi_ = tc.einsum('a,b,c -> abc ',up,up,up)

        

   (2)Psi = TensorPureState( nq = 4 )随机建立态,以及如果有机会你会看到后面ADQC会在         建立一个随机目标态psi_target(只作为计算保真度的部分并不参与线路演化) 我们对比一下:

      Psi: 梦开始的地方|000》

       

      Psi:nq=4 的 TensorPureState( )

       

     返回一个一长串高阶张量,conj( ).flatten( ),获得可以拿去点积的平展形式

    

     这简直就是psi_target:     

   

* 定义门:建立了Psi 实例后,MathFun可以提供演化门的细节

    (1)mf.pauli_operators( ), mf.swap( ), mf.hadamard( ), mf.phase_shift( ):QFT_3的手写例子

print('初态为|000>')
up = tc.tensor([1.0, 0.0]).to(dtype=tc.float64)
psi = TensorPureState(tc.einsum('a,b,c->abc', up, up, up))psi.act_single_gate(mf.hadamard(), [0])
psi.act_single_gate(mf.phase_shift(pi/2), [0], [1])
psi.act_single_gate(mf.phase_shift(pi/4), [0], [2])
psi.act_single_gate(mf.hadamard(), [1])
psi.act_single_gate(mf.phase_shift(pi/2), [1], [2])
psi.act_single_gate(mf.hadamard(), [2])

    (2)Psi.act_single_gate( ) StaeOP.py传4*4矩阵,内置函数细节可以转换为2*2*2*2的张量:

psi0_ = ghz.clone()
psi0 = qs.TensorPureState(psi0_)cnot = tc.tensor([[1, 0, 0, 0], [0, 1, 0, 0],[0, 0, 0, 1], [0, 0, 1, 0]]).to(dtype=tc.float64)print('在量子位1(控制)与2(目标)上作用矩阵上传的CNOT后得:')
psi1.act_single_gate(cnot, [1, 2])
print(psi1.tensor.flatten())print('在量子位1(控制)与2(目标)上作用2*2*2*2张量上传的CNOT后得:')
psi0.act_single_gate(cnot.reshape(2,2,2,2), [1, 2])
print(psi1.tensor.flatten())​

 psi0 ~ psi1原理在于:act_single_gate类函数l56-l68里有reshape,转成合乎多体演化的多阶张量

for pp in pos_control:perm.remove(pp)perm = pos + perm + pos_controlstate1 = self.tensor.permute(perm).reshape(2 ** m_p, -1, 2 ** m_c)state1_ = state1[:, :, :-1]state2_ = gate.reshape(-1, 2 ** m_p).mm(state1[:, :, -1])state1 = tc.cat([state1_, state2_.reshape(state2_.shape + (1,))], dim=-1)

    (3)ADGate 那章有模块化编程之后细讲:

 有了模块化编程就豁然开朗,如果说前面都是教学工具的话,开发到这一步到这一步才像  vqnet,qiskit_learning等专业框架一样,真上道了。。。。orz.

* 量子态演化:act_single_gate(gate,cqbit1,cqbit2) 方法(1,2 制备均匀叠加态)

    (1)Psi.act_single_gate( ), 插入门演化量子态的直接方法

U.append(mf.hadamard())psi_ = qs.state_all_up(4, 2).to(dtype=tc.float64)
Psi = qs.TensorPureState(psi_)
Psi.act_single_gate(U[0],[0])
Psi.act_single_gate(U[0],[1])
Psi.act_single_gate(U[0],[2])
Psi.act_single_gate(U[0],[3])

    (2)Psi.observation( gate,[qbit_nth] ), 直接获取该位置的期望值

   

    (3)Psi.reduced_density_matrix( ), 获取该位置约化密度矩阵进行svdvals后获得纠缠谱

      * 这是一个对 nq=4 的 4-qubits 随机态的采样,详见rmd_sample.py

   

    原理上要获得(2,3)间的纠缠谱:permute(1,2,0,3)再reshape(4,4),并且与自己点积     

print('求[1,2]位置对应的约化密度矩阵')
psi = TensorPureState(nq=4)  # 4-qubit随机量子态
rmd1 = psi.reduced_density_matrix([1, 2])tmp = psi.tensor.permute(1, 2, 0, 3).reshape(4, 4)
rmd2 = tmp.mm(tmp.t())
print('两种方法结果的差 = ', (rmd1 - rmd2).norm().item())

值得一提的约化密度矩阵的原理与张量的向量化:                                                                                    

 之后的张量网络收缩里我们也有这个矩阵化,规则人话说就是把指标分成两组各自将指标向量化(abc...)x(ABCD...)把各元素的访问索引返回成一个矩阵:所谓向量化,是指返回一个向量,   依原tensor指标先后次序, 将元素索引一 一访问后获得的线性排布。

    (4)Psi.sampling( 2048 , [3] ), 跟随qbits[3],随机采样2048次,获得结果分布

    

    (5)Psi.bipartite_ent([0,1])纠缠谱,与其它几个谱方法的比较:

       * Psi返回的奇异谱:

s0 = svdvals(psi.tensor.reshape(4, 4))
print('SVD获得的奇异值:\n', s0)

        * Psi约化矩阵返回的本征谱: 

rho = psi.reduced_density_matrix([2, 3])
s1 = eigvalsh(rho)
print('约化矩阵rho[2,3]的本征值(开方):\n',sqrt(s1.sort(descending=True)[0]))

        * Psi约化矩阵成员函数的二分纠缠谱: 

print('调用成员函数获得的本征谱:\n',psi.bipartite_ent([0, 1]))

纠缠谱,纠缠熵:纠缠熵作为纠缠谱的平方的概率分布,算纠缠熵,刻画了两个子体系之间的纠缠大小;此外,不同的二分方式确定了不同的奇异谱或纠缠谱的计算方式,体现在对量子态系数 的矩阵化。纠缠谱平方本质上也是对应约化密度矩阵的本征谱。

* 量子态演化:act_N_qubit_QFT(psi)方法

    (1)原理:

     

  (2)规则与运行:

           * 毕竟是一组门实例的封装的,可以指定qbit_nth对psi进行局部qft

           * 在pos送入一个list装载待qft的qbits

​#对|0000> 0,1,2号位进行QFT:
psi_test = TensorPureState(tc.einsum('a,b,c,d->abcd',up,up,up,up))
psi_test = act_N_qubit_QFT(psi_test,pos = [0,1,2])
#对|0000> 0,1,3号位进行QFT:
psi_test = TensorPureState(tc.einsum('a,b,c,d->abcd',up,up,up,up))
psi_test = act_N_qubit_QFT(psi_test,pos = [0,1,3])

   * 表示一下对psi[0,1,2],psi[0,1,3],进行的QFT编码

  

 

* 建立并运行一个完整的量子线路实例,我们就是把它分成以上三个部分来完成的:(1)建立量子态实例psi;(2)演化量子线路,psi.act_single_gate或者是psi.act_N_qubits_QFT ;(3)psi的测量与运行结果的处理。

这篇关于TN Tutorial(0-1):建立量子态,演化门实例等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620412

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

OpenStack离线Train版安装系列—11.5实例使用-Cinder存储服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack实例操作选项解释:启动和停止instance实例

关于启动和停止OpenStack实例 如果你想要启动和停止OpenStack实例时,有四种方法可以考虑。 管理员可以暂停、挂起、搁置、停止OpenStack 的计算实例。但是这些方法之间有什么不同之处? 目录 关于启动和停止OpenStack实例1.暂停和取消暂停实例2.挂起和恢复实例3.搁置(废弃)实例和取消废弃实例4.停止(删除)实例 1.暂停和取消暂停实例