Skip to main content

View on GitHub

Open this notebook in GitHub to run it yourself
This tutorial demonstrates automatic arithmetic operation management by the synthesis engine. It synthesizes a complex arithmetic expression, where uncomputation procedure, together with initialization and reuse of auxiliary qubits, are all automated. Given different global width or depth constraints results in different circuits. Define a quantum model that applies some quantum arithmetic operation on QNum variables.
from classiq import *
from classiq.qmod.symbolic import max


@qfunc
def main(z: Output[QNum]):
    x = QNum()
    y = QNum()
    x |= 2
    y |= 1
    z |= (2 * x + y + max(3 * y, 2)) > 4
    drop(x)
    drop(y)


qmod = create_model(main)
qmod = set_preferences(qmod, random_seed=424788457)
You can try different optimization scenarios, below we introduce two examples:
  1. Optimizing over depth and constraining the maximal width to 9 qubits.
  2. Optimizing over depth and constraining the maximal width to 12 qubits.
Optimizing over depth and constraining the maximal width to 9 qubits
NUM_QUBITS_1 = 9
qmod_1 = set_constraints(qmod, optimization_parameter="depth", max_width=NUM_QUBITS_1)
qprog_1 = synthesize(qmod_1)
show(qprog_1)

result = execute(qprog_1).result_value()
print("The result of the arithmetic calculation: ", result.parsed_counts)
Output:

Quantum program link: https://platform.classiq.io/circuit/30eUHZJyfNuCdGpLdJhEcX9rCUp
  The result of the arithmetic calculation:  [{'z': 1}: 2048]
  

Change the quantum model constraint to treat the second scenario for optimizing over depth and constraining the maximal width to 12 qubits:
NUM_QUBITS_2 = 12
qmod_2 = set_constraints(qmod, optimization_parameter="depth", max_width=NUM_QUBITS_2)
qprog_2 = synthesize(qmod_2)
show(qprog_2)

result = execute(qprog_2).result_value()
print("The result of the arithmetic calculation: ", result.parsed_counts)
Output:

Quantum program link: https://platform.classiq.io/circuit/30eUJhEVwKFryUCOwnNzg7TvB9c
  The result of the arithmetic calculation:  [{'z': 1}: 2048]
  

Mathematical Background

The given mathematical expression: z=(2x+y+max(3y,2))>4z = (2 \cdot x + y + \max(3 \cdot y, 2)) > 4 is solved by the automatic arithmetic operation management, optimizing over depth and constraining the maximal width to 9 and 12 qubits, which outputs the value for z. The parsed_counts result:
  • Optimizing over depth and constraining the maximal width to 9 qubits: [{'z': 1.0}: 2048]
  • Optimizing over depth and constraining the maximal width to 12 qubits: [{'z': 1.0}: 2048]
Both the result are same which verifies the arithmetic expression to be True. The expected result:
Allocated values: x=2,y=1x = 2, \,\,\, y = 1 Expression Calculation: 2x+y=22+1=4+1=53y=31=3max(3y,2)=max(3,2)=32 \cdot x + y = 2 \cdot 2 + 1 = 4 + 1 = 5 \,\,\, 3 \cdot y = 3 \cdot 1 = 3 \,\,\, \max(3 \cdot y, 2) = \max(3, 2) = 3 Therefore: 2x+y+max(3y,2)=5+3=82 \cdot x + y + \max(3 \cdot y, 2) = 5 + 3 = 8 As 8>4    True8 > 4 \implies \text{True} z is assigned the value True : z    1z \implies 1