Q# 微软量子计算编程语言

微软量子开发工具包,分为windows版本和macOS和linux版本,下载页面:https://www.microsoft.com/en-us/quantum/development-kit.

Q#开发工具需要使用vs2017或者 vs code.

注意:vs2017需要安装 .NET Core cross-platform development(.NET Core跨平台工具集).

01 微软量子开发工具包安装

微软量子开发工具包使用Q#语言。是一个比较小的语言包,依赖于C#和F#。

01.01 Q#安装方法01

1.安装好vs2017或vs code后,下载对应平台的微软量子开放工具包的安装包,双击即可安装。如图下载windows版本的 QsharpVSIX.vsix 包。
Q# 微软量子计算编程语言_第1张图片

2.下载好QsharpVSIX.vsix包后,双击,即可运行。如下图,点击安装,即可完成微软量子开发工具包的安装。
Q# 微软量子计算编程语言_第2张图片

01.02 Q#安装方法02

  1. 选择:vs2017菜单==>工具 ==> 扩展和更新。
    Q# 微软量子计算编程语言_第3张图片

2.在扩展和更新窗口搜索 “Microsoft Quantum Development Kit”,搜索到后,双击,加入更新计划。关闭扩展和更新窗口.。
Q# 微软量子计算编程语言_第4张图片

3.在弹出的VSIX Installer窗口,点击修改按钮。
Q# 微软量子计算编程语言_第5张图片

4.关闭微软量子开发工具包安装完成提示窗口
Q# 微软量子计算编程语言_第6张图片

02 下载Q# Demo

微软在github上面提供了,Q#的demo。
github地址:https://github.com/microsoft/quantum
下载Q# Demo代码。

git clone https://github.com/microsoft/quantum.git

代码内容大致如下,可以直接用vs2017打开QsharpLibraries.sln解决方案。
Q# 微软量子计算编程语言_第7张图片

QsharpLibraries.sln解决方案的工程结构如下,设TeleportationSample为启动项。Program.cs是入口程序,负责调用量子算法运行,TeleportationSample.qs是Q#程序,实现具体量子算法。TeleportationSample.qs文件内有较详细注释。编译QsharpLibraries.sln。19个项目成功。
Q# 微软量子计算编程语言_第8张图片

设TeleportationSample为启动项。F5运行程序,可以看到TeleportationSample工程运行结果。
Q# 微软量子计算编程语言_第9张图片

03 自己创建Q# Demo

具体过程参考微软官方文档:https://docs.microsoft.com/zh-cn/quantum/quantum-writeaquantumprogram?view=qsharp-preview&tabs=tabid-vs2017.
Q# 微软量子计算编程语言_第10张图片

03.01 创建Q#新项目

文件==>新建==>项目;选择C#项目中的[Q# Application],指定项目名称和路径。创建新项目。
Q# 微软量子计算编程语言_第11张图片

Q# Application项目默认有两个文件:Driver.cs,Operation.qs。
Q# 微软量子计算编程语言_第12张图片

Driver.cs是项目入口文件,负责调用Q#量子算法,并初始化参数等。

using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Quantum.QSharp002
{
    class Driver
    {
        static void Main(string[] args)
        {

        }
    }
}

Operation.qs是具体的量子算法文件。默认内容:

namespace Quantum.QSharp002
{
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;

    operation Operation () : ()
    {
        body
        {
            
        }
	}
}

03.02 Bell测试

按照文档https://docs.microsoft.com/zh-cn/quantum/quantum-writeaquantumprogram?view=qsharp-preview&tabs=tabid-vs2017。
重命名文件Operation.qs ==> Bell.qs.修改命名空间为Quantum.QSharp002 ==>Quantum.Bell。
Driver.cs文件内容:

using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Quantum.Bell
{
    class Driver
    {
        static void Main(string[] args)
        {
            using (var sim = new QuantumSimulator())
            {
                // Try initial values
                Result[] initials = new Result[] { Result.Zero, Result.One };
                foreach (Result initial in initials)
                {
                    var res = BellTest.Run(sim, 1000, initial).Result;
                    var (numZeros, numOnes, agree) = res;
                    System.Console.WriteLine(
                        $"Init:{initial,-4} 0s={numZeros,-4} 1s={numOnes,-4} agree={agree,-4}");
                }
            }
            System.Console.WriteLine("Press any key to continue...");
            System.Console.ReadKey();
        }
    }
}

Bell.qs内容:

namespace Quantum.Bell
{
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;

    operation Set (desired: Result, q1: Qubit) : ()
    {
        body
        {
            let current = M(q1);

            if (desired != current)
            {
                X(q1);
            } 
        }
    }

    operation BellTest (count : Int, initial: Result) : (Int,Int,Int)
    {
        body
        {
            mutable numOnes = 0;
            mutable agree = 0;
            using (qubits = Qubit[2])
            {
                for (test in 1..count)
                {
                    Set (initial, qubits[0]);
                    Set (Zero, qubits[1]);

                    H(qubits[0]);
                    CNOT(qubits[0],qubits[1]);
                    let res = M (qubits[0]);

                    if (M (qubits[1]) == res) 
                    {
                        set agree = agree + 1;
                    }

                    // Count the number of ones we saw:
                    if (res == One)
                    {
                        set numOnes = numOnes + 1;
                    }
                }

                Set(Zero, qubits[0]);
                Set(Zero, qubits[1]);
            }
            // Return number of times we saw a |0> and number of times we saw a |1>
            return (count-numOnes, numOnes, agree);
        }
    }
}

运行结果:

Init:Zero 0s=484  1s=516  agree=1000
Init:One  0s=464  1s=536  agree=1000
Press any key to continue...
Q# 微软量子计算编程语言_第13张图片

04 文档

微软官网提供了较为详细的量子编程基础知识和Q#的语法说明。
https://docs.microsoft.com/zh-cn/quantum/quantum-qr-intro?view=qsharp-preview

目前Q#主要提供模拟量子算法编程。

强烈推荐看demo里面的注释,和微软官方提供的文档。

另外:创业公司 本源量子计算官网提供了相对较简单的量子计算基础知识介绍。

下面是知乎上SIY.ZUSTC CS提供的一段内容:

  1. 可扩展性,可重构性。Q#之前很多语言都是变相的标记语言,不过披着Python等的外衣。这些标记语言“忠实”地描述量子线路的结构以实现程序。这点类似于最早期的FORTRAN程序,它们跳转和循环是依赖行号的(相比早期汇编的地址已经是巨大进步了),一旦程序需要重构或者在中间加几行,往往是灾难性的:你需要自己更改全部行号。直到后来do-enddo,以及跳转标签等结构的引入,才为大规模程序设计铺平道路(典型地Pascal语言的发明使得编写通用操作系统变得更加可行(比如DOS“抄袭”的CPM系统),后来C的发明极大推进了这个过程)。
    现在基于线路描述的量子程序存在同样的问题,一旦程序要进行扩展,或者重构,对原来的设计是灾难性的。Q#在更高的层级上描述量子程序,免去了这部分问题。

  2. 动态性。用IBM等的工具构建量子线路时,一个显著的缺点在于无法动态运行线路。比如说,我希望通过测量某些qubit的结果,来控制接下来的量子线路的行为。虽然我们几乎总是可以才用延迟测量或者计数符合等方式避免中途测量,但是显然在实际实现中,越早进行测量是越好的,这是因为搭建经典控制线路的代价远低于量子线路,特别是在规模化的情况下,一个原则是尽可能增加线路经典部分,这样可以节约稀缺的量子线路资源,并且抵抗消相干等问题。而很多构建工具需要显示地预先compile线路,这样就没有办法执行复杂的经典控制。

  3. 语义性。如何融合量子计算和经典计算之间的语义差异?我们可以看到,很多经典计算中的语义在量子计算中无法使用,比如递归(递归变量是qubit?),赋值(量子不可克隆原理),循环(同样地,qubit难以做循环控制变量)。为了解决这一点,Q#构建了一套基于类型系统的语义逻辑: 将qubit的“赋值”拆为2个部分,分别是Set和M,其中Set制备初态,将经典比特转化为量子比特; M是测量,将量子比特转化为经典比特。通过类型系统,经典比特得以进行我们熟知的各种运算,而量子比特只允许限定的量子门操作,或者被经典比特控制。这套系统可以通过类型检查来排除一些潜在的错误操作,熟悉编译原理也可以通过这个类型系统生成对应的控制逻辑。

如有错误之处,欢迎批评指正。QQ群:579809480。

你可能感兴趣的:(量子计算)