-
Notifications
You must be signed in to change notification settings - Fork 0
/
BasicPhaseEstimation.qs
51 lines (40 loc) · 1.33 KB
/
BasicPhaseEstimation.qs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
namespace PhaseEstimation {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Convert;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Arrays;
open Microsoft.Quantum.Math;
operation U (phi : Double, psi : Qubit[]): Unit is Adj + Ctl {
Controlled Rz (Most(psi), (2.*phi, Tail(psi)));
}
operation basicPhaseEstimation (n : Int, theta : Double, oracle : (Qubit[]) => Unit is Ctl, psi : Qubit[]) : Result {
use aux = Qubit();
H(aux);
Rz (-IntAsDouble(n)*theta, aux);
for _ in 0 .. n-1 {
Controlled oracle ([aux], psi);
}
H(aux);
let result = MResetZ(aux);
return result;
}
// @EntryPoint()
operation run (nShots : Int, phi : Double, oraclePower : Int) : (Int, Int) {
let theta = - PI() / (2.0 * IntAsDouble(oraclePower));
use psi = Qubit[3];
ApplyToEachCA(X, psi);
mutable nZero = 0;
mutable nOne = 0;
for _ in 0 .. nShots-1 {
let result = basicPhaseEstimation(oraclePower, theta, U(phi, _), psi);
if (result == One) {
set nOne += 1;
} else {
set nZero += 1;
}
}
ResetAll(psi);
return (nZero, nOne);
}
}