当前位置:网站首页>Q_06_05 文件结构
Q_06_05 文件结构
2022-08-09 13:02:00 【MOVCat】
文件结构
AQ#文件由一个或多个名称空间声明组成。
每个名称空间声明都包含用户定义类型,操作和函数的定义。名称空间声明可以包含任何数量的每种类型的定义,但它必须至少包含一个定义。
用户定义的类型声明
Q#为用户声明新的用户定义类型提供了一种方式,如Q#类型模型部分中所述。即使基础类型相同,用户定义的类型也是不同的。特别是,如果底层类型相同,则两个用户定义类型之间不会自动转换。
用户定义的类型声明包含关键字newtype ,后跟用户定义类型的名称,an = ,有效类型说明和终止分号。
例如:
newtype PairOfInts = (Int, Int); 一个文件可能包含零个或多个用户定义的类型声明。类型名称在命名空间中必须是唯一的,并且不能与操作和函数名称冲突。
操作定义
操作是Q#的核心,大致类似于其他语言的功能。每个Q#源文件可以定义任意数量的操作,如果该文件仅定义一个或多个用户定义的类型,则包括无。
操作定义由关键字operation ,后面跟着操作名称的符号,定义操作参数的类型化标识符元组,冒号: ,描述操作结果类型的类型注释,开放大括号{ 一个可选的主体定义,一个可选的关联定义,一个可选的受控定义,一个可选的受控关联定义以及一个最终关闭大括号} 。
一个操作应该定义一个受控的伴随变体,当且仅当它定义了一个受控变体和一个伴随变体。
操作名称在命名空间中必须是唯一的,并且不能与类型和函数名称冲突。
身体
操作的主体是实现操作的Q#代码。无身体定义手术是合法的;比如像Paulis和Hadamard门这样的基本操作就是这样定义的。一个主体定义由关键字body ,后跟一个语句块。
伴随
伴随操作指定如何实现操作的复共轭转置。指定无伴随操作是合法的;例如,测量操作没有伴随因为它们不可逆。当且仅当其声明包含伴随声明时,操作才支持Adjoint函数。
一个伴随定义由关键词adjoint ,其次是以下之一:
- 关键字
self表明操作是它自己的伴随。 - 关键字
auto表示Q#编译器应根据操作的主体为操作生成伴随点。生成的版本将应用身体中每个量子操作的伴随,与身体中的顺序相反。非量子代码可以重新组织以确保在使用它们之前计算值。 - 一个实现操作伴随的语句块。
因此,一个操作定义包含
adjoint self 要么
adjoint auto 要么
adjoint { // Code for the adjoint goes here } 如果没有这些出现,则不定义伴随。
一个操作的主体包含repeat-until-success循环,set语句和/或对不支持Adjoint函数的其他操作的测量或调用,可能不会指定auto关键字。
如果一个操作没有主体,但应该定义一个伴随,它应该指定adjoint auto或adjoint self 。
受控
操作的受控版本指定如何实施量子控制版本的操作。上面的受控部分提供了更完整的描述。
指定没有受控版本的操作是合法的;例如,测量操作没有受控版本,因为它们不可控。当且仅当其定义包含受控定义时,操作才支持Controlled仿函数。
受控定义由受控关键字组成,后跟以下之一:
- 关键字
auto指示Q#编译器应根据操作的主体生成操作的受控版本。生成的版本将对每个量子操作应用量子控制。非量子码将不被修改。 - A
(一个将是控制量子位数组变量名称的符号)以及一个实现受控操作版本的语句块。
因此,一个操作定义包含
controlled auto 要么
controlled (controls) {
// Code for the controlled version goes here.
// "controls" is bound to the array of control qubits.
}一个操作,其主体包含repeat-until-success循环或测量,或者调用不支持Controlled仿函数的另一个操作,可能不指定auto关键字。
如果一个操作没有主体,但应该有一个受控的版本定义,它应该指定controlled auto 。
受控伴随
操作的受控伴随版本指定如何实现操作的伴随量子控制版本。指定没有受控伴随版本的操作是合法的;例如,测量操作没有受控的伴随版本,因为它们既不可控也不可逆。
一个操作应该定义一个受控的伴随变体,当且仅当它定义了一个受控变体和一个伴随变体。
受控的伴随定义由关键字adjoint ,然后由关键字controlled ,后面的关键字是关键字auto表示Q#编译器应根据操作的主体生成操作的受控伴随版本,或者由(是保存控制量子位数组的变量的名称) ,以及实现操作的受控伴随版本的语句块。
一个操作,其主体包含repeat-until-success循环,set语句和/或对没有受控伴音版本的其他操作的测量或调用,可能不指定auto关键字。
如果为操作的伴随版本或受控版本提供了语句块,并且为受控伴随版本指定了auto ,则所提供的语句块用于生成受控伴随版本。如果为两者提供了一个语句块,并且控制的伴随版本被指定为auto ,那么将从受控版本的语句块生成受控伴随版本。
如果一个操作没有正文,但应该有一个受控的伴随版本定义,它应该指定adjoint controlled auto 。
操作定义
操作定义可能如下所示,它定义了原始泡利X操作:
operation X (q : Qubit) : () {
adjoint self
controlled auto
adjoint controlled auto
}以下定义了传送操作。
namespace Microsoft.Quantum.Samples {
// Entangle two qubits.
// Assumes that both qubits are in the |0> state.
operation EPR (q1 : Qubit, q2 : Qubit) : () {
body
{
H(q2);
CNOT(q2, q1);
}
}
// Teleport the quantum state of the source to the target.
// Assumes that the target is in the |0> state.
operation Teleport (source : Qubit, target : Qubit) : () {
body {
// Get a temporary for the Bell pair
using (ancilla = Qubit[1]) {
let temp = ancilla[0];
// Create a Bell pair between the temporary and the target
EPR(target, temp);
// Do the teleportation
CNOT(source, temp);
H(source);
if (M(source) == One) {
X(target);
}
if (M(temp) == One) {
Z(target);
}
}
}
}
}功能定义
函数纯粹是Q#中的经典例程。每个Q#源文件可以定义任意数量的函数,包括无。
一个函数定义由关键字function ,后面是作为函数名称的符号,作为操作的类型化标识符元组,描述函数结果类型的类型注释以及定义函数的语句块。
请注意,定义函数的语句块必须像任何其他语句块一样包含在{ 和} 。外部定义需要终止分号。
函数名称在名称空间内必须是唯一的,并且不得与操作和类型名称冲突。函数可能不会分配量子位或调用操作。
例如,
function DotProduct(a : Double[], b : Double[]) : Double {
if (Length(a) != Length(b) {
fail "Arrays are not compatible";
}
mutable accum = 0.0;
for (i in 0..Length(a)-1) {
set accum = accum + a[i] * b[i];
}
return accum;
}边栏推荐
- Rmarkdown Tutorial
- WPF 系统托盘 图标闪烁
- JS动画函数封装
- 基于 R 语言的深度学习——简单回归案例
- uni-app - uview Swiper 轮播图组件点击跳转链接(点击后拿到 item 行数据, 取出数据做操作)
- gin's middleware and routing grouping
- [MRCTF2020]套娃-1
- FFmpeg multimedia file processing (FFMPEG logging system)
- kustomize entry example and basic syntax instructions
- 【瑞吉外卖】day05:增、删、改、查分类以及公共字段自动填充
猜你喜欢

搭建大型分布式服务(四)Docker搭建开发环境安装Mysql

5G Unicom Network Management Design Ideas

阿里大淘系模型治理阶段性分享

Jenkins API groovy calling practice: Jenkins Core Api & Job DSL to create a project

缓存和数据库一致性问题

技嘉显卡 RGBFusion 不能调光解决方法

#WeArePlay | 与更多开发者一起,探索新世界

Anta and Huawei Sports Health jointly verify the champion running shoes and lead Chinese sports with innovation

kustomize entry example and basic syntax instructions

第六届”蓝帽杯“全国大学生网络安全技能大赛 半决赛
随机推荐
FFmpeg多媒体文件处理(ffmpeg操作目录及list的实现)
FPGA中串口通信的时钟频率和波特率计数
如何求最大公约数?
搭建大型分布式服务(二)搭建会员服务
read stream 特别注意
FPGA-在ISE中错误总结(更新中)
从NPU-SLAM-EDA技术分析
【FPGA教程案例48】图像案例8——基于FPGA的RGB图像转化为HSV图像的实现,通过MATLAB进行辅助验证
gin的中间件和路由分组
面试攻略系列(三)-- 高级开发工程师面试问些啥?
JS动画函数封装
5G China unicom AP:B SMS ASCII Transcoding Requirements
面试攻略系列(四)-- 你不知道的大厂面试
npm install失败
kustomize入门示例及基本语法使用说明
IDEA Gradle 常遇问题(二)(持续更新)
用plot_hist_numeric()实现画直方图
陈强教授《机器学习及R应用》课程 第十六章作业
FFmpeg多媒体文件处理(FFMPEG日志系统)
Map mixed density function and quantile added line