I cannot seem to get an estimate for the number of solutions using the quantum counting algorithm described in Nielsen and Chuang, i.e. phase estimation with the Grover iteration acting as $U$.
I try doing the following with control
and target
as allocated qubit registers:
let controlBE = BigEndian(control);
let ancilla = target[0];
X(ancilla);
ApplyToEachCA(H, control + target);
for (i in 0..Length(control) - 1) {
Controlled GroverPow([control[Length(control) - 1 - i]], (2 ^ i, target));
}
Adjoint QFT(controlBE);
let fiBE = MeasureInteger(controlBE);
let numSolutionsD = PowD(Sin(ToDouble(fiBE) / 2.0), 2.0) * ToDouble(2 ^ Length(inputQubits));
Message("numSolutions: " + Round(numSolutionsD));
My GroverPow
is a discrete oracle that is supposed to perform the Grover iteration to the power defined by the given integer.
operation GroverPow(power: Int, qubits: Qubit[]): Unit {
let ancilla = qubits[0];
let inputQubits = qubits[1..Length(qubits) - 1];
let aug = Tail(inputQubits);
let ans = Most(inputQubits);
for (i in 1..power) {
Oracle(ans, database, ancilla, aug); // Grover iteration
ApplyToEachCA(H, inputQubits);
ApplyToEachCA(X, inputQubits);
Controlled Z(Most(inputQubits), Tail(inputQubits));
ApplyToEachCA(X, inputQubits);
ApplyToEachCA(H, inputQubits);
}
}
This just doesn't give the correct answer, even when I have the oracle do absolutely nothing. Is there an obvious bug that I'm missing? I've tried using various combinations of my home-grown functions as well as the built-in AmpAmpByOracle
and QuantumPhaseEstimation
functions and various initial/target states but to no avail. I've tried absolutely everything I can think of, and am almost starting to get suspicious of the validity of this algorithm...obviously it's sound but that's where I'm at! Just doesn't seem to work.