3
$\begingroup$

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?


UPDATE
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?

$\endgroup$

1 Answer 1

2
$\begingroup$

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) s_psi0.z(n) 

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) 
$\endgroup$
2
  • $\begingroup$ Could you please reference some works where they have this additional qubit? Thank you! $\endgroup$ Commented 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$ Commented Sep 29, 2020 at 13:14

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.