I'm trying to implement a circuit for Quantum Amplitude Estimation in Qiskit using elementary gates.

I have created the circuit that represent my algorithm $A$ but now from the theory I know that I have to create the Q-operator defined as: $Q = A S_0 A^{-1} S_{\psi_{0}}$ , where $S_0$ and $S_{\psi_{0}}$ are two reflections.

How can I implement these two reflections in the circuit using Qiskit gates?

I built a quantum circuit for reproducing an algorithm $A$ for computing expected value of a random variable, given by:

  1. Load a random variable X as a quantum state

$$ L|0\rangle_n = |\psi\rangle_n = \sum_{i=0}^{2^n - 1}\sqrt{p_i} |i\rangle_n \ \ \ such \ that \ \sum_{i=0}^{2^n - 1}p_i = 1 $$

  1. Create an operator for the encoding

$$ F|i\rangle_n |0\rangle = \sqrt{1 - f(i)} |i\rangle_n |0\rangle + \sqrt{f(i)} |i\rangle_n |1\rangle $$

So my algorithm $A$ is given by the final state:

$$ F (L|0\rangle_n)|0\rangle = F|\psi\rangle_n|0\rangle = \sum_{i=0}^{2^n-1} \sqrt{1 - f(i)} \sqrt{p_i} |i\rangle_n |0\rangle + \sum_{i=0}^{2^n-1} \sqrt{f(i)} \sqrt{p_i} |i\rangle_n |1\rangle $$
I used 3 qubits for loading distribution and one ancilla qubit; so my Qiskit circuit is the following Qiskit circuit

From this I would create $Q$ operator for Amplitude Estimation. How can I procede?


1 Answer 1


Short answer:

Check out qiskit.aqua.algorithms.amplitude_estimators.q_factory.QFactory which constructs $Q$ if you provide it with $A$. You can use the i_objective argument to specify the "good" state in $S_{\Psi_0}$.

Long answer:

The $S_0$ operation is flips the sign of the $|0\rangle$ state and leaves all the others in place. This can be implemented with a multi-controlled Z gate with X gates around the target gate, so it applies a -1 factor to $|0\rangle$ and not $|1\rangle$. In Qiskit, you can do that with the QuantumCircuit.mcx method and Hadamard gates around that (since there's no mcz method and HXH = Z):

from qiskit import QuantumCircuit
s0 = QuantumCircuit(n)
s0.x(n - 1)
s0.h(n - 1)
s0.mcx(list(range(n - 1)), n - 1)
s0.h(n - 1)
s0.x(n - 1)

The $S_{\Psi_0}$ operation, called the oracle in Grover's algorithm, applies a -1 factor to the "good" qubit states. This requires additional information, how do you determine if a state is "good" or "bad" in your scenario?

As an example: In many optimization examples we define the operator $A$ as $$ A|0\rangle^{\otimes (n + 1)} = \sqrt{1 - a} |\psi_0\rangle|0\rangle + \sqrt{a} |\psi_1\rangle|1\rangle $$ for $n$-qubit states $|\psi_{0,1}\rangle$. There we define good states by the last qubit begin in state $|1\rangle$ and hence the circuit for $S_{\Psi_0}$ is just a $Z$ gate on the last qubit:

s_psi0 = QuantumCircuit(n + 1)

In the amplitude estimation algorithm, the QFactory class (full import qiskit.aqua.algorithms.amplitude_estimators.q_factory.QFactory) is used, which constructs $Q$ if you provide it with $A$. There it assumes that the good state can be specified by the a single qubit begin in state $|1\rangle$. The index of this qubit is specified via i_objective (per default the last qubit index is used).

The above example, where the "good" state is specified by the last qubit being in state $|1\rangle$ would therefore be

from qiskit.aqua.algorithms.amplitude_estimators.q_factory import QFactory
q = QFactory(your_a_factory)
  • $\begingroup$ Could you please reference some works where they have this additional qubit? Thank you! $\endgroup$ Sep 18, 2020 at 15:51
  • $\begingroup$ Hi, I try to modify my question in order to make it more precise. I hope you could help me $\endgroup$
    – VittorioC
    Sep 29, 2020 at 13:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.