1- """
2- Build the Grover Search Algorithm for a desired
3- number of quantum bits using Qiskit framework.
4- This experiment runs in IBM Q simulator with 10000 shots.
5-
6- This circuit demonstrates amplitude amplification
7- and can be used as a building block for quantum
8- search and optimization problems.
9-
10- References:
11- https://en.wikipedia.org/wiki/Grover%27s_algorithm
12- https://qiskit.org/textbook/ch-algorithms/grover.html
13- """
14-
151import importlib .util
162import math
173
184
19- QISKIT_AVAILABLE = importlib .util .find_spec ("qiskit" ) is not None
20-
21- if QISKIT_AVAILABLE :
22- from qiskit import Aer , ClassicalRegister , QuantumCircuit , QuantumRegister , execute
23-
24-
255def grover_search (number_of_qubits : int = 2 ):
266 """
277 Build and simulate Grover's search algorithm.
28-
29- The oracle marks the |11...1> state.
30-
31- Args:
32- number_of_qubits (int): number of qubits
33-
34- Returns:
35- qiskit.result.counts.Counts: distribution counts.
36-
37- Raises:
38- TypeError: if input is not integer
39- ValueError: if invalid number of qubits
40- ModuleNotFoundError: if qiskit is not installed
41-
42- >>> if QISKIT_AVAILABLE: # doctest: +SKIP
43- ... counts = grover_search(2)
44- ... isinstance(counts, dict)
45- True
468 """
47- if not QISKIT_AVAILABLE :
9+
10+ if importlib .util .find_spec ("qiskit" ) is None :
4811 raise ModuleNotFoundError (
4912 "qiskit is required for this algorithm. "
5013 "Install it with: pip install qiskit qiskit-aer"
5114 )
5215
16+ from qiskit import Aer , ClassicalRegister , QuantumCircuit , QuantumRegister , execute
17+
5318 if isinstance (number_of_qubits , str ):
5419 raise TypeError ("number of qubits must be an integer." )
5520 if number_of_qubits <= 0 :
@@ -59,20 +24,16 @@ def grover_search(number_of_qubits: int = 2):
5924 if number_of_qubits > 10 :
6025 raise ValueError ("number of qubits too large to simulate (>10)." )
6126
62- # Create registers
6327 qr = QuantumRegister (number_of_qubits , "qr" )
6428 cr = ClassicalRegister (number_of_qubits , "cr" )
6529 quantum_circuit = QuantumCircuit (qr , cr )
6630
67- # Step 1: Initialize superposition
6831 quantum_circuit .h (qr )
6932
70- # -------- Oracle (mark |11...1>) --------
7133 quantum_circuit .h (number_of_qubits - 1 )
7234 quantum_circuit .mcx (list (range (number_of_qubits - 1 )), number_of_qubits - 1 )
7335 quantum_circuit .h (number_of_qubits - 1 )
7436
75- # -------- Diffuser --------
7637 quantum_circuit .h (qr )
7738 quantum_circuit .x (qr )
7839
@@ -83,18 +44,9 @@ def grover_search(number_of_qubits: int = 2):
8344 quantum_circuit .x (qr )
8445 quantum_circuit .h (qr )
8546
86- # Measure all qubits
8747 quantum_circuit .measure (qr , cr )
8848
89- # Run simulator with 10000 shots
9049 backend = Aer .get_backend ("qasm_simulator" )
9150 job = execute (quantum_circuit , backend , shots = 10000 )
9251
9352 return job .result ().get_counts (quantum_circuit )
94-
95-
96- if __name__ == "__main__" :
97- if QISKIT_AVAILABLE :
98- print (f"Total count for Grover search state is: { grover_search (3 )} " )
99- else :
100- print ("qiskit not installed. Install with: pip install qiskit qiskit-aer" )
0 commit comments