16 auto P1 = G1::random_element();
17 auto P2 = G1::random_element();
20 op_queue->initialize_new_subtable();
21 op_queue->add_accumulate(P1);
22 op_queue->mul_accumulate(P2, z);
23 op_queue->eq_and_reset();
36 auto table_polynomials = op_queue->construct_ultra_ops_table_columns();
37 auto prev_table_polynomials = op_queue->construct_previous_ultra_ops_table_columns();
38 auto subtable_polynomials = op_queue->construct_current_ultra_ops_subtable_columns();
42 for (
auto [table_poly, prev_table_poly, subtable_poly] :
43 zip_view(table_polynomials, prev_table_polynomials, subtable_polynomials)) {
44 const Fr table_eval = table_poly.evaluate(eval_challenge);
47 if (settings == MergeSettings::PREPEND) {
49 const size_t current_subtable_size = op_queue->get_current_ultra_ops_subtable_num_rows();
50 const Fr subtable_eval = subtable_poly.evaluate(eval_challenge);
51 const Fr shifted_previous_table_eval = prev_table_poly.evaluate(eval_challenge) *
52 eval_challenge.
pow(current_subtable_size);
53 EXPECT_EQ(table_eval, subtable_eval + shifted_previous_table_eval);
56 const size_t prev_table_size = op_queue->get_previous_ultra_ops_table_num_rows();
57 const size_t shift_magnitude = ultra_fixed_offset.value_or(prev_table_size);
59 const Fr prev_table_eval = prev_table_poly.evaluate(eval_challenge);
60 const Fr shifted_subtable_eval =
61 subtable_poly.evaluate(eval_challenge) * eval_challenge.
pow(shift_magnitude);
62 EXPECT_EQ(table_eval, shifted_subtable_eval + prev_table_eval);
74 auto ultra_table = op_queue->get_ultra_ops();
75 auto eccvm_table = op_queue->get_eccvm_ops();
77 EXPECT_EQ(eccvm_table.size(), ultra_table.size());
79 for (
auto [ultra_op, eccvm_op] :
zip_view(ultra_table, eccvm_table)) {
80 EXPECT_EQ(ultra_op.op_code.value(), eccvm_op.op_code.value());