diff --git a/qsharp.html.markdown b/qsharp.html.markdown index 04e697a4..acfbed47 100644 --- a/qsharp.html.markdown +++ b/qsharp.html.markdown @@ -4,47 +4,49 @@ contributors: - ["Vincent van Wingerden", "https://github.com/vivanwin"] - ["Mariia Mykhailova", "https://github.com/tcNickolas"] - ["Andrew Ryan Davis", "https://github.com/AndrewDavis1191"] + - ["Alex Hansen", "https://github.com/sezna"] filename: LearnQSharp.qs --- Q# is a high-level domain-specific language which enables developers to write quantum algorithms. Q# programs can be executed on a quantum simulator running on a classical computer and (in future) on quantum computers. -```c# +```qsharp // Single-line comments start with // ///////////////////////////////////// // 1. Quantum data types and operators -// The most important part of quantum programs is qubits. +// The most important part of quantum programs is qubits. // In Q# type Qubit represents the qubits which can be used. // This will allocate an array of two new qubits as the variable qs. -using (qs = Qubit[2]) { +operation QuantumDataTypes() : Unit { + use qs = Qubit[2]; // The qubits have internal state that you cannot access to read or modify directly. - // You can inspect the current state of your quantum program + // You can inspect the current state of your quantum program // if you're running it on a classical simulator. // Note that this will not work on actual quantum hardware! - DumpMachine(); + Std.Diagnostics.DumpMachine(); // If you want to change the state of a qubit // you have to do this by applying quantum gates to the qubit. - H(qs[0]); // This changes the state of the first qubit - // from |0⟩ (the initial state of allocated qubits) - // to (|0⟩ + |1⟩) / sqrt(2). + H(qs[0]); // This changes the state of the first qubit + // from |0⟩ (the initial state of allocated qubits) + // to (|0⟩ + |1⟩) / sqrt(2). // qs[1] = |1⟩; - this does NOT work, you have to manipulate a qubit by using gates. // You can apply multi-qubit gates to several qubits. CNOT(qs[0], qs[1]); - // You can also apply a controlled version of a gate: + // You can also apply a controlled version of a gate: // a gate that is applied if all control qubits are in |1⟩ state. - // The first argument is an array of control qubits, + // The first argument is an array of control qubits, // the second argument is the target qubit. - Controlled Y([qs[0]], qs[1]); + Controlled Y([qs[0]], qs[1]); - // If you want to apply an anti-controlled gate - // (a gate that is applied if all control qubits are in |0⟩ state), + // If you want to apply an anti-controlled gate + // (a gate that is applied if all control qubits are in |0⟩ state), // you can use a library function. ApplyControlledOnInt(0, X, [qs[0]], qs[1]); @@ -58,96 +60,101 @@ using (qs = Qubit[2]) { ///////////////////////////////////// // 2. Classical data types and operators -// Numbers in Q# can be stored in Int, BigInt or Double. -let i = 1; // This defines an Int variable i equal to 1 -let bi = 1L; // This defines a BigInt variable bi equal to 1 -let d = 1.0; // This defines a Double variable d equal to 1 +function ClassicalDataTypes() : Unit { + // Numbers in Q# can be stored in Int, BigInt or Double. + let i = 1; // This defines an Int variable i equal to 1 + let bi = 1L; // This defines a BigInt variable bi equal to 1 + let d = 1.0; // This defines a Double variable d equal to 1 -// Arithmetic is done as expected, as long as the types are the same -let n = 2 * 10; // = 20 -// Q# does not have implicit type cast, -// so to perform arithmetic on values of different types, -// you need to cast type explicitly -let nd = IntAsDouble(2) * 1.0; // = 20.0 + // Arithmetic is done as expected, as long as the types are the same + let n = 2 * 10; // = 20 + // Q# does not have implicit type cast, + // so to perform arithmetic on values of different types, + // you need to cast type explicitly + let nd = Std.Convert.IntAsDouble(2) * 1.0; // = 20.0 -// Boolean type is called Bool -let trueBool = true; -let falseBool = false; + // Boolean type is called Bool + let trueBool = true; + let falseBool = false; -// Logic operators work as expected -let andBool = true and false; -let orBool = true or false; -let notBool = not false; + // Logic operators work as expected + let andBool = true and false; + let orBool = true or false; + let notBool = not false; -// Strings -let str = "Hello World!"; + // Strings + let str = "Hello World!"; -// Equality is == -let x = 10 == 15; // is false + // Equality is == + let x = 10 == 15; // is false -// Range is a sequence of integers and can be defined like: start..step..stop -let xi = 1..2..7; // Gives the sequence 1,3,5,7 + // Range is a sequence of integers and can be defined like: start..step..stop + let xi = 1..2..7; // Gives the sequence 1,3,5,7 -// Assigning new value to a variable: -// by default all Q# variables are immutable; -// if the variable was defined using let, you cannot reassign its value. + // Assigning new value to a variable: + // by default all Q# variables are immutable; + // if the variable was defined using let, you cannot reassign its value. -// When you want to make a variable mutable, you have to declare it as such, -// and use the set word to update value -mutable xii = true; -set xii = false; + // When you want to make a variable mutable, you have to declare it as such, + // and use the set word to update value + mutable xii = true; + set xii = false; -// You can create an array for any data type like this -let xiii = new Double[10]; + // You can create an array for any data type like this + let xiii = [0.0, size = 10]; -// Getting an element from an array -let xiv = xiii[8]; + // Getting an element from an array + let xiv = xiii[8]; -// Assigning a new value to an array element -mutable xv = new Double[10]; -set xv w/= 5 <- 1; + // Assigning a new value to an array element + mutable xv = [0.0, size = 10]; + set xv w/= 5 <- 1.0; +} ///////////////////////////////////// // 3. Control flow -// If structures work a little different than most languages -if (a == 1) { - // ... -} elif (a == 2) { - // ... -} else { - // ... -} +operation ControlFlow() : Unit { + let a = 1; + // If expressions support a true branch, elif, and else. + if (a == 1) { + // ... + } elif (a == 2) { + // ... + } else { + // ... + } + use qubits = Qubit[2]; -// Foreach loops can be used to iterate over an array -for (qubit in qubits) { - X(qubit); -} + // For loops can be used to iterate over an array + for qubit in qubits { + X(qubit); + } -// Regular for loops can be used to iterate over a range of numbers -for (index in 0 .. Length(qubits) - 1) { - X(qubits[index]); -} + // Regular for loops can be used to iterate over a range of numbers + for index in 0..Length(qubits) - 1 { + X(qubits[index]); + } -// While loops are restricted for use in classical context only -mutable index = 0; -while (index < 10) { - set index += 1; -} + // While loops are restricted for use in classical context only + mutable index = 0; + while (index < 10) { + set index += 1; + } -// Quantum equivalent of a while loop is a repeat-until-success loop. -// Because of the probabilistic nature of quantum computing sometimes -// you want to repeat a certain sequence of operations -// until a specific condition is achieved; you can use this loop to express this. -repeat { - // Your operation here + let success_criteria = true; + // Quantum equivalent of a while loop is a repeat-until-success loop. + // Because of the probabilistic nature of quantum computing sometimes + // you want to repeat a certain sequence of operations + // until a specific condition is achieved; you can use this loop to express this. + repeat { + // Your operation here + } until (success_criteria) // This could be a measurement to check if the state is reached + fixup { + // Resetting to the initial conditions, if required + } } -until (success criteria) // This could be a measurement to check if the state is reached -fixup { - // Resetting to the initial conditions, if required -} - ///////////////////////////////////// // 4. Putting it all together @@ -157,11 +164,11 @@ operation ApplyXGate(source : Qubit) : Unit { X(source); } -// If the operation implements a unitary transformation, you can define -// adjoint and controlled variants of it. -// The easiest way to do that is to add "is Adj + Ctl" after Unit. +// If the operation implements a unitary transformation, you can define +// adjoint and controlled variants of it. +// The easiest way to do that is to add "is Adj + Ctl" after Unit. // This will tell the compiler to generate the variants automatically. -operation ApplyXGateCA (source : Qubit) : Unit is Adj + Ctl { +operation ApplyXGateCA(source : Qubit) : Unit is Adj + Ctl { X(source); } @@ -169,20 +176,21 @@ operation ApplyXGateCA (source : Qubit) : Unit is Adj + Ctl { // To run Q# code, you can put @EntryPoint() before the operation you want to run first -@EntryPoint() operation XGateDemo() : Unit { - using (q = Qubit()) { - ApplyXGate(q); - } + use q = Qubit(); + ApplyXGate(q); } -// Here is a simple example: a quantum random number generator. +// Here is a simple example: a quantum random number generator. // We will generate a classical array of random bits using quantum code. -@EntryPoint() -operation QRNGDemo() : Unit { - mutable bits = new Int[5]; // Array we'll use to store bits - using (q = Qubit()) { // Allocate a qubit - for (i in 0 .. 4) { // Generate each bit independently +// Callables (functions or operations) named `Main` are used as entry points. +operation Main() : Unit { + mutable bits = [0, size = 5]; // Array we'll use to store bits + use q = Qubit(); + { + // Allocate a qubit + for i in 0..4 { + // Generate each bit independently H(q); // Hadamard gate sets equal superposition let result = M(q); // Measure qubit gets 0|1 with 50/50 prob let bit = result == Zero ? 0 | 1; // Convert measurement result to integer @@ -196,9 +204,6 @@ operation QRNGDemo() : Unit { ## Further Reading -The [Quantum Katas][1] offer great self-paced tutorials and programming exercises to learn quantum computing and Q#. +The Quantum Katas ([repo](https://github.com/microsoft/qsharp/tree/main/katas) [hosted tutorials](https://quantum.microsoft.com/en-us/tools/quantum-katas) offer great self-paced tutorials and programming exercises to learn quantum computing and Q#. -[Q# Documentation][2] is official Q# documentation, including language reference and user guides. - -[1]: https://github.com/microsoft/QuantumKatas -[2]: https://docs.microsoft.com/quantum/ +[Q# Documentation](https://docs.microsoft.com/quantum/) is official Q# documentation, including language reference and user guides. \ No newline at end of file