From 84bf34266b655e6380108325cbdb81a5f7560093 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Sun, 14 Sep 2025 05:00:47 -0700 Subject: [PATCH] put back shortcut for square test. Remove assumption in unit test Signed-off-by: Nikolaj Bjorner --- src/test/rational.cpp | 50 +++++++++++++++++++++---------------------- src/util/mpz.cpp | 2 -- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/test/rational.cpp b/src/test/rational.cpp index c44daf8c6..2b4220414 100644 --- a/src/test/rational.cpp +++ b/src/test/rational.cpp @@ -312,37 +312,37 @@ static void tst7() { static void tst8() { rational r; - ENSURE(!rational(-4).is_int_perfect_square(r) && r.is_zero()); - ENSURE(!rational(-3).is_int_perfect_square(r) && r.is_zero()); - ENSURE(!rational(-2).is_int_perfect_square(r) && r.is_zero()); - ENSURE(!rational(-1).is_int_perfect_square(r) && r.is_zero()); + ENSURE(!rational(-4).is_int_perfect_square(r)); + ENSURE(!rational(-3).is_int_perfect_square(r)); + ENSURE(!rational(-2).is_int_perfect_square(r)); + ENSURE(!rational(-1).is_int_perfect_square(r)); ENSURE(rational(0).is_int_perfect_square(r) && r.is_zero()); ENSURE(rational(1).is_int_perfect_square(r) && r.is_one()); - ENSURE(!rational(2).is_int_perfect_square(r) && r == rational(2)); - ENSURE(!rational(3).is_int_perfect_square(r) && r == rational(2)); + ENSURE(!rational(2).is_int_perfect_square(r)); + ENSURE(!rational(3).is_int_perfect_square(r)); ENSURE(rational(4).is_int_perfect_square(r) && r == rational(2)); - ENSURE(!rational(5).is_int_perfect_square(r) && r == rational(3)); - ENSURE(!rational(6).is_int_perfect_square(r) && r == rational(3)); - ENSURE(!rational(7).is_int_perfect_square(r) && r == rational(3)); - ENSURE(!rational(8).is_int_perfect_square(r) && r == rational(3)); + ENSURE(!rational(5).is_int_perfect_square(r)); + ENSURE(!rational(6).is_int_perfect_square(r)); + ENSURE(!rational(7).is_int_perfect_square(r)); + ENSURE(!rational(8).is_int_perfect_square(r)); ENSURE(rational(9).is_int_perfect_square(r) && r == rational(3)); - ENSURE(!rational(10).is_int_perfect_square(r) && r == rational(4)); - ENSURE(!rational(11).is_int_perfect_square(r) && r == rational(4)); - ENSURE(!rational(12).is_int_perfect_square(r) && r == rational(4)); - ENSURE(!rational(13).is_int_perfect_square(r) && r == rational(4)); - ENSURE(!rational(14).is_int_perfect_square(r) && r == rational(4)); - ENSURE(!rational(15).is_int_perfect_square(r) && r == rational(4)); + ENSURE(!rational(10).is_int_perfect_square(r)); + ENSURE(!rational(11).is_int_perfect_square(r)); + ENSURE(!rational(12).is_int_perfect_square(r)); + ENSURE(!rational(13).is_int_perfect_square(r)); + ENSURE(!rational(14).is_int_perfect_square(r)); + ENSURE(!rational(15).is_int_perfect_square(r)); ENSURE(rational(16).is_int_perfect_square(r) && r == rational(4)); - ENSURE(!rational(17).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(18).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(19).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(20).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(21).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(22).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(23).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(24).is_int_perfect_square(r) && r == rational(5)); + ENSURE(!rational(17).is_int_perfect_square(r)); + ENSURE(!rational(18).is_int_perfect_square(r)); + ENSURE(!rational(19).is_int_perfect_square(r)); + ENSURE(!rational(20).is_int_perfect_square(r)); + ENSURE(!rational(21).is_int_perfect_square(r)); + ENSURE(!rational(22).is_int_perfect_square(r)); + ENSURE(!rational(23).is_int_perfect_square(r)); + ENSURE(!rational(24).is_int_perfect_square(r)); ENSURE(rational(25).is_int_perfect_square(r) && r == rational(5)); - ENSURE(!rational(26).is_int_perfect_square(r) && r == rational(6)); + ENSURE(!rational(26).is_int_perfect_square(r)); ENSURE(rational(36).is_int_perfect_square(r) && r == rational(6)); ENSURE(rational(1,9).is_perfect_square(r) && r == rational(1,3)); diff --git a/src/util/mpz.cpp b/src/util/mpz.cpp index 1d73e225c..0d4df44a2 100644 --- a/src/util/mpz.cpp +++ b/src/util/mpz.cpp @@ -2320,13 +2320,11 @@ bool mpz_manager::is_perfect_square(mpz const & a, mpz & root) { set(root, 1); return true; } -#if 0 // current contract is that root is set to an approximation within +1/-1 of actional root. // x^2 mod 16 in { 9, 1, 4, 0 } auto mod16 = get_least_significant(a) & 0xF; if (mod16 != 0 && mod16 != 1 && mod16 != 4 && mod16 != 9) return false; -#endif mpz lo, hi, mid, sq_lo, sq_mid; set(lo, 1);