These code samples were written by Mariia Mykhailova.
// Example 6-1: Applying the mirror subroutine to a flipped phase
open Microsoft.Quantum.Arrays;
open Microsoft.Quantum.Convert;
open Microsoft.Quantum.Diagnostics;
// Operation that flips the sign of the marked value in the register
operation Flip (markedValue : Int, register : Qubit[]) : Unit is Adj {
let bits = IntAsBoolArray(markedValue, Length(register));
ApplyPauliFromBitString(PauliX, false, bits, register);
Controlled Z(Most(register), Tail(register));
ApplyPauliFromBitString(PauliX, false, bits, register);
}
// "Mirror" operation
operation Mirror (register : Qubit[]) : Unit is Adj {
within {
ApplyToEachA(H, register);
ApplyToEachA(X, register);
} apply {
Controlled Z(Most(register), Tail(register));
}
}
operation OneIteration () : Unit {
let markedState = 3;
// Allocate the qubit register
use register = Qubit[4];
// Prep
ApplyToEach(H, register);
// Flip
Flip(markedState, register);
DumpMachine();
// Note that at this point the marked state will have negative amplitude
// Mirror
Mirror(register);
DumpMachine();
// Note that after mirroring step the probability of measuring the marked state
// (the first column in square brackets, also indicated by a row of asterisks before it)
// is larger than the others
// Make sure the qubits are back to the |0❭ state
ResetAll(register);
}
%simulate OneIteration
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.2500 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.6875 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ |
()
// Example 6-2: Repeated amplitude amplification iterations
open Microsoft.Quantum.Arrays;
open Microsoft.Quantum.Convert;
open Microsoft.Quantum.Diagnostics;
operation RepeatedIterations () : Unit {
let markedState = 3;
let numberOfIterations = 4;
// Allocate the qubit register
use register = Qubit[4];
// Prep
ApplyToEach(H, register);
DumpMachine();
for i in 1 .. numberOfIterations {
Flip(markedState, register);
Mirror(register);
DumpMachine();
// Observe how the probability of measuring the marked state changes after each iteration
}
// Make sure the qubits are back to the |0❭ state
ResetAll(register);
}
%simulate RepeatedIterations
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $0.2500 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.6875 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $-0.1875 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $0.9531 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $0.0781 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.9805 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $0.0508 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $0.7627 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $-0.1670 + 0.0000 i$ | ↑ |
()
// Example 6-3: Amplitude amplification iterations with multiple values flipped
open Microsoft.Quantum.Arrays;
open Microsoft.Quantum.Convert;
open Microsoft.Quantum.Diagnostics;
// Operation that flips the sign of multiple marked values
operation FlipMultipleStates (markedValues : Int[], register : Qubit[]) : Unit is Adj {
ApplyToEachA(Flip(_, register), markedValues);
}
operation MultipleTerms () : Unit {
let markedStates = [0, 1, 2];
let numberOfIterations = 4;
// Allocate the qubit register
use register = Qubit[4];
// Prep
ApplyToEach(H, register);
for (i in 1 .. numberOfIterations) {
// Flip
FlipMultipleStates(markedStates, register);
// Mirror
Mirror(register);
DumpMachine();
}
// Make sure the qubits are back to the |0❭ state
ResetAll(register);
}
c:\snippet_.qs(20,9): warning QS3306: Deprecated syntax. Parentheses here are no longer required and will not be supported in the future.
%simulate MultipleTerms
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $-0.5625 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $-0.5625 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $-0.5625 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $-0.0625 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $0.4531 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $0.4531 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $0.4531 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $-0.1719 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $-0.0039 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $-0.0039 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $-0.0039 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $0.2773 + 0.0000 i$ | ↑ |
Qubit IDs | 0, 1, 2, 3 | ||
---|---|---|---|
Basis state (little endian) | Amplitude | Meas. Pr. | Phase |
$\left|0\right\rangle$ | $-0.4482 + 0.0000 i$ | ↑ | |
$\left|1\right\rangle$ | $-0.4482 + 0.0000 i$ | ↑ | |
$\left|2\right\rangle$ | $-0.4482 + 0.0000 i$ | ↑ | |
$\left|3\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|4\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|5\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|6\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|7\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|8\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|9\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|10\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|11\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|12\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|13\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|14\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ | |
$\left|15\right\rangle$ | $-0.1748 + 0.0000 i$ | ↑ |
()