Q Sharp
| Q# | |
|---|---|
| Paradigm | Quantum, functional, imperative |
| Designed by | Microsoft Research (quantum architectures and computation group; QuArC) |
| Developer | Microsoft |
| First appeared | December 11, 2017 (2017年12月11日)[1] |
| Typing discipline | Static, strong |
| Platform | Common Language Infrastructure |
| License | MIT License [2] |
| Filename extensions | .qs |
| Website | learn |
| Influenced by | |
| C#, F#, Python | |
Q# (pronounced Q sharp) is a domain-specific programming language used for expressing quantum algorithms.[3] It was initially released to the public by Microsoft as part of the Quantum Development Kit.[4]
Q# works in conjunction with classical languages such as C#, Python and F#, and is designed to allow the use of traditional programming concepts in quantum computing, including functions with variables and branches as well as a syntax-highlighted development environment with a quantum debugger.[1] [5] [6]
History
[edit ]Historically, Microsoft Research had two teams interested in quantum computing: the QuArC team based in Redmond, Washington,[7] directed by Krysta Svore, that explored the construction of quantum circuitry, and Station Q initially located in Santa Barbara and directed by Michael Freedman, that explored topological quantum computing.[8] [9]
During a Microsoft Ignite Keynote on September 26, 2017, Microsoft announced that they were going to release a new programming language geared specifically towards quantum computers.[10] On December 11, 2017, Microsoft released Q# as a part of the Quantum Development Kit.[4]
At Build 2019, Microsoft announced that it would be open-sourcing the Quantum Development Kit, including its Q# compilers and simulators.[11]
To support Q#, Microsoft developed Quantum Intermediate Representation (QIR) in 2023 as a common interface between programming languages and target quantum processors. The company also announced a compiler extension that generates QIR from Q#.[12]
Bettina Heim used to lead the Q# language development effort.[13] [14]
Usage
[edit ]Q# is available as a separately downloaded extension for Visual Studio,[15] but it can also be run as an independent tool from the command line or Visual Studio Code. Q# was introduced on Windows and is available on MacOS and Linux.[16]
The Quantum Development Kit includes a quantum simulator capable of running Q# and simulated 30 logical qubits.[17] [18]
In order to invoke the quantum simulator, another .NET programming language, usually C#, is used, which provides the (classical) input data for the simulator and reads the (classical) output data from the simulator.[19]
Features
[edit ]A primary feature of Q# is the ability to create and use qubits for algorithms. As a consequence, some of the most prominent features of Q# are the ability to entangle and introduce superpositioning to qubits via controlled NOT gates and Hadamard gates, respectively, as well as Toffoli Gates, Pauli X, Y, Z Gate, and many more which are used for a variety of operations (See quantum logic gates).[citation needed ]
The hardware stack that will eventually come together with Q# is expected to implement Qubits as topological qubits. The quantum simulator that is shipped with the Quantum Development Kit today is capable of processing up to 32 qubits on a user machine and up to 40 qubits on Azure.[20]
Documentation and resources
[edit ]Currently, the resources available for Q# are scarce, but the official documentation is published: Microsoft Developer Network: Q#. Microsoft Quantum Github repository is also a large collection of sample programs implementing a variety of Quantum algorithms and their tests.
Microsoft has also hosted a Quantum Coding contest on Codeforces, called Microsoft Q# Coding Contest - Codeforces, and also provided related material to help answer the questions in the blog posts, plus the detailed solutions in the tutorials.
Microsoft hosts a set of learning exercises to help learn Q# on GitHub: microsoft/QuantumKatas with links to resources, and answers to the problems.
Syntax
[edit ]Q# is syntactically related to both C# and F# yet also has some significant differences.
Similarities with C#
[edit ]- Uses
namespacefor code isolation - All statements end with a
; - Curly braces are used for statements of scope
- Single line comments are done using
// - Variable data types such as
IntDoubleStringandBoolare similar, although capitalised (and Int is 64-bit)[21] - Qubits are allocated and disposed inside a
usingblock. - Lambda functions are defined using the
=>operator. - Results are returned using the
returnkeyword.
Similarities with F#
[edit ]- Variables are declared using either
letormutable[3] - First-order functions
- Modules, which are imported using the
openkeyword - The datatype is declared after the variable name
- The range operator
.. for ... inloops- Every operation/function has a return value, rather than
void. Instead ofvoid, an empty Tuple()is returned. - Definition of record datatypes (using the
newtypekeyword, instead oftype).
Differences
[edit ]- Functions are declared using the
functionkeyword - Operations on the quantum computer are declared using the
operationkeyword - Lack of multiline comments
- Asserts instead of throwing exceptions
- Documentation is written in Markdown instead of XML-based documentation tags
Example
[edit ]The following source code is a multiplexer from the official Microsoft Q# library repository.
// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. namespaceMicrosoft.Quantum.Canon{ openMicrosoft.Quantum.Intrinsic; openMicrosoft.Quantum.Arithmetic; openMicrosoft.Quantum.Arrays; openMicrosoft.Quantum.Diagnostics; openMicrosoft.Quantum.Math; /// # Summary /// Applies a multiply-controlled unitary operation $U$ that applies a /// unitary $V_j$ when controlled by n-qubit number state $\ket{j}$. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Input /// ## unitaryGenerator /// A tuple where the first element `Int` is the number of unitaries $N,ドル /// and the second element `(Int -> ('T => () is Adj + Ctl))` /// is a function that takes an integer $j$ in $[0,N-1]$ and outputs the unitary /// operation $V_j$. /// /// ## index /// $n$-qubit control register that encodes number states $\ket{j}$ in /// little-endian format. /// /// ## target /// Generic qubit register that $V_j$ acts on. /// /// # Remarks /// `coefficients` will be padded with identity elements if /// fewer than 2ドル^n$ are specified. This implementation uses /// $n-1$ auxiliary qubits. /// /// # References /// - [ *Andrew M. Childs, Dmitri Maslov, Yunseong Nam, Neil J. Ross, Yuan Su*, /// arXiv:1711.10980](https://arxiv.org/abs/1711.10980) operationMultiplexOperationsFromGenerator<'T>(unitaryGenerator:(Int,(Int->('T=>UnitisAdj+Ctl))),index:LittleEndian,target:'T):UnitisCtl+Adj{ let(nUnitaries,unitaryFunction)=unitaryGenerator; letunitaryGeneratorWithOffset=(nUnitaries,0,unitaryFunction); ifLength(index!)==0{ fail"MultiplexOperations failed. Number of index qubits must be greater than 0."; } ifnUnitaries>0{ letauxiliary=[]; AdjointMultiplexOperationsFromGeneratorImpl(unitaryGeneratorWithOffset,auxiliary,index,target); } } /// # Summary /// Implementation step of `MultiplexOperationsFromGenerator`. /// # See Also /// - Microsoft.Quantum.Canon.MultiplexOperationsFromGenerator internaloperationMultiplexOperationsFromGeneratorImpl<'T>(unitaryGenerator:(Int,Int,(Int->('T=>UnitisAdj+Ctl))),auxiliary:Qubit[],index:LittleEndian,target:'T) :Unit{ body(...){ letnIndex=Length(index!); letnStates=2^nIndex; let(nUnitaries,unitaryOffset,unitaryFunction)=unitaryGenerator; letnUnitariesLeft=MinI(nUnitaries,nStates/2); letnUnitariesRight=MinI(nUnitaries,nStates); letleftUnitaries=(nUnitariesLeft,unitaryOffset,unitaryFunction); letrightUnitaries=(nUnitariesRight-nUnitariesLeft,unitaryOffset+nUnitariesLeft,unitaryFunction); letnewControls=LittleEndian(Most(index!)); ifnUnitaries>0{ ifLength(auxiliary)==1andnIndex==0{ // Termination case (ControlledAdjoint(unitaryFunction(unitaryOffset)))(auxiliary,target); }elifLength(auxiliary)==0andnIndex>=1{ // Start case letnewauxiliary=Tail(index!); ifnUnitariesRight>0{ MultiplexOperationsFromGeneratorImpl(rightUnitaries,[newauxiliary],newControls,target); } within{ X(newauxiliary); }apply{ MultiplexOperationsFromGeneratorImpl(leftUnitaries,[newauxiliary],newControls,target); } }else{ // Recursion that reduces nIndex by 1 and sets Length(auxiliary) to 1. letcontrols=[Tail(index!)]+auxiliary; usenewauxiliary=Qubit(); useandauxiliary=Qubit[MaxI(0,Length(controls)-2)]; within{ ApplyAndChain(andauxiliary,controls,newauxiliary); }apply{ ifnUnitariesRight>0{ MultiplexOperationsFromGeneratorImpl(rightUnitaries,[newauxiliary],newControls,target); } within{ (ControlledX)(auxiliary,newauxiliary); }apply{ MultiplexOperationsFromGeneratorImpl(leftUnitaries,[newauxiliary],newControls,target); } } } } } adjointauto; controlled(controlRegister,...){ MultiplexOperationsFromGeneratorImpl(unitaryGenerator,auxiliary+controlRegister,index,target); } adjointcontrolledauto; } /// # Summary /// Applies multiply-controlled unitary operation $U$ that applies a /// unitary $V_j$ when controlled by n-qubit number state $\ket{j}$. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Input /// ## unitaryGenerator /// A tuple where the first element `Int` is the number of unitaries $N,ドル /// and the second element `(Int -> ('T => () is Adj + Ctl))` /// is a function that takes an integer $j$ in $[0,N-1]$ and outputs the unitary /// operation $V_j$. /// /// ## index /// $n$-qubit control register that encodes number states $\ket{j}$ in /// little-endian format. /// /// ## target /// Generic qubit register that $V_j$ acts on. /// /// # Remarks /// `coefficients` will be padded with identity elements if /// fewer than 2ドル^n$ are specified. This version is implemented /// directly by looping through n-controlled unitary operators. operationMultiplexOperationsBruteForceFromGenerator<'T>(unitaryGenerator:(Int,(Int->('T=>UnitisAdj+Ctl))),index:LittleEndian,target:'T) :UnitisAdj+Ctl{ letnIndex=Length(index!); letnStates=2^nIndex; let(nUnitaries,unitaryFunction)=unitaryGenerator; foridxOpin0..MinI(nStates,nUnitaries)-1{ (ControlledOnInt(idxOp,unitaryFunction(idxOp)))(index!,target); } } /// # Summary /// Returns a multiply-controlled unitary operation $U$ that applies a /// unitary $V_j$ when controlled by n-qubit number state $\ket{j}$. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Input /// ## unitaryGenerator /// A tuple where the first element `Int` is the number of unitaries $N,ドル /// and the second element `(Int -> ('T => () is Adj + Ctl))` /// is a function that takes an integer $j$ in $[0,N-1]$ and outputs the unitary /// operation $V_j$. /// /// # Output /// A multiply-controlled unitary operation $U$ that applies unitaries /// described by `unitaryGenerator`. /// /// # See Also /// - Microsoft.Quantum.Canon.MultiplexOperationsFromGenerator functionMultiplexerFromGenerator(unitaryGenerator:(Int,(Int->(Qubit[]=>UnitisAdj+Ctl)))):((LittleEndian,Qubit[])=>UnitisAdj+Ctl){ returnMultiplexOperationsFromGenerator(unitaryGenerator,_,_); } /// # Summary /// Returns a multiply-controlled unitary operation $U$ that applies a /// unitary $V_j$ when controlled by n-qubit number state $\ket{j}$. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Input /// ## unitaryGenerator /// A tuple where the first element `Int` is the number of unitaries $N,ドル /// and the second element `(Int -> ('T => () is Adj + Ctl))` /// is a function that takes an integer $j$ in $[0,N-1]$ and outputs the unitary /// operation $V_j$. /// /// # Output /// A multiply-controlled unitary operation $U$ that applies unitaries /// described by `unitaryGenerator`. /// /// # See Also /// - Microsoft.Quantum.Canon.MultiplexOperationsBruteForceFromGenerator functionMultiplexerBruteForceFromGenerator(unitaryGenerator:(Int,(Int->(Qubit[]=>UnitisAdj+Ctl)))):((LittleEndian,Qubit[])=>UnitisAdj+Ctl){ returnMultiplexOperationsBruteForceFromGenerator(unitaryGenerator,_,_); } /// # Summary /// Computes a chain of AND gates /// /// # Description /// The auxiliary qubits to compute temporary results must be specified explicitly. /// The length of that register is `Length(ctrlRegister) - 2`, if there are at least /// two controls, otherwise the length is 0. internaloperationApplyAndChain(auxRegister:Qubit[],ctrlRegister:Qubit[],target:Qubit) :UnitisAdj{ ifLength(ctrlRegister)==0{ X(target); }elifLength(ctrlRegister)==1{ CNOT(Head(ctrlRegister),target); }else{ EqualityFactI(Length(auxRegister),Length(ctrlRegister)); letcontrols1=ctrlRegister[0..0]+auxRegister; letcontrols2=Rest(ctrlRegister); lettargets=auxRegister+[target]; ApplyToEachA(ApplyAnd,Zipped3(controls1,controls2,targets)); } } }
References
[edit ]- ^ a b "Microsoft's Q# quantum programming language out now in preview". Ars Technica. 12 Dec 2017. Retrieved 2024年09月04日.
- ^ "Introduction to Q#" (PDF). University of Washington.
- ^ a b QuantumWriter. "The Q# Programming Language". docs.microsoft.com. Retrieved 2017年12月11日.
- ^ a b "Announcing the Microsoft Quantum Development Kit" . Retrieved 2017年12月11日.
- ^ "Microsoft makes play for next wave of computing with quantum computing toolkit". Ars Technica. 25 Sep 2017. Retrieved 2024年09月04日.
- ^ "Quantum Computers Barely Exist—Here's Why We're Writing Languages for Them Anyway". MIT Technology Review. 22 Dec 2017. Retrieved 2024年09月04日.
- ^ "Solving the quantum many-body problem with artificial neural networks". Microsoft Azure Quantum. 15 February 2017.
- ^ Scott Aaronson's blog, 2013, 'Microsoft: From QDOS to QMA in less than 35 years', https://scottaaronson.blog/?p=1471
- ^ "What are the Q# programming language & QDK? - Azure Quantum". learn.microsoft.com. 12 January 2024.
- ^ "Microsoft announces quantum computing programming language" . Retrieved 2017年12月14日.
- ^ Microsoft is open-sourcing its Quantum Development Kit
- ^ Krill, Paul (29 Sep 2020). "Microsoft taps LLVM for quantum computing". InfoWorld. Retrieved 2024年09月04日.
- ^ "The Women of QuArC". 30 March 2019.
- ^ "Intro to Q# - Intro to Quantum Software Development". stem.mitre.org.
- ^ QuantumWriter. "Setting up the Q# development environment". docs.microsoft.com. Retrieved 2017年12月14日.
- ^ Coppock, Mark (26 Feb 2018). "Microsoft's quantum computing language is now available for MacOS". Digital Trends. Retrieved 2024年09月04日.
- ^ Akdogan, Erman (23 October 2022). "Quantum computing is coming for finance & crypto". Medium.
- ^ Melanson, Mike (16 Dec 2017). "This Week in Programming: Get Quantum with Q Sharp". The New Stack. Retrieved 2024年09月04日.
- ^ "This Week in Programming: Get Quantum with Q Sharp". The New Stack. 16 December 2017.
- ^ "Microsoft previews quantum computing development kit". CIO. Archived from the original on 2022年10月30日. Retrieved 2022年10月30日.
- ^ "Types in Q# - Microsoft Quantum". docs.microsoft.com. 27 July 2022.