{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Grover search: subset problem\n", "\n", "We define a function named `subset_sum(i,j)` that returns the sum of the elements `i` and `j` of a list `set_`. We want to use a Grover search to find which `i` `j` combination led to a given value." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from qlasskit import qlassf, Qint, Qint3, Qlist, Parameter\n", "from typing import Tuple\n", "\n", "\n", "@qlassf\n", "def subset_sum(\n", " ii: Tuple[Qint[2], Qint[2]], set_: Parameter[Qlist[Qint3, 4]]\n", ") -> Qint[3]:\n", " return set_[ii[0]] + set_[ii[1]] if ii[0] != ii[1] else 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our quantum function `subset_sum` will be used as an oracle for a Grover search. For instance, here we want to find the input value that produce the value `7`. Since we know that there are at least two result (`(i,j)` and `(j,i)`), we set `n_matching=2`. We also bind the parameter `set_` with the set of numbers where we want to search the solution." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from qlasskit.algorithms import Grover\n", "\n", "q_algo = Grover(subset_sum.bind(set_=[0, 5, 2, 3]), Qint3(7), n_matching=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we use our prefered framework and simulator for sampling the result; this is an example using `qiskit` with `aer_simulator`.\n", "\n", "In the output histogram, it's now evident that the input leading to a value of `7` are the tuples `(1,2)` and `(2,1)` (5+2 and 2+5), aligning with our expectations.\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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8ODByMjIwPTp002WTZ8+HRkZGRgyZIhJ+9ChQwHcuY9eTk6O2r5lyxbEx8cjKiqqWPfoIyIiIrJndnlOXnR0tHphxPHjx9W2+Ph4AECbNm0wePBgAMD48eOxceNGzJ07F7/++iuaNWuGo0ePIjY2FmFhYRg1apTJc0dGRmLw4MGIjo5Gs2bN0K1bN6SkpODrr79G5cqVsXjx4jIbJxEREVFpscuQt2fPHqxevdqkbe/evSaHWI0hz9PTEzt37sTUqVOxfv16xMXFITAwEGPHjsWUKVPg4eFR4PmXLVuGRo0aYfny5fjggw/g5eWFXr16YebMmahbt27pDo6IiIioDNj9LVTsXXp6Onx9fe97GTMRmWfIIssev2KUNXrhmPi7J7JPxc0e5fqcPCIiIiIqHEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERERkQYx5BERERFpEEMeERHZpdmzZyMsLAze3t4ICAhAz549cerUKZN1Xn31VdStWxceHh7w9/dHjx49cPLkSRv1mMi+MOQREZFd2rlzJ4YPH44DBw5g27ZtyM3NRVRUFDIzM9V1Hn30UaxcuRInTpxATEwMRARRUVHIy8uzYc+J7IOzrTtARERUmK1bt5r8vGrVKgQEBODIkSOIiIgAAAwdOlRdXqtWLcyYMQOPPPII/vrrL9StW7dM+0tkb7gnr5wozmGLrKwsDB8+HH5+fvDy8sIzzzyDS5cu2ajH1uXo4yciIC0tDQBQuXLlQpdnZmZi5cqVqF27NoKDg8uya0R2iSGvnCjOYYvRo0dj06ZN+Pbbb7Fz504kJyfj6aeftmGvrcfR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", "text/plain": [ "
" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit import QuantumCircuit, transpile\n", "from qiskit.visualization import plot_histogram\n", "from qiskit_aer import AerSimulator\n", "\n", "qc = q_algo.export(\"qiskit\")\n", "qc.measure_all()\n", "simulator = AerSimulator()\n", "circ = transpile(qc, simulator)\n", "result = simulator.run(circ).result()\n", "counts = result.get_counts(circ)\n", "\n", "counts_readable = q_algo.decode_counts(counts)\n", "plot_histogram(counts_readable)" ] } ], "metadata": { "kernelspec": { "display_name": "qlasskit_310-env", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 2 }