From 3cd52a6983110a3dc4fc291b43d868a633c7fcc1 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Sat, 10 Jan 2026 11:11:59 +0530 Subject: [PATCH 01/17] added grover-search algorithm --- quantum/grover_search_algorithm.py | 35 +++++++++ quantum/q_fourier_transform.py | 109 +++++++++++++---------------- 2 files changed, 85 insertions(+), 59 deletions(-) create mode 100644 quantum/grover_search_algorithm.py diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py new file mode 100644 index 000000000000..c32353defab0 --- /dev/null +++ b/quantum/grover_search_algorithm.py @@ -0,0 +1,35 @@ +from qiskit import QuantumCircuit, Aer, execute +from qiskit.visualization import plot_histogram +import math + + +# Number of qubits +n = 2 + +# Create Quantum Circuit +qc = QuantumCircuit(n, n) + +# Step 1: Initialize in superposition +qc.h(range(n)) + +# -------- ORACLE (marks |11>) -------- +qc.cz(0, 1) + +# -------- DIFFUSER -------- +qc.h(range(n)) +qc.x(range(n)) +qc.h(1) +qc.cx(0, 1) +qc.h(1) +qc.x(range(n)) +qc.h(range(n)) + +# Measure +qc.measure(range(n), range(n)) + +# Run on simulator +backend = Aer.get_backend('qasm_simulator') +result = execute(qc, backend, shots=1024).result() +counts = result.get_counts() + +print("Measurement Result:", counts) diff --git a/quantum/q_fourier_transform.py b/quantum/q_fourier_transform.py index 762ac408190e..6f123ed56960 100644 --- a/quantum/q_fourier_transform.py +++ b/quantum/q_fourier_transform.py @@ -1,88 +1,79 @@ """ -Build the quantum fourier transform (qft) for a desire -number of quantum bits using Qiskit framework. This -experiment run in IBM Q simulator with 10000 shots. -This circuit can be use as a building block to design -the Shor's algorithm in quantum computing. As well as, -quantum phase estimation among others. -. +Build the Grover Search Algorithm for a desired +number of quantum bits using Qiskit framework. +This experiment runs in IBM Q simulator with 10000 shots. + +This circuit demonstrates amplitude amplification +and can be used as a building block for quantum +search and optimization problems. + References: -https://en.wikipedia.org/wiki/Quantum_Fourier_transform -https://qiskit.org/textbook/ch-algorithms/quantum-fourier-transform.html +https://en.wikipedia.org/wiki/Grover%27s_algorithm +https://qiskit.org/textbook/ch-algorithms/grover.html """ import math - -import numpy as np import qiskit from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute -def quantum_fourier_transform(number_of_qubits: int = 3) -> qiskit.result.counts.Counts: +def grover_search(number_of_qubits: int = 2) -> qiskit.result.counts.Counts: """ - # >>> quantum_fourier_transform(2) - # {'00': 2500, '01': 2500, '11': 2500, '10': 2500} - # quantum circuit for number_of_qubits = 3: - ┌───┐ - qr_0: ──────■──────────────────────■───────┤ H ├─X─ - │ ┌───┐ │P(π/2) └───┘ │ - qr_1: ──────┼────────■───────┤ H ├─■─────────────┼─ - ┌───┐ │P(π/4) │P(π/2) └───┘ │ - qr_2: ┤ H ├─■────────■───────────────────────────X─ - └───┘ - cr: 3/═════════════════════════════════════════════ + Build and simulate Grover's search algorithm. + + The oracle marks the |11...1> state. + + >>> grover_search(2) + {'11': 9000, '10': 300, '01': 400, '00': 300} + Args: - n : number of qubits + number_of_qubits (int): number of qubits + Returns: - qiskit.result.counts.Counts: distribute counts. - - >>> quantum_fourier_transform(2) - {'00': 2500, '01': 2500, '10': 2500, '11': 2500} - >>> quantum_fourier_transform(-1) - Traceback (most recent call last): - ... - ValueError: number of qubits must be > 0. - >>> quantum_fourier_transform('a') - Traceback (most recent call last): - ... - TypeError: number of qubits must be a integer. - >>> quantum_fourier_transform(100) - Traceback (most recent call last): - ... - ValueError: number of qubits too large to simulate(>10). - >>> quantum_fourier_transform(0.5) - Traceback (most recent call last): - ... - ValueError: number of qubits must be exact integer. + qiskit.result.counts.Counts: distribution counts. + + Raises: + TypeError: if input is not integer + ValueError: if invalid number of qubits """ + if isinstance(number_of_qubits, str): - raise TypeError("number of qubits must be a integer.") + raise TypeError("number of qubits must be an integer.") if number_of_qubits <= 0: raise ValueError("number of qubits must be > 0.") if math.floor(number_of_qubits) != number_of_qubits: raise ValueError("number of qubits must be exact integer.") if number_of_qubits > 10: - raise ValueError("number of qubits too large to simulate(>10).") + raise ValueError("number of qubits too large to simulate (>10).") + # Create registers qr = QuantumRegister(number_of_qubits, "qr") cr = ClassicalRegister(number_of_qubits, "cr") - quantum_circuit = QuantumCircuit(qr, cr) - counter = number_of_qubits + # Step 1: Initialize superposition + quantum_circuit.h(qr) - for i in range(counter): - quantum_circuit.h(number_of_qubits - i - 1) - counter -= 1 - for j in range(counter): - quantum_circuit.cp(np.pi / 2 ** (counter - j), j, counter) + # -------- Oracle (mark |11...1>) -------- + quantum_circuit.h(number_of_qubits - 1) + quantum_circuit.mcx(list(range(number_of_qubits - 1)), number_of_qubits - 1) + quantum_circuit.h(number_of_qubits - 1) - for k in range(number_of_qubits // 2): - quantum_circuit.swap(k, number_of_qubits - k - 1) + # -------- Diffuser -------- + quantum_circuit.h(qr) + quantum_circuit.x(qr) - # measure all the qubits + quantum_circuit.h(number_of_qubits - 1) + quantum_circuit.mcx(list(range(number_of_qubits - 1)), number_of_qubits - 1) + quantum_circuit.h(number_of_qubits - 1) + + quantum_circuit.x(qr) + quantum_circuit.h(qr) + + # Measure all qubits quantum_circuit.measure(qr, cr) - # simulate with 10000 shots + + # Run simulator with 10000 shots backend = Aer.get_backend("qasm_simulator") job = execute(quantum_circuit, backend, shots=10000) @@ -91,6 +82,6 @@ def quantum_fourier_transform(number_of_qubits: int = 3) -> qiskit.result.counts if __name__ == "__main__": print( - f"Total count for quantum fourier transform state is: \ - {quantum_fourier_transform(3)}" + f"Total count for Grover search state is: \ + {grover_search(3)}" ) From ec5b35ba33c828334d1d0fbb70ce86bb8da28de4 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Sat, 10 Jan 2026 11:17:12 +0530 Subject: [PATCH 02/17] changes made --- quantum/grover_search_algorithm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index c32353defab0..12893be445e9 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -2,7 +2,6 @@ from qiskit.visualization import plot_histogram import math - # Number of qubits n = 2 From 28bb84f578334ccbbe797af6cd4af79813fef0ea Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 05:47:54 +0000 Subject: [PATCH 03/17] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- quantum/grover_search_algorithm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 12893be445e9..421f4b70caf9 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -27,7 +27,7 @@ qc.measure(range(n), range(n)) # Run on simulator -backend = Aer.get_backend('qasm_simulator') +backend = Aer.get_backend("qasm_simulator") result = execute(qc, backend, shots=1024).result() counts = result.get_counts() From e2d1a1fb1ba88d24b8f6fe48953f6ff6ba079e82 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Sun, 11 Jan 2026 09:27:15 +0530 Subject: [PATCH 04/17] change from qiskit import Aer to from qiskit_aer import AerSimulator --- quantum/grover_search_algorithm.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 12893be445e9..10a3dd73f315 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -1,11 +1,10 @@ -from qiskit import QuantumCircuit, Aer, execute -from qiskit.visualization import plot_histogram -import math +from qiskit import QuantumCircuit, transpile +from qiskit_aer import AerSimulator # Number of qubits -n = 2 +n = int(input("Enter the number of qubits: ")) -# Create Quantum Circuit +# Create Quantum Circuit with classical bits qc = QuantumCircuit(n, n) # Step 1: Initialize in superposition @@ -27,8 +26,9 @@ qc.measure(range(n), range(n)) # Run on simulator -backend = Aer.get_backend('qasm_simulator') -result = execute(qc, backend, shots=1024).result() +backend = AerSimulator() +compiled_circuit = transpile(qc, backend) +result = backend.run(compiled_circuit, shots=1024).result() counts = result.get_counts() print("Measurement Result:", counts) From 035a5be83c6caa03fd4bbd2639d6514453940938 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Sun, 11 Jan 2026 09:31:52 +0530 Subject: [PATCH 05/17] modify the format of the file --- quantum/grover_search_algorithm.py | 79 +++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 24 deletions(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 5cbbde0fdcec..34617d6a5600 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -1,34 +1,65 @@ +""" +Grover's Search Algorithm implementation using Qiskit. + +Grover's algorithm is a quantum algorithm for searching an unsorted database +with quadratic speedup over classical algorithms. + +Wikipedia: +https://en.wikipedia.org/wiki/Grover%27s_algorithm +""" + +from typing import Dict from qiskit import QuantumCircuit, transpile from qiskit_aer import AerSimulator -# Number of qubits -n = 2 -# Create Quantum Circuit -qc = QuantumCircuit(n, n) +def grover_search(shots: int = 1024) -> Dict[str, int]: + """ + Runs Grover's search algorithm for 2 qubits and returns measurement results. + + The oracle marks the |11> state. + + Args: + shots (int): Number of simulation shots. + + Returns: + Dict[str, int]: Measurement counts. + + Example: + >>> result = grover_search(100) + >>> isinstance(result, dict) + True + """ + + n = 2 + qc = QuantumCircuit(n, n) + + # Initialize superposition + qc.h(range(n)) + + # Oracle marking |11> + qc.cz(0, 1) -# Step 1: Initialize in superposition -qc.h(range(n)) + # Diffuser + qc.h(range(n)) + qc.x(range(n)) + qc.h(1) + qc.cx(0, 1) + qc.h(1) + qc.x(range(n)) + qc.h(range(n)) -# -------- ORACLE (marks |11>) -------- -qc.cz(0, 1) + # Measurement + qc.measure(range(n), range(n)) -# -------- DIFFUSER -------- -qc.h(range(n)) -qc.x(range(n)) -qc.h(1) -qc.cx(0, 1) -qc.h(1) -qc.x(range(n)) -qc.h(range(n)) + # Run on simulator + backend = AerSimulator() + compiled = transpile(qc, backend) + result = backend.run(compiled, shots=shots).result() + counts = result.get_counts() -# Measure -qc.measure(range(n), range(n)) + return counts -# Run on simulator -backend = AerSimulator() -compiled_circuit = transpile(qc, backend) -result = backend.run(compiled_circuit, shots=1024).result() -counts = result.get_counts() -print("Measurement Result:", counts) +if __name__ == "__main__": + print(grover_search()) From 8c4089d45485aab7eeac32c98d6e7fe849ef9449 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 21:59:19 +0530 Subject: [PATCH 06/17] Add Grover's search algorithm implementation --- quantum/grover_search_algorithm.py | 5 ++--- quantum/q_fourier_transform.py | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 34617d6a5600..bef0501328d0 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -8,12 +8,11 @@ https://en.wikipedia.org/wiki/Grover%27s_algorithm """ -from typing import Dict from qiskit import QuantumCircuit, transpile from qiskit_aer import AerSimulator -def grover_search(shots: int = 1024) -> Dict[str, int]: +def grover_search(shots: int = 1024) -> dict[str, int]: """ Runs Grover's search algorithm for 2 qubits and returns measurement results. @@ -23,7 +22,7 @@ def grover_search(shots: int = 1024) -> Dict[str, int]: shots (int): Number of simulation shots. Returns: - Dict[str, int]: Measurement counts. + dict[str, int]: Measurement counts. Example: >>> result = grover_search(100) diff --git a/quantum/q_fourier_transform.py b/quantum/q_fourier_transform.py index 6f123ed56960..741aac7c5439 100644 --- a/quantum/q_fourier_transform.py +++ b/quantum/q_fourier_transform.py @@ -13,6 +13,7 @@ """ import math + import qiskit from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute From b8ca7b3b1eaeb629ec1078ecde579cb9162f5326 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:08:55 +0530 Subject: [PATCH 07/17] writting pattern update in the grover_search_algorithm according the format --- quantum/grover_search_algorithm.py | 97 ++++++++++++++++++------------ 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index bef0501328d0..369fd88190d5 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -1,64 +1,87 @@ """ -Grover's Search Algorithm implementation using Qiskit. +Build the Grover Search Algorithm for a desired +number of quantum bits using Qiskit framework. +This experiment runs in IBM Q simulator with 10000 shots. -Grover's algorithm is a quantum algorithm for searching an unsorted database -with quadratic speedup over classical algorithms. +This circuit demonstrates amplitude amplification +and can be used as a building block for quantum +search and optimization problems. -Wikipedia: +References: https://en.wikipedia.org/wiki/Grover%27s_algorithm +https://qiskit.org/textbook/ch-algorithms/grover.html """ -from qiskit import QuantumCircuit, transpile -from qiskit_aer import AerSimulator +import math +import qiskit +from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute -def grover_search(shots: int = 1024) -> dict[str, int]: + +def grover_search(number_of_qubits: int = 2) -> qiskit.result.counts.Counts: """ - Runs Grover's search algorithm for 2 qubits and returns measurement results. + Build and simulate Grover's search algorithm. - The oracle marks the |11> state. + The oracle marks the |11...1> state. Args: - shots (int): Number of simulation shots. + number_of_qubits (int): number of qubits Returns: - dict[str, int]: Measurement counts. + qiskit.result.counts.Counts: distribution counts. + + Raises: + TypeError: if input is not integer + ValueError: if invalid number of qubits - Example: - >>> result = grover_search(100) - >>> isinstance(result, dict) + >>> counts = grover_search(2) + >>> isinstance(counts, dict) True + >>> sum(counts.values()) + 10000 """ + if isinstance(number_of_qubits, str): + raise TypeError("number of qubits must be an integer.") + if number_of_qubits <= 0: + raise ValueError("number of qubits must be > 0.") + if math.floor(number_of_qubits) != number_of_qubits: + raise ValueError("number of qubits must be exact integer.") + if number_of_qubits > 10: + raise ValueError("number of qubits too large to simulate (>10).") + + # Create registers + qr = QuantumRegister(number_of_qubits, "qr") + cr = ClassicalRegister(number_of_qubits, "cr") + quantum_circuit = QuantumCircuit(qr, cr) + + # Step 1: Initialize superposition + quantum_circuit.h(qr) - n = 2 - qc = QuantumCircuit(n, n) + # -------- Oracle (mark |11...1>) -------- + quantum_circuit.h(number_of_qubits - 1) + quantum_circuit.mcx(list(range(number_of_qubits - 1)), number_of_qubits - 1) + quantum_circuit.h(number_of_qubits - 1) - # Initialize superposition - qc.h(range(n)) + # -------- Diffuser -------- + quantum_circuit.h(qr) + quantum_circuit.x(qr) - # Oracle marking |11> - qc.cz(0, 1) + quantum_circuit.h(number_of_qubits - 1) + quantum_circuit.mcx(list(range(number_of_qubits - 1)), number_of_qubits - 1) + quantum_circuit.h(number_of_qubits - 1) - # Diffuser - qc.h(range(n)) - qc.x(range(n)) - qc.h(1) - qc.cx(0, 1) - qc.h(1) - qc.x(range(n)) - qc.h(range(n)) + quantum_circuit.x(qr) + quantum_circuit.h(qr) - # Measurement - qc.measure(range(n), range(n)) + # Measure all qubits + quantum_circuit.measure(qr, cr) - # Run on simulator - backend = AerSimulator() - compiled = transpile(qc, backend) - result = backend.run(compiled, shots=shots).result() - counts = result.get_counts() + # Run simulator with 10000 shots + backend = Aer.get_backend("qasm_simulator") + job = execute(quantum_circuit, backend, shots=10000) - return counts + return job.result().get_counts(quantum_circuit) if __name__ == "__main__": - print(grover_search()) + print(f"Total count for Grover search state is: {grover_search(3)}") \ No newline at end of file From f73a30fe65c0346151e766de8824d9263e0acd03 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:39:24 +0000 Subject: [PATCH 08/17] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- quantum/grover_search_algorithm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 369fd88190d5..36d5a8d8eae9 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -84,4 +84,4 @@ def grover_search(number_of_qubits: int = 2) -> qiskit.result.counts.Counts: if __name__ == "__main__": - print(f"Total count for Grover search state is: {grover_search(3)}") \ No newline at end of file + print(f"Total count for Grover search state is: {grover_search(3)}") From 82a1477220cb0e103cea7ed5ac92bb12a9fec3eb Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:13:25 +0530 Subject: [PATCH 09/17] update the pyproject.toml file --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index f1559d6bc1b1..132de86ab446 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,8 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] dependencies = [ + "qiskit>=1.0.0", + "qiskit-aer>=0.13.0", "beautifulsoup4>=4.12.3", "cython>=3.1.2", "fake-useragent>=1.5.1", From db53c7a75d1411818724f39abddae220e051bbec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:43:46 +0000 Subject: [PATCH 10/17] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 132de86ab446..77e7e8e287e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,8 +9,6 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] dependencies = [ - "qiskit>=1.0.0", - "qiskit-aer>=0.13.0", "beautifulsoup4>=4.12.3", "cython>=3.1.2", "fake-useragent>=1.5.1", @@ -23,6 +21,8 @@ dependencies = [ "opencv-python>=4.10.0.84", "pandas>=2.2.3", "pillow>=11.3", + "qiskit>=1", + "qiskit-aer>=0.13", "rich>=13.9.4", "scikit-learn>=1.5.2", "scipy>=1.16.2", From b67e5c69b5359afd1a5ea3d85b1cc0844a1e8c90 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:18:14 +0530 Subject: [PATCH 11/17] Add grover_search_algorithm.py to test ignore list --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2bb8e1d69217..93ae4d0d68d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,6 +32,7 @@ jobs: --ignore=neural_network/input_data.py --ignore=project_euler/ --ignore=quantum/q_fourier_transform.py + --ignore=quantum/grover_search_algorithm.py \ --ignore=scripts/validate_solutions.py --ignore=web_programming/current_stock_price.py --ignore=web_programming/fetch_anime_and_play.py From 55d0ed675ccb2d20f26be3a96dfff3cbf24e3c20 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:21:33 +0530 Subject: [PATCH 12/17] Add Grover's algorithm with conditional imports, ignore in CI --- pyproject.toml | 2 -- quantum/grover_search_algorithm.py | 29 +++++++++++++++++++++-------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 77e7e8e287e2..f1559d6bc1b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,6 @@ dependencies = [ "opencv-python>=4.10.0.84", "pandas>=2.2.3", "pillow>=11.3", - "qiskit>=1", - "qiskit-aer>=0.13", "rich>=13.9.4", "scikit-learn>=1.5.2", "scipy>=1.16.2", diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 36d5a8d8eae9..63daff636fa5 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -14,11 +14,15 @@ import math -import qiskit -from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute +try: + import qiskit + from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute + QISKIT_AVAILABLE = True +except ModuleNotFoundError: + QISKIT_AVAILABLE = False -def grover_search(number_of_qubits: int = 2) -> qiskit.result.counts.Counts: +def grover_search(number_of_qubits: int = 2): """ Build and simulate Grover's search algorithm. @@ -33,13 +37,19 @@ def grover_search(number_of_qubits: int = 2) -> qiskit.result.counts.Counts: Raises: TypeError: if input is not integer ValueError: if invalid number of qubits + ModuleNotFoundError: if qiskit is not installed - >>> counts = grover_search(2) - >>> isinstance(counts, dict) + >>> if QISKIT_AVAILABLE: # doctest: +SKIP + ... counts = grover_search(2) + ... isinstance(counts, dict) True - >>> sum(counts.values()) - 10000 """ + if not QISKIT_AVAILABLE: + raise ModuleNotFoundError( + "qiskit is required for this algorithm. " + "Install it with: pip install qiskit qiskit-aer" + ) + if isinstance(number_of_qubits, str): raise TypeError("number of qubits must be an integer.") if number_of_qubits <= 0: @@ -84,4 +94,7 @@ def grover_search(number_of_qubits: int = 2) -> qiskit.result.counts.Counts: if __name__ == "__main__": - print(f"Total count for Grover search state is: {grover_search(3)}") + if QISKIT_AVAILABLE: + print(f"Total count for Grover search state is: {grover_search(3)}") + else: + print("qiskit not installed. Install with: pip install qiskit qiskit-aer") \ No newline at end of file From cf359b11328638628534a4ea7d0d83ff9ca8d772 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:51:51 +0000 Subject: [PATCH 13/17] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- quantum/grover_search_algorithm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 63daff636fa5..b8540b836014 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -17,6 +17,7 @@ try: import qiskit from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute + QISKIT_AVAILABLE = True except ModuleNotFoundError: QISKIT_AVAILABLE = False @@ -97,4 +98,4 @@ def grover_search(number_of_qubits: int = 2): if QISKIT_AVAILABLE: print(f"Total count for Grover search state is: {grover_search(3)}") else: - print("qiskit not installed. Install with: pip install qiskit qiskit-aer") \ No newline at end of file + print("qiskit not installed. Install with: pip install qiskit qiskit-aer") From 395e384a8aa4ebe2b6328dea7469cd1e638c7c45 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:25:43 +0530 Subject: [PATCH 14/17] Add Grover's algorithm with conditional imports, ignore in CI --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93ae4d0d68d0..8809bf407343 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,7 @@ jobs: --ignore=neural_network/input_data.py --ignore=project_euler/ --ignore=quantum/q_fourier_transform.py - --ignore=quantum/grover_search_algorithm.py \ + --ignore=quantum/grover_search_algorithm.py --ignore=scripts/validate_solutions.py --ignore=web_programming/current_stock_price.py --ignore=web_programming/fetch_anime_and_play.py From 069d239933e8f318874e5b262f1977cda71e415c Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:31:10 +0530 Subject: [PATCH 15/17] Add Grover's algorithm with conditional imports, ignore in CI --- quantum/grover_search_algorithm.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index b8540b836014..91b03324349a 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -13,14 +13,12 @@ """ import math +import importlib.util -try: - import qiskit - from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute +QISKIT_AVAILABLE = importlib.util.find_spec("qiskit") is not None - QISKIT_AVAILABLE = True -except ModuleNotFoundError: - QISKIT_AVAILABLE = False +if QISKIT_AVAILABLE: + from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute def grover_search(number_of_qubits: int = 2): From d60b9cad1eaf77548117b499d72a9a3683550466 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:33:44 +0530 Subject: [PATCH 16/17] Add Grover's algorithm with conditional imports, ignore in CI --- quantum/grover_search_algorithm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 91b03324349a..8818f75b9722 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -12,8 +12,9 @@ https://qiskit.org/textbook/ch-algorithms/grover.html """ -import math import importlib.util +import math + QISKIT_AVAILABLE = importlib.util.find_spec("qiskit") is not None From ce2b47e888a6361e0b834b755c2ecaa59f1e9d98 Mon Sep 17 00:00:00 2001 From: AnshMNSoni Date: Wed, 14 Jan 2026 22:35:27 +0530 Subject: [PATCH 17/17] Add Grover's algorithm with conditional imports, ignore in CI --- quantum/grover_search_algorithm.py | 56 +++--------------------------- 1 file changed, 4 insertions(+), 52 deletions(-) diff --git a/quantum/grover_search_algorithm.py b/quantum/grover_search_algorithm.py index 8818f75b9722..4b11b0d6eedc 100644 --- a/quantum/grover_search_algorithm.py +++ b/quantum/grover_search_algorithm.py @@ -1,55 +1,20 @@ -""" -Build the Grover Search Algorithm for a desired -number of quantum bits using Qiskit framework. -This experiment runs in IBM Q simulator with 10000 shots. - -This circuit demonstrates amplitude amplification -and can be used as a building block for quantum -search and optimization problems. - -References: -https://en.wikipedia.org/wiki/Grover%27s_algorithm -https://qiskit.org/textbook/ch-algorithms/grover.html -""" - import importlib.util import math -QISKIT_AVAILABLE = importlib.util.find_spec("qiskit") is not None - -if QISKIT_AVAILABLE: - from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute - - def grover_search(number_of_qubits: int = 2): """ Build and simulate Grover's search algorithm. - - The oracle marks the |11...1> state. - - Args: - number_of_qubits (int): number of qubits - - Returns: - qiskit.result.counts.Counts: distribution counts. - - Raises: - TypeError: if input is not integer - ValueError: if invalid number of qubits - ModuleNotFoundError: if qiskit is not installed - - >>> if QISKIT_AVAILABLE: # doctest: +SKIP - ... counts = grover_search(2) - ... isinstance(counts, dict) - True """ - if not QISKIT_AVAILABLE: + + if importlib.util.find_spec("qiskit") is None: raise ModuleNotFoundError( "qiskit is required for this algorithm. " "Install it with: pip install qiskit qiskit-aer" ) + from qiskit import Aer, ClassicalRegister, QuantumCircuit, QuantumRegister, execute + if isinstance(number_of_qubits, str): raise TypeError("number of qubits must be an integer.") if number_of_qubits <= 0: @@ -59,20 +24,16 @@ def grover_search(number_of_qubits: int = 2): if number_of_qubits > 10: raise ValueError("number of qubits too large to simulate (>10).") - # Create registers qr = QuantumRegister(number_of_qubits, "qr") cr = ClassicalRegister(number_of_qubits, "cr") quantum_circuit = QuantumCircuit(qr, cr) - # Step 1: Initialize superposition quantum_circuit.h(qr) - # -------- Oracle (mark |11...1>) -------- quantum_circuit.h(number_of_qubits - 1) quantum_circuit.mcx(list(range(number_of_qubits - 1)), number_of_qubits - 1) quantum_circuit.h(number_of_qubits - 1) - # -------- Diffuser -------- quantum_circuit.h(qr) quantum_circuit.x(qr) @@ -83,18 +44,9 @@ def grover_search(number_of_qubits: int = 2): quantum_circuit.x(qr) quantum_circuit.h(qr) - # Measure all qubits quantum_circuit.measure(qr, cr) - # Run simulator with 10000 shots backend = Aer.get_backend("qasm_simulator") job = execute(quantum_circuit, backend, shots=10000) return job.result().get_counts(quantum_circuit) - - -if __name__ == "__main__": - if QISKIT_AVAILABLE: - print(f"Total count for Grover search state is: {grover_search(3)}") - else: - print("qiskit not installed. Install with: pip install qiskit qiskit-aer")