# Search for an element and estimate the success probability
**English** · 简体中文
Grover search marks good states with a phase oracle. Below we mark `3` among four basis states and read that state out after one iteration.
```{testcode}
from oracq.algorithms.input_model.oracles import phase_marks
from oracq.algorithms.common.search import grover
from oracq import simulate
result = grover(phase_marks(2, [3]), 2, iterations=1)
state = simulate(result.operation.program())
print(state.amplitudes)
assert abs(state.amplitudes[(3, 0)] - 1) < 1e-12
```
```{testoutput}
{(3, 0): (0.9999999999999996-1.8369701987210287e-16j)}
```
{obj}`grover ` takes the phase oracle declared by {obj}`phase_marks `. The printed dictionary holds a single basis state: the key `(3, 0)` means the target reads `3` and the signal is zero, and the squared magnitude of the amplitude is approximately `1` (the imaginary part is floating-point noise). The output contains the target and the signal. Here the signal is an empty interface and the result word is zero; a more elaborate input preparation may carry work registers.
## Estimating the probability
Standard amplitude estimation runs phase estimation on the Grover iterate; its entry point is {obj}`amplitude_estimation `. It takes an initial-state preparation and a set of good states and outputs a phase register. The initial state below is uniform over `0` and `1`, so the good state `1` has probability `1/2`.
```{testcode}
from oracq.algorithms.input_model.oracles import uniform_state
from oracq.algorithms.common.estimation import amplitude_estimation, amplitude_from_phase
operation = amplitude_estimation(uniform_state(1), [1], precision=3)
state = simulate(operation.program())
phases = {key[2] for key in state.amplitudes}
# The decoded values differ from 1/2 only in the last floating-point bit, and trig libraries on
# different platforms may differ in that bit; round to 12 digits before printing so the output
# is verbatim-identical on every platform.
print({value: round(amplitude_from_phase(value, 3), 12) for value in sorted(phases)})
assert phases == {2, 6}
assert all(abs(amplitude_from_phase(value, 3) - 0.5) < 1e-12 for value in phases)
```
```{testoutput}
{2: 0.5, 6: 0.5}
```
The initial state is prepared by {obj}`uniform_state `. The printed dictionary decodes the two phase words back into probabilities via {obj}`amplitude_from_phase `: both `2` and `6` give approximately `1/2`; the unrounded decoded values differ from `1/2` only in the last floating-point bit, which comes from the rounding of a finite-precision readout. In general, a finite-precision phase readout yields an approximate estimate; repeated sampling and statistical post-processing happen on the host side.
## Related pages
- Algorithm pages: Grover search, amplitude amplification, amplitude estimation, phase estimation
- API reference: [Search and amplitude amplification](../api/algorithms/common/search.rst), [Phase, amplitude, and overlap estimation](../api/algorithms/common/estimation.rst), [Oracle declarations and implementations](../api/algorithms/input_model/oracles.rst)
- Continue with: [Running and modifying the algorithm gallery](gallery.md) (further cases covering both algorithms of this example)