From b4e09bdd94429775a126bb5ad99529faa1ecdad4 Mon Sep 17 00:00:00 2001 From: xumingkuan Date: Mon, 20 Oct 2025 16:14:56 -0400 Subject: [PATCH 1/2] [verifier] Use simplify in addition to minimal_polynomial in SymPy --- src/python/verifier/verifier_sympy.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/python/verifier/verifier_sympy.py b/src/python/verifier/verifier_sympy.py index addd9ab3..2132953e 100644 --- a/src/python/verifier/verifier_sympy.py +++ b/src/python/verifier/verifier_sympy.py @@ -266,12 +266,24 @@ def search_phase_factor_to_check_equivalence( # print(f'Checking phase factor {current_phase_factor_for_fingerprint}') output_vec2_shifted = phase_shift(output_vec2, current_phase_factor_symbolic) # verify v1[0] == v2[0] and v1[1] == v2[1] - x = sympy.symbols("x") diff = any( - sympy.minimal_polynomial(v1[0] - v2[0], x) != x - or sympy.minimal_polynomial(v1[1] - v2[1], x) != x + v1[0] != v2[0] or v1[1] != v2[1] for (v1, v2) in zip(output_vec1, output_vec2_shifted) ) + if diff: # simple v1[0] == v2[0] and v1[1] == v2[1] check doesn't work + try: + x = sympy.symbols("x") + diff = any( + sympy.minimal_polynomial(v1[0] - v2[0], x) != x + or sympy.minimal_polynomial(v1[1] - v2[1], x) != x + for (v1, v2) in zip(output_vec1, output_vec2_shifted) + ) + except sympy.polys.polyerrors.NotAlgebraic: + diff = any( + sympy.simplify(v1[0] - v2[0]) != 0 + or sympy.simplify(v1[1] - v2[1]) != 0 + for (v1, v2) in zip(output_vec1, output_vec2_shifted) + ) if diff: print( f"sympy returns {[(sympy.simplify(v1[0] - v2[0]), sympy.simplify(v1[1] - v2[1])) for (v1, v2) in zip(output_vec1, output_vec2_shifted)]} for the following equivalence which passed random testing:" From 0aab36c8d40103c17cb95b39b70c9c380c820e65 Mon Sep 17 00:00:00 2001 From: xumingkuan Date: Mon, 20 Oct 2025 16:31:43 -0400 Subject: [PATCH 2/2] [bug] Fix input format for Rational --- src/quartz/math/rational.cpp | 4 +++- src/test/test_optimize.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/quartz/math/rational.cpp b/src/quartz/math/rational.cpp index 0c89738f..8265e4b6 100644 --- a/src/quartz/math/rational.cpp +++ b/src/quartz/math/rational.cpp @@ -909,7 +909,7 @@ std::istream &operator>>(istream &cin, Rational &b) { int ch; while (cin) { ch = cin.get(); - if (!isspace(ch)) { + if (!isspace(ch) || ch == '"') { // filter out whitespace and '"' cin.unget(); break; } @@ -922,6 +922,8 @@ std::istream &operator>>(istream &cin, Rational &b) { if (isdigit(ch) || ch == '.' || ch == '-' || ch == '/' || ch == 'e' || ch == 'E' || ch == '+') { s += (char)ch; + } else if (ch == '"') { + // filter out '"' } else { cin.unget(); break; diff --git a/src/test/test_optimize.cpp b/src/test/test_optimize.cpp index 5bb58921..8bdee598 100644 --- a/src/test/test_optimize.cpp +++ b/src/test/test_optimize.cpp @@ -21,7 +21,7 @@ int main(int argc, char **argv) { } } - ParamInfo param_info(/*num_input_symbolic_params=*/2, false); + ParamInfo param_info; Context ctx({GateType::input_qubit, GateType::input_param, GateType::cx, GateType::h, GateType::rz, GateType::x, GateType::add}, /*num_qubits=*/3, ¶m_info);