介绍问#¶
量子开发工具包¶
有很多软件框架设计来帮助我们编写量子代码。我尝试了很多人,包括Qiskit,Cirq,森林,ProjectQ,XACC。他们对古典语言框架构建,像Python或c++。在我们看来,最简单的框架使用(学习量子计算和实际的日常开发工作)是微软的量子开发工具包。这就是我们要在这个类中使用。
量子开发工具包有几个重要的功能需要注意。首先,它引入了一个新的语言被称为问# (Q-Sharp)。问#是一种编程语言专门为量子计算机;它让我们获得特殊的运营商和语法,只在量子领域和意义很难实现在传统语言,但让我们的生活作为开发人员更容易。问#很容易接如果你熟悉传统的编程语言,但我们会从最基本的开始,了解更多我们引入新的量子计算的概念在整个课程。
第二件事QDK包括量子模拟器。这个工具可以阅读我们的量子程序和在本地运行它们,经典计算机模拟量子比特我们使用和操作。当地的模拟器可以支持多达30个量子位(最终将采取\ (16 \ cdot 2 ^ {30} \)位,或16 GB的RAM)。这使我们能够测试算法无需访问实际的量子计算机,都是非常昂贵的,基本上用于硬件的研究。
第三,QDK包括完整与Visual Studio ide和VS代码集成。这包括支持智能感知(文档和代码自动完成),语法高亮显示、编译、调试和单元测试。方便的话,我们将使用所有这些东西在这门课!粗略地浏览GitHub显示了一些项目构建支持模块将其引入其他ide。QDK的工具都是基于命令行,所以如果你喜欢开发没有QDK支持在不同的IDE,您仍然可以使用它,它就更手动工作。
最后,问#实际上是一个net语言,. net是一个开源、跨平台运行时,许多不同的语言可以编译和运行。这意味着古典语言c#、c++和IronPython可以调用Q #代码,更重要的是,问#经典代码可以调用一些(但不是全部). net的基础类库。net BCL这是真正有用的,因为有很多有用的实用功能,在开发过程中节省时间和精力。
QDK的参考文档¶
与所有优秀的框架,QDK带来全面的在线文档,你可以在这里找到:
https://docs.microsoft.com/en-us/azure/quantum/user-guide/?view=qsharp-preview
这个网站包含一个完整的解释所有的问# ' s语言特性,如何使用它们的教程,和一套完整的API参考QDK所有的功能和类型。如果你忘记特定功能是如何工作或需要找到一个函数,这个网站将会成为你的最好的朋友。我们要解释最简单的事情问#在这个类中,但有更多的东西比我们可以问#和QDK融入一个为期两天的课程。如果你想继续探索量子计算的世界在我们这里做,你可以使用这个网站作为一个很好的起点。我还将链接到一些更高级的培训和探索物质的类。
在Visual Studio中打开课程解决方案¶
类包中,有一个文件命名介绍Development.sln量子软件。打开这个,应该打开Visual Studio。如果你需要一个进修如何使用Visual Studio,看一看的部分背景进修部分。
有三个项目的解决方案:
- ConsoleSandbox是一个项目你可以使用交互并尝试自己的量子代码通过一个终端/命令提示符。它的设置让你添加和任何你想要的古典或量子代码运行。你可以用它来测试一个想法,一个算法在自定义输入,或任何其他你想要做的。任何事情都可能发生在这个项目!
- CSharpExercises充满了运动的必备部分测试您的静态类型语言的知识。在这个阶段可以忽略他们的类。
- QSharpExercises充满了动手实验室,我们将探索整个课程。每一个
q
文件包含一组练习帮助您理解量子计算的一个方面,并且给你练习使用它从软件工程的角度来看。班上的一些模块会问你完成其中一个实验室一旦你读完它。
一旦你打开解决方案,看一看QSharpReference.qs文件QSharpExercises项目。Q扩展用于问#文件。这个文件包含一个简单的例子最常见的事情,你会倾向于在问#。你可以依靠它快速查找语法或一些函数的名称你忘了;问#的更深入的解释,你会想看看参考文档在微软官方网站。然而,对于这门课,这个引用将涵盖我们所需要的一切。
问#概述¶
代码结构¶
问#是一种简单的语言。它不是面向对象的,至少不是传统意义上的古典OOP语言。它倾向于接近函数式编程范式,尽管它在两者之间的界限越来越模糊。从古典语言的角度来看,我认为问#大致类似于普通C。
问#一个“对象”的概念,因为它有变量和类型系统。这是强类型的,这意味着一个变量有一个良好定义的类型声明和它的时候只能是类型。函数等参数的特定类型只能给这些特定类型。然而,它没有班级的概念。对象在问#没有自己的属性或实例方法;对象只是一种特殊的实例,它们。
(和我们的意思一切在问#是通过静态方法(称为操作在问#)。从本质上讲,当我们编写问#代码,我们只是构建一个群这些静态操作。操作可以有任意多个参数是你想要的,他们可以是任何类型的。他们也可以返回一个变量,就像在大多数古典语言。代码操作可以包含量子,经典,或两者兼而有之——他们在问#完全可以互换。它不在乎范式你使用,它允许您构建逐行基础上任何你想要的。你可以点缀量子和经典代码无论你认为合适的。
问#是一个编译语言,像其他c风格的语言。这不是一个像Python脚本语言。编译器将检查语法和语义正确性和识别任何问题之前运行。当然,它不能抓住一切——问#仍运行时错误(比如试图访问一个无效索引数组),但编译器捕获很多简单的错误。
这是一个简单的例子问#文件:
名称空间MyQuantumProgram{开放Microsoft.Quantum.Intrinsic;/ / / / / #总结/将问候消息打印到控制台。运行HelloWorld():单位{/ /问好!消息(“Hello World !”);}}
这里有几件事需要注意:
- 在问#一切都是裹着名称空间。这是相同的在c#和c++名称空间,它本质上是一样的Java包。Python并没有一种模拟,因为您可以定义在相同的名称空间中跨多个文件。名称空间本质上是命名空间;任何定义在一个名称空间都是可访问的任何引用(进口/使用)名称空间。
- 引用名称空间是完成了开放“开放Microsoft.Quantum关键字,如图所示。内在的“行。一样这是一个有效的“使用”声明在c#或c++或Java或Python的“进口”的声明。它让你参考其他名称空间中,而无需输入整个名称空间的事情。
- 语句都结束了分号。Python对不起各位,这只是其中的一个事情你不得不习惯于问#。
- 这段代码定义了一个操作称为“HelloWorld”。不需要任何参数(空括号后操作)的名称,它不返回任何值。结肠是用来区分参数和返回类型;任何涉及到正确的返回类型。在这种情况下,它的回报单位。单位问#是一样的无效在c#、c++和Java,或基本上是一样的没有一个在Python中。
- 操作(和名称空间)是由一对大括号定义范围,如其他c风格的语言。空格和缩进没关系。
- 文档注释(文档字符串)连接到操作,使用块类型,变量和所有其他的评论,从三个斜杠。官方文档格式字符串减价。
- 在代码中注释完成两个斜杠,像大多数c风格的语言。
- 的消息函数本质上是“打印”功能。这是类似于
Console.WriteLine ()
在c#中,std:: cout < < < < std:: endl的东西
在c++中,system.out.println ()
在Java中,和print ()
在Python中。
运行这个函数将直接打印“Hello World !”程序的输出,无论是控制台,Visual Studio调试终端,或别的东西。
基本类型¶
问#文档涵盖了包括类型,但我在这里总结了重要的:
- 单位基本上是空白的,或没有。它代表了一个空的价值/缺乏价值。
- Int是一个64位带符号整数。注意,这是64位,而不是32位;大多数古典语言会称之为“长”。
- 双是一个64位的浮点数。这是一样的“双重”在c风格的语言,或在Python中“浮动”。
- Bool是一个布尔值,要么真正的或假。
- 字符串是一个Unicode字符序列。这就像一个c# / Java字符串,或者一个str在Python中。
- 量子位是一个量子位。它不公开任何信息(不透明的),但是你可以采取行动量子位与量子盖茨(定义为操作,就像其他一切)。
- 结果代表量子位测量的结果。它实际上是一个枚举有两个可能的值:零这对应于\ \(刃{0}\)状态,一个这对应于\ \(刃{1}\)状态。
- 范围是类似于Python范围——的范围是一个整数序列离散开始,步长,并停止。
使用变量¶
问#分离可变变量(你可以改变后的他们已经定义)从不变的变量。您可以定义一个新的不变的变量让关键字:
让var1 = 0;
变量的类型将自动由编译器推断出来的。在本例中,它将被设置为一个Int。因为var1是不可变的,它总有值0。它不能被改变。
可变的变量可以被声明可变的关键字:
可变var2 =“hello world”;
在这种情况下,var2
是一个字符串。通过使用,以后可以修改它集关键字:
设置var2 = $“var1 = {IntAsString (var1)}”;
这也显示了字符串插值,你可以插入代码在一个字符串的字符串值。的IntAsString函数将整数转换为字符串。字符串插值是通过把一个开放前的美元报价。你可以把你想要的任何代码运行在一对大括号。这是一样的字符串插值在c#中,或者把一个“f”在Python中的字符串前面。
元组¶
问#很广泛支持元组(匿名类型,包含多个不同的对象)。他们习惯很多,尤其是对配对值到一个变量或返回多个从一个操作。一个元组的定义是这样的:
让someTuple = (1、2、3.0);
这将创建一个新类型的元组(Int, Int,双)。类型是由编译器自动算出。tuple可以传递这一变量,可方便的如果你想包语义相关的东西在一起。
得到的值的元组可以通过“打开”元组为单独的变量:
让(tuple0 tuple1 tuple2) = someTuple;
和之前一样,这些变量的类型将被自动发现。
如果你只关心一个值,你可以忽略其余把下划线的位置:
让(tuple3 _, _) = someTuple;
这将退出第一个值,别管其他的。
范围¶
范围在问#用于选择特定指数的数组或for循环迭代。他们是这样定义的:
让范围= 0 . . 3;
这可以解读为“从0到3”。这将创建一个范围的值0,1,2,3。注意,最后一个元素在问#范围包括在收集;这不同于范围在Python中,最后一个元素是排除在外。
如果没有指定,那么将使用范围的默认步长1。然而,范围也可以定义为一个显式的步长:
让rangeWithStep = 0 . . 2 . . 10;
在这个语法,一步是中间。这代表一个范围的值0,2、4、6、8、10。
范围也可以减量通过指定一个负数的步长:
让negativeRange = 10 . . 1 . . 1;
这将会从10到1,减少增量为1。
数组¶
数组在问#工作(主要是)在其他语言一样。他们定义和用方括号索引:
可变intArray = new Int [10];
这将定义一个新的可变数组存储10个整数。注意,问#是固定长度的数组,和它们有相同的数据类型的所有元素;他们不像Python列表。
得到一个数组的长度(大小)是完成了长度功能:
让arrayLength =长度(intArray);
完成从一个数组元素是用方括号,其实在大多数古典语言:
让array3 = intArray [3];
这将得到第四个元素数组中(数组在问0 #)。
不幸的是,这有点奇怪修改一个数组的元素在问#。这是因为数组本身是不变的(即使它们的元素不是),所以修改意味着创建一个新数组,数组复制内容,并修改相关指数在复制操作。都是用这个语法修改元素:
设置intArray w / = 3 < - 22;
这种不同寻常的语法被称为一个“apply-and-replace”操作符。它intArray的值复制到一个新数组相同的大小和类型,但取代了元素在指数3值22日,然后分配变量intArray到新数组。它有效地声明一样的喜欢intArray [3] = 22;
,只是一群复制。事实上,使用更传统的语法要包括在早期版本的问#,但他们摆脱执行数组是不可变的。
而不是创建一个新的数组这样与一个特定的长度和更新在for循环中,常常很容易就追加元素列表。将元素附加到一个数组可以是这样的:
设置intArray + = [8];
这将增加1元素的数组,和“8”元素。数组的大小可以连接在一起,他们没有中的元素。
还有一些其他的事你可以去做阵列在问#(如获得子集)。所有这些都是QSharpReference文件所示。
控制流¶
问#支持三个主要控制代码的方法:if语句,循环,如此反复,直到循环(这有点像一个延伸的循环的倒数)。我们去前两个,因为它们是最常见的。
如果语句做同样的方式,他们在另一个c风格的语言:
如果someBool{/ /做某事}elif someOtherBool{/ /做其他别的东西}}{/ /做第三件事
elif
是一样的其他的如果
在其他语言。
For循环有点不同。问#没有c风格的for循环;相反,我们将考虑一个“每”循环,或一个枚举循环。它可以遍历集合中的所有物品如下:
因为我在intArray{/ /做一些和我}
这可以用范围,模拟传统c风格的for循环的行为:
让长度= (intArray);因为我在0 . .长度- 1{/ /做一些和我}
记住一系列的最终价值是包括在范围内,所以如果你要遍历每个索引数组,你必须结束它的长度- 1或者它会越界。
单量子位盖茨¶
量子盖茨问#作为操作,实现在一个量子位作为参数(和潜在的其他一些参数,取决于门口)。例如,如果你有一个叫“量子位的量子位,操作将应用X门口量子位:
X(量子位);
的\ (R_x \)门,任意旋转绕X轴,定义为处方
功能也需要旋转的角度:
Rx(π(),量子位);
(注意,π()函数是用来获得的价值\π(\ \)。)
测量完成了一个量子位米
操作:
我们测量= M(量子位);
这将返回一个结果
对象,该对象会有价值零或一个。
量子比特分配¶
问#有一个很好的量子位分配系统。你不需要找出哪些量子位是留给哪些用例或跟踪多少你使用到目前为止;它为你做这一切。如果你想要一个量子位,使用使用声明:
使用(量子位=量子位()){/ /做某事的量子位重置(量子位);}
量子位的存在只要使用声明的范围。这意味着你可以叫使用块的中间业务,并通过这些操作的量子位没有它被摧毁。量子位总是在\ \(刃{0}\)国家分配时,他们必须放回\ \(刃{0}\)国家之前的范围。这是非常重要的!你可以把他们在\ \(刃{0}\)状态,你所做的所有操作,或通过调用重置
函数(测量量子位,如果它是\ \(刃{1}\)应用X门)。
实验室1¶
问#这是一个非常快速的总结,但是如您所见,大多数古典语言很相似。我们会进入一些更高级的东西,我们在整个课程中,但你知道足以处理一些简单的任务。进入下一个页面,你会开始写问#代码在实验室第一个动手锻炼!