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 包。
微软量子开发工具包下载地址

2.下载好QsharpVSIX.vsix包后,双击,即可运行。如下图,点击安装,即可完成微软量子开发工具包的安装。
微软量子开发工具包安装

01.02 Q#安装方法02

  1. 选择:vs2017菜单==>工具 ==> 扩展和更新。
    启动安装vs扩展界面

2.在扩展和更新窗口搜索 “Microsoft Quantum Development Kit”,搜索到后,双击,加入更新计划。关闭扩展和更新窗口.。
搜索微软量子开发工具包

3.在弹出的VSIX Installer窗口,点击修改按钮。
安装微软量子开发工具包

4.关闭微软量子开发工具包安装完成提示窗口
关闭微软量子开发工具包安装完成提示窗口

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#Demo代码内容

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

设TeleportationSample为启动项。F5运行程序,可以看到TeleportationSample工程运行结果。
Q#Demo代码运行结果

03 自己创建Q# Demo

具体过程参考微软官方文档:https://docs.microsoft.com/zh-cn/quantum/quantum-writeaquantumprogram?view=qsharp-preview&tabs=tabid-vs2017.
Q#官网文档

03.01 创建Q#新项目

文件==>新建==>项目;选择C#项目中的[Q# Application],指定项目名称和路径。创建新项目。
新建Q#项目

Q# Application项目默认有两个文件:Driver.cs,Operation.qs。
新建Q#项目内容

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#Demo运行结果

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。

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值