void mpbq_manager::add(mpbq const & a, mpbq const & b, mpbq & r) { #ifdef MPBQ_DEBUG rational _a = to_rational(a); rational _b = to_rational(b); #endif if (a.m_k == b.m_k) { m_manager.add(a.m_num, b.m_num, r.m_num); r.m_k = a.m_k; } else if (a.m_k < b.m_k) { m_manager.mul2k(a.m_num, b.m_k - a.m_k, m_tmp); m_manager.add(b.m_num, m_tmp, r.m_num); r.m_k = b.m_k; } else { SASSERT(a.m_k > b.m_k); m_manager.mul2k(b.m_num, a.m_k - b.m_k, m_tmp); m_manager.add(a.m_num, m_tmp, r.m_num); r.m_k = a.m_k; } normalize(r); #ifdef MPBQ_DEBUG rational _r = to_rational(r); SASSERT(_a + _b == _r); #endif }
rational pb_util::get_k(func_decl *a) const { parameter const& p = a->get_parameter(0); if (is_at_most_k(a) || is_at_least_k(a)) { return to_rational(p); } else { SASSERT(is_le(a) || is_ge(a) || is_eq(a)); return to_rational(p); } }
rational pb_util::get_coeff(func_decl* a, unsigned index) const { if (is_at_most_k(a) || is_at_least_k(a)) { return rational::one(); } SASSERT(is_le(a) || is_ge(a) || is_eq(a)); SASSERT(1 + index < a->get_num_parameters()); return to_rational(a->get_parameter(index + 1)); }
void mpbq_manager::add(mpbq const & a, mpz const & b, mpbq & r) { #ifdef MPBQ_DEBUG rational _a = to_rational(a); rational _b(b); #endif if (a.m_k == 0) { m_manager.add(a.m_num, b, r.m_num); r.m_k = a.m_k; } else { m_manager.mul2k(b, a.m_k, m_tmp); m_manager.add(a.m_num, m_tmp, r.m_num); r.m_k = a.m_k; } normalize(r); #ifdef MPBQ_DEBUG rational _r = to_rational(r); TRACE("mpbq_bug", tout << "add a: " << _a << ", b: " << _b << ", r: " << _r << ", expected: " << (_a + _b) << "\n";);
void mpbq_manager::normalize(mpbq & a) { if (a.m_k == 0) return; if (m_manager.is_zero(a.m_num)) { a.m_k = 0; return; } #ifdef MPBQ_DEBUG rational r = to_rational(a); #endif unsigned k = m_manager.power_of_two_multiple(a.m_num); if (k > a.m_k) k = a.m_k; m_manager.machine_div2k(a.m_num, k); a.m_k -= k; #ifdef MPBQ_DEBUG rational new_r = to_rational(a); SASSERT(r == new_r); #endif }