3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-10-03 14:33:56 +00:00

put back shortcut for square test. Remove assumption in unit test

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2025-09-14 05:00:47 -07:00
parent 8158a500d4
commit 84bf34266b
2 changed files with 25 additions and 27 deletions

View file

@ -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));

View file

@ -2320,13 +2320,11 @@ bool mpz_manager<SYNCH>::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);