3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-11 05:30:51 +00:00

Add more PDD utilities (div, pow) (#5180)

* Expose 'inv' on rationals to get reciprocal value

* Align parameter names with implementation

* Add cached operation that divides PDD by a constant

* Fix display for constant PDDs

* operator^ should probably call ^ instead of + (mk_xor instead of add)

* Add helper function 'pow' on PDDs
This commit is contained in:
Jakob Rath 2021-04-14 13:48:42 +02:00 committed by GitHub
parent 2f7069a8b7
commit 324d9ed461
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 146 additions and 20 deletions

View file

@ -438,9 +438,10 @@ public :
SASSERT(m.zero().max_pow2_divisor() == UINT_MAX);
SASSERT(m.one().max_pow2_divisor() == 0);
pdd p = (1 << 20) * a * b + 1024 * b * b * b;
pdd p = (1 << 20)*a*b + 1024*b*b*b;
std::cout << p << " divided by 2^" << p.max_pow2_divisor() << "\n";
SASSERT(p.max_pow2_divisor() == 10);
SASSERT(p.div(rational::power_of_two(10)) == 1024*a*b + b*b*b);
SASSERT((p + p).max_pow2_divisor() == 11);
SASSERT((p * p).max_pow2_divisor() == 20);
SASSERT((p + 2*b).max_pow2_divisor() == 1);
@ -492,6 +493,22 @@ public :
SASSERT(r == -(2*a*a*b*b - 2*a*a*b - 3*a*b*b + a*b*b*b + 4*b));
}
static void pow() {
std::cout << "pow\n";
pdd_manager m(4, pdd_manager::mod2N_e, 5);
unsigned const va = 0;
unsigned const vb = 1;
pdd const a = m.mk_var(va);
pdd const b = m.mk_var(vb);
SASSERT(a.pow(0) == m.one());
SASSERT(a.pow(1) == a);
SASSERT(a.pow(2) == a*a);
SASSERT(a.pow(7) == a*a*a*a*a*a*a);
SASSERT((3*a*b).pow(3) == 27*a*a*a*b*b*b);
}
};
}
@ -510,4 +527,5 @@ void tst_pdd() {
dd::test::factor();
dd::test::max_pow2_divisor();
dd::test::binary_resolve();
dd::test::pow();
}