bool are_poly_coefficients_less_than(const std::uint64_t *poly, int coeff_count, int coeff_uint64_count, const std::uint64_t *max_coeff, int max_coeff_uint64_count) { #ifdef _DEBUG if (poly == nullptr && coeff_count > 0 && coeff_uint64_count > 0) { throw invalid_argument("poly"); } if (coeff_count < 0) { throw invalid_argument("coeff_count"); } if (coeff_uint64_count < 0) { throw invalid_argument("coeff_uint64_count"); } if (max_coeff == nullptr && max_coeff_uint64_count > 0) { throw invalid_argument("max_coeff"); } if (max_coeff_uint64_count < 0) { throw invalid_argument("max_coeff_uint64_count"); } #endif if (coeff_count == 0) { return true; } if (max_coeff_uint64_count == 0) { return false; } if (coeff_uint64_count == 0) { return true; } for (int i = 0; i < coeff_count; i++) { if (compare_uint_uint(poly, coeff_uint64_count, max_coeff, max_coeff_uint64_count) >= 0) { return false; } poly += coeff_uint64_count; } return true; }
ChooserPoly ChooserEvaluator::add_many(const std::vector<ChooserPoly> &operands) { if (operands.empty()) { throw invalid_argument("operands vector can not be empty"); } int sum_max_coeff_count = operands[0].max_coeff_count_; vector<ChooserPoly>::size_type largest_abs_value_index = 0; for (vector<ChooserPoly>::size_type i = 0; i < operands.size(); ++i) { // Throw if any of the operands is not initialized correctly if (operands[i].max_coeff_count_ <= 0 || operands[i].comp_ == nullptr) { throw invalid_argument("input operand is not correctly initialized"); } if (operands[i].max_coeff_count_ > sum_max_coeff_count) { sum_max_coeff_count = operands[i].max_coeff_count_; } if (compare_uint_uint(operands[i].max_abs_value_.pointer(), operands[i].max_abs_value_.uint64_count(), operands[largest_abs_value_index].max_abs_value_.pointer(), operands[largest_abs_value_index].max_abs_value_.uint64_count() > 0)) { largest_abs_value_index = i; } } int sum_max_abs_value_bit_count = operands[largest_abs_value_index].max_abs_value_.significant_bit_count() + get_significant_bit_count(operands.size()); int sum_max_abs_value_uint64_count = divide_round_up(sum_max_abs_value_bit_count, bits_per_uint64); Pointer sum_max_abs_value(allocate_zero_uint(sum_max_abs_value_uint64_count, pool_)); vector<Computation*> comps; for (vector<ChooserPoly>::size_type i = 0; i < operands.size(); ++i) { add_uint_uint(operands[i].max_abs_value_.pointer(), operands[i].max_abs_value_.uint64_count(), sum_max_abs_value.get(), sum_max_abs_value_uint64_count, false, sum_max_abs_value_uint64_count, sum_max_abs_value.get()); comps.push_back(operands[i].comp_); } return ChooserPoly(sum_max_coeff_count, BigUInt(sum_max_abs_value_bit_count, sum_max_abs_value.get()), new AddManyComputation(comps)); }