Grover search: subset problem

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.

from qlasskit import qlassf, Qint, Qint3, Qlist, Parameter
from typing import Tuple


@qlassf
def subset_sum(
    ii: Tuple[Qint[2], Qint[2]], set_: Parameter[Qlist[Qint3, 4]]
) -> Qint[3]:
    return set_[ii[0]] + set_[ii[1]] if ii[0] != ii[1] else 0

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.

from qlasskit.algorithms import Grover

q_algo = Grover(subset_sum.bind(set_=[0, 5, 2, 3]), Qint3(7), n_matching=2)

Then we use our prefered framework and simulator for sampling the result; this is an example using qiskit with aer_simulator.

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.

from qiskit import QuantumCircuit, transpile
from qiskit.visualization import plot_histogram
from qiskit_aer import AerSimulator

qc = q_algo.export("qiskit")
qc.measure_all()
simulator = AerSimulator()
circ = transpile(qc, simulator)
result = simulator.run(circ).result()
counts = result.get_counts(circ)

counts_readable = q_algo.decode_counts(counts)
plot_histogram(counts_readable)
_images/3ad5e46a1ff24988619a5367461ab629ad3c20ea9f82f5f638f9a14ba5c32933.png