当前位置:网站首页>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;
}边栏推荐
- ftplib+ tqdm upload and download progress bar
- 5G China unicom AP:B SMS ASCII Transcoding Requirements
- ARM板卡增加路由功能
- Sandbox中的进程/线程相关-1
- Microsoft 10/11 命令行打开系统设置页(WUAP,!WIN32)
- Process/Thread Related in Sandbox - 2
- Yocto 可以下载的第三方库
- GIN file upload and return
- kustomize入门示例及基本语法使用说明
- GET POST PUT DELETE request in GIN
猜你喜欢

电脑重装系统后桌面图标如何调小尺寸

面试攻略系列(三)-- 高级开发工程师面试问些啥?

为什么文字不贴合边

5G China unicom repeater network management protocol real-time requirements

快来扔鸡蛋。

Periodic sharing of Alibaba Da Tao system model governance

jenkins api create custom pipeline

【瑞吉外卖】day05:增、删、改、查分类以及公共字段自动填充

GIN文件上传与返回

How to solve the 0x80070005 error when the computer is reinstalled and the system is restored
随机推荐
R语言kaggle 游戏数据探索与可视化
render解析
安踏携手华为运动健康共同验证冠军跑鞋 创新引领中国体育
NFS pays special attention to the problem of permissions
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(循环不变量)
陈强教授《机器学习及R应用》课程 第十七章作业
jenkins api create custom pipeline
七夕力扣刷不停,343. 整数拆分(剑指 Offer 14- I. 剪绳子、剑指 Offer 14- II. 剪绳子 II)
从NPU-SLAM-EDA技术分析
Oracle Recovery Tools修复空闲坏块
Dry+Bean+Dataset R语言数据分析,报告英文
Ledong Fire Rescue Brigade was invited to carry out fire safety training for cadres
Yocto 可以下载的第三方库
Rmarkdown教程
万物皆可柯里化的 Ramda.js
[极客大挑战 2019]Upload
用plot_hist_numeric()实现画直方图
Uni - app - uview Swiper shuffling figure component, click on the links to jump (click to get the item after the row data, remove data operation)
第六届”蓝帽杯“全国大学生网络安全技能大赛 半决赛
剑指 Offer 43. 1~n 整数中 1 出现的次数(递归、数学)