HI!
Yesterday I wrote on the MResetZ() which allows us to get the status of a Qubit and release it. Well, at the end of each Q# operation, all the used Qubits need to be released for the simulator to work properly.
The following sample code will show a bad sample where a Qubit is used and not released correctly:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
operation HGateWithOutReset (initial: Result) : (Result) | |
{ | |
body | |
{ | |
mutable res = Zero; | |
using (qubits = Qubit[2]) | |
{ | |
let qubit1 = qubits[0]; | |
let qubit2 = qubits[1]; | |
H(qubit1); | |
set res = M(qubit1); | |
} | |
return (res); | |
} | |
} |
So, in runtime we will find this amazing and cool error:
Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState
HResult=0x80131500
Message=Released qubits are not in zero state.
Source=Microsoft.Quantum.Simulation.Simulators
Microsoft Quantum Development Kit offers us a series of operations that help us to release Qubits: Reset() and ResetAll(). As its name indicates Reset() is intended to release a single Qubit and ResetAll() to release an array of Qubits.
Given a single Qubit, Reset() evaluates the Qubit state and ensures that the Qubit is in the state |0⟩ so it can be safely released.
The following 2 operations show examples of how to use these operations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
operation HGateWithResetEachQubit (initial: Result) : (Result) | |
{ | |
body | |
{ | |
mutable res = Zero; | |
using (qubits = Qubit[2]) | |
{ | |
let qubit1 = qubits[0]; | |
let qubit2 = qubits[1]; | |
H(qubit1); | |
set res = M(qubit1); | |
Reset(qubit1); | |
Reset(qubit2); | |
} | |
return (res); | |
} | |
} | |
operation HGateWithResetAllQubits (initial: Result) : (Result) | |
{ | |
body | |
{ | |
mutable res = Zero; | |
using (qubits = Qubit[2]) | |
{ | |
let qubit1 = qubits[0]; | |
let qubit2 = qubits[1]; | |
H(qubit1); | |
set res = M(qubit1); | |
ResetAll(qubits); | |
} | |
return (res); | |
} | |
} |
Happy QCoding!
Greetings @ Toronto
El Bruno
References
- Microsoft Quantum Development Kit
- Q# Reference, M operation
- Q# Reference, H operation
- Q# Reference, MResetZ operation
- Q# Reference, Reset operation
- Q# Reference, ResetAll operation
My Posts
- El Bruno, Using MResetZ() to reset Qubits in Q#
- El Bruno, Qubit operations in Q#
- El Bruno, Information about Simulators on Microsoft Quantum Development Kit (Do you have 16 TB RAM?)
- El Bruno, Hello QWorld using Microsoft #Quantum Development Kit (fix to build the project) [Updated]
- El Bruno, More information about the Microsoft bet in Quantum Computing
- El Bruno, Quantum Computing, let’s add this one to Artificial Intelligence and Mixed Reality!
LikeLike