当前位置:网站首页>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;
}边栏推荐
- 2.微服务'黑话'集锦及Eureka注册中心相关概念
- 面试攻略系列(三)-- 高级开发工程师面试问些啥?
- offset、client、scroll、window.pageYOffset比较
- Yocto 可以下载的第三方库
- 【FPGA教程案例48】图像案例8——基于FPGA的RGB图像转化为HSV图像的实现,通过MATLAB进行辅助验证
- 绘制混合密度函数图以及添加分位数线
- How to solve the 0x80070005 error when the computer is reinstalled and the system is restored
- Sandbox中的进程/线程相关-1
- puzzle(016.5)逻辑电路
- JS动画函数封装
猜你喜欢
随机推荐
Professor Chen Qiang's "Machine Learning and R Application" course Chapter 15 Homework
FPGA - Summary of bugs in ISE (in update)
【NVIDIA】Tesla V100安装NVIDIA-Driver驱动程序适配CUDA-Toolkit-11.6
GIN初探,环境安装
The sword refers to the offer, cuts the rope 2
5G 联通网管设计思路
用plot_hist_numeric()实现画直方图
The sword refers to Offer 56 - II. Number of occurrences of a number in an array II (bit operation)
自己做了个nodejs+epxress+mysql的小项目,怎么才能让别人通过互联网访问呢?
Rmarkdown教程
Explanation of RTSP protocol
驻波比计算方法
[极客大挑战 2019]Upload
记录本项目中用到的系统调用与C库函数-2
ArcEngine(八) 选择要素并高亮显示
【奖励公示】第23期 2022年7月奖励名单公示:社区明星评选 | 新人奖 | 博客同步 | 推荐奖
ftplib+ tqdm upload and download progress bar
5G China unicom AP:B SMS ASCII 转码要求
GIN文件上传与返回
R语言kaggle 游戏数据探索与可视化








