### Install Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/README.md Install the Qlasskit library using pip. This command is used to add the package to your Python environment. ```bash pip install qlasskit ``` -------------------------------- ### Build and Serve Docs Locally Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md Install Sphinx and related packages, then navigate to the docs directory and build the HTML documentation locally to preview changes. ```bash pip install sphinx sphinx_rtd_theme sphinx_rtd_dark_mode myst_nb cd docs make html ``` -------------------------------- ### Bind Custom Type Parameter to Qlassf Function Source: https://github.com/dakk/qlasskit/blob/master/docs/source/parameters.ipynb Illustrates parameterization with custom and complex types like Qlist and Qint. The example binds a Qlist of Qints to a qlassf function and shows the resulting circuit expressions. ```python from qlasskit import Qlist, Qint, Qint4 @qlassf def test(a: Parameter[Qlist[Qint[2], 4]], b: Qint[4]) -> Qint[4]: s = Qint4(0) for n in a: s += n return s + b qf = test.bind(a=[2, 1, 0, 3]) qf.expressions ``` -------------------------------- ### Run BQM on D-Wave Annealer Source: https://github.com/dakk/qlasskit/blob/master/docs/source/bqm.ipynb Execute a BQM on a real D-Wave quantum annealer. Ensure you have a valid D-Wave account and configure the sampler accordingly. This example uses `EmbeddingComposite` for embedding the problem onto the QPU. ```python from dwave.system import DWaveSampler, EmbeddingComposite sampler = EmbeddingComposite(DWaveSampler()) sampleset = sampler.sample(bqm, num_reads=10) decoded_samples = decode_samples(test_factor, sampleset) best_sample = min(decoded_samples, key=lambda x: x.energy) print(best_sample.sample) ``` -------------------------------- ### Build and Upload Release to PyPI Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md For maintainers, this process involves building the distribution packages and uploading them to PyPI using twine. Ensure build and twine are installed. ```bash pip install build twine rm -r dist/* python -m build python -m twine upload dist/* ``` -------------------------------- ### Clone Qlasskit Repository Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md Clone the Qlasskit repository locally to start contributing. Ensure you replace YOUR_USERNAME with your GitHub username. ```bash git clone https://github.com/YOUR_USERNAME/qlasskit.git ``` -------------------------------- ### Export to Binary Quadratic Model with QlassF.to_bqm() Source: https://context7.com/dakk/qlasskit/llms.txt Converts a compiled function's boolean expression to various BQM formats (BQM, QUBO, Ising, PyQubo model) for use with quantum annealers or simulated annealing solvers. Requires `pip install pyqubo`. The example also shows solving with `dimod.SimulatedAnnealingSampler` and decoding the results. ```python from qlasskit import qlassf, Qint from qlasskit.bqm import decode_samples @qlassf def polynomial(x: Qint[4]) -> bool: return x * x == 9 # find x such that x^2 == 9 # Export to different BQM formats bqm = polynomial.to_bqm(fmt="bqm") # dimod BQM qubo = polynomial.to_bqm(fmt="qubo") # QUBO dict ising = polynomial.to_bqm(fmt="ising") # (h, J) Ising model model = polynomial.to_bqm(fmt="pq_model") # raw pyqubo model # Solve with simulated annealing (requires dimod) import dimod sa = dimod.SimulatedAnnealingSampler() result = sa.sample(bqm, num_reads=100) decoded = decode_samples(polynomial, result) for sample in decoded[:3]: print(sample.energy, sample.sample) # e.g. 0.0 {'x': Qint4(3)} — found x=3 since 3^2=9 ``` -------------------------------- ### Simulate Quantum Circuit and Decode Results Source: https://github.com/dakk/qlasskit/blob/master/docs/source/quickstart.ipynb Simulate the quantum circuit using AerSimulator, get the counts, and decode them into a human-readable format for plotting. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator simulator = AerSimulator() circ = transpile(qc, simulator) result = simulator.run(circ).result() counts = result.get_counts(circ) counts_readable = sum_two_numbers.decode_counts(counts) plot_histogram(counts_readable) ``` -------------------------------- ### Define and Print qlassf Function Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_unitary_of_f.ipynb Defines a qlassf function and prints its representation. Ensure qlasskit is installed. ```python from qlasskit import qlassf @qlassf def f(a: bool, b: bool) -> bool: return a ^ (not b) print(f"\n{f}\n") ``` -------------------------------- ### Qlasskit with Qlist for Searching Source: https://github.com/dakk/qlasskit/blob/master/README.md Shows how to use Qlist, a fixed-size list type, within Qlasskit functions. This example defines a 'search' function that checks if a given value exists in a list of 2-bit integers. ```python @qlassf def search(alist: Qlist[Qint[2], 4], to_search: Qint[2]): for x in alist: if x == to_search: return True return False ``` -------------------------------- ### Simulate and Get Unitary Matrix Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_unitary_of_f.ipynb Uses AerSimulator with the 'unitary' method to obtain the unitary matrix of the quantum circuit. The result is then converted to LaTeX for display. ```python from qiskit import transpile from qiskit_aer import AerSimulator from qiskit.visualization import array_to_latex simulator = AerSimulator(method="unitary") circ = transpile(qc, simulator) result = simulator.run(circ).result() array_to_latex(result.get_unitary(circ, 3), max_size=16) ``` -------------------------------- ### Simulate and Analyze Deutsch-Jozsa Algorithm Results Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_deutsch_jozsa.ipynb Measure all qubits, set up an Aer simulator, transpile the circuit, run the simulation, and get the measurement counts. Decode the counts using the algorithm's decoder and plot the histogram. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc.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) ``` -------------------------------- ### Convert qlassf function to BQM Source: https://github.com/dakk/qlasskit/blob/master/docs/source/bqm.ipynb Convert a qlassf function to a Binary Quadratic Model (BQM). This example binds a parameter and then converts the function to a BQM for further processing. ```python from qlasskit import qlassf, Qint, Parameter @qlassf def test_factor_generic(num: Parameter[Qint[4]], a: Qint[3], b: Qint[3]) -> Qint[4]: return num - (a * b) test_factor = test_factor_generic.bind(num=15) bqm = test_factor.to_bqm() print("Vars:", bqm.num_variables, "\nInteractions:", bqm.num_interactions) ``` -------------------------------- ### Grover's Search Algorithm Implementation Source: https://context7.com/dakk/qlasskit/llms.txt Builds a Grover's search circuit using a `QlassF` oracle. It automatically computes the optimal number of iterations and accepts either a boolean oracle or a generic function with an `element_to_search`. The example demonstrates exporting to Qiskit, running on `AerSimulator`, and decoding the results. ```python from qlasskit import qlassf, Qint from qlasskit.algorithms import Grover from qiskit_aer import AerSimulator from qiskit import transpile # Oracle: returns True for the element we are searching for @qlassf def contains_7(x: Qint[4]) -> bool: return x == 7 algo = Grover(contains_7, True) # Alternatively, search for a specific output value of a general function @qlassf def f(x: Qint[4]) -> Qint[4]: return x * 2 algo2 = Grover(f, element_to_search=14) # find x such that f(x)==14 # Run on simulator qc = algo.export("qiskit") sim = AerSimulator() qc.measure_all() result = sim.run(transpile(qc, sim), shots=1024).result() counts = result.get_counts() decoded = algo.decode_counts(counts, discard_lower=10) print(decoded) # {7: } — found x=7 ``` -------------------------------- ### Create Feature Branch Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md Create a new branch for your changes, starting from the upstream main branch. Fetch upstream changes before creating the branch. ```bash git fetch upstream git checkout -b your-branch-name upstream/master ``` -------------------------------- ### Execute Grover Search with Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_hash.ipynb Exports the Grover algorithm to a Qiskit quantum circuit, measures all qubits, simulates the circuit using AerSimulator, and plots the results. Requires Qiskit and Qiskit Aer to be installed. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator nc = q_algo.export("qiskit") nc.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, discard_lower=5) plot_histogram(counts_readable) ``` -------------------------------- ### Define Realistic Sudoku Checker with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_sudoku.ipynb Implements a Sudoku checker for a 4x4 matrix using Qlasskit's Qint for integer representation. This example highlights the significant increase in qubit requirements for more realistic Sudoku problems. ```python from qlasskit import Qint, Qint3 @qlassf def sudoku_check(m: Qmatrix[Qint[2], 4, 4]) -> bool: res = True # Constraints res = (m[0][2] == 3) and (m[0][0] == 1) # Check every row and column for i in range(len(m)): c = (Qint3(0) + m[i][0] + m[i][1] + m[i][2] + m[i][3]) == 6 r = (Qint3(0) + m[0][i] + m[1][i] + m[2][i] + m[3][i]) == 6 res = res and c and r return res print(sudoku_check.circuit()) ``` -------------------------------- ### Run Tox for Checks Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md Before committing, run tox to ensure type checking, linting, and tests pass. Ensure tox is installed via pip. ```bash tox ``` -------------------------------- ### Qlasskit with Tuples and Fixed-Size Lists Source: https://github.com/dakk/qlasskit/blob/master/README.md Illustrates the use of complex data types like tuples and fixed-size lists within Qlasskit functions. This example shows a function accepting a tuple of two 8-bit integers and returning a tuple of booleans. ```python @qlassf def f(a: Tuple[Qint[8], Qint[8]]) -> Tuple[bool, bool]: return a[0] == 42, a[1] == 0 ``` -------------------------------- ### Create Oracle from Scratch Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_bernstein_vazirani.ipynb Define a quantum oracle from scratch using Python and qlasskit's Qint for a 4-bit secret. This method allows for custom oracle logic. ```python from qlasskit import qlassf, Qint @qlassf def oracle(x: Qint[4]) -> bool: s = Qint4(14) return (x[0] & s[0]) ^ (x[1] & s[1]) ^ (x[2] & s[2]) ^ (x[3] & s[3]) oracle.export("qiskit").draw("mpl") ``` -------------------------------- ### QCircuit Initialization Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.qcircuit.qcircuit.QCircuit.md Initializes a quantum circuit with a specified number of qubits and an optional name. ```APIDOC ## QCircuit(num_qubits=0, name='qc', native=None) ### Description Initialize a quantum circuit. ### Parameters #### Parameters - **num_qubits** (*int*, optional) - The number of qubits in the circuit. Defaults to 0. - **name** (*str*, optional) - The name of the circuit. Defaults to 'qc'. - **native** (*any*, optional) - Represents native gate set. Defaults to None. ``` -------------------------------- ### Initialize Grover Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/algorithms.ipynb Instantiate the `Grover` algorithm by providing a quantum oracle function decorated with `@qlassf` and a boolean flag. The oracle defines the search space. ```python from qlasskit.algorithms import Grover @qlassf def g_orac(a: Tuple[bool, bool]) -> bool: return a[0] and not a[1] q_algo = Grover(g_orac, True) ``` -------------------------------- ### Initialize Simon Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/algorithms.ipynb Create an instance of the `Simon` algorithm by passing a function `f` decorated with `@qlassf`. This function defines the mapping for the periodicity search. ```python from qlasskit.algorithms import Simon @qlassf def f(a: Qint[4]) -> Qint[4]: return (a >> 3) + 1 q_algo = Simon(f) ``` -------------------------------- ### Initialize Simon Algorithm with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_simon.ipynb Initializes the Simon algorithm from Qlasskit, passing the previously defined quantum function 'f' to it. ```python from qlasskit.algorithms import Simon q_algo = Simon(f) ``` -------------------------------- ### Using py2qasm to Convert Python to QASM Source: https://context7.com/dakk/qlasskit/llms.txt Illustrates the usage of the `py2qasm` command-line tool for converting Python functions decorated with `@qlassf` into QASM (Quantum Assembly) format. Allows specifying the number of qubits and the compiler backend. ```bash # py2qasm: translate a Python function to QASM echo " from qlasskit import qlassf @qlassf def g(a: bool, b: bool) -> bool: return a and b " | py2qasm -e g -q 3.0 ``` ```bash # py2qasm with file I/O and specific compiler py2qasm -i circuit.py -e my_circuit -o out.qasm -c internal -q 2.0 ``` -------------------------------- ### Simulate and Decode Results with QlassKit Source: https://context7.com/dakk/qlasskit/llms.txt Demonstrates how to simulate a quantum circuit using Qiskit Aer, retrieve raw counts, and decode them into a human-readable format using QlassKit's `decode_counts` method. Also shows exporting the QlassF to other frameworks. ```python from qiskit_aer import AerSimulator from qiskit import transpile sim = AerSimulator() result = sim.run(transpile(qc, sim)).result() counts = result.get_counts(qc) readable = sum_two.decode_counts(counts) # e.g. {Qint2(3): 1024} — sum of 1+2 = 3 # Export to other frameworks cirq_circ = sum_two.export("cirq") pennylane_dev = sum_two.export("pennylane") qasm_str = sum_two.export("qasm") sympy_expr = sum_two.export("sympy") ``` -------------------------------- ### Define a Quantum Function with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/README.md Define a classical function in Python decorated with `@qlassf` to be translated into quantum operators. This example shows a function 'h' that takes a 4-bit integer and returns a boolean. ```python from qlasskit import qlassf, Qint @qlassf def h(k: Qint[4]) -> bool: h = True for i in range(4): h = h and k[i] return h ``` -------------------------------- ### Using py2bexp to Convert Python to Boolean Expressions Source: https://context7.com/dakk/qlasskit/llms.txt Demonstrates how to use the `py2bexp` command-line tool to translate Python functions decorated with `@qlassf` into boolean expressions. Supports various output formats like CNF and DIMACS, and can read from stdin or files. ```bash # py2bexp: translate a Python function to boolean expressions echo " from qlasskit import qlassf, Qint @qlassf def f(x: Qint[4]) -> bool: return x > 7 " | py2bexp -e f -f cnf -t sympy ``` ```bash # py2bexp with explicit input/output files py2bexp -i my_function.py -e my_fn -o output.txt -f dnf -t dimacs ``` -------------------------------- ### QCircuit: Low-level Quantum Circuit Builder Source: https://context7.com/dakk/qlasskit/llms.txt Demonstrates the construction, manipulation, and export of quantum circuits using Qlasskit's internal QCircuit representation. Supports manual gate construction, named qubit maps, and composition. ```python from qlasskit.qcircuit import QCircuit, gates # Manual circuit construction pc = QCircuit(3, name="my_circuit") pc.h(0) pc.cx(0, 1) pc.ccx(0, 1, 2) pc.barrier(label="mid") pc.x(2) print(qc) # QCircuit(4 gates, 3 qubits) print(qc.gate_stats) # {'H': 1, 'CX': 1, 'CCX': 1, 'X': 1} # Named qubit access pc2 = QCircuit(2) pc2.add_qubit("ancilla") pc2.h(qc2["ancilla"]) # Compose two circuits combined = qc + qc2.copy(vanilla=True) # Apply QFT pc3 = QCircuit(4) pc3.qft([0, 1, 2, 3]) # Export qiskit_qc = qc.export(mode="circuit", framework="qiskit") qasm_str = qc.export(mode="circuit", framework="qasm") # Random circuit for testing rand_qc = QCircuit.random(qubits_n=5, depth=20) ``` -------------------------------- ### Parameterize and Bind Qlasskit Functions Source: https://github.com/dakk/qlasskit/blob/master/README.md Demonstrates how to parameterize Qlasskit functions and bind values to these parameters before compilation. This allows for creating specialized versions of a function. ```python @qlassf def test(a: Parameter[bool], b: bool) -> bool: return a and b qf = test.bind(a=True) ``` -------------------------------- ### Initialize Grover Algorithm for SAT Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_sat.ipynb Initializes the Grover algorithm from qlasskit to search for inputs satisfying the defined SAT oracle. The target value is set to True. Requires importing Grover. ```python from qlasskit.algorithms import Grover q_algo = Grover(sat, True) pc = q_algo.export("qiskit") ``` -------------------------------- ### Initialize Deutsch-Jozsa Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/algorithms.ipynb Instantiate the `DeutschJozsa` algorithm by providing a function `f` decorated with `@qlassf`. This function represents the oracle to be tested for constant or balanced properties. ```python from qlasskit.algorithms import DeutschJozsa @qlassf def f(b: Qint[4]) -> bool: return b < 16 q_algo = DeutschJozsa(f) ``` -------------------------------- ### Initialize Grover Search Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_hash.ipynb Initializes the Grover search algorithm with the hash function and the target hash value. The target value must be an instance of `Qint8`. ```python from qlasskit.algorithms import Grover q_algo = Grover(hash_simp, Qint8(0xCA)) ``` -------------------------------- ### Apply Bernstein-Vazirani Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_bernstein_vazirani.ipynb Initialize and export the Bernstein-Vazirani quantum algorithm using a pre-defined oracle. This prepares the quantum circuit for execution. ```python from qlasskit.algorithms import BernsteinVazirani q_algo = BernsteinVazirani(oracle) pc = q_algo.export("qiskit") pc.draw("mpl") ``` -------------------------------- ### QlassF Class Constructor Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.qlassfun.QlassF.md Initializes a new instance of the QlassF class. ```APIDOC ## ### Description Initializes a new instance of the QlassF class. ### Parameters * **name** (str) - The name of the qlassf function. * **original_f** (Callable) - The original function object. * **args** (List[Arg]) - A list of arguments for the function. * **returns** (Arg) - The return type of the function. * **exps** (List[Tuple[Symbol, Boolean]]) - A list of expressions associated with the function. ``` -------------------------------- ### Execute Grover Search with Qiskit Aer Simulator Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover.ipynb Prepare the Grover search circuit for execution by measuring all qubits, transpile it for the Aer simulator, run the simulation, and obtain the measurement counts. This snippet demonstrates how to use Qlasskit's Grover algorithm with a Qiskit backend. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc.measure_all() simulator = AerSimulator() circ = transpile(qc, simulator) result = simulator.run(circ).result() counts = result.get_counts(circ) ``` -------------------------------- ### Grover Class Constructor Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.algorithms.grover.Grover.md Initializes the Grover algorithm with a specified oracle and search parameters. ```APIDOC ## qlasskit.algorithms.grover.Grover(oracle: [QlassF](qlasskit.qlassfun.QlassF.md#qlasskit.qlassfun.QlassF), element_to_search: Qtype | None = None, n_iterations: int | None = None, n_matching: int = 1) ### Description Initializes the Grover algorithm. ### Parameters * **oracle** ([*QlassF*](qlasskit.qlassfun.QlassF.md#qlasskit.qlassfun.QlassF)) – The oracle function f(x) -> bool that returns True if x satisfies the condition, or a generic function f(x) = y to compare with element_to_search. * **element_to_search** (*Qtype* *,* *optional*) – The element to search for within the search space. * **n_iterations** (*int* *,* *optional*) – Forces a specific number of iterations. If not provided, it defaults to approximately pi/4 * sqrt(N/n_matching). * **n_matching** (*int*) – The expected number of matching elements. Defaults to 1. ``` -------------------------------- ### Qlasskit Quantum Types: Qint and Qfixed Source: https://context7.com/dakk/qlasskit/llms.txt Illustrates the use of Qlasskit's quantum integer (Qint) and fixed-point (Qfixed) types in function signatures for circuit synthesis. These types define statically sized quantum bit vectors. ```python from qlasskit import qlassf, Qint, Qfixed, Qchar from qlasskit.types import Qlist, Qmatrix from typing import Tuple # Qint[N] — N-bit unsigned integer (N: 2,3,4,5,6,7,8,12,16) @qlassf def arith(a: Qint[4], b: Qint[4]) -> Qint[4]: return (a + b) * 2 - 1 # Qfixed[i,f] — fixed-point rational with i integer bits and f fractional bits @qlassf def scale(x: Qfixed[2, 4]) -> bool: return x > 1.5 ``` -------------------------------- ### Initialize Deutsch-Jozsa Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_deutsch_jozsa.ipynb Initialize the Deutsch-Jozsa algorithm with the defined quantum function `f`. ```python from qlasskit.algorithms import DeutschJozsa q_algo = DeutschJozsa(f) ``` -------------------------------- ### Export QlassF Circuit to Quantum Frameworks Source: https://context7.com/dakk/qlasskit/llms.txt Use the `.export()` method to export the compiled circuit to formats like Qiskit, Cirq, PennyLane, QASM, Sympy, or QuTiP. You can export the full circuit or a reusable gate. ```python from qlasskit import qlassf, Qint @qlassf def sum_two(a: Qint[2], b: Qint[2]) -> Qint[2]: return a + b # Export as a Qiskit QuantumCircuit qiskit_circ = sum_two.export("qiskit") qiskit_circ.draw("mpl") # Export as a Qiskit Gate (for embedding into larger circuits) from qiskit import QuantumCircuit from qlasskit import Qint2 pc = QuantumCircuit(sum_two.num_qubits, len(sum_two.output_qubits)) pc.initialize(sum_two.encode_input(Qint2(1), Qint2(2)), sum_two.input_qubits) pc.append(sum_two.gate("qiskit"), sum_two.qubits) pc.measure(sum_two.output_qubits, range(len(sum_two.output_qubits))) ``` -------------------------------- ### Qlasskit Type Definitions and Functions Source: https://context7.com/dakk/qlasskit/llms.txt Demonstrates the use of Qlasskit's type system for defining functions that operate on specific data types like Qchar, Qlist, Tuple, and Qmatrix. These functions are decorated with @qlassf to be compilable. ```python from qlasskit import qlassf, Qchar, Qlist, Qint, Qmatrix from typing import Tuple # Qchar — single ASCII character (8 bits) @qlassf def is_uppercase(c: Qchar) -> bool: return ord(c) >= 65 and ord(c) <= 90 # Qlist[T, N] — fixed-size list of N elements of type T @qlassf def list_sum(nums: Qlist[Qint[4], 3]) -> Qint[4]: return nums[0] + nums[1] + nums[2] # Tuple — heterogeneous container @qlassf def swap_pair(p: Tuple[bool, Qint[4]]) -> Tuple[Qint[4], bool]: return p[1], p[0] # Qmatrix[T, m, n] — m×n matrix @qlassf def trace_bool(m: Qmatrix[bool, 2, 2]) -> bool: return m[0][0] and m[1][1] ``` -------------------------------- ### Simon Class Initialization Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.algorithms.simon.Simon.md Initializes the Simon algorithm with a given function f. ```APIDOC ## qlasskit.algorithms.simon.Simon(f: QlassF) ### Description Initializes the Simon algorithm with the function f(x). ### Parameters #### Parameters - **f** (QlassF) - Required - The function f(x) to be used in the algorithm. ``` -------------------------------- ### Export and Simulate Quantum Circuit with Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_subset.ipynb Exports the configured Grover algorithm to a Qiskit quantum circuit, adds measurements, and simulates it using AerSimulator. The results are then decoded for human readability and plotted as a histogram. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc = q_algo.export("qiskit") pc.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) ``` -------------------------------- ### ECDSA Key Generation, Signing, and Verification Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_ecdsa.ipynb This snippet shows how to generate a private and public key pair, sign a message using the private key, and verify the signature using the public key. Note that the modular inverse function is highly simplified and only works for the specific parameters used. ```python import random # Extremely simplified parameters P = 3 # Prime field G = 2 # Generator N = 3 # Order of generator def mod_inv(a, m): return 1 if a == 1 else 2 # Only valid for P = 3 def generate_keypair(): private_key = random.randint(1, 3) # 2-bit key (1 to 3) public_key = pow(G, private_key, P) return private_key, public_key def sign(message, private_key): z = message % N k = random.randint(1, 3) # 2-bit nonce r = pow(G, k, P) s = (mod_inv(k, N) * (z + r * private_key)) % N return (r, s) def verify(message, signature, public_key): r, s = signature z = message % N w = mod_inv(s, N) u1 = (z * w) % N u2 = (r * w) % N v = (pow(G, u1, P) * pow(public_key, u2, P)) % P return v == r # Example usage private_key, public_key = generate_keypair() message = int("0b0", 2) # Single character message signature = sign(message, private_key) is_valid = verify(message, signature, public_key) print(f"Private Key: {private_key}") print(f"Public Key: {public_key}") print(f"Message: {message}") print(f"Signature: {signature}") print(f"Signature valid: {is_valid}") ``` -------------------------------- ### Define a Big Circuit with fastOptimizer Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_big_circuit.ipynb Use `qlassfa` with `boolopt.fastOptimizer` to define a function that generates a large quantum circuit. This is recommended for performance when dealing with many qubits or complex operations. ```python from qlasskit import Qint8, Qlist, boolopt, qlassfa @qlassfa(bool_optimizer=boolopt.fastOptimizer) def test(a_list: Qlist[Qint8, 64]) -> Qint8: h_val = Qint8(0) for c in a_list: h_val = h_val + c return h_val ``` -------------------------------- ### Initialize Grover Algorithm for Subset Sum Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_subset.ipynb Initializes the Grover algorithm with the defined `subset_sum` function as the oracle. The `set_` parameter is bound to a specific list, and the target value is set. `n_matching` is specified to account for expected symmetric solutions (e.g., (i,j) and (j,i)). ```python from qlasskit.algorithms import Grover q_algo = Grover(subset_sum.bind(set_=[0, 5, 2, 3]), Qint3(7), n_matching=2) ``` -------------------------------- ### Print the Circuit Representation Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_big_circuit.ipynb After defining the function, you can print its generated quantum circuit representation. This helps in understanding the scale and complexity of the circuit. ```python print(test.circuit()) ``` -------------------------------- ### Export and Simulate Grover's Algorithm with Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_factors.ipynb Exports the Grover algorithm circuit to Qiskit, simulates it using AerSimulator, and decodes the results. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc = q_algo.export("qiskit") pc.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, discard_lower=5) plot_histogram(counts_readable) ``` -------------------------------- ### Add Upstream Remote Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md Add the original Qlasskit repository as an upstream remote to keep your local copy synchronized with the main project. ```bash git remote add upstream https://github.com/dakk/qlasskit.git ``` -------------------------------- ### Initialize Grover Search Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover.ipynb Initialize the Grover search algorithm with the defined oracle function and the target output value. The `True` argument indicates that we are searching for an input that yields a `True` result from the oracle. ```python from qlasskit.algorithms import Grover q_algo = Grover(and_all, True) ``` -------------------------------- ### Export and Simulate Sudoku Solver with Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_sudoku.ipynb Exports the Grover algorithm's quantum circuit to Qiskit, adds measurements, and simulates it using AerSimulator. The results are then decoded to a human-readable format, discarding low-probability outcomes. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc = q_algo.export("qiskit") pc.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, discard_lower=20) plot_histogram(counts_readable) ``` -------------------------------- ### Simulate and Decode Bernstein-Vazirani Results Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_bernstein_vazirani.ipynb Execute the Bernstein-Vazirani quantum circuit on a simulator, measure the qubits, and decode the results to find the secret string. This step involves running the circuit and interpreting the measurement counts. ```python from qiskit import QuantumCircuit from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc.measure_all() simulator = AerSimulator() result = simulator.run(pc).result() counts = result.get_counts(pc) counts_readable = q_algo.decode_counts(counts) plot_histogram(counts_readable) ``` -------------------------------- ### Create and Activate Pyenv Environment Source: https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md Use pyenv to create and activate an isolated Python environment for working on Qlasskit. This helps manage dependencies effectively. ```bash pyenv virtualenv qlasskit-env ``` ```bash pyenv activate qlasskit-env ``` -------------------------------- ### Solve BQM with Simulated Annealing Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_bqm_polynomial.ipynb Use `neal.SimulatedAnnealingSampler` to find samples for the BQM. Decode the samples using `decode_samples` and find the sample with the minimum energy. ```python import neal from qlasskit.bqm import decode_samples sa = neal.SimulatedAnnealingSampler() sampleset = sa.sample(bqm, num_reads=10) decoded_samples = decode_samples(poly, sampleset) best_sample = min(decoded_samples, key=lambda x: x.energy) print(best_sample.sample) ``` -------------------------------- ### Solve BQM using Simulated Annealing Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_bqm_tsp.ipynb Solves the generated BQM using the Simulated Annealing sampler from the 'neal' library. The results are decoded to find the best sample representing the shortest path. ```python import neal from qlasskit.bqm import decode_samples sa = neal.SimulatedAnnealingSampler() sampleset = sa.sample(bqm, num_reads=10) decoded_samples = decode_samples(tsp_f, sampleset) best_sample = min(decoded_samples, key=lambda x: x.energy) print(best_sample.sample, ":", best_sample.energy) ``` -------------------------------- ### Comparison Operators Source: https://github.com/dakk/qlasskit/blob/master/docs/source/supported.md Demonstrates various comparison operators including greater than, less than or equal to, equal to, and not equal to. ```python a > b or b <= c and c == d or c != a ``` -------------------------------- ### Define Toy Hash Function with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_hash.ipynb Defines a simple hash function using qlasskit's decorator. Ensure all necessary qlasskit components are imported. ```python from qlasskit import qlassf, Qint, Qint8, Qlist @qlassf def hash_simp(m: Qlist[Qint[4], 2]) -> Qint[8]: hv = 0 for i in m: hv = ((hv << 4) ^ (hv >> 1) ^ i) & 0xFF return hv ``` -------------------------------- ### Compile Python Function to Quantum Circuit with @qlassf Source: https://context7.com/dakk/qlasskit/llms.txt Use the `@qlassf` decorator or `qlassf()` function to compile Python functions into `QlassF` objects. You can also pass the source code as a string. Options like `compiler` and `uncompute` can be specified. ```python from qlasskit import qlassf, Qint, Qint4 # Basic usage as a decorator @qlassf def is_even(n: Qint[4]) -> bool: return n % 2 == 0 print(is_even) # QlassF(n:Qint4) -> bool: # _ret = ... # As a regular function call (string source also accepted) from qlasskit import qlassf, Qint2 f_str = "def add(a: Qint[2], b: Qint[2]) -> Qint[2]:\n return a + b" add = qlassf(f_str) # Choosing a specific compiler backend @qlassf(compiler="tweedledum") def my_fn(x: bool) -> bool: return not x # With uncompute disabled (keeps ancilla qubits) @qlassf(uncompute=False) def fn(a: Qint[4]) -> bool: return a > 7 ``` -------------------------------- ### Run Grover Search Simulation with Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_sat.ipynb Runs the Grover search quantum circuit using qiskit's AerSimulator. Measures all qubits, transpile the circuit, executes the simulation, and retrieves the results. Decodes the counts to display a readable histogram. Requires importing QuantumCircuit, transpile, plot_histogram, and AerSimulator. ```python from qiskit import QuantumCircuit, transpile from qiskit.visualization import plot_histogram from qiskit_aer import AerSimulator pc.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, discard_lower=15) plot_histogram(counts_readable) ``` -------------------------------- ### Compile the whole function with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/how_it_works.ipynb Compiles the entire Python function into a single quantum circuit using qlasskit's integrated approach, resulting in a more optimized circuit. ```python qc = QuantumCircuit(f_comp.num_qubits) pc.append(f_comp.gate(), f_comp.qubits) ``` ```python print("Operations:", qc.decompose().count_ops()) ``` -------------------------------- ### Parameter and UnboundQlassf.bind() Source: https://context7.com/dakk/qlasskit/llms.txt Allows for creating parameterized functions where arguments can be bound later. This results in an `UnboundQlassf` object that is compiled only after the `.bind()` method is called with concrete values, enabling circuit reuse. ```APIDOC ## `Parameter` and `UnboundQlassf.bind()` — Parameterized functions Mark function arguments with `Parameter[T]` to defer binding. The result is an `UnboundQlassf` that is compiled only after `.bind()` is called with concrete values. This enables circuit reuse with different constant parameters without rewriting the function. ```python from qlasskit import qlassf, Qint, Parameter @qlassf def threshold_check(limit: Parameter[Qint[4]], n: Qint[4]) -> bool: return n > limit # Returns UnboundQlassf — not yet compiled print(type(threshold_check)) # # Bind the parameter to produce a compiled QlassF check_gt5 = threshold_check.bind(limit=5) check_gt10 = threshold_check.bind(limit=10) print(check_gt5.num_qubits) print(check_gt5.f()(Qint[4](7))) # True print(check_gt10.f()(Qint[4](7))) # False ``` ``` -------------------------------- ### DeutschJozsa Class Initialization Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.algorithms.deutschjozsa.DeutschJozsa.md Initializes the DeutschJozsa algorithm with a given function. ```APIDOC ## DeutschJozsa(f: QlassF) ### Description Initializes the DeutschJozsa algorithm with a function `f`. ### Parameters #### Path Parameters - **f** (QlassF) - Required - The function to be analyzed, which maps inputs to a boolean output. ``` -------------------------------- ### Export and Draw Oracle Circuit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover.ipynb Export the compiled quantum circuit for the defined oracle function and draw it using Matplotlib. This step visualizes the quantum circuit generated by Qlasskit. ```python and_all.export("qiskit").draw("mpl") ``` -------------------------------- ### Define Factorization Problem with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_grover_factors.ipynb Defines a quantum function for factorization using qlasskit and initializes Grover's algorithm. ```python from typing import Tuple from qlasskit import qlassf, Qint from qlasskit.algorithms import Grover @qlassf def factorize(a: Tuple[Qint[2], Qint[2]]) -> bool: return a[0] * a[1] == 9 q_algo = Grover(factorize) ``` -------------------------------- ### Use Grover's Algorithm with Qlasskit Source: https://github.com/dakk/qlasskit/blob/master/README.md Utilize the Grover's algorithm implementation from Qlasskit to find inputs for which a given quantum function returns True. The circuit can be exported to various formats, such as Qiskit. ```python from qlasskit.algorithms import Grover algo = Grover(h, True) pc = algo.circuit().export("circuit", "qiskit") ``` -------------------------------- ### Create and Optimize Boolean Function Circuit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/decompiler_and_optimizer.ipynb Define a boolean function using qlassfa with fastOptimizer and generate its initial quantum circuit. ```python from qlasskit import qlassfa, qlassf, boolopt, Qlist from qlasskit.decompiler import Decompiler, circuit_boolean_optimizer @qlassfa(bool_optimizer=boolopt.fastOptimizer) def qf(a: Qlist[bool, 2]) -> bool: s = True for i in a: s = s and i return s qf.circuit() ``` -------------------------------- ### Export Deutsch-Jozsa Quantum Circuit to Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_deutsch_jozsa.ipynb Export the quantum circuit for the Deutsch-Jozsa algorithm to Qiskit format and draw it. ```python qc = q_algo.export("qiskit") pc.draw("mpl") ``` -------------------------------- ### qlasskit.bqm.decode_samples(qf, sampleset) Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.bqm.decode_samples.md This function takes a quantum frustration (qf) object and a dimod sampleset as input. It processes the sampleset to return a high-level decoded solution. ```APIDOC ## qlasskit.bqm.decode_samples(qf, sampleset) ### Description Get dimod sampleset and return an high level decoded solution. ### Parameters #### Path Parameters - **qf** (object) - Required - The quantum frustration object. - **sampleset** (dimod.SampleSet) - Required - The input sampleset. ### Response #### Success Response (object) - Returns a high-level decoded solution. ``` -------------------------------- ### Create Quantum Circuit for qlassf Function Source: https://github.com/dakk/qlasskit/blob/master/docs/source/example_unitary_of_f.ipynb Creates a qiskit QuantumCircuit from a qlassf function's gate and qubits. This is useful for further quantum operations. ```python from qiskit import QuantumCircuit qc = QuantumCircuit(f.num_qubits, f.num_qubits) pc.append(f.gate(), f.qubits) pc.save_state() pc.decompose().draw("mpl") ``` -------------------------------- ### Export Quantum Circuit to Qiskit Source: https://github.com/dakk/qlasskit/blob/master/docs/source/quickstart.ipynb Export the defined quantum function to the qiskit framework and draw the resulting circuit. ```python circuit = sum_two_numbers.export("qiskit") circuit.draw("mpl") ``` -------------------------------- ### Initialize Bernstein-Vazirani Algorithm Source: https://github.com/dakk/qlasskit/blob/master/docs/source/algorithms.ipynb Construct a `BernsteinVazirani` algorithm instance using a secret oracle generated by `secret_oracle`. The `secret_oracle` function takes the number of bits and the secret value as arguments. ```python from qlasskit.algorithms import BernsteinVazirani, secret_oracle oracle = secret_oracle(4, 14) q_algo = BernsteinVazirani(oracle) ``` -------------------------------- ### `QlassF.export()` / `.gate()` — Export to quantum framework Source: https://context7.com/dakk/qlasskit/llms.txt Export the compiled circuit to various quantum frameworks like Qiskit, Cirq, PennyLane, QASM, Sympy, or QuTiP. The export can be a full circuit or a reusable gate. ```APIDOC ## `QlassF.export()` / `.gate()` — Export to quantum framework Export the compiled circuit to Qiskit, Cirq, PennyLane, QASM, Sympy, or QuTiP as a full circuit or as a reusable gate. ```python from qlasskit import qlassf, Qint @qlassf def sum_two(a: Qint[2], b: Qint[2]) -> Qint[2]: return a + b # Export as a Qiskit QuantumCircuit qiskit_circ = sum_two.export("qiskit") qiskit_circ.draw("mpl") # Export as a Qiskit Gate (for embedding into larger circuits) from qiskit import QuantumCircuit from qlasskit import Qint2 pc = QuantumCircuit(sum_two.num_qubits, len(sum_two.output_qubits)) pc.initialize(sum_two.encode_input(Qint2(1), Qint2(2)), sum_two.input_qubits) pc.append(sum_two.gate("qiskit"), sum_two.qubits) pc.measure(sum_two.output_qubits, range(len(sum_two.output_qubits))) ``` ``` -------------------------------- ### Decompiler Class Constructor Source: https://github.com/dakk/qlasskit/blob/master/docs/source/generated/qlasskit.decompiler.Decompiler.md Initializes a new instance of the Decompiler class. ```APIDOC ## __init__() ### Description Initializes a new instance of the Decompiler class. ### Method __init__ ``` -------------------------------- ### Quantum Hybrid Function Source: https://github.com/dakk/qlasskit/blob/master/docs/source/supported.md Demonstrates using a quantum gate (CX) within a Qlasskit function. Note that including quantum gates changes the function's behavior. ```python def bell(a: bool, b: bool) -> bool: return Q.CX(Q.H(a), b) ``` -------------------------------- ### Use Helper Functions in Qlassf Source: https://github.com/dakk/qlasskit/blob/master/README.md Demonstrates how to use other Qlasskit-decorated functions within a new Qlasskit function. The `@qlassfa` decorator is used to provide definitions for helper functions. ```python @qlassf def equal_8(n: Qint[4]) -> bool: return equal_8 == 8 @qlassfa(defs=[equal_8]) def f(n: Qint[4]) -> bool: n = n+1 if equal_8(n) else n return n ```