# Quantum Amplitude Amplification#

amplitude_amplification(args, state_function, oracle_function, kwargs_oracle={}, iter=1)[source]#

This method performs quantum amplitude amplification.

The problem of quantum amplitude amplification is described as follows:

• Given a unitary operator $$\mathcal{A}$$, let $$\ket{\Psi}=\mathcal{A}\ket{0}$$.

• Write $$\ket{\Psi}=\ket{\Psi_1}+\ket{\Psi_0}$$ as a superposition of the orthogonal good and bad components of $$\ket{\Psi}$$.

• Enhance the probability $$a=\langle\Psi_1|\Psi_1\rangle$$ that a measurement of $$\ket{\Psi}$$ yields a good state.

Let $$\theta_a\in [0,\pi/2]$$ such that $$\sin^2(\theta_a)=a$$. Then the amplitude amplification operator $$\mathcal Q$$ acts as

$\mathcal Q^j\ket{\Psi}=\frac{1}{\sqrt{a}}\sin((2j+1)\theta_a)\ket{\Psi_1}+\frac{1}{\sqrt{1-a}}\cos((2j+1)\theta_a)\ket{\Psi_0}.$

Therefore, after $$m$$ iterations the probability of measuring a good state is $$\sin^2((2m+1)\theta_a)$$.

Parameters
argsQuantumVariable or list[QuantumVariable]

The (list of) QuantumVariables which represent the state, the amplitude amplification is performed on.

state_functionfunction

A Python function preparing the state $$\ket{\Psi}$$. This function will receive the variables in the list args as arguments in the course of this algorithm.

oracle_functionfunction

A Python function tagging the good state $$\ket{\Psi_1}$$. This function will receive the variables in the list args as arguments in the course of this algorithm.

kwargs_oracledict, optional

A dictionary containing keyword arguments for the oracle. The default is {}.

iterint, optional

The amount of amplitude amplification iterations to perform. The default is 1.

Examples

We define a function that prepares the state $$\ket{\Psi}=\cos(\frac{\pi}{16})\ket{0}+\sin(\frac{\pi}{16})\ket{1}$$ and an oracle that tags the good state $$\ket{1}$$. In this case, we have $$a=\sin^2(\frac{\pi}{16})\approx 0.19509$$.

from qrisp import z, ry, QuantumBool, amplitude_amplification
import numpy as np

def state_function(qb):
ry(np.pi/8,qb)

def oracle_function(qb):
z(qb)

qb = QuantumBool()

state_function(qb)

>>> qb.qs.statevector(decimals=5)
0.98079∣False⟩+0.19509∣True⟩


We can enhance the probability of measuring the good state with amplitude amplification:

>>> amplitude_amplification([qb], state_function, oracle_function)
>>> qb.qs.statevector(decimals=5)
0.83147*|False> + 0.55557*|True>

>>> amplitude_amplification([qb], state_function, oracle_function)
>>> qb.qs.statevector(decimals=5)
0.55557*|False> + 0.83147*|True>

>>> amplitude_amplification([qb], state_function, oracle_function)
>>> qb.qs.statevector(decimals=5)
0.19509*|False> + 0.98079*|True>