Skip to content

Commit 69fddd5

Browse files
authored
Another round of minor updates to gf arithmetic bloqs (#1727)
- Make `GF2Addition` self inverse - Fix a bug in symbolic resource estimation of `SynthesizeLRCircuit`.
1 parent 72cef5d commit 69fddd5

4 files changed

Lines changed: 20 additions & 5 deletions

File tree

qualtran/bloqs/gf_arithmetic/gf2_addition.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ def on_classical_vals(self, *, x, y) -> Dict[str, 'ClassicalValT']:
7878
assert isinstance(x, self.qgf.gf_type) and isinstance(y, self.qgf.gf_type)
7979
return {'x': x, 'y': x + y}
8080

81+
def adjoint(self) -> 'Bloq':
82+
return self
83+
8184

8285
@bloq_example
8386
def _gf16_addition() -> GF2Addition:

qualtran/bloqs/gf_arithmetic/gf2_multiplication.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
Signature,
3535
)
3636
from qualtran.bloqs.basic_gates import CNOT, CZ, Discard, MeasureX, Toffoli
37-
from qualtran.symbolics import ceil, is_symbolic, log2, Shaped, SymbolicInt
37+
from qualtran.symbolics import is_symbolic, log2, Shaped, SymbolicInt
3838

3939
if TYPE_CHECKING:
4040
from qualtran import BloqBuilder, Soquet, SoquetT
@@ -130,8 +130,8 @@ def build_call_graph(
130130
self, ssa: 'SympySymbolAllocator'
131131
) -> Union['BloqCountDictT', Set['BloqCountT']]:
132132
n = self.matrix.shape[0]
133-
if is_symbolic(n):
134-
return {CNOT(): ceil(n**2)}
133+
if isinstance(self.matrix, Shaped):
134+
return {CNOT(): n**2 - n}
135135
L, U, _ = self.lup
136136
# The number of cnots is the number of non zero off-diagnoal entries in L and U.
137137
cnots = np.sum(L) + np.sum(U) - 2 * self.n

qualtran/bloqs/gf_arithmetic/gf2_multiplication_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import numpy as np
1818
import pytest
19+
import sympy
1920
from galois import GF, Poly
2021

2122
import qualtran.testing as qlt_testing
@@ -37,6 +38,7 @@
3738
from qualtran.resource_counting import get_cost_value, QECGatesCost
3839
from qualtran.resource_counting.generalizers import ignore_alloc_free, ignore_split_join
3940
from qualtran.simulation.classical_sim import do_phased_classical_simulation
41+
from qualtran.symbolics import Shaped
4042
from qualtran.testing import assert_consistent_classical_action
4143

4244

@@ -79,6 +81,17 @@ def test_synthesize_lr_circuit_slow(m):
7981
assert i == QGFM.from_bits([*bloq_adj_out])
8082

8183

84+
def test_synthesize_lr_circuit_symbolic_resource():
85+
bloq = SynthesizeLRCircuit(Shaped((4, 4)))
86+
assert get_cost_value(bloq, QECGatesCost()).clifford == 12
87+
assert get_cost_value(bloq.adjoint(), QECGatesCost()).clifford == 12
88+
89+
n = sympy.Symbol("n")
90+
bloq = SynthesizeLRCircuit(Shaped((n, n)))
91+
assert get_cost_value(bloq, QECGatesCost()).clifford == n**2 - n
92+
assert get_cost_value(bloq.adjoint(), QECGatesCost()).clifford == n**2 - n
93+
94+
8295
def test_gf2_plus_equal_prod_classical_sim_quick():
8396
m = 2
8497
bloq = GF2Multiplication(QGF(2, m), plus_equal_prod=True)

qualtran/bloqs/gf_arithmetic/gf2_square_test.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
from qualtran.bloqs.gf_arithmetic.gf2_square import _gf2_square_symbolic, _gf16_square, GF2Square
2020
from qualtran.resource_counting import get_cost_value, QECGatesCost
21-
from qualtran.symbolics import ceil
2221
from qualtran.testing import assert_consistent_classical_action
2322

2423

@@ -41,7 +40,7 @@ def test_gf2_square_resource():
4140
bloq = _gf2_square_symbolic.make()
4241
m = bloq.bitsize
4342
assert get_cost_value(bloq, QECGatesCost()).total_t_count() == 0
44-
expected_expr = ceil(m**2)
43+
expected_expr = m**2 - m
4544
assert isinstance(expected_expr, sympy.Expr)
4645
assert sympy.simplify(get_cost_value(bloq, QECGatesCost()).clifford - expected_expr) == 0
4746

0 commit comments

Comments
 (0)