我想用F#编写量子程序,但我不知道如何从F#调用Q#操作。我到底要怎么做?
我尝试先阅读C#版本,但它似乎不能很好地转换为F#。
我正在创建一个程序Q#。
问题
你有两个处于状态 |00? 的量子比特。您的任务是为它们创建以下状态:1/3–?(|00?+|01?+|10?) 您必须实现一个操作,该操作将 2 个量子位的数组作为输入并且没有输出。您的解决方案的“输出”是它离开输入量子位的状态。
代码
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Math;
open Microsoft.Quantum.Convert;
operation Solve (qs : Qubit[]) : Unit
{
body
{
Ry(ArcCos(Sqrt(2.0/3.0))*2.0,qs[0]);
(ControlledOnInt(0,H))([qs[0]],qs[1]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时会显示以下错误。
错误
CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point
[C:\Users\Pawar\Desktop\HK\codeforces\Q#\Solution\Solution.csproj]
Run Code Online (Sandbox Code Playgroud)
所以我试着把EntryPoint()方法声明放在前面。这向我显示了不同的错误
错误 QS6231:无效的入口点。Qubit 类型的值不能用作参数或返回值到入口点。[C:\Users\Pawar\Desktop\HK\codeforces\Q#\Solution\Solution.csproj]
请帮我如何正确运行它?谢谢 ??
我正在制作一个程序,该程序使用C#脚本中作为参数接收的整数数组,Driver.cs但是它给出以下错误:
Error CS1503 Argument 2: cannot convert from 'long[]' to 'Microsoft.Quantum.Simulation.Core.IQArray<long>'
我试图改为传入一个字符串数组并在程序内转换它们,但是出现了相同的错误:
Error CS1503 Argument 2: cannot convert from 'string[]' to 'Microsoft.Quantum.Simulation.Core.IQArray<string>'
这是C#代码Driver.cs- keyArray是我要传递给Q#的数组。
using (var qsim = new QuantumSimulator())
{
var result = QMain.Run(qsim, keyArray).Result;
var (res0, res1, res2) = result;
System.Console.WriteLine(res0 + ", " + res1 + ", " + res2);
}
Run Code Online (Sandbox Code Playgroud)
Q#QMain操作在Operations.qs:
operation QMain(keyCode : Int[]) : (Result, Result, Result)
Run Code Online (Sandbox Code Playgroud)
在Q#中,Int数据类型对应于C#long。
传递字符串数组也失败,具有以下签名QMain:
operation QMain(s …Run Code Online (Sandbox Code Playgroud) 我有以下 Q# 操作
operation VQC (cirq:((Double[],Qubit[])=>Unit is Adj),measurement:Pauli[], args: Double[], nQubits:Int) : Double {
let res=EstimateFrequencyA(cirq(args,_),Measure(measurement,_),nQubits,1000);
return 2.*res-1.;
}
operation Cirq(args:Double[],qs: Qubit[]):Unit is Adj{
Rz(args[0],qs[0] );
CNOT(qs[0],qs[1]);
Ry(args[1],qs[1]);
}
Run Code Online (Sandbox Code Playgroud)
如何将 Cirq 操作从 C# 或 F# 传递到 VQC 操作?
第一个Q#代码示例提供一种方法“ Set”,其编写方式如下(链接):
operation Set (desired: Result, q1: Qubit) : ()
{
body
{
let current = M(q1);
if (desired != current)
{
X(q1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
该方法将量子位设置为所需值。为此,将测量qubit值,如果该值与预期值不同,则将“交换” qubit状态。
但是在量子物理学中,如果不破坏粒子就无法测量粒子。这是《量子计算和量子信息》一书的引文:
...测量会更改量子位的状态,使其从| 0>和| 1>的叠加变为与测量结果一致的特定状态。例如,如果| +>的测量结果为0,则qubit的测量后状态将为| 0>。
但是使用Q#可以测量一个量子比特并继续使用它。
为什么Q#语言允许我们实现实际上不可能的操作?
预先感谢您的回答。
背景
我正在处理的项目的一部分要求我分析 Q# 源代码并在遇到某些语法元素时执行特定操作。例如,假设我想计算整个程序中使用了多少种不同的门类型。现在,这可以通过遍历程序的抽象语法树并根据当前语法节点执行操作来实现。
我试过的
我首先分析了qsharp-compiler存储库,但是,编译器的内部工作方式缺乏在线文档,浏览所有 C# 和 F# 源代码非常乏味。
当然,我可以为该语言编写自己的解析器,但这对于手头的任务来说可能是一种矫枉过正。有有一个方法可以从编译器的内部提取AST。
问题
有没有办法以编程方式使用 Q# 编译器(从 C# 或 F#)编译 Q# 源代码,并提取内部 AST?
QDK全态模拟器有没有办法返回量子态的波函数或测量概率?专门针对 C# 主机应用程序?
我想从 C# 中量子算法的输出分布中进行采样。目前,我正在重新调用模拟器并对每个样本执行破坏性测量,但是这个过程非常慢。
'Microsoft.Quantum.Simulator.Runtime.dll'在尝试通过运行teleport示例程序验证我的Q#环境时,无法加载DLL 错误.
dotnet build
dotnet run
platform windows 7 64 bit with AVX enabled. vscode with .NET Core SDK 2.0
Unhandled Exception: System.DllNotFoundException: Unable to load DLL 'Microsoft.Quantum.Simulator.Runtime.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
at Microsoft.Quantum.Simulation.Simulators.QuantumSimulator.Init()
at Microsoft.Quantum.Simulation.Simulators.QuantumSimulator..ctor(Boolean throwOnReleasingQubitsNotInZeroState, Nullable`1 randomNumberGeneratorSeed, Boolean disableBorrowing)
at Microsoft.Quantum.Examples.Teleportation.Program.Main(String[] args) in C:\opt\workspace\quantum\Quantum\Samples\Teleportation\Program.cs:line 13
Run Code Online (Sandbox Code Playgroud)