diff --git a/hydra/definitions.py b/hydra/definitions.py index 104d76ed1..4722dca6f 100644 --- a/hydra/definitions.py +++ b/hydra/definitions.py @@ -625,6 +625,22 @@ def precompute_lineline_sparsity(curve_id: int): return ll_sparsity[0:12] +def replace_consecutive_zeros(lst): + result = [] + i = 0 + while i < len(lst): + if i < len(lst) - 1 and lst[i] == 0 and lst[i + 1] == 0: + result.append(3) # Replace consecutive zeros with 3 + i += 2 + elif lst[i] == -1: + result.append(2) # Replace -1 with 2 + i += 1 + else: + result.append(lst[i]) + i += 1 + return result + + if __name__ == "__main__": from tools.extension_trick import v_to_gnark, gnark_to_v, w_to_gnark, gnark_to_w from random import randint diff --git a/hydra/extension_field_modulo_circuit.py b/hydra/extension_field_modulo_circuit.py index ad0458e41..bf9af4756 100644 --- a/hydra/extension_field_modulo_circuit.py +++ b/hydra/extension_field_modulo_circuit.py @@ -432,7 +432,6 @@ def update_LHS_state( assert len(Ps_sparsities) == len( Ps ), f"len(Ps_sparsities)={len(Ps_sparsities)} != len(Ps)={len(Ps)}" - for i, sparsity in enumerate(Ps_sparsities): if sparsity: assert all( @@ -451,8 +450,12 @@ def update_LHS_state( self.accumulate_poly_instructions[acc_index].Pis_of_Z[-1].append(LHS) for i in range(1, len(Ps)): if Ps[i - 1] == Ps[i]: - # Consecutives elements are the same : Squaring - LHS_current_eval = LHS_current_eval + # Consecutives elements are the same : retrieve previous evaluation. + LHS_current_eval = self.accumulate_poly_instructions[ + acc_index + ].Pis_of_Z[-1][-1] + + # Todo : support smarter analysis to save a few muls else: LHS_current_eval = self.eval_poly_in_precomputed_Z( diff --git a/hydra/modulo_circuit_structs.py b/hydra/modulo_circuit_structs.py index 1111d7845..a2ae3a47f 100644 --- a/hydra/modulo_circuit_structs.py +++ b/hydra/modulo_circuit_structs.py @@ -349,7 +349,7 @@ def extract_from_circuit_output( code += "};" return code - def serialize(self, raw: bool = False) -> str: + def serialize(self, raw: bool = False, is_option: bool = False) -> str: if self.elmts is None: raw_struct = "Option::None" if raw: @@ -359,10 +359,12 @@ def serialize(self, raw: bool = False) -> str: else: assert len(self.elmts) == 12 raw_struct = f"{self.__class__.__name__}{{{','.join([f'w{i}: {int_to_u384(self.elmts[i].value)}' for i in range(len(self))])}}}" + if is_option: + raw_struct = f"Option::Some({raw_struct})" if raw: return raw_struct else: - return f"let {self.name}:{self.__class__.__name__} = {raw_struct};\n" + return f"let {self.name} = {raw_struct};\n" def dump_to_circuit_input(self) -> str: code = "" @@ -393,7 +395,7 @@ def extract_from_circuit_output( code += "};" return code - def serialize(self, raw: bool = False) -> str: + def serialize(self, raw: bool = False, is_option: bool = False) -> str: if self.elmts is None: raw_struct = "Option::None" if raw: @@ -401,12 +403,14 @@ def serialize(self, raw: bool = False) -> str: else: return f"let {self.name}:Option<{self.__class__.__name__}> = {raw_struct};\n" else: - assert len(self.elmts) == 11 + assert len(self.elmts) == 11, f"Expected 11 elements, got {len(self.elmts)}" raw_struct = f"{self.__class__.__name__}{{{','.join([f'w{i}: {int_to_u384(self.elmts[i].value)}' for i in range(len(self))])}}}" + if is_option: + raw_struct = f"Option::Some({raw_struct})" if raw: return raw_struct else: - return f"let {self.name}:{self.__class__.__name__} = {raw_struct};\n" + return f"let {self.name} = {raw_struct};\n" def dump_to_circuit_input(self) -> str: code = "" diff --git a/hydra/precompiled_circuits/all_circuits.py b/hydra/precompiled_circuits/all_circuits.py index f731879a8..f71a575ac 100644 --- a/hydra/precompiled_circuits/all_circuits.py +++ b/hydra/precompiled_circuits/all_circuits.py @@ -46,7 +46,7 @@ from concurrent.futures import ProcessPoolExecutor -seed(42) +seed(0) class CircuitID(Enum): @@ -71,6 +71,7 @@ class CircuitID(Enum): ADD_EC_POINT = int.from_bytes(b"add_ec_point", "big") DOUBLE_EC_POINT = int.from_bytes(b"double_ec_point", "big") MP_CHECK_BIT0_LOOP = int.from_bytes(b"mp_check_bit0_loop", "big") + MP_CHECK_BIT00_LOOP = int.from_bytes(b"mp_check_bit00_loop", "big") MP_CHECK_BIT1_LOOP = int.from_bytes(b"mp_check_bit1_loop", "big") MP_CHECK_PREPARE_PAIRS = int.from_bytes(b"mp_check_prepare_pairs", "big") MP_CHECK_PREPARE_LAMBDA_ROOT = int.from_bytes( @@ -742,7 +743,7 @@ def _run_circuit_inner(self, input: list[PyFelt]): ) circuit.write_p_and_q(input) - m, _, _, _ = circuit.multi_pairing_check(n_pairs) + m, _, _, _, _ = circuit.multi_pairing_check(n_pairs) circuit.extend_output(m) circuit.finalize_circuit() @@ -907,6 +908,178 @@ def _run_circuit_inner(self, input: list[PyFelt]): return circuit +class MPCheckBit00Loop(BaseEXTFCircuit): + def __init__( + self, + curve_id: int, + n_pairs: int = 0, + auto_run: bool = True, + compilation_mode: int = 1, + ): + assert compilation_mode == 1, "Compilation mode 1 is required for this circuit" + self.n_pairs = n_pairs + super().__init__( + name=f"mpcheck_bit00", + input_len=None, + curve_id=curve_id, + auto_run=auto_run, + compilation_mode=compilation_mode, + ) + self.generic_over_curve = True + + def build_input(self) -> list[PyFelt]: + input = [] + for _ in range(self.n_pairs): + p = G1Point.gen_random_point(CurveID(self.curve_id)) + current_q = G2Point.gen_random_point(CurveID(self.curve_id)) + yInv = self.field(p.y).__inv__() + xNegOverY = -self.field(p.x) * yInv + input.extend( + [ + yInv, + xNegOverY, + self.field(current_q.x[0]), + self.field(current_q.x[1]), + self.field(current_q.y[0]), + self.field(current_q.y[1]), + ] + ) + + input.append( + self.field.random() + ) # LHS accumulation = Sum(ci*(prod(Pi,j)-Ri)(z)) + input.append(self.field.random()) # R(i-1)(z) = f(i-1)(z) for miller loop. + input.extend([self.field.random() for _ in range(12)]) # Ri = new_f + input.append(self.field.random()) # ci_minus_one + input.append(self.field(randint(0, STARK - 1))) # z + return input + + def _run_circuit_inner(self, input: list[PyFelt]): + n_pairs = self.n_pairs + assert n_pairs >= 2, f"n_pairs must be >= 2, got {n_pairs}" + circuit: multi_pairing_check.MultiPairingCheckCircuit = ( + multi_pairing_check.MultiPairingCheckCircuit( + self.name, + self.curve_id, + n_pairs=n_pairs, + hash_input=False, + compilation_mode=self.compilation_mode, + ) + ) + # Parse (yInv, xNegOverY, Qx0, Qx1, Qy0, Qy1) * n_pairs + current_points = [] + for i in range(n_pairs): + circuit.yInv.append( + circuit.write_struct(u384(name=f"yInv_{i}", elmts=[input.pop(0)])) + ) + circuit.xNegOverY.append( + circuit.write_struct(u384(name=f"xNegOverY_{i}", elmts=[input.pop(0)])) + ) + current_pt = circuit.write_struct( + G2PointCircuit( + name=f"Q{i}", + elmts=[input.pop(0), input.pop(0), input.pop(0), input.pop(0)], + ) + ) + current_points.append( + ( + [ + current_pt[0], + current_pt[1], + ], + [ + current_pt[2], + current_pt[3], + ], + ) + ) + + lhs_i = circuit.write_struct(u384(name="lhs_i", elmts=[input.pop(0)])) + f_i_of_z: ModuloCircuitElement = circuit.write_struct( + u384(name="f_i_of_z", elmts=[input.pop(0)]) + ) + + # f_i_plus_one is R as the result E12 for this bit. + f_i_plus_one: list[ModuloCircuitElement] = circuit.write_struct( + E12D(name="f_i_plus_one", elmts=[input.pop(0) for _ in range(12)]) + ) + ci = circuit.write_struct(u384(name="ci", elmts=[input.pop(0)])) + assert len(input) == 1, f"Input should be empty now" + + circuit.create_powers_of_Z( + circuit.write_struct(u384(name="z", elmts=[input.pop(0)])), max_degree=11 + ) + ci_plus_one = circuit.mul(ci, ci, f"Compute c_i = (c_(i-1))^2") + + assert len(input) == 0, f"Input should be empty now" + assert len(current_points) == n_pairs + + sum_i_prod_k_P = circuit.mul( + f_i_of_z, f_i_of_z, f"Square f evaluation in Z, the result of previous bit." + ) + new_points = [] + for k in range(n_pairs): + T, l1 = circuit.double_step(current_points[k], k) + sum_i_prod_k_P = circuit.mul( + sum_i_prod_k_P, + circuit.eval_poly_in_precomputed_Z( + l1, circuit.line_sparsity, f"line_{k}" + ), + f"Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_{k}(z)", + ) + + new_points.append(T) + + sum_i_prod_k_P = circuit.mul( + sum_i_prod_k_P, + sum_i_prod_k_P, + "Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2", + ) + + new_new_points = [] + for k in range(n_pairs): + T, l1 = circuit.double_step(new_points[k], k) + sum_i_prod_k_P = circuit.mul( + sum_i_prod_k_P, + circuit.eval_poly_in_precomputed_Z( + l1, circuit.line_sparsity, f"line_{k}" + ), + f"Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_{k}(z)", + ) + + new_new_points.append(T) + + f_i_plus_one_of_z = circuit.eval_poly_in_precomputed_Z( + f_i_plus_one, poly_name="R" + ) + new_lhs = circuit.mul( + ci_plus_one, + circuit.sub(sum_i_prod_k_P, f_i_plus_one_of_z, f"(Π(i,k) (Pk(z))) - Ri(z)"), + f"ci * ((Π(i,k) (Pk(z)) - Ri(z))", + ) + lhs_i_plus_one = circuit.add( + lhs_i, new_lhs, f"LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z))" + ) + for i, point in enumerate(new_new_points): + # circuit.extend_output(point[0]) + # circuit.extend_output(point[1]) + circuit.extend_struct_output( + G2PointCircuit( + name=f"Q{i}", + elmts=[point[0][0], point[0][1], point[1][0], point[1][1]], + ) + ) + circuit.extend_struct_output( + u384(name="f_i_plus_one_of_z", elmts=[f_i_plus_one_of_z]) + ) + circuit.extend_struct_output( + u384(name="lhs_i_plus_one", elmts=[lhs_i_plus_one]) + ) + circuit.extend_struct_output(u384(name="ci_plus_one", elmts=[ci_plus_one])) + + return circuit + + class MPCheckBit1Loop(BaseEXTFCircuit): def __init__( self, @@ -1058,17 +1231,23 @@ def _run_circuit_inner(self, input: list[PyFelt]): ) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, - circuit.eval_poly_in_precomputed_Z(l1, circuit.line_sparsity), + circuit.eval_poly_in_precomputed_Z( + l1, circuit.line_sparsity, f"line_{k}p_1" + ), ) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, - circuit.eval_poly_in_precomputed_Z(l2, circuit.line_sparsity), + circuit.eval_poly_in_precomputed_Z( + l2, circuit.line_sparsity, f"line_{k}p_2" + ), ) new_points.append(T) sum_i_prod_k_P_of_z = circuit.mul(sum_i_prod_k_P_of_z, c_or_cinv_of_z) - f_i_plus_one_of_z = circuit.eval_poly_in_precomputed_Z(f_i_plus_one) + f_i_plus_one_of_z = circuit.eval_poly_in_precomputed_Z( + f_i_plus_one, poly_name="R" + ) new_lhs = circuit.mul( ci_plus_one, circuit.sub(sum_i_prod_k_P_of_z, f_i_plus_one_of_z), @@ -1221,7 +1400,9 @@ def _run_circuit_inner(self, input: list[PyFelt]): # Conjugate c_inverse for BLS. c_or_c_inv = circuit.conjugate_e12d(c_or_c_inv) - c_or_c_inv_of_z = circuit.eval_poly_in_precomputed_Z(c_or_c_inv) + c_or_c_inv_of_z = circuit.eval_poly_in_precomputed_Z( + c_or_c_inv, poly_name=f"C_inv" if self.curve_id == BLS12_381_ID else "C" + ) circuit.extend_struct_output( u384( name="c_inv_of_z" if self.curve_id == BLS12_381_ID else "c_of_z", @@ -1265,7 +1446,7 @@ def _run_circuit_inner(self, input: list[PyFelt]): ] scaling_factor_of_z = circuit.eval_poly_in_precomputed_Z( - scaling_factor, sparsity=scaling_factor_sparsity + scaling_factor, sparsity=scaling_factor_sparsity, poly_name="W" ) circuit.extend_struct_output( @@ -1276,7 +1457,9 @@ def _run_circuit_inner(self, input: list[PyFelt]): c_inv = c_or_c_inv # Compute needed frobenius: c_inv_frob_1 = circuit.frobenius(c_inv, 1) - c_inv_frob_1_of_z = circuit.eval_poly_in_precomputed_Z(c_inv_frob_1) + c_inv_frob_1_of_z = circuit.eval_poly_in_precomputed_Z( + c_inv_frob_1, poly_name="C_inv_frob_1" + ) circuit.extend_struct_output( u384("c_inv_frob_1_of_z", elmts=[c_inv_frob_1_of_z]) ) @@ -1287,7 +1470,7 @@ def _run_circuit_inner(self, input: list[PyFelt]): E12D(name="c_inv", elmts=[input.pop(0) for _ in range(12)]) ) c_0 = circuit.write_struct(u384(name="c_0", elmts=[input.pop(0)])) - c_inv_of_z = circuit.eval_poly_in_precomputed_Z(c_inv) + c_inv_of_z = circuit.eval_poly_in_precomputed_Z(c_inv, poly_name=f"C_inv") circuit.extend_struct_output(u384(name="c_inv_of_z", elmts=[c_inv_of_z])) lhs = circuit.sub( circuit.mul(c_of_z, c_inv_of_z), @@ -1302,9 +1485,15 @@ def _run_circuit_inner(self, input: list[PyFelt]): c_frob_2 = circuit.frobenius(c, 2) c_inv_frob_3 = circuit.frobenius(c_inv, 3) - c_inv_frob_1_of_z = circuit.eval_poly_in_precomputed_Z(c_inv_frob_1) - c_frob_2_of_z = circuit.eval_poly_in_precomputed_Z(c_frob_2) - c_inv_frob_3_of_z = circuit.eval_poly_in_precomputed_Z(c_inv_frob_3) + c_inv_frob_1_of_z = circuit.eval_poly_in_precomputed_Z( + c_inv_frob_1, poly_name="C_inv_frob_1" + ) + c_frob_2_of_z = circuit.eval_poly_in_precomputed_Z( + c_frob_2, poly_name="C_frob_2" + ) + c_inv_frob_3_of_z = circuit.eval_poly_in_precomputed_Z( + c_inv_frob_3, poly_name="C_inv_frob_3" + ) circuit.extend_struct_output( u384("c_inv_frob_1_of_z", elmts=[c_inv_frob_1_of_z]) @@ -1409,7 +1598,7 @@ def _run_circuit_inner(self, input: list[PyFelt]): c_inv_of_z = circuit.write_struct(u384("c_inv_of_z", elmts=[input.pop(0)])) circuit.create_powers_of_Z(z, max_degree=11) - f_i_plus_one_of_z = circuit.eval_poly_in_precomputed_Z(R_i) + f_i_plus_one_of_z = circuit.eval_poly_in_precomputed_Z(R_i, poly_name="R") sum_i_prod_k_P_of_z = circuit.mul( c_inv_of_z, c_inv_of_z ) # # At initialisation, f=1/c so f^2 = 1/c^2 @@ -1422,7 +1611,9 @@ def _run_circuit_inner(self, input: list[PyFelt]): T, l1 = circuit.double_step(current_points[k], k) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, - circuit.eval_poly_in_precomputed_Z(l1, circuit.line_sparsity), + circuit.eval_poly_in_precomputed_Z( + l1, circuit.line_sparsity, f"line_{k}p_1" + ), ) new_points.append(T) elif self.curve_id == BLS12_381_ID: @@ -1433,11 +1624,15 @@ def _run_circuit_inner(self, input: list[PyFelt]): T, l1, l2 = circuit.triple_step(current_points[k], k) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, - circuit.eval_poly_in_precomputed_Z(l1, circuit.line_sparsity), + circuit.eval_poly_in_precomputed_Z( + l1, circuit.line_sparsity, f"line_{k}p_1" + ), ) sum_i_prod_k_P_of_z = circuit.mul( sum_i_prod_k_P_of_z, - circuit.eval_poly_in_precomputed_Z(l2, circuit.line_sparsity), + circuit.eval_poly_in_precomputed_Z( + l2, circuit.line_sparsity, f"line_{k}p_2" + ), ) new_points.append(T) @@ -1615,10 +1810,14 @@ def _run_circuit_inner(self, input: list[PyFelt]): circuit.create_powers_of_Z(z, max_degree=self.max_q_degree) c_n_minus_2 = circuit.mul(c_n_minus_3, c_n_minus_3) - c_n_minus_1 = circuit.mul(c_n_minus_2, c_n_minus_3) + c_n_minus_1 = circuit.mul(c_n_minus_2, c_n_minus_2) - R_n_minus_2_of_z = circuit.eval_poly_in_precomputed_Z(R_n_minus_2) - R_n_minus_1_of_z = circuit.eval_poly_in_precomputed_Z(R_n_minus_1) + R_n_minus_2_of_z = circuit.eval_poly_in_precomputed_Z( + R_n_minus_2, poly_name="R_n_minus_2" + ) + R_n_minus_1_of_z = circuit.eval_poly_in_precomputed_Z( + R_n_minus_1, poly_name="R_n_minus_1" + ) # Relation n-2 : f * lines prod_k_P_of_z_n_minus_2 = R_n_minus_3_of_z # Init @@ -1626,7 +1825,9 @@ def _run_circuit_inner(self, input: list[PyFelt]): for l in lines: prod_k_P_of_z_n_minus_2 = circuit.mul( prod_k_P_of_z_n_minus_2, - circuit.eval_poly_in_precomputed_Z(l, circuit.line_sparsity), + circuit.eval_poly_in_precomputed_Z( + l, circuit.line_sparsity, f"line_{k}" + ), ) lhs_n_minus_2 = circuit.mul( @@ -1649,16 +1850,20 @@ def _run_circuit_inner(self, input: list[PyFelt]): comment=f"c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z))", ) - final_lhs = circuit.add(previous_lhs, circuit.add(lhs_n_minus_2, lhs_n_minus_1)) + _final_lhs = circuit.add(previous_lhs, lhs_n_minus_2) + final_lhs = circuit.add(_final_lhs, lhs_n_minus_1) - Q_of_z = circuit.eval_poly_in_precomputed_Z(Q) + Q_of_z = circuit.eval_poly_in_precomputed_Z(Q, poly_name="big_Q") P_irr, P_irr_sparsity = circuit.write_sparse_constant_elements( get_irreducible_poly(self.curve_id, 12).get_coeffs(), ) - P_of_z = circuit.eval_poly_in_precomputed_Z(P_irr, P_irr_sparsity) + P_of_z = circuit.eval_poly_in_precomputed_Z( + P_irr, P_irr_sparsity, poly_name="P_irr" + ) check = circuit.sub(final_lhs, circuit.mul(Q_of_z, P_of_z)) circuit.extend_struct_output(u384("final_check", elmts=[check])) + circuit.extend_struct_output(u384("_final_lhs", elmts=[_final_lhs])) return circuit @@ -1738,7 +1943,9 @@ def _run_circuit_inner(self, input: list[PyFelt]): c_n_minus_1 = circuit.mul(c_n_minus_2, c_n_minus_2) - R_n_minus_1_of_z = circuit.eval_poly_in_precomputed_Z(R_n_minus_1) + R_n_minus_1_of_z = circuit.eval_poly_in_precomputed_Z( + R_n_minus_1, poly_name="R_n_minus_1" + ) # Relation n-1 (last one) : f * w * c_inv_frob_1 prod_k_P_of_z_n_minus_1 = circuit.mul(R_n_minus_2_of_z, c_inv_frob_1_of_z) @@ -2275,6 +2482,11 @@ def format_cairo_files_in_parallel(filenames, compilation_mode): "params": [{"n_pairs": k} for k in [2, 3]], "filename": "multi_pairing_check", }, + CircuitID.MP_CHECK_BIT00_LOOP: { + "class": MPCheckBit00Loop, + "params": [{"n_pairs": k} for k in [2, 3]], + "filename": "multi_pairing_check", + }, CircuitID.MP_CHECK_BIT1_LOOP: { "class": MPCheckBit1Loop, "params": [{"n_pairs": k} for k in [2, 3]], @@ -2314,6 +2526,9 @@ def format_cairo_files_in_parallel(filenames, compilation_mode): if __name__ == "__main__": + import random + + random.seed(0) print(f"Compiling Cairo 1 circuits...") main( PRECOMPILED_CIRCUITS_DIR="src/cairo/src/circuits/", diff --git a/hydra/precompiled_circuits/multi_pairing_check.py b/hydra/precompiled_circuits/multi_pairing_check.py index bc273b345..e6c8acd43 100644 --- a/hydra/precompiled_circuits/multi_pairing_check.py +++ b/hydra/precompiled_circuits/multi_pairing_check.py @@ -100,8 +100,9 @@ def get_max_Q_degree(curve_id: int, n_pairs: int) -> int: f_degree = 11 lamda_root_degree = 11 - # Largest Q happens in bit_1 case where we do f*f*c * Π_n_pairs(line*line) - max_q_degree = 2 * f_degree + lamda_root_degree + 2 * line_degree * n_pairs - 12 + # Largest Q happens in bit_00 case where we do (f*f* Π_n_pairs(line)^2 * Π_n_pairs(line) + + max_q_degree = 4 * f_degree + 2 * line_degree * n_pairs + line_degree * n_pairs - 12 return max_q_degree @@ -180,6 +181,47 @@ def bit_0_case( ) return new_f, new_points + def bit_00_case( + self, + f: list[ModuloCircuitElement], + points: list[tuple[list[ModuloCircuitElement], list[ModuloCircuitElement]]], + n_pairs: int, + ): + """ + Compute the bit 00 case of the Miller loop. + params : f : the current miller loop FP12 element + points : the list of points to double + n_pairs : the number of pairs to double + returns : the new miller loop FP12 element and the new points + """ + assert len(points) == n_pairs + new_lines = [] + new_points = [] + for k in range(n_pairs): + T, l1 = self.double_step(points[k], k) + new_lines.append(l1) + new_lines.append(l1) # Double since it's going to be squared + new_points.append(T) + + new_new_points = [] + new_new_lines = [] + + for k in range(n_pairs): + T, l1 = self.double_step(new_points[k], k) + new_new_lines.append(l1) + new_new_points.append(T) + + # (f^2 * Π_(new_lines))^2 * Π_new_new_lines = f^4 * Π_new_lines^2 * Π_new_new_lines + + new_f = self.extf_mul( + [f, f, f, f, *new_lines, *new_new_lines], + 12, + Ps_sparsities=[None, None, None, None] + + [self.line_sparsity] * n_pairs * 2 + + [self.line_sparsity] * n_pairs, + ) + return new_f, new_new_points + def bit_1_init_case( self, f: list[ModuloCircuitElement], @@ -263,11 +305,12 @@ def multi_pairing_check( if self.curve_id == CurveID.BLS12_381.value: # Conjugate c so that the final conjugate in BLS loop gives indeed f/c^(-x), as conjugate(f/conjugate(c^(-x))) = conjugate(f)/c^(-x) - c = None - c_inv = self.conjugate_e12d(c_or_c_inv) + lambda_root = None + lambda_root_inverse = c_or_c_inv + c_inv = self.conjugate_e12d(lambda_root_inverse) elif self.curve_id == CurveID.BN254.value: - c = c_or_c_inv - c_inv = self.extf_inv(c_or_c_inv, 12) + lambda_root = c = c_or_c_inv + lambda_root_inverse = c_inv = self.extf_inv(c_or_c_inv, 12) # Init f as 1/c = 1 / (λ-th √(f_output*scaling_factor)), where: # λ = 6 * x + 2 + q - q**2 + q**3 for BN @@ -288,11 +331,16 @@ def multi_pairing_check( f"Init bit {self.loop_counter[start_index]} not implemented" ) - # Rest of miller loop. - for i in range(start_index - 1, -1, -1): + i = start_index - 1 + while i >= 0: if self.loop_counter[i] == 0: - # Free squaring for 1/c in bit 0 - f, Qs = self.bit_0_case(f, Qs, n_pairs) + if i > 0 and self.loop_counter[i - 1] == 0: + # Two consecutive bits are 0, call bit_00_case + f, Qs = self.bit_00_case(f, Qs, n_pairs) + i -= 1 # Skip the next bit since it's already processed + else: + # Single bit 0, call bit_0_case + f, Qs = self.bit_0_case(f, Qs, n_pairs) elif self.loop_counter[i] == 1 or self.loop_counter[i] == -1: # Choose Q or -Q depending on the bit for the addition. Q_selects = [ @@ -304,6 +352,12 @@ def multi_pairing_check( f, Qs = self.bit_1_case(f, Qs, Q_selects, n_pairs, c_or_c_inv) else: raise NotImplementedError(f"Bit {self.loop_counter[i]} not implemented") + i -= 1 + + if m is not None and len(m) == 12: + final_r_sparsity = None + else: + final_r_sparsity = [1] + [0] * 11 if self.curve_id == CurveID.BN254.value: lines = self.bn254_finalize_step(Qs) @@ -316,43 +370,40 @@ def multi_pairing_check( c_inv_frob_1 = self.frobenius(c_inv, 1) c_frob_2 = self.frobenius(c, 2) c_inv_frob_3 = self.frobenius(c_inv, 3) + f = self.extf_mul( - ( - [f, w, c_inv_frob_1, c_frob_2, c_inv_frob_3] - + ([m] if m is not None else []) - ), + ([f, w, c_inv_frob_1, c_frob_2, c_inv_frob_3]), 12, - Ps_sparsities=( - [None, scaling_factor_sparsity, None, None, None] - + ([None] if m is not None else []) - ), - r_sparsity=[1] + [0] * 11, + Ps_sparsities=([None, scaling_factor_sparsity, None, None, None]), + r_sparsity=final_r_sparsity, ) elif self.curve_id == CurveID.BLS12_381.value: # λ = -x + q for BLS c_inv_frob_1 = self.frobenius(c_inv, 1) - + f = self.extf_mul( + Ps=[f, w, c_inv_frob_1], + extension_degree=12, + Ps_sparsities=[None, scaling_factor_sparsity, None], + r_sparsity=final_r_sparsity, + ) if m is not None and len(m) == 12: - f = self.extf_mul( - Ps=[f, w, c_inv_frob_1], - extension_degree=12, - Ps_sparsities=[None, scaling_factor_sparsity, None], - ) f = self.conjugate_e12d(f) - f = self.extf_mul([f, m], 12, r_sparsity=[1] + [0] * 11) - else: - f = self.extf_mul( - Ps=[f, w, c_inv_frob_1], - extension_degree=12, - Ps_sparsities=[None, scaling_factor_sparsity, None], - r_sparsity=[1] + [0] * 11, - ) + else: raise NotImplementedError(f"Curve {self.curve_id} not implemented") + if m is not None and len(m) == 12: + f = self.extf_mul([f, m], 12, r_sparsity=[1] + [0] * 11) + assert [fi.value for fi in f] == [1] + [0] * 11, f"f: {f}" - return f, lambda_root, scaling_factor, scaling_factor_sparsity + return ( + f, + lambda_root, + lambda_root_inverse, + scaling_factor, + scaling_factor_sparsity, + ) def get_pairing_check_input( @@ -428,9 +479,12 @@ def total_cost(c): f"Test {curve_id.name} {n_pairs=} {'with m' if include_m else 'without m'} passed" ) print(f"n_eq: {c.accumulate_poly_instructions[0].n}") + print( + f"Q max degree: {max([q.degree() for q in c.accumulate_poly_instructions[0].Qis])}" + ) for curve_id in [CurveID.BN254, CurveID.BLS12_381]: - for n_pairs in [2, 3, 4]: + for n_pairs in [2, 3]: print(f"Testing {curve_id.name} {n_pairs=}") test_mpcheck(curve_id, n_pairs) test_mpcheck(curve_id, n_pairs, include_m=True) diff --git a/src/cairo/src/circuits/multi_pairing_check.cairo b/src/cairo/src/circuits/multi_pairing_check.cairo index 32e06f393..b2328fd6f 100644 --- a/src/cairo/src/circuits/multi_pairing_check.cairo +++ b/src/cairo/src/circuits/multi_pairing_check.cairo @@ -13,7 +13,7 @@ use garaga::definitions::{ use core::option::Option; -fn run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( +fn run_BLS12_381_MP_CHECK_BIT00_LOOP_2_circuit( yInv_0: u384, xNegOverY_0: u384, Q0: G2Point, @@ -112,14 +112,14 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( let t63 = circuit_mul(t62, in4); let t64 = circuit_mul(t59, in3); let t65 = circuit_mul(t32, in4); - let t66 = circuit_mul(t63, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t67 = circuit_add(t61, t66); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t68 = circuit_add(t67, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t69 = circuit_mul(t64, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t70 = circuit_add(t68, t69); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t71 = circuit_mul(t65, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t72 = circuit_add(t70, t71); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t73 = circuit_mul(t11, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_0(z) + let t66 = circuit_mul(t63, t0); // Eval sparse poly line_0 step coeff_2 * z^2 + let t67 = circuit_add(t61, t66); // Eval sparse poly line_0 step + coeff_2 * z^2 + let t68 = circuit_add(t67, t1); // Eval sparse poly line_0 step + 1*z^3 + let t69 = circuit_mul(t64, t4); // Eval sparse poly line_0 step coeff_6 * z^6 + let t70 = circuit_add(t68, t69); // Eval sparse poly line_0 step + coeff_6 * z^6 + let t71 = circuit_mul(t65, t6); // Eval sparse poly line_0 step coeff_8 * z^8 + let t72 = circuit_add(t70, t71); // Eval sparse poly line_0 step + coeff_8 * z^8 + let t73 = circuit_mul(t11, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t74 = circuit_add(in11, in12); // Doubling slope numerator start let t75 = circuit_sub(in11, in12); let t76 = circuit_mul(t74, t75); @@ -174,39 +174,166 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( let t125 = circuit_mul(t124, in10); let t126 = circuit_mul(t121, in9); let t127 = circuit_mul(t94, in10); - let t128 = circuit_mul(t125, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t129 = circuit_add(t123, t128); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t130 = circuit_add(t129, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t131 = circuit_mul(t126, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t132 = circuit_add(t130, t131); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t133 = circuit_mul(t127, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t134 = circuit_add(t132, t133); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t135 = circuit_mul(t73, t134); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_1(z) - let t136 = circuit_mul(in18, in30); // Eval UnnamedPoly step coeff_1 * z^1 - let t137 = circuit_add(in17, t136); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t138 = circuit_mul(in19, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t139 = circuit_add(t137, t138); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t140 = circuit_mul(in20, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t141 = circuit_add(t139, t140); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t142 = circuit_mul(in21, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t143 = circuit_add(t141, t142); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t144 = circuit_mul(in22, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t145 = circuit_add(t143, t144); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t146 = circuit_mul(in23, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t147 = circuit_add(t145, t146); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t148 = circuit_mul(in24, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t149 = circuit_add(t147, t148); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t150 = circuit_mul(in25, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t151 = circuit_add(t149, t150); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t152 = circuit_mul(in26, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t153 = circuit_add(t151, t152); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t154 = circuit_mul(in27, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t155 = circuit_add(t153, t154); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t156 = circuit_mul(in28, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t157 = circuit_add(t155, t156); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t158 = circuit_sub(t135, t157); // (Π(i,k) (Pk(z))) - Ri(z) - let t159 = circuit_mul(t10, t158); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) - let t160 = circuit_add(in15, t159); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t128 = circuit_mul(t125, t0); // Eval sparse poly line_1 step coeff_2 * z^2 + let t129 = circuit_add(t123, t128); // Eval sparse poly line_1 step + coeff_2 * z^2 + let t130 = circuit_add(t129, t1); // Eval sparse poly line_1 step + 1*z^3 + let t131 = circuit_mul(t126, t4); // Eval sparse poly line_1 step coeff_6 * z^6 + let t132 = circuit_add(t130, t131); // Eval sparse poly line_1 step + coeff_6 * z^6 + let t133 = circuit_mul(t127, t6); // Eval sparse poly line_1 step coeff_8 * z^8 + let t134 = circuit_add(t132, t133); // Eval sparse poly line_1 step + coeff_8 * z^8 + let t135 = circuit_mul(t73, t134); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) + let t136 = circuit_mul( + t135, t135 + ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 + let t137 = circuit_add(t40, t41); // Doubling slope numerator start + let t138 = circuit_sub(t40, t41); + let t139 = circuit_mul(t137, t138); + let t140 = circuit_mul(t40, t41); + let t141 = circuit_mul(t139, in0); + let t142 = circuit_mul(t140, in1); // Doubling slope numerator end + let t143 = circuit_add(t50, t50); // Fp2 add coeff 0/1 + let t144 = circuit_add(t51, t51); // Fp2 add coeff 1/1 + let t145 = circuit_mul(t143, t143); // Fp2 Div x/y start : Fp2 Inv y start + let t146 = circuit_mul(t144, t144); + let t147 = circuit_add(t145, t146); + let t148 = circuit_inverse(t147); + let t149 = circuit_mul(t143, t148); // Fp2 Inv y real part end + let t150 = circuit_mul(t144, t148); + let t151 = circuit_sub(in2, t150); // Fp2 Inv y imag part end + let t152 = circuit_mul(t141, t149); // Fp2 mul start + let t153 = circuit_mul(t142, t151); + let t154 = circuit_sub(t152, t153); // Fp2 mul real part end + let t155 = circuit_mul(t141, t151); + let t156 = circuit_mul(t142, t149); + let t157 = circuit_add(t155, t156); // Fp2 mul imag part end + let t158 = circuit_add(t154, t157); + let t159 = circuit_sub(t154, t157); + let t160 = circuit_mul(t158, t159); + let t161 = circuit_mul(t154, t157); + let t162 = circuit_add(t161, t161); + let t163 = circuit_add(t40, t40); // Fp2 add coeff 0/1 + let t164 = circuit_add(t41, t41); // Fp2 add coeff 1/1 + let t165 = circuit_sub(t160, t163); // Fp2 sub coeff 0/1 + let t166 = circuit_sub(t162, t164); // Fp2 sub coeff 1/1 + let t167 = circuit_sub(t40, t165); // Fp2 sub coeff 0/1 + let t168 = circuit_sub(t41, t166); // Fp2 sub coeff 1/1 + let t169 = circuit_mul(t154, t167); // Fp2 mul start + let t170 = circuit_mul(t157, t168); + let t171 = circuit_sub(t169, t170); // Fp2 mul real part end + let t172 = circuit_mul(t154, t168); + let t173 = circuit_mul(t157, t167); + let t174 = circuit_add(t172, t173); // Fp2 mul imag part end + let t175 = circuit_sub(t171, t50); // Fp2 sub coeff 0/1 + let t176 = circuit_sub(t174, t51); // Fp2 sub coeff 1/1 + let t177 = circuit_mul(t154, t40); // Fp2 mul start + let t178 = circuit_mul(t157, t41); + let t179 = circuit_sub(t177, t178); // Fp2 mul real part end + let t180 = circuit_mul(t154, t41); + let t181 = circuit_mul(t157, t40); + let t182 = circuit_add(t180, t181); // Fp2 mul imag part end + let t183 = circuit_sub(t179, t50); // Fp2 sub coeff 0/1 + let t184 = circuit_sub(t182, t51); // Fp2 sub coeff 1/1 + let t185 = circuit_sub(t183, t184); + let t186 = circuit_mul(t185, in3); + let t187 = circuit_sub(t154, t157); + let t188 = circuit_mul(t187, in4); + let t189 = circuit_mul(t184, in3); + let t190 = circuit_mul(t157, in4); + let t191 = circuit_mul(t188, t0); // Eval sparse poly line_0 step coeff_2 * z^2 + let t192 = circuit_add(t186, t191); // Eval sparse poly line_0 step + coeff_2 * z^2 + let t193 = circuit_add(t192, t1); // Eval sparse poly line_0 step + 1*z^3 + let t194 = circuit_mul(t189, t4); // Eval sparse poly line_0 step coeff_6 * z^6 + let t195 = circuit_add(t193, t194); // Eval sparse poly line_0 step + coeff_6 * z^6 + let t196 = circuit_mul(t190, t6); // Eval sparse poly line_0 step coeff_8 * z^8 + let t197 = circuit_add(t195, t196); // Eval sparse poly line_0 step + coeff_8 * z^8 + let t198 = circuit_mul(t136, t197); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_0(z) + let t199 = circuit_add(t102, t103); // Doubling slope numerator start + let t200 = circuit_sub(t102, t103); + let t201 = circuit_mul(t199, t200); + let t202 = circuit_mul(t102, t103); + let t203 = circuit_mul(t201, in0); + let t204 = circuit_mul(t202, in1); // Doubling slope numerator end + let t205 = circuit_add(t112, t112); // Fp2 add coeff 0/1 + let t206 = circuit_add(t113, t113); // Fp2 add coeff 1/1 + let t207 = circuit_mul(t205, t205); // Fp2 Div x/y start : Fp2 Inv y start + let t208 = circuit_mul(t206, t206); + let t209 = circuit_add(t207, t208); + let t210 = circuit_inverse(t209); + let t211 = circuit_mul(t205, t210); // Fp2 Inv y real part end + let t212 = circuit_mul(t206, t210); + let t213 = circuit_sub(in2, t212); // Fp2 Inv y imag part end + let t214 = circuit_mul(t203, t211); // Fp2 mul start + let t215 = circuit_mul(t204, t213); + let t216 = circuit_sub(t214, t215); // Fp2 mul real part end + let t217 = circuit_mul(t203, t213); + let t218 = circuit_mul(t204, t211); + let t219 = circuit_add(t217, t218); // Fp2 mul imag part end + let t220 = circuit_add(t216, t219); + let t221 = circuit_sub(t216, t219); + let t222 = circuit_mul(t220, t221); + let t223 = circuit_mul(t216, t219); + let t224 = circuit_add(t223, t223); + let t225 = circuit_add(t102, t102); // Fp2 add coeff 0/1 + let t226 = circuit_add(t103, t103); // Fp2 add coeff 1/1 + let t227 = circuit_sub(t222, t225); // Fp2 sub coeff 0/1 + let t228 = circuit_sub(t224, t226); // Fp2 sub coeff 1/1 + let t229 = circuit_sub(t102, t227); // Fp2 sub coeff 0/1 + let t230 = circuit_sub(t103, t228); // Fp2 sub coeff 1/1 + let t231 = circuit_mul(t216, t229); // Fp2 mul start + let t232 = circuit_mul(t219, t230); + let t233 = circuit_sub(t231, t232); // Fp2 mul real part end + let t234 = circuit_mul(t216, t230); + let t235 = circuit_mul(t219, t229); + let t236 = circuit_add(t234, t235); // Fp2 mul imag part end + let t237 = circuit_sub(t233, t112); // Fp2 sub coeff 0/1 + let t238 = circuit_sub(t236, t113); // Fp2 sub coeff 1/1 + let t239 = circuit_mul(t216, t102); // Fp2 mul start + let t240 = circuit_mul(t219, t103); + let t241 = circuit_sub(t239, t240); // Fp2 mul real part end + let t242 = circuit_mul(t216, t103); + let t243 = circuit_mul(t219, t102); + let t244 = circuit_add(t242, t243); // Fp2 mul imag part end + let t245 = circuit_sub(t241, t112); // Fp2 sub coeff 0/1 + let t246 = circuit_sub(t244, t113); // Fp2 sub coeff 1/1 + let t247 = circuit_sub(t245, t246); + let t248 = circuit_mul(t247, in9); + let t249 = circuit_sub(t216, t219); + let t250 = circuit_mul(t249, in10); + let t251 = circuit_mul(t246, in9); + let t252 = circuit_mul(t219, in10); + let t253 = circuit_mul(t250, t0); // Eval sparse poly line_1 step coeff_2 * z^2 + let t254 = circuit_add(t248, t253); // Eval sparse poly line_1 step + coeff_2 * z^2 + let t255 = circuit_add(t254, t1); // Eval sparse poly line_1 step + 1*z^3 + let t256 = circuit_mul(t251, t4); // Eval sparse poly line_1 step coeff_6 * z^6 + let t257 = circuit_add(t255, t256); // Eval sparse poly line_1 step + coeff_6 * z^6 + let t258 = circuit_mul(t252, t6); // Eval sparse poly line_1 step coeff_8 * z^8 + let t259 = circuit_add(t257, t258); // Eval sparse poly line_1 step + coeff_8 * z^8 + let t260 = circuit_mul(t198, t259); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_1(z) + let t261 = circuit_mul(in18, in30); // Eval R step coeff_1 * z^1 + let t262 = circuit_add(in17, t261); // Eval R step + (coeff_1 * z^1) + let t263 = circuit_mul(in19, t0); // Eval R step coeff_2 * z^2 + let t264 = circuit_add(t262, t263); // Eval R step + (coeff_2 * z^2) + let t265 = circuit_mul(in20, t1); // Eval R step coeff_3 * z^3 + let t266 = circuit_add(t264, t265); // Eval R step + (coeff_3 * z^3) + let t267 = circuit_mul(in21, t2); // Eval R step coeff_4 * z^4 + let t268 = circuit_add(t266, t267); // Eval R step + (coeff_4 * z^4) + let t269 = circuit_mul(in22, t3); // Eval R step coeff_5 * z^5 + let t270 = circuit_add(t268, t269); // Eval R step + (coeff_5 * z^5) + let t271 = circuit_mul(in23, t4); // Eval R step coeff_6 * z^6 + let t272 = circuit_add(t270, t271); // Eval R step + (coeff_6 * z^6) + let t273 = circuit_mul(in24, t5); // Eval R step coeff_7 * z^7 + let t274 = circuit_add(t272, t273); // Eval R step + (coeff_7 * z^7) + let t275 = circuit_mul(in25, t6); // Eval R step coeff_8 * z^8 + let t276 = circuit_add(t274, t275); // Eval R step + (coeff_8 * z^8) + let t277 = circuit_mul(in26, t7); // Eval R step coeff_9 * z^9 + let t278 = circuit_add(t276, t277); // Eval R step + (coeff_9 * z^9) + let t279 = circuit_mul(in27, t8); // Eval R step coeff_10 * z^10 + let t280 = circuit_add(t278, t279); // Eval R step + (coeff_10 * z^10) + let t281 = circuit_mul(in28, t9); // Eval R step coeff_11 * z^11 + let t282 = circuit_add(t280, t281); // Eval R step + (coeff_11 * z^11) + let t283 = circuit_sub(t260, t282); // (Π(i,k) (Pk(z))) - Ri(z) + let t284 = circuit_mul(t10, t283); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t285 = circuit_add(in15, t284); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = TryInto::< _, CircuitModulus @@ -220,7 +347,7 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( ) .unwrap(); - let mut circuit_inputs = (t40, t41, t50, t51, t102, t103, t112, t113, t157, t160, t10,) + let mut circuit_inputs = (t165, t166, t175, t176, t227, t228, t237, t238, t282, t285, t10,) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); @@ -260,23 +387,23 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( Result::Err(_) => { panic!("Expected success") } }; let Q0: G2Point = G2Point { - x0: outputs.get_output(t40), - x1: outputs.get_output(t41), - y0: outputs.get_output(t50), - y1: outputs.get_output(t51) + x0: outputs.get_output(t165), + x1: outputs.get_output(t166), + y0: outputs.get_output(t175), + y1: outputs.get_output(t176) }; let Q1: G2Point = G2Point { - x0: outputs.get_output(t102), - x1: outputs.get_output(t103), - y0: outputs.get_output(t112), - y1: outputs.get_output(t113) + x0: outputs.get_output(t227), + x1: outputs.get_output(t228), + y0: outputs.get_output(t237), + y1: outputs.get_output(t238) }; - let f_i_plus_one_of_z: u384 = outputs.get_output(t157); - let lhs_i_plus_one: u384 = outputs.get_output(t160); + let f_i_plus_one_of_z: u384 = outputs.get_output(t282); + let lhs_i_plus_one: u384 = outputs.get_output(t285); let ci_plus_one: u384 = outputs.get_output(t10); return (Q0, Q1, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); } -fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( +fn run_BLS12_381_MP_CHECK_BIT00_LOOP_3_circuit( yInv_0: u384, xNegOverY_0: u384, Q0: G2Point, @@ -381,14 +508,14 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( let t63 = circuit_mul(t62, in4); let t64 = circuit_mul(t59, in3); let t65 = circuit_mul(t32, in4); - let t66 = circuit_mul(t63, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t67 = circuit_add(t61, t66); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t68 = circuit_add(t67, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t69 = circuit_mul(t64, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t70 = circuit_add(t68, t69); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t71 = circuit_mul(t65, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t72 = circuit_add(t70, t71); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t73 = circuit_mul(t11, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_0(z) + let t66 = circuit_mul(t63, t0); // Eval sparse poly line_0 step coeff_2 * z^2 + let t67 = circuit_add(t61, t66); // Eval sparse poly line_0 step + coeff_2 * z^2 + let t68 = circuit_add(t67, t1); // Eval sparse poly line_0 step + 1*z^3 + let t69 = circuit_mul(t64, t4); // Eval sparse poly line_0 step coeff_6 * z^6 + let t70 = circuit_add(t68, t69); // Eval sparse poly line_0 step + coeff_6 * z^6 + let t71 = circuit_mul(t65, t6); // Eval sparse poly line_0 step coeff_8 * z^8 + let t72 = circuit_add(t70, t71); // Eval sparse poly line_0 step + coeff_8 * z^8 + let t73 = circuit_mul(t11, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) let t74 = circuit_add(in11, in12); // Doubling slope numerator start let t75 = circuit_sub(in11, in12); let t76 = circuit_mul(t74, t75); @@ -443,14 +570,14 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( let t125 = circuit_mul(t124, in10); let t126 = circuit_mul(t121, in9); let t127 = circuit_mul(t94, in10); - let t128 = circuit_mul(t125, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t129 = circuit_add(t123, t128); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t130 = circuit_add(t129, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t131 = circuit_mul(t126, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t132 = circuit_add(t130, t131); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t133 = circuit_mul(t127, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t134 = circuit_add(t132, t133); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t135 = circuit_mul(t73, t134); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_1(z) + let t128 = circuit_mul(t125, t0); // Eval sparse poly line_1 step coeff_2 * z^2 + let t129 = circuit_add(t123, t128); // Eval sparse poly line_1 step + coeff_2 * z^2 + let t130 = circuit_add(t129, t1); // Eval sparse poly line_1 step + 1*z^3 + let t131 = circuit_mul(t126, t4); // Eval sparse poly line_1 step coeff_6 * z^6 + let t132 = circuit_add(t130, t131); // Eval sparse poly line_1 step + coeff_6 * z^6 + let t133 = circuit_mul(t127, t6); // Eval sparse poly line_1 step coeff_8 * z^8 + let t134 = circuit_add(t132, t133); // Eval sparse poly line_1 step + coeff_8 * z^8 + let t135 = circuit_mul(t73, t134); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) let t136 = circuit_add(in17, in18); // Doubling slope numerator start let t137 = circuit_sub(in17, in18); let t138 = circuit_mul(t136, t137); @@ -505,39 +632,228 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( let t187 = circuit_mul(t186, in16); let t188 = circuit_mul(t183, in15); let t189 = circuit_mul(t156, in16); - let t190 = circuit_mul(t187, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t191 = circuit_add(t185, t190); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t192 = circuit_add(t191, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t193 = circuit_mul(t188, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t194 = circuit_add(t192, t193); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t195 = circuit_mul(t189, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t196 = circuit_add(t194, t195); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t197 = circuit_mul(t135, t196); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_2(z) - let t198 = circuit_mul(in24, in36); // Eval UnnamedPoly step coeff_1 * z^1 - let t199 = circuit_add(in23, t198); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t200 = circuit_mul(in25, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t201 = circuit_add(t199, t200); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t202 = circuit_mul(in26, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t203 = circuit_add(t201, t202); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t204 = circuit_mul(in27, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t205 = circuit_add(t203, t204); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t206 = circuit_mul(in28, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t207 = circuit_add(t205, t206); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t208 = circuit_mul(in29, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t209 = circuit_add(t207, t208); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t210 = circuit_mul(in30, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t211 = circuit_add(t209, t210); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t212 = circuit_mul(in31, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t213 = circuit_add(t211, t212); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t214 = circuit_mul(in32, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t215 = circuit_add(t213, t214); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t216 = circuit_mul(in33, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t217 = circuit_add(t215, t216); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t218 = circuit_mul(in34, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t219 = circuit_add(t217, t218); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t220 = circuit_sub(t197, t219); // (Π(i,k) (Pk(z))) - Ri(z) - let t221 = circuit_mul(t10, t220); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) - let t222 = circuit_add(in21, t221); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t190 = circuit_mul(t187, t0); // Eval sparse poly line_2 step coeff_2 * z^2 + let t191 = circuit_add(t185, t190); // Eval sparse poly line_2 step + coeff_2 * z^2 + let t192 = circuit_add(t191, t1); // Eval sparse poly line_2 step + 1*z^3 + let t193 = circuit_mul(t188, t4); // Eval sparse poly line_2 step coeff_6 * z^6 + let t194 = circuit_add(t192, t193); // Eval sparse poly line_2 step + coeff_6 * z^6 + let t195 = circuit_mul(t189, t6); // Eval sparse poly line_2 step coeff_8 * z^8 + let t196 = circuit_add(t194, t195); // Eval sparse poly line_2 step + coeff_8 * z^8 + let t197 = circuit_mul(t135, t196); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) + let t198 = circuit_mul( + t197, t197 + ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 + let t199 = circuit_add(t40, t41); // Doubling slope numerator start + let t200 = circuit_sub(t40, t41); + let t201 = circuit_mul(t199, t200); + let t202 = circuit_mul(t40, t41); + let t203 = circuit_mul(t201, in0); + let t204 = circuit_mul(t202, in1); // Doubling slope numerator end + let t205 = circuit_add(t50, t50); // Fp2 add coeff 0/1 + let t206 = circuit_add(t51, t51); // Fp2 add coeff 1/1 + let t207 = circuit_mul(t205, t205); // Fp2 Div x/y start : Fp2 Inv y start + let t208 = circuit_mul(t206, t206); + let t209 = circuit_add(t207, t208); + let t210 = circuit_inverse(t209); + let t211 = circuit_mul(t205, t210); // Fp2 Inv y real part end + let t212 = circuit_mul(t206, t210); + let t213 = circuit_sub(in2, t212); // Fp2 Inv y imag part end + let t214 = circuit_mul(t203, t211); // Fp2 mul start + let t215 = circuit_mul(t204, t213); + let t216 = circuit_sub(t214, t215); // Fp2 mul real part end + let t217 = circuit_mul(t203, t213); + let t218 = circuit_mul(t204, t211); + let t219 = circuit_add(t217, t218); // Fp2 mul imag part end + let t220 = circuit_add(t216, t219); + let t221 = circuit_sub(t216, t219); + let t222 = circuit_mul(t220, t221); + let t223 = circuit_mul(t216, t219); + let t224 = circuit_add(t223, t223); + let t225 = circuit_add(t40, t40); // Fp2 add coeff 0/1 + let t226 = circuit_add(t41, t41); // Fp2 add coeff 1/1 + let t227 = circuit_sub(t222, t225); // Fp2 sub coeff 0/1 + let t228 = circuit_sub(t224, t226); // Fp2 sub coeff 1/1 + let t229 = circuit_sub(t40, t227); // Fp2 sub coeff 0/1 + let t230 = circuit_sub(t41, t228); // Fp2 sub coeff 1/1 + let t231 = circuit_mul(t216, t229); // Fp2 mul start + let t232 = circuit_mul(t219, t230); + let t233 = circuit_sub(t231, t232); // Fp2 mul real part end + let t234 = circuit_mul(t216, t230); + let t235 = circuit_mul(t219, t229); + let t236 = circuit_add(t234, t235); // Fp2 mul imag part end + let t237 = circuit_sub(t233, t50); // Fp2 sub coeff 0/1 + let t238 = circuit_sub(t236, t51); // Fp2 sub coeff 1/1 + let t239 = circuit_mul(t216, t40); // Fp2 mul start + let t240 = circuit_mul(t219, t41); + let t241 = circuit_sub(t239, t240); // Fp2 mul real part end + let t242 = circuit_mul(t216, t41); + let t243 = circuit_mul(t219, t40); + let t244 = circuit_add(t242, t243); // Fp2 mul imag part end + let t245 = circuit_sub(t241, t50); // Fp2 sub coeff 0/1 + let t246 = circuit_sub(t244, t51); // Fp2 sub coeff 1/1 + let t247 = circuit_sub(t245, t246); + let t248 = circuit_mul(t247, in3); + let t249 = circuit_sub(t216, t219); + let t250 = circuit_mul(t249, in4); + let t251 = circuit_mul(t246, in3); + let t252 = circuit_mul(t219, in4); + let t253 = circuit_mul(t250, t0); // Eval sparse poly line_0 step coeff_2 * z^2 + let t254 = circuit_add(t248, t253); // Eval sparse poly line_0 step + coeff_2 * z^2 + let t255 = circuit_add(t254, t1); // Eval sparse poly line_0 step + 1*z^3 + let t256 = circuit_mul(t251, t4); // Eval sparse poly line_0 step coeff_6 * z^6 + let t257 = circuit_add(t255, t256); // Eval sparse poly line_0 step + coeff_6 * z^6 + let t258 = circuit_mul(t252, t6); // Eval sparse poly line_0 step coeff_8 * z^8 + let t259 = circuit_add(t257, t258); // Eval sparse poly line_0 step + coeff_8 * z^8 + let t260 = circuit_mul(t198, t259); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_0(z) + let t261 = circuit_add(t102, t103); // Doubling slope numerator start + let t262 = circuit_sub(t102, t103); + let t263 = circuit_mul(t261, t262); + let t264 = circuit_mul(t102, t103); + let t265 = circuit_mul(t263, in0); + let t266 = circuit_mul(t264, in1); // Doubling slope numerator end + let t267 = circuit_add(t112, t112); // Fp2 add coeff 0/1 + let t268 = circuit_add(t113, t113); // Fp2 add coeff 1/1 + let t269 = circuit_mul(t267, t267); // Fp2 Div x/y start : Fp2 Inv y start + let t270 = circuit_mul(t268, t268); + let t271 = circuit_add(t269, t270); + let t272 = circuit_inverse(t271); + let t273 = circuit_mul(t267, t272); // Fp2 Inv y real part end + let t274 = circuit_mul(t268, t272); + let t275 = circuit_sub(in2, t274); // Fp2 Inv y imag part end + let t276 = circuit_mul(t265, t273); // Fp2 mul start + let t277 = circuit_mul(t266, t275); + let t278 = circuit_sub(t276, t277); // Fp2 mul real part end + let t279 = circuit_mul(t265, t275); + let t280 = circuit_mul(t266, t273); + let t281 = circuit_add(t279, t280); // Fp2 mul imag part end + let t282 = circuit_add(t278, t281); + let t283 = circuit_sub(t278, t281); + let t284 = circuit_mul(t282, t283); + let t285 = circuit_mul(t278, t281); + let t286 = circuit_add(t285, t285); + let t287 = circuit_add(t102, t102); // Fp2 add coeff 0/1 + let t288 = circuit_add(t103, t103); // Fp2 add coeff 1/1 + let t289 = circuit_sub(t284, t287); // Fp2 sub coeff 0/1 + let t290 = circuit_sub(t286, t288); // Fp2 sub coeff 1/1 + let t291 = circuit_sub(t102, t289); // Fp2 sub coeff 0/1 + let t292 = circuit_sub(t103, t290); // Fp2 sub coeff 1/1 + let t293 = circuit_mul(t278, t291); // Fp2 mul start + let t294 = circuit_mul(t281, t292); + let t295 = circuit_sub(t293, t294); // Fp2 mul real part end + let t296 = circuit_mul(t278, t292); + let t297 = circuit_mul(t281, t291); + let t298 = circuit_add(t296, t297); // Fp2 mul imag part end + let t299 = circuit_sub(t295, t112); // Fp2 sub coeff 0/1 + let t300 = circuit_sub(t298, t113); // Fp2 sub coeff 1/1 + let t301 = circuit_mul(t278, t102); // Fp2 mul start + let t302 = circuit_mul(t281, t103); + let t303 = circuit_sub(t301, t302); // Fp2 mul real part end + let t304 = circuit_mul(t278, t103); + let t305 = circuit_mul(t281, t102); + let t306 = circuit_add(t304, t305); // Fp2 mul imag part end + let t307 = circuit_sub(t303, t112); // Fp2 sub coeff 0/1 + let t308 = circuit_sub(t306, t113); // Fp2 sub coeff 1/1 + let t309 = circuit_sub(t307, t308); + let t310 = circuit_mul(t309, in9); + let t311 = circuit_sub(t278, t281); + let t312 = circuit_mul(t311, in10); + let t313 = circuit_mul(t308, in9); + let t314 = circuit_mul(t281, in10); + let t315 = circuit_mul(t312, t0); // Eval sparse poly line_1 step coeff_2 * z^2 + let t316 = circuit_add(t310, t315); // Eval sparse poly line_1 step + coeff_2 * z^2 + let t317 = circuit_add(t316, t1); // Eval sparse poly line_1 step + 1*z^3 + let t318 = circuit_mul(t313, t4); // Eval sparse poly line_1 step coeff_6 * z^6 + let t319 = circuit_add(t317, t318); // Eval sparse poly line_1 step + coeff_6 * z^6 + let t320 = circuit_mul(t314, t6); // Eval sparse poly line_1 step coeff_8 * z^8 + let t321 = circuit_add(t319, t320); // Eval sparse poly line_1 step + coeff_8 * z^8 + let t322 = circuit_mul(t260, t321); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_1(z) + let t323 = circuit_add(t164, t165); // Doubling slope numerator start + let t324 = circuit_sub(t164, t165); + let t325 = circuit_mul(t323, t324); + let t326 = circuit_mul(t164, t165); + let t327 = circuit_mul(t325, in0); + let t328 = circuit_mul(t326, in1); // Doubling slope numerator end + let t329 = circuit_add(t174, t174); // Fp2 add coeff 0/1 + let t330 = circuit_add(t175, t175); // Fp2 add coeff 1/1 + let t331 = circuit_mul(t329, t329); // Fp2 Div x/y start : Fp2 Inv y start + let t332 = circuit_mul(t330, t330); + let t333 = circuit_add(t331, t332); + let t334 = circuit_inverse(t333); + let t335 = circuit_mul(t329, t334); // Fp2 Inv y real part end + let t336 = circuit_mul(t330, t334); + let t337 = circuit_sub(in2, t336); // Fp2 Inv y imag part end + let t338 = circuit_mul(t327, t335); // Fp2 mul start + let t339 = circuit_mul(t328, t337); + let t340 = circuit_sub(t338, t339); // Fp2 mul real part end + let t341 = circuit_mul(t327, t337); + let t342 = circuit_mul(t328, t335); + let t343 = circuit_add(t341, t342); // Fp2 mul imag part end + let t344 = circuit_add(t340, t343); + let t345 = circuit_sub(t340, t343); + let t346 = circuit_mul(t344, t345); + let t347 = circuit_mul(t340, t343); + let t348 = circuit_add(t347, t347); + let t349 = circuit_add(t164, t164); // Fp2 add coeff 0/1 + let t350 = circuit_add(t165, t165); // Fp2 add coeff 1/1 + let t351 = circuit_sub(t346, t349); // Fp2 sub coeff 0/1 + let t352 = circuit_sub(t348, t350); // Fp2 sub coeff 1/1 + let t353 = circuit_sub(t164, t351); // Fp2 sub coeff 0/1 + let t354 = circuit_sub(t165, t352); // Fp2 sub coeff 1/1 + let t355 = circuit_mul(t340, t353); // Fp2 mul start + let t356 = circuit_mul(t343, t354); + let t357 = circuit_sub(t355, t356); // Fp2 mul real part end + let t358 = circuit_mul(t340, t354); + let t359 = circuit_mul(t343, t353); + let t360 = circuit_add(t358, t359); // Fp2 mul imag part end + let t361 = circuit_sub(t357, t174); // Fp2 sub coeff 0/1 + let t362 = circuit_sub(t360, t175); // Fp2 sub coeff 1/1 + let t363 = circuit_mul(t340, t164); // Fp2 mul start + let t364 = circuit_mul(t343, t165); + let t365 = circuit_sub(t363, t364); // Fp2 mul real part end + let t366 = circuit_mul(t340, t165); + let t367 = circuit_mul(t343, t164); + let t368 = circuit_add(t366, t367); // Fp2 mul imag part end + let t369 = circuit_sub(t365, t174); // Fp2 sub coeff 0/1 + let t370 = circuit_sub(t368, t175); // Fp2 sub coeff 1/1 + let t371 = circuit_sub(t369, t370); + let t372 = circuit_mul(t371, in15); + let t373 = circuit_sub(t340, t343); + let t374 = circuit_mul(t373, in16); + let t375 = circuit_mul(t370, in15); + let t376 = circuit_mul(t343, in16); + let t377 = circuit_mul(t374, t0); // Eval sparse poly line_2 step coeff_2 * z^2 + let t378 = circuit_add(t372, t377); // Eval sparse poly line_2 step + coeff_2 * z^2 + let t379 = circuit_add(t378, t1); // Eval sparse poly line_2 step + 1*z^3 + let t380 = circuit_mul(t375, t4); // Eval sparse poly line_2 step coeff_6 * z^6 + let t381 = circuit_add(t379, t380); // Eval sparse poly line_2 step + coeff_6 * z^6 + let t382 = circuit_mul(t376, t6); // Eval sparse poly line_2 step coeff_8 * z^8 + let t383 = circuit_add(t381, t382); // Eval sparse poly line_2 step + coeff_8 * z^8 + let t384 = circuit_mul(t322, t383); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_2(z) + let t385 = circuit_mul(in24, in36); // Eval R step coeff_1 * z^1 + let t386 = circuit_add(in23, t385); // Eval R step + (coeff_1 * z^1) + let t387 = circuit_mul(in25, t0); // Eval R step coeff_2 * z^2 + let t388 = circuit_add(t386, t387); // Eval R step + (coeff_2 * z^2) + let t389 = circuit_mul(in26, t1); // Eval R step coeff_3 * z^3 + let t390 = circuit_add(t388, t389); // Eval R step + (coeff_3 * z^3) + let t391 = circuit_mul(in27, t2); // Eval R step coeff_4 * z^4 + let t392 = circuit_add(t390, t391); // Eval R step + (coeff_4 * z^4) + let t393 = circuit_mul(in28, t3); // Eval R step coeff_5 * z^5 + let t394 = circuit_add(t392, t393); // Eval R step + (coeff_5 * z^5) + let t395 = circuit_mul(in29, t4); // Eval R step coeff_6 * z^6 + let t396 = circuit_add(t394, t395); // Eval R step + (coeff_6 * z^6) + let t397 = circuit_mul(in30, t5); // Eval R step coeff_7 * z^7 + let t398 = circuit_add(t396, t397); // Eval R step + (coeff_7 * z^7) + let t399 = circuit_mul(in31, t6); // Eval R step coeff_8 * z^8 + let t400 = circuit_add(t398, t399); // Eval R step + (coeff_8 * z^8) + let t401 = circuit_mul(in32, t7); // Eval R step coeff_9 * z^9 + let t402 = circuit_add(t400, t401); // Eval R step + (coeff_9 * z^9) + let t403 = circuit_mul(in33, t8); // Eval R step coeff_10 * z^10 + let t404 = circuit_add(t402, t403); // Eval R step + (coeff_10 * z^10) + let t405 = circuit_mul(in34, t9); // Eval R step coeff_11 * z^11 + let t406 = circuit_add(t404, t405); // Eval R step + (coeff_11 * z^11) + let t407 = circuit_sub(t384, t406); // (Π(i,k) (Pk(z))) - Ri(z) + let t408 = circuit_mul(t10, t407); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t409 = circuit_add(in21, t408); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = TryInto::< _, CircuitModulus @@ -552,7 +868,7 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( .unwrap(); let mut circuit_inputs = ( - t40, t41, t50, t51, t102, t103, t112, t113, t164, t165, t174, t175, t219, t222, t10, + t227, t228, t237, t238, t289, t290, t299, t300, t351, t352, t361, t362, t406, t409, t10, ) .new_inputs(); // Prefill constants: @@ -599,49 +915,47 @@ fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( Result::Err(_) => { panic!("Expected success") } }; let Q0: G2Point = G2Point { - x0: outputs.get_output(t40), - x1: outputs.get_output(t41), - y0: outputs.get_output(t50), - y1: outputs.get_output(t51) + x0: outputs.get_output(t227), + x1: outputs.get_output(t228), + y0: outputs.get_output(t237), + y1: outputs.get_output(t238) }; let Q1: G2Point = G2Point { - x0: outputs.get_output(t102), - x1: outputs.get_output(t103), - y0: outputs.get_output(t112), - y1: outputs.get_output(t113) + x0: outputs.get_output(t289), + x1: outputs.get_output(t290), + y0: outputs.get_output(t299), + y1: outputs.get_output(t300) }; let Q2: G2Point = G2Point { - x0: outputs.get_output(t164), - x1: outputs.get_output(t165), - y0: outputs.get_output(t174), - y1: outputs.get_output(t175) + x0: outputs.get_output(t351), + x1: outputs.get_output(t352), + y0: outputs.get_output(t361), + y1: outputs.get_output(t362) }; - let f_i_plus_one_of_z: u384 = outputs.get_output(t219); - let lhs_i_plus_one: u384 = outputs.get_output(t222); + let f_i_plus_one_of_z: u384 = outputs.get_output(t406); + let lhs_i_plus_one: u384 = outputs.get_output(t409); let ci_plus_one: u384 = outputs.get_output(t10); return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); } -fn run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( +fn run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( yInv_0: u384, xNegOverY_0: u384, Q0: G2Point, - Q_or_Qneg_0: G2Point, yInv_1: u384, xNegOverY_1: u384, Q1: G2Point, - Q_or_Qneg_1: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one: E12D, - c_or_cinv_of_z: u384, - z: u384, - ci: u384 + ci: u384, + z: u384 ) -> (G2Point, G2Point, u384, u384, u384) { // CONSTANT stack - let in0 = CE::> {}; // 0x0 + let in0 = CE::> {}; // 0x3 + let in1 = CE::> {}; // 0x6 + let in2 = CE::> {}; // 0x0 // INPUT stack - let (in1, in2) = (CE::> {}, CE::> {}); let (in3, in4) = (CE::> {}, CE::> {}); let (in5, in6) = (CE::> {}, CE::> {}); let (in7, in8) = (CE::> {}, CE::> {}); @@ -656,136 +970,746 @@ fn run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( let (in25, in26) = (CE::> {}, CE::> {}); let (in27, in28) = (CE::> {}, CE::> {}); let (in29, in30) = (CE::> {}, CE::> {}); - let (in31, in32) = (CE::> {}, CE::> {}); - let (in33, in34) = (CE::> {}, CE::> {}); - let (in35, in36) = (CE::> {}, CE::> {}); - let in37 = CE::> {}; - let t0 = circuit_mul(in36, in36); // Compute z^2 - let t1 = circuit_mul(t0, in36); // Compute z^3 - let t2 = circuit_mul(t1, in36); // Compute z^4 - let t3 = circuit_mul(t2, in36); // Compute z^5 - let t4 = circuit_mul(t3, in36); // Compute z^6 - let t5 = circuit_mul(t4, in36); // Compute z^7 - let t6 = circuit_mul(t5, in36); // Compute z^8 - let t7 = circuit_mul(t6, in36); // Compute z^9 - let t8 = circuit_mul(t7, in36); // Compute z^10 - let t9 = circuit_mul(t8, in36); // Compute z^11 - let t10 = circuit_mul(in37, in37); - let t11 = circuit_mul(in22, in22); - let t12 = circuit_sub(in5, in9); // Fp2 sub coeff 0/1 - let t13 = circuit_sub(in6, in10); // Fp2 sub coeff 1/1 - let t14 = circuit_sub(in3, in7); // Fp2 sub coeff 0/1 - let t15 = circuit_sub(in4, in8); // Fp2 sub coeff 1/1 - let t16 = circuit_mul(t14, t14); // Fp2 Div x/y start : Fp2 Inv y start - let t17 = circuit_mul(t15, t15); - let t18 = circuit_add(t16, t17); - let t19 = circuit_inverse(t18); - let t20 = circuit_mul(t14, t19); // Fp2 Inv y real part end - let t21 = circuit_mul(t15, t19); - let t22 = circuit_sub(in0, t21); // Fp2 Inv y imag part end - let t23 = circuit_mul(t12, t20); // Fp2 mul start - let t24 = circuit_mul(t13, t22); - let t25 = circuit_sub(t23, t24); // Fp2 mul real part end - let t26 = circuit_mul(t12, t22); - let t27 = circuit_mul(t13, t20); - let t28 = circuit_add(t26, t27); // Fp2 mul imag part end - let t29 = circuit_add(t25, t28); - let t30 = circuit_sub(t25, t28); - let t31 = circuit_mul(t29, t30); - let t32 = circuit_mul(t25, t28); - let t33 = circuit_add(t32, t32); - let t34 = circuit_add(in3, in7); // Fp2 add coeff 0/1 - let t35 = circuit_add(in4, in8); // Fp2 add coeff 1/1 - let t36 = circuit_sub(t31, t34); // Fp2 sub coeff 0/1 - let t37 = circuit_sub(t33, t35); // Fp2 sub coeff 1/1 - let t38 = circuit_mul(t25, in3); // Fp2 mul start - let t39 = circuit_mul(t28, in4); - let t40 = circuit_sub(t38, t39); // Fp2 mul real part end - let t41 = circuit_mul(t25, in4); - let t42 = circuit_mul(t28, in3); - let t43 = circuit_add(t41, t42); // Fp2 mul imag part end - let t44 = circuit_sub(t40, in5); // Fp2 sub coeff 0/1 - let t45 = circuit_sub(t43, in6); // Fp2 sub coeff 1/1 - let t46 = circuit_sub(t44, t45); - let t47 = circuit_mul(t46, in1); - let t48 = circuit_sub(t25, t28); - let t49 = circuit_mul(t48, in2); - let t50 = circuit_mul(t45, in1); - let t51 = circuit_mul(t28, in2); - let t52 = circuit_add(in5, in5); // Fp2 add coeff 0/1 - let t53 = circuit_add(in6, in6); // Fp2 add coeff 1/1 - let t54 = circuit_sub(t36, in3); // Fp2 sub coeff 0/1 - let t55 = circuit_sub(t37, in4); // Fp2 sub coeff 1/1 - let t56 = circuit_mul(t54, t54); // Fp2 Div x/y start : Fp2 Inv y start - let t57 = circuit_mul(t55, t55); - let t58 = circuit_add(t56, t57); - let t59 = circuit_inverse(t58); - let t60 = circuit_mul(t54, t59); // Fp2 Inv y real part end - let t61 = circuit_mul(t55, t59); - let t62 = circuit_sub(in0, t61); // Fp2 Inv y imag part end - let t63 = circuit_mul(t52, t60); // Fp2 mul start - let t64 = circuit_mul(t53, t62); - let t65 = circuit_sub(t63, t64); // Fp2 mul real part end - let t66 = circuit_mul(t52, t62); - let t67 = circuit_mul(t53, t60); - let t68 = circuit_add(t66, t67); // Fp2 mul imag part end - let t69 = circuit_add(t25, t65); // Fp2 add coeff 0/1 - let t70 = circuit_add(t28, t68); // Fp2 add coeff 1/1 - let t71 = circuit_sub(in0, t69); // Fp2 neg coeff 0/1 - let t72 = circuit_sub(in0, t70); // Fp2 neg coeff 1/1 - let t73 = circuit_add(t71, t72); - let t74 = circuit_sub(t71, t72); - let t75 = circuit_mul(t73, t74); - let t76 = circuit_mul(t71, t72); - let t77 = circuit_add(t76, t76); - let t78 = circuit_sub(t75, in3); // Fp2 sub coeff 0/1 - let t79 = circuit_sub(t77, in4); // Fp2 sub coeff 1/1 - let t80 = circuit_sub(t78, t36); // Fp2 sub coeff 0/1 - let t81 = circuit_sub(t79, t37); // Fp2 sub coeff 1/1 - let t82 = circuit_sub(in3, t80); // Fp2 sub coeff 0/1 - let t83 = circuit_sub(in4, t81); // Fp2 sub coeff 1/1 - let t84 = circuit_mul(t71, t82); // Fp2 mul start - let t85 = circuit_mul(t72, t83); - let t86 = circuit_sub(t84, t85); // Fp2 mul real part end - let t87 = circuit_mul(t71, t83); - let t88 = circuit_mul(t72, t82); - let t89 = circuit_add(t87, t88); // Fp2 mul imag part end - let t90 = circuit_sub(t86, in5); // Fp2 sub coeff 0/1 - let t91 = circuit_sub(t89, in6); // Fp2 sub coeff 1/1 - let t92 = circuit_mul(t71, in3); // Fp2 mul start - let t93 = circuit_mul(t72, in4); - let t94 = circuit_sub(t92, t93); // Fp2 mul real part end - let t95 = circuit_mul(t71, in4); - let t96 = circuit_mul(t72, in3); - let t97 = circuit_add(t95, t96); // Fp2 mul imag part end - let t98 = circuit_sub(t94, in5); // Fp2 sub coeff 0/1 - let t99 = circuit_sub(t97, in6); // Fp2 sub coeff 1/1 - let t100 = circuit_sub(t98, t99); - let t101 = circuit_mul(t100, in1); - let t102 = circuit_sub(t71, t72); - let t103 = circuit_mul(t102, in2); - let t104 = circuit_mul(t99, in1); - let t105 = circuit_mul(t72, in2); - let t106 = circuit_mul(t49, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t107 = circuit_add(t47, t106); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t108 = circuit_add(t107, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t109 = circuit_mul(t50, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t110 = circuit_add(t108, t109); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t111 = circuit_mul(t51, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t112 = circuit_add(t110, t111); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t113 = circuit_mul(t11, t112); - let t114 = circuit_mul(t103, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t115 = circuit_add(t101, t114); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t116 = circuit_add(t115, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t117 = circuit_mul(t104, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t118 = circuit_add(t116, t117); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t119 = circuit_mul(t105, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t120 = circuit_add(t118, t119); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t121 = circuit_mul(t113, t120); - let t122 = circuit_sub(in15, in19); // Fp2 sub coeff 0/1 - let t123 = circuit_sub(in16, in20); // Fp2 sub coeff 1/1 - let t124 = circuit_sub(in13, in17); // Fp2 sub coeff 0/1 - let t125 = circuit_sub(in14, in18); // Fp2 sub coeff 1/1 + let t0 = circuit_mul(in30, in30); // Compute z^2 + let t1 = circuit_mul(t0, in30); // Compute z^3 + let t2 = circuit_mul(t1, in30); // Compute z^4 + let t3 = circuit_mul(t2, in30); // Compute z^5 + let t4 = circuit_mul(t3, in30); // Compute z^6 + let t5 = circuit_mul(t4, in30); // Compute z^7 + let t6 = circuit_mul(t5, in30); // Compute z^8 + let t7 = circuit_mul(t6, in30); // Compute z^9 + let t8 = circuit_mul(t7, in30); // Compute z^10 + let t9 = circuit_mul(t8, in30); // Compute z^11 + let t10 = circuit_mul(in29, in29); // Compute c_i = (c_(i-1))^2 + let t11 = circuit_mul(in16, in16); // Square f evaluation in Z, the result of previous bit. + let t12 = circuit_add(in5, in6); // Doubling slope numerator start + let t13 = circuit_sub(in5, in6); + let t14 = circuit_mul(t12, t13); + let t15 = circuit_mul(in5, in6); + let t16 = circuit_mul(t14, in0); + let t17 = circuit_mul(t15, in1); // Doubling slope numerator end + let t18 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t19 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t20 = circuit_mul(t18, t18); // Fp2 Div x/y start : Fp2 Inv y start + let t21 = circuit_mul(t19, t19); + let t22 = circuit_add(t20, t21); + let t23 = circuit_inverse(t22); + let t24 = circuit_mul(t18, t23); // Fp2 Inv y real part end + let t25 = circuit_mul(t19, t23); + let t26 = circuit_sub(in2, t25); // Fp2 Inv y imag part end + let t27 = circuit_mul(t16, t24); // Fp2 mul start + let t28 = circuit_mul(t17, t26); + let t29 = circuit_sub(t27, t28); // Fp2 mul real part end + let t30 = circuit_mul(t16, t26); + let t31 = circuit_mul(t17, t24); + let t32 = circuit_add(t30, t31); // Fp2 mul imag part end + let t33 = circuit_add(t29, t32); + let t34 = circuit_sub(t29, t32); + let t35 = circuit_mul(t33, t34); + let t36 = circuit_mul(t29, t32); + let t37 = circuit_add(t36, t36); + let t38 = circuit_add(in5, in5); // Fp2 add coeff 0/1 + let t39 = circuit_add(in6, in6); // Fp2 add coeff 1/1 + let t40 = circuit_sub(t35, t38); // Fp2 sub coeff 0/1 + let t41 = circuit_sub(t37, t39); // Fp2 sub coeff 1/1 + let t42 = circuit_sub(in5, t40); // Fp2 sub coeff 0/1 + let t43 = circuit_sub(in6, t41); // Fp2 sub coeff 1/1 + let t44 = circuit_mul(t29, t42); // Fp2 mul start + let t45 = circuit_mul(t32, t43); + let t46 = circuit_sub(t44, t45); // Fp2 mul real part end + let t47 = circuit_mul(t29, t43); + let t48 = circuit_mul(t32, t42); + let t49 = circuit_add(t47, t48); // Fp2 mul imag part end + let t50 = circuit_sub(t46, in7); // Fp2 sub coeff 0/1 + let t51 = circuit_sub(t49, in8); // Fp2 sub coeff 1/1 + let t52 = circuit_mul(t29, in5); // Fp2 mul start + let t53 = circuit_mul(t32, in6); + let t54 = circuit_sub(t52, t53); // Fp2 mul real part end + let t55 = circuit_mul(t29, in6); + let t56 = circuit_mul(t32, in5); + let t57 = circuit_add(t55, t56); // Fp2 mul imag part end + let t58 = circuit_sub(t54, in7); // Fp2 sub coeff 0/1 + let t59 = circuit_sub(t57, in8); // Fp2 sub coeff 1/1 + let t60 = circuit_sub(t58, t59); + let t61 = circuit_mul(t60, in3); + let t62 = circuit_sub(t29, t32); + let t63 = circuit_mul(t62, in4); + let t64 = circuit_mul(t59, in3); + let t65 = circuit_mul(t32, in4); + let t66 = circuit_mul(t63, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 + let t67 = circuit_add(t61, t66); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 + let t68 = circuit_add(t67, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 + let t69 = circuit_mul(t64, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 + let t70 = circuit_add(t68, t69); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 + let t71 = circuit_mul(t65, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 + let t72 = circuit_add(t70, t71); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t73 = circuit_mul(t11, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_0(z) + let t74 = circuit_add(in11, in12); // Doubling slope numerator start + let t75 = circuit_sub(in11, in12); + let t76 = circuit_mul(t74, t75); + let t77 = circuit_mul(in11, in12); + let t78 = circuit_mul(t76, in0); + let t79 = circuit_mul(t77, in1); // Doubling slope numerator end + let t80 = circuit_add(in13, in13); // Fp2 add coeff 0/1 + let t81 = circuit_add(in14, in14); // Fp2 add coeff 1/1 + let t82 = circuit_mul(t80, t80); // Fp2 Div x/y start : Fp2 Inv y start + let t83 = circuit_mul(t81, t81); + let t84 = circuit_add(t82, t83); + let t85 = circuit_inverse(t84); + let t86 = circuit_mul(t80, t85); // Fp2 Inv y real part end + let t87 = circuit_mul(t81, t85); + let t88 = circuit_sub(in2, t87); // Fp2 Inv y imag part end + let t89 = circuit_mul(t78, t86); // Fp2 mul start + let t90 = circuit_mul(t79, t88); + let t91 = circuit_sub(t89, t90); // Fp2 mul real part end + let t92 = circuit_mul(t78, t88); + let t93 = circuit_mul(t79, t86); + let t94 = circuit_add(t92, t93); // Fp2 mul imag part end + let t95 = circuit_add(t91, t94); + let t96 = circuit_sub(t91, t94); + let t97 = circuit_mul(t95, t96); + let t98 = circuit_mul(t91, t94); + let t99 = circuit_add(t98, t98); + let t100 = circuit_add(in11, in11); // Fp2 add coeff 0/1 + let t101 = circuit_add(in12, in12); // Fp2 add coeff 1/1 + let t102 = circuit_sub(t97, t100); // Fp2 sub coeff 0/1 + let t103 = circuit_sub(t99, t101); // Fp2 sub coeff 1/1 + let t104 = circuit_sub(in11, t102); // Fp2 sub coeff 0/1 + let t105 = circuit_sub(in12, t103); // Fp2 sub coeff 1/1 + let t106 = circuit_mul(t91, t104); // Fp2 mul start + let t107 = circuit_mul(t94, t105); + let t108 = circuit_sub(t106, t107); // Fp2 mul real part end + let t109 = circuit_mul(t91, t105); + let t110 = circuit_mul(t94, t104); + let t111 = circuit_add(t109, t110); // Fp2 mul imag part end + let t112 = circuit_sub(t108, in13); // Fp2 sub coeff 0/1 + let t113 = circuit_sub(t111, in14); // Fp2 sub coeff 1/1 + let t114 = circuit_mul(t91, in11); // Fp2 mul start + let t115 = circuit_mul(t94, in12); + let t116 = circuit_sub(t114, t115); // Fp2 mul real part end + let t117 = circuit_mul(t91, in12); + let t118 = circuit_mul(t94, in11); + let t119 = circuit_add(t117, t118); // Fp2 mul imag part end + let t120 = circuit_sub(t116, in13); // Fp2 sub coeff 0/1 + let t121 = circuit_sub(t119, in14); // Fp2 sub coeff 1/1 + let t122 = circuit_sub(t120, t121); + let t123 = circuit_mul(t122, in9); + let t124 = circuit_sub(t91, t94); + let t125 = circuit_mul(t124, in10); + let t126 = circuit_mul(t121, in9); + let t127 = circuit_mul(t94, in10); + let t128 = circuit_mul(t125, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 + let t129 = circuit_add(t123, t128); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 + let t130 = circuit_add(t129, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 + let t131 = circuit_mul(t126, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 + let t132 = circuit_add(t130, t131); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 + let t133 = circuit_mul(t127, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 + let t134 = circuit_add(t132, t133); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t135 = circuit_mul(t73, t134); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_1(z) + let t136 = circuit_mul(in18, in30); // Eval UnnamedPoly step coeff_1 * z^1 + let t137 = circuit_add(in17, t136); // Eval UnnamedPoly step + (coeff_1 * z^1) + let t138 = circuit_mul(in19, t0); // Eval UnnamedPoly step coeff_2 * z^2 + let t139 = circuit_add(t137, t138); // Eval UnnamedPoly step + (coeff_2 * z^2) + let t140 = circuit_mul(in20, t1); // Eval UnnamedPoly step coeff_3 * z^3 + let t141 = circuit_add(t139, t140); // Eval UnnamedPoly step + (coeff_3 * z^3) + let t142 = circuit_mul(in21, t2); // Eval UnnamedPoly step coeff_4 * z^4 + let t143 = circuit_add(t141, t142); // Eval UnnamedPoly step + (coeff_4 * z^4) + let t144 = circuit_mul(in22, t3); // Eval UnnamedPoly step coeff_5 * z^5 + let t145 = circuit_add(t143, t144); // Eval UnnamedPoly step + (coeff_5 * z^5) + let t146 = circuit_mul(in23, t4); // Eval UnnamedPoly step coeff_6 * z^6 + let t147 = circuit_add(t145, t146); // Eval UnnamedPoly step + (coeff_6 * z^6) + let t148 = circuit_mul(in24, t5); // Eval UnnamedPoly step coeff_7 * z^7 + let t149 = circuit_add(t147, t148); // Eval UnnamedPoly step + (coeff_7 * z^7) + let t150 = circuit_mul(in25, t6); // Eval UnnamedPoly step coeff_8 * z^8 + let t151 = circuit_add(t149, t150); // Eval UnnamedPoly step + (coeff_8 * z^8) + let t152 = circuit_mul(in26, t7); // Eval UnnamedPoly step coeff_9 * z^9 + let t153 = circuit_add(t151, t152); // Eval UnnamedPoly step + (coeff_9 * z^9) + let t154 = circuit_mul(in27, t8); // Eval UnnamedPoly step coeff_10 * z^10 + let t155 = circuit_add(t153, t154); // Eval UnnamedPoly step + (coeff_10 * z^10) + let t156 = circuit_mul(in28, t9); // Eval UnnamedPoly step coeff_11 * z^11 + let t157 = circuit_add(t155, t156); // Eval UnnamedPoly step + (coeff_11 * z^11) + let t158 = circuit_sub(t135, t157); // (Π(i,k) (Pk(z))) - Ri(z) + let t159 = circuit_mul(t10, t158); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t160 = circuit_add(in15, t159); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [ + 54880396502181392957329877675, + 31935979117156477062286671870, + 20826981314825584179608359615, + 8047903782086192180586325942 + ] + ) + .unwrap(); + + let mut circuit_inputs = (t40, t41, t50, t51, t102, t103, t112, t113, t157, t160, t10,) + .new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(lhs_i); + circuit_inputs = circuit_inputs.next(f_i_of_z); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w1); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w2); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w3); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w4); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w5); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w6); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w7); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w8); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); + circuit_inputs = circuit_inputs.next(ci); + circuit_inputs = circuit_inputs.next(z); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let Q0: G2Point = G2Point { + x0: outputs.get_output(t40), + x1: outputs.get_output(t41), + y0: outputs.get_output(t50), + y1: outputs.get_output(t51) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t102), + x1: outputs.get_output(t103), + y0: outputs.get_output(t112), + y1: outputs.get_output(t113) + }; + let f_i_plus_one_of_z: u384 = outputs.get_output(t157); + let lhs_i_plus_one: u384 = outputs.get_output(t160); + let ci_plus_one: u384 = outputs.get_output(t10); + return (Q0, Q1, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); +} +fn run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + yInv_2: u384, + xNegOverY_2: u384, + Q2: G2Point, + lhs_i: u384, + f_i_of_z: u384, + f_i_plus_one: E12D, + ci: u384, + z: u384 +) -> (G2Point, G2Point, G2Point, u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x3 + let in1 = CE::> {}; // 0x6 + let in2 = CE::> {}; // 0x0 + + // INPUT stack + let (in3, in4) = (CE::> {}, CE::> {}); + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let (in33, in34) = (CE::> {}, CE::> {}); + let (in35, in36) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in36, in36); // Compute z^2 + let t1 = circuit_mul(t0, in36); // Compute z^3 + let t2 = circuit_mul(t1, in36); // Compute z^4 + let t3 = circuit_mul(t2, in36); // Compute z^5 + let t4 = circuit_mul(t3, in36); // Compute z^6 + let t5 = circuit_mul(t4, in36); // Compute z^7 + let t6 = circuit_mul(t5, in36); // Compute z^8 + let t7 = circuit_mul(t6, in36); // Compute z^9 + let t8 = circuit_mul(t7, in36); // Compute z^10 + let t9 = circuit_mul(t8, in36); // Compute z^11 + let t10 = circuit_mul(in35, in35); // Compute c_i = (c_(i-1))^2 + let t11 = circuit_mul(in22, in22); // Square f evaluation in Z, the result of previous bit. + let t12 = circuit_add(in5, in6); // Doubling slope numerator start + let t13 = circuit_sub(in5, in6); + let t14 = circuit_mul(t12, t13); + let t15 = circuit_mul(in5, in6); + let t16 = circuit_mul(t14, in0); + let t17 = circuit_mul(t15, in1); // Doubling slope numerator end + let t18 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t19 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t20 = circuit_mul(t18, t18); // Fp2 Div x/y start : Fp2 Inv y start + let t21 = circuit_mul(t19, t19); + let t22 = circuit_add(t20, t21); + let t23 = circuit_inverse(t22); + let t24 = circuit_mul(t18, t23); // Fp2 Inv y real part end + let t25 = circuit_mul(t19, t23); + let t26 = circuit_sub(in2, t25); // Fp2 Inv y imag part end + let t27 = circuit_mul(t16, t24); // Fp2 mul start + let t28 = circuit_mul(t17, t26); + let t29 = circuit_sub(t27, t28); // Fp2 mul real part end + let t30 = circuit_mul(t16, t26); + let t31 = circuit_mul(t17, t24); + let t32 = circuit_add(t30, t31); // Fp2 mul imag part end + let t33 = circuit_add(t29, t32); + let t34 = circuit_sub(t29, t32); + let t35 = circuit_mul(t33, t34); + let t36 = circuit_mul(t29, t32); + let t37 = circuit_add(t36, t36); + let t38 = circuit_add(in5, in5); // Fp2 add coeff 0/1 + let t39 = circuit_add(in6, in6); // Fp2 add coeff 1/1 + let t40 = circuit_sub(t35, t38); // Fp2 sub coeff 0/1 + let t41 = circuit_sub(t37, t39); // Fp2 sub coeff 1/1 + let t42 = circuit_sub(in5, t40); // Fp2 sub coeff 0/1 + let t43 = circuit_sub(in6, t41); // Fp2 sub coeff 1/1 + let t44 = circuit_mul(t29, t42); // Fp2 mul start + let t45 = circuit_mul(t32, t43); + let t46 = circuit_sub(t44, t45); // Fp2 mul real part end + let t47 = circuit_mul(t29, t43); + let t48 = circuit_mul(t32, t42); + let t49 = circuit_add(t47, t48); // Fp2 mul imag part end + let t50 = circuit_sub(t46, in7); // Fp2 sub coeff 0/1 + let t51 = circuit_sub(t49, in8); // Fp2 sub coeff 1/1 + let t52 = circuit_mul(t29, in5); // Fp2 mul start + let t53 = circuit_mul(t32, in6); + let t54 = circuit_sub(t52, t53); // Fp2 mul real part end + let t55 = circuit_mul(t29, in6); + let t56 = circuit_mul(t32, in5); + let t57 = circuit_add(t55, t56); // Fp2 mul imag part end + let t58 = circuit_sub(t54, in7); // Fp2 sub coeff 0/1 + let t59 = circuit_sub(t57, in8); // Fp2 sub coeff 1/1 + let t60 = circuit_sub(t58, t59); + let t61 = circuit_mul(t60, in3); + let t62 = circuit_sub(t29, t32); + let t63 = circuit_mul(t62, in4); + let t64 = circuit_mul(t59, in3); + let t65 = circuit_mul(t32, in4); + let t66 = circuit_mul(t63, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 + let t67 = circuit_add(t61, t66); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 + let t68 = circuit_add(t67, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 + let t69 = circuit_mul(t64, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 + let t70 = circuit_add(t68, t69); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 + let t71 = circuit_mul(t65, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 + let t72 = circuit_add(t70, t71); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t73 = circuit_mul(t11, t72); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_0(z) + let t74 = circuit_add(in11, in12); // Doubling slope numerator start + let t75 = circuit_sub(in11, in12); + let t76 = circuit_mul(t74, t75); + let t77 = circuit_mul(in11, in12); + let t78 = circuit_mul(t76, in0); + let t79 = circuit_mul(t77, in1); // Doubling slope numerator end + let t80 = circuit_add(in13, in13); // Fp2 add coeff 0/1 + let t81 = circuit_add(in14, in14); // Fp2 add coeff 1/1 + let t82 = circuit_mul(t80, t80); // Fp2 Div x/y start : Fp2 Inv y start + let t83 = circuit_mul(t81, t81); + let t84 = circuit_add(t82, t83); + let t85 = circuit_inverse(t84); + let t86 = circuit_mul(t80, t85); // Fp2 Inv y real part end + let t87 = circuit_mul(t81, t85); + let t88 = circuit_sub(in2, t87); // Fp2 Inv y imag part end + let t89 = circuit_mul(t78, t86); // Fp2 mul start + let t90 = circuit_mul(t79, t88); + let t91 = circuit_sub(t89, t90); // Fp2 mul real part end + let t92 = circuit_mul(t78, t88); + let t93 = circuit_mul(t79, t86); + let t94 = circuit_add(t92, t93); // Fp2 mul imag part end + let t95 = circuit_add(t91, t94); + let t96 = circuit_sub(t91, t94); + let t97 = circuit_mul(t95, t96); + let t98 = circuit_mul(t91, t94); + let t99 = circuit_add(t98, t98); + let t100 = circuit_add(in11, in11); // Fp2 add coeff 0/1 + let t101 = circuit_add(in12, in12); // Fp2 add coeff 1/1 + let t102 = circuit_sub(t97, t100); // Fp2 sub coeff 0/1 + let t103 = circuit_sub(t99, t101); // Fp2 sub coeff 1/1 + let t104 = circuit_sub(in11, t102); // Fp2 sub coeff 0/1 + let t105 = circuit_sub(in12, t103); // Fp2 sub coeff 1/1 + let t106 = circuit_mul(t91, t104); // Fp2 mul start + let t107 = circuit_mul(t94, t105); + let t108 = circuit_sub(t106, t107); // Fp2 mul real part end + let t109 = circuit_mul(t91, t105); + let t110 = circuit_mul(t94, t104); + let t111 = circuit_add(t109, t110); // Fp2 mul imag part end + let t112 = circuit_sub(t108, in13); // Fp2 sub coeff 0/1 + let t113 = circuit_sub(t111, in14); // Fp2 sub coeff 1/1 + let t114 = circuit_mul(t91, in11); // Fp2 mul start + let t115 = circuit_mul(t94, in12); + let t116 = circuit_sub(t114, t115); // Fp2 mul real part end + let t117 = circuit_mul(t91, in12); + let t118 = circuit_mul(t94, in11); + let t119 = circuit_add(t117, t118); // Fp2 mul imag part end + let t120 = circuit_sub(t116, in13); // Fp2 sub coeff 0/1 + let t121 = circuit_sub(t119, in14); // Fp2 sub coeff 1/1 + let t122 = circuit_sub(t120, t121); + let t123 = circuit_mul(t122, in9); + let t124 = circuit_sub(t91, t94); + let t125 = circuit_mul(t124, in10); + let t126 = circuit_mul(t121, in9); + let t127 = circuit_mul(t94, in10); + let t128 = circuit_mul(t125, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 + let t129 = circuit_add(t123, t128); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 + let t130 = circuit_add(t129, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 + let t131 = circuit_mul(t126, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 + let t132 = circuit_add(t130, t131); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 + let t133 = circuit_mul(t127, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 + let t134 = circuit_add(t132, t133); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t135 = circuit_mul(t73, t134); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_1(z) + let t136 = circuit_add(in17, in18); // Doubling slope numerator start + let t137 = circuit_sub(in17, in18); + let t138 = circuit_mul(t136, t137); + let t139 = circuit_mul(in17, in18); + let t140 = circuit_mul(t138, in0); + let t141 = circuit_mul(t139, in1); // Doubling slope numerator end + let t142 = circuit_add(in19, in19); // Fp2 add coeff 0/1 + let t143 = circuit_add(in20, in20); // Fp2 add coeff 1/1 + let t144 = circuit_mul(t142, t142); // Fp2 Div x/y start : Fp2 Inv y start + let t145 = circuit_mul(t143, t143); + let t146 = circuit_add(t144, t145); + let t147 = circuit_inverse(t146); + let t148 = circuit_mul(t142, t147); // Fp2 Inv y real part end + let t149 = circuit_mul(t143, t147); + let t150 = circuit_sub(in2, t149); // Fp2 Inv y imag part end + let t151 = circuit_mul(t140, t148); // Fp2 mul start + let t152 = circuit_mul(t141, t150); + let t153 = circuit_sub(t151, t152); // Fp2 mul real part end + let t154 = circuit_mul(t140, t150); + let t155 = circuit_mul(t141, t148); + let t156 = circuit_add(t154, t155); // Fp2 mul imag part end + let t157 = circuit_add(t153, t156); + let t158 = circuit_sub(t153, t156); + let t159 = circuit_mul(t157, t158); + let t160 = circuit_mul(t153, t156); + let t161 = circuit_add(t160, t160); + let t162 = circuit_add(in17, in17); // Fp2 add coeff 0/1 + let t163 = circuit_add(in18, in18); // Fp2 add coeff 1/1 + let t164 = circuit_sub(t159, t162); // Fp2 sub coeff 0/1 + let t165 = circuit_sub(t161, t163); // Fp2 sub coeff 1/1 + let t166 = circuit_sub(in17, t164); // Fp2 sub coeff 0/1 + let t167 = circuit_sub(in18, t165); // Fp2 sub coeff 1/1 + let t168 = circuit_mul(t153, t166); // Fp2 mul start + let t169 = circuit_mul(t156, t167); + let t170 = circuit_sub(t168, t169); // Fp2 mul real part end + let t171 = circuit_mul(t153, t167); + let t172 = circuit_mul(t156, t166); + let t173 = circuit_add(t171, t172); // Fp2 mul imag part end + let t174 = circuit_sub(t170, in19); // Fp2 sub coeff 0/1 + let t175 = circuit_sub(t173, in20); // Fp2 sub coeff 1/1 + let t176 = circuit_mul(t153, in17); // Fp2 mul start + let t177 = circuit_mul(t156, in18); + let t178 = circuit_sub(t176, t177); // Fp2 mul real part end + let t179 = circuit_mul(t153, in18); + let t180 = circuit_mul(t156, in17); + let t181 = circuit_add(t179, t180); // Fp2 mul imag part end + let t182 = circuit_sub(t178, in19); // Fp2 sub coeff 0/1 + let t183 = circuit_sub(t181, in20); // Fp2 sub coeff 1/1 + let t184 = circuit_sub(t182, t183); + let t185 = circuit_mul(t184, in15); + let t186 = circuit_sub(t153, t156); + let t187 = circuit_mul(t186, in16); + let t188 = circuit_mul(t183, in15); + let t189 = circuit_mul(t156, in16); + let t190 = circuit_mul(t187, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 + let t191 = circuit_add(t185, t190); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 + let t192 = circuit_add(t191, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 + let t193 = circuit_mul(t188, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 + let t194 = circuit_add(t192, t193); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 + let t195 = circuit_mul(t189, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 + let t196 = circuit_add(t194, t195); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t197 = circuit_mul(t135, t196); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_2(z) + let t198 = circuit_mul(in24, in36); // Eval UnnamedPoly step coeff_1 * z^1 + let t199 = circuit_add(in23, t198); // Eval UnnamedPoly step + (coeff_1 * z^1) + let t200 = circuit_mul(in25, t0); // Eval UnnamedPoly step coeff_2 * z^2 + let t201 = circuit_add(t199, t200); // Eval UnnamedPoly step + (coeff_2 * z^2) + let t202 = circuit_mul(in26, t1); // Eval UnnamedPoly step coeff_3 * z^3 + let t203 = circuit_add(t201, t202); // Eval UnnamedPoly step + (coeff_3 * z^3) + let t204 = circuit_mul(in27, t2); // Eval UnnamedPoly step coeff_4 * z^4 + let t205 = circuit_add(t203, t204); // Eval UnnamedPoly step + (coeff_4 * z^4) + let t206 = circuit_mul(in28, t3); // Eval UnnamedPoly step coeff_5 * z^5 + let t207 = circuit_add(t205, t206); // Eval UnnamedPoly step + (coeff_5 * z^5) + let t208 = circuit_mul(in29, t4); // Eval UnnamedPoly step coeff_6 * z^6 + let t209 = circuit_add(t207, t208); // Eval UnnamedPoly step + (coeff_6 * z^6) + let t210 = circuit_mul(in30, t5); // Eval UnnamedPoly step coeff_7 * z^7 + let t211 = circuit_add(t209, t210); // Eval UnnamedPoly step + (coeff_7 * z^7) + let t212 = circuit_mul(in31, t6); // Eval UnnamedPoly step coeff_8 * z^8 + let t213 = circuit_add(t211, t212); // Eval UnnamedPoly step + (coeff_8 * z^8) + let t214 = circuit_mul(in32, t7); // Eval UnnamedPoly step coeff_9 * z^9 + let t215 = circuit_add(t213, t214); // Eval UnnamedPoly step + (coeff_9 * z^9) + let t216 = circuit_mul(in33, t8); // Eval UnnamedPoly step coeff_10 * z^10 + let t217 = circuit_add(t215, t216); // Eval UnnamedPoly step + (coeff_10 * z^10) + let t218 = circuit_mul(in34, t9); // Eval UnnamedPoly step coeff_11 * z^11 + let t219 = circuit_add(t217, t218); // Eval UnnamedPoly step + (coeff_11 * z^11) + let t220 = circuit_sub(t197, t219); // (Π(i,k) (Pk(z))) - Ri(z) + let t221 = circuit_mul(t10, t220); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t222 = circuit_add(in21, t221); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [ + 54880396502181392957329877675, + 31935979117156477062286671870, + 20826981314825584179608359615, + 8047903782086192180586325942 + ] + ) + .unwrap(); + + let mut circuit_inputs = ( + t40, t41, t50, t51, t102, t103, t112, t113, t164, t165, t174, t175, t219, t222, t10, + ) + .new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(lhs_i); + circuit_inputs = circuit_inputs.next(f_i_of_z); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w1); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w2); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w3); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w4); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w5); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w6); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w7); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w8); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); + circuit_inputs = circuit_inputs.next(ci); + circuit_inputs = circuit_inputs.next(z); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let Q0: G2Point = G2Point { + x0: outputs.get_output(t40), + x1: outputs.get_output(t41), + y0: outputs.get_output(t50), + y1: outputs.get_output(t51) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t102), + x1: outputs.get_output(t103), + y0: outputs.get_output(t112), + y1: outputs.get_output(t113) + }; + let Q2: G2Point = G2Point { + x0: outputs.get_output(t164), + x1: outputs.get_output(t165), + y0: outputs.get_output(t174), + y1: outputs.get_output(t175) + }; + let f_i_plus_one_of_z: u384 = outputs.get_output(t219); + let lhs_i_plus_one: u384 = outputs.get_output(t222); + let ci_plus_one: u384 = outputs.get_output(t10); + return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); +} +fn run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + Q_or_Qneg_0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + Q_or_Qneg_1: G2Point, + lhs_i: u384, + f_i_of_z: u384, + f_i_plus_one: E12D, + c_or_cinv_of_z: u384, + z: u384, + ci: u384 +) -> (G2Point, G2Point, u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x0 + + // INPUT stack + let (in1, in2) = (CE::> {}, CE::> {}); + let (in3, in4) = (CE::> {}, CE::> {}); + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let (in33, in34) = (CE::> {}, CE::> {}); + let (in35, in36) = (CE::> {}, CE::> {}); + let in37 = CE::> {}; + let t0 = circuit_mul(in36, in36); // Compute z^2 + let t1 = circuit_mul(t0, in36); // Compute z^3 + let t2 = circuit_mul(t1, in36); // Compute z^4 + let t3 = circuit_mul(t2, in36); // Compute z^5 + let t4 = circuit_mul(t3, in36); // Compute z^6 + let t5 = circuit_mul(t4, in36); // Compute z^7 + let t6 = circuit_mul(t5, in36); // Compute z^8 + let t7 = circuit_mul(t6, in36); // Compute z^9 + let t8 = circuit_mul(t7, in36); // Compute z^10 + let t9 = circuit_mul(t8, in36); // Compute z^11 + let t10 = circuit_mul(in37, in37); + let t11 = circuit_mul(in22, in22); + let t12 = circuit_sub(in5, in9); // Fp2 sub coeff 0/1 + let t13 = circuit_sub(in6, in10); // Fp2 sub coeff 1/1 + let t14 = circuit_sub(in3, in7); // Fp2 sub coeff 0/1 + let t15 = circuit_sub(in4, in8); // Fp2 sub coeff 1/1 + let t16 = circuit_mul(t14, t14); // Fp2 Div x/y start : Fp2 Inv y start + let t17 = circuit_mul(t15, t15); + let t18 = circuit_add(t16, t17); + let t19 = circuit_inverse(t18); + let t20 = circuit_mul(t14, t19); // Fp2 Inv y real part end + let t21 = circuit_mul(t15, t19); + let t22 = circuit_sub(in0, t21); // Fp2 Inv y imag part end + let t23 = circuit_mul(t12, t20); // Fp2 mul start + let t24 = circuit_mul(t13, t22); + let t25 = circuit_sub(t23, t24); // Fp2 mul real part end + let t26 = circuit_mul(t12, t22); + let t27 = circuit_mul(t13, t20); + let t28 = circuit_add(t26, t27); // Fp2 mul imag part end + let t29 = circuit_add(t25, t28); + let t30 = circuit_sub(t25, t28); + let t31 = circuit_mul(t29, t30); + let t32 = circuit_mul(t25, t28); + let t33 = circuit_add(t32, t32); + let t34 = circuit_add(in3, in7); // Fp2 add coeff 0/1 + let t35 = circuit_add(in4, in8); // Fp2 add coeff 1/1 + let t36 = circuit_sub(t31, t34); // Fp2 sub coeff 0/1 + let t37 = circuit_sub(t33, t35); // Fp2 sub coeff 1/1 + let t38 = circuit_mul(t25, in3); // Fp2 mul start + let t39 = circuit_mul(t28, in4); + let t40 = circuit_sub(t38, t39); // Fp2 mul real part end + let t41 = circuit_mul(t25, in4); + let t42 = circuit_mul(t28, in3); + let t43 = circuit_add(t41, t42); // Fp2 mul imag part end + let t44 = circuit_sub(t40, in5); // Fp2 sub coeff 0/1 + let t45 = circuit_sub(t43, in6); // Fp2 sub coeff 1/1 + let t46 = circuit_sub(t44, t45); + let t47 = circuit_mul(t46, in1); + let t48 = circuit_sub(t25, t28); + let t49 = circuit_mul(t48, in2); + let t50 = circuit_mul(t45, in1); + let t51 = circuit_mul(t28, in2); + let t52 = circuit_add(in5, in5); // Fp2 add coeff 0/1 + let t53 = circuit_add(in6, in6); // Fp2 add coeff 1/1 + let t54 = circuit_sub(t36, in3); // Fp2 sub coeff 0/1 + let t55 = circuit_sub(t37, in4); // Fp2 sub coeff 1/1 + let t56 = circuit_mul(t54, t54); // Fp2 Div x/y start : Fp2 Inv y start + let t57 = circuit_mul(t55, t55); + let t58 = circuit_add(t56, t57); + let t59 = circuit_inverse(t58); + let t60 = circuit_mul(t54, t59); // Fp2 Inv y real part end + let t61 = circuit_mul(t55, t59); + let t62 = circuit_sub(in0, t61); // Fp2 Inv y imag part end + let t63 = circuit_mul(t52, t60); // Fp2 mul start + let t64 = circuit_mul(t53, t62); + let t65 = circuit_sub(t63, t64); // Fp2 mul real part end + let t66 = circuit_mul(t52, t62); + let t67 = circuit_mul(t53, t60); + let t68 = circuit_add(t66, t67); // Fp2 mul imag part end + let t69 = circuit_add(t25, t65); // Fp2 add coeff 0/1 + let t70 = circuit_add(t28, t68); // Fp2 add coeff 1/1 + let t71 = circuit_sub(in0, t69); // Fp2 neg coeff 0/1 + let t72 = circuit_sub(in0, t70); // Fp2 neg coeff 1/1 + let t73 = circuit_add(t71, t72); + let t74 = circuit_sub(t71, t72); + let t75 = circuit_mul(t73, t74); + let t76 = circuit_mul(t71, t72); + let t77 = circuit_add(t76, t76); + let t78 = circuit_sub(t75, in3); // Fp2 sub coeff 0/1 + let t79 = circuit_sub(t77, in4); // Fp2 sub coeff 1/1 + let t80 = circuit_sub(t78, t36); // Fp2 sub coeff 0/1 + let t81 = circuit_sub(t79, t37); // Fp2 sub coeff 1/1 + let t82 = circuit_sub(in3, t80); // Fp2 sub coeff 0/1 + let t83 = circuit_sub(in4, t81); // Fp2 sub coeff 1/1 + let t84 = circuit_mul(t71, t82); // Fp2 mul start + let t85 = circuit_mul(t72, t83); + let t86 = circuit_sub(t84, t85); // Fp2 mul real part end + let t87 = circuit_mul(t71, t83); + let t88 = circuit_mul(t72, t82); + let t89 = circuit_add(t87, t88); // Fp2 mul imag part end + let t90 = circuit_sub(t86, in5); // Fp2 sub coeff 0/1 + let t91 = circuit_sub(t89, in6); // Fp2 sub coeff 1/1 + let t92 = circuit_mul(t71, in3); // Fp2 mul start + let t93 = circuit_mul(t72, in4); + let t94 = circuit_sub(t92, t93); // Fp2 mul real part end + let t95 = circuit_mul(t71, in4); + let t96 = circuit_mul(t72, in3); + let t97 = circuit_add(t95, t96); // Fp2 mul imag part end + let t98 = circuit_sub(t94, in5); // Fp2 sub coeff 0/1 + let t99 = circuit_sub(t97, in6); // Fp2 sub coeff 1/1 + let t100 = circuit_sub(t98, t99); + let t101 = circuit_mul(t100, in1); + let t102 = circuit_sub(t71, t72); + let t103 = circuit_mul(t102, in2); + let t104 = circuit_mul(t99, in1); + let t105 = circuit_mul(t72, in2); + let t106 = circuit_mul(t49, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 + let t107 = circuit_add(t47, t106); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 + let t108 = circuit_add(t107, t1); // Eval sparse poly line_0p_1 step + 1*z^3 + let t109 = circuit_mul(t50, t4); // Eval sparse poly line_0p_1 step coeff_6 * z^6 + let t110 = circuit_add(t108, t109); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 + let t111 = circuit_mul(t51, t6); // Eval sparse poly line_0p_1 step coeff_8 * z^8 + let t112 = circuit_add(t110, t111); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 + let t113 = circuit_mul(t11, t112); + let t114 = circuit_mul(t103, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 + let t115 = circuit_add(t101, t114); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 + let t116 = circuit_add(t115, t1); // Eval sparse poly line_0p_2 step + 1*z^3 + let t117 = circuit_mul(t104, t4); // Eval sparse poly line_0p_2 step coeff_6 * z^6 + let t118 = circuit_add(t116, t117); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 + let t119 = circuit_mul(t105, t6); // Eval sparse poly line_0p_2 step coeff_8 * z^8 + let t120 = circuit_add(t118, t119); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 + let t121 = circuit_mul(t113, t120); + let t122 = circuit_sub(in15, in19); // Fp2 sub coeff 0/1 + let t123 = circuit_sub(in16, in20); // Fp2 sub coeff 1/1 + let t124 = circuit_sub(in13, in17); // Fp2 sub coeff 0/1 + let t125 = circuit_sub(in14, in18); // Fp2 sub coeff 1/1 let t126 = circuit_mul(t124, t124); // Fp2 Div x/y start : Fp2 Inv y start let t127 = circuit_mul(t125, t125); let t128 = circuit_add(t126, t127); @@ -876,45 +1800,45 @@ fn run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( let t213 = circuit_mul(t212, in12); let t214 = circuit_mul(t209, in11); let t215 = circuit_mul(t182, in12); - let t216 = circuit_mul(t159, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t217 = circuit_add(t157, t216); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t218 = circuit_add(t217, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t219 = circuit_mul(t160, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t220 = circuit_add(t218, t219); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t221 = circuit_mul(t161, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t222 = circuit_add(t220, t221); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t216 = circuit_mul(t159, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 + let t217 = circuit_add(t157, t216); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 + let t218 = circuit_add(t217, t1); // Eval sparse poly line_1p_1 step + 1*z^3 + let t219 = circuit_mul(t160, t4); // Eval sparse poly line_1p_1 step coeff_6 * z^6 + let t220 = circuit_add(t218, t219); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 + let t221 = circuit_mul(t161, t6); // Eval sparse poly line_1p_1 step coeff_8 * z^8 + let t222 = circuit_add(t220, t221); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t223 = circuit_mul(t121, t222); - let t224 = circuit_mul(t213, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t225 = circuit_add(t211, t224); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t226 = circuit_add(t225, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t227 = circuit_mul(t214, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t228 = circuit_add(t226, t227); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t229 = circuit_mul(t215, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t230 = circuit_add(t228, t229); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t224 = circuit_mul(t213, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 + let t225 = circuit_add(t211, t224); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 + let t226 = circuit_add(t225, t1); // Eval sparse poly line_1p_2 step + 1*z^3 + let t227 = circuit_mul(t214, t4); // Eval sparse poly line_1p_2 step coeff_6 * z^6 + let t228 = circuit_add(t226, t227); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 + let t229 = circuit_mul(t215, t6); // Eval sparse poly line_1p_2 step coeff_8 * z^8 + let t230 = circuit_add(t228, t229); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t231 = circuit_mul(t223, t230); let t232 = circuit_mul(t231, in35); - let t233 = circuit_mul(in24, in36); // Eval UnnamedPoly step coeff_1 * z^1 - let t234 = circuit_add(in23, t233); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t235 = circuit_mul(in25, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t236 = circuit_add(t234, t235); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t237 = circuit_mul(in26, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t238 = circuit_add(t236, t237); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t239 = circuit_mul(in27, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t240 = circuit_add(t238, t239); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t241 = circuit_mul(in28, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t242 = circuit_add(t240, t241); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t243 = circuit_mul(in29, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t244 = circuit_add(t242, t243); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t245 = circuit_mul(in30, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t246 = circuit_add(t244, t245); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t247 = circuit_mul(in31, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t248 = circuit_add(t246, t247); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t249 = circuit_mul(in32, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t250 = circuit_add(t248, t249); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t251 = circuit_mul(in33, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t252 = circuit_add(t250, t251); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t253 = circuit_mul(in34, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t254 = circuit_add(t252, t253); // Eval UnnamedPoly step + (coeff_11 * z^11) + let t233 = circuit_mul(in24, in36); // Eval R step coeff_1 * z^1 + let t234 = circuit_add(in23, t233); // Eval R step + (coeff_1 * z^1) + let t235 = circuit_mul(in25, t0); // Eval R step coeff_2 * z^2 + let t236 = circuit_add(t234, t235); // Eval R step + (coeff_2 * z^2) + let t237 = circuit_mul(in26, t1); // Eval R step coeff_3 * z^3 + let t238 = circuit_add(t236, t237); // Eval R step + (coeff_3 * z^3) + let t239 = circuit_mul(in27, t2); // Eval R step coeff_4 * z^4 + let t240 = circuit_add(t238, t239); // Eval R step + (coeff_4 * z^4) + let t241 = circuit_mul(in28, t3); // Eval R step coeff_5 * z^5 + let t242 = circuit_add(t240, t241); // Eval R step + (coeff_5 * z^5) + let t243 = circuit_mul(in29, t4); // Eval R step coeff_6 * z^6 + let t244 = circuit_add(t242, t243); // Eval R step + (coeff_6 * z^6) + let t245 = circuit_mul(in30, t5); // Eval R step coeff_7 * z^7 + let t246 = circuit_add(t244, t245); // Eval R step + (coeff_7 * z^7) + let t247 = circuit_mul(in31, t6); // Eval R step coeff_8 * z^8 + let t248 = circuit_add(t246, t247); // Eval R step + (coeff_8 * z^8) + let t249 = circuit_mul(in32, t7); // Eval R step coeff_9 * z^9 + let t250 = circuit_add(t248, t249); // Eval R step + (coeff_9 * z^9) + let t251 = circuit_mul(in33, t8); // Eval R step coeff_10 * z^10 + let t252 = circuit_add(t250, t251); // Eval R step + (coeff_10 * z^10) + let t253 = circuit_mul(in34, t9); // Eval R step coeff_11 * z^11 + let t254 = circuit_add(t252, t253); // Eval R step + (coeff_11 * z^11) let t255 = circuit_sub(t232, t254); let t256 = circuit_mul(t10, t255); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) let t257 = circuit_add(in21, t256); @@ -1148,21 +2072,21 @@ fn run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( let t103 = circuit_mul(t102, in2); let t104 = circuit_mul(t99, in1); let t105 = circuit_mul(t72, in2); - let t106 = circuit_mul(t49, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t107 = circuit_add(t47, t106); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t108 = circuit_add(t107, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t109 = circuit_mul(t50, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t110 = circuit_add(t108, t109); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t111 = circuit_mul(t51, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t112 = circuit_add(t110, t111); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t106 = circuit_mul(t49, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 + let t107 = circuit_add(t47, t106); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 + let t108 = circuit_add(t107, t1); // Eval sparse poly line_0p_1 step + 1*z^3 + let t109 = circuit_mul(t50, t4); // Eval sparse poly line_0p_1 step coeff_6 * z^6 + let t110 = circuit_add(t108, t109); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 + let t111 = circuit_mul(t51, t6); // Eval sparse poly line_0p_1 step coeff_8 * z^8 + let t112 = circuit_add(t110, t111); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t113 = circuit_mul(t11, t112); - let t114 = circuit_mul(t103, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t115 = circuit_add(t101, t114); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t116 = circuit_add(t115, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t117 = circuit_mul(t104, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t118 = circuit_add(t116, t117); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t119 = circuit_mul(t105, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t120 = circuit_add(t118, t119); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t114 = circuit_mul(t103, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 + let t115 = circuit_add(t101, t114); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 + let t116 = circuit_add(t115, t1); // Eval sparse poly line_0p_2 step + 1*z^3 + let t117 = circuit_mul(t104, t4); // Eval sparse poly line_0p_2 step coeff_6 * z^6 + let t118 = circuit_add(t116, t117); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 + let t119 = circuit_mul(t105, t6); // Eval sparse poly line_0p_2 step coeff_8 * z^8 + let t120 = circuit_add(t118, t119); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t121 = circuit_mul(t113, t120); let t122 = circuit_sub(in15, in19); // Fp2 sub coeff 0/1 let t123 = circuit_sub(in16, in20); // Fp2 sub coeff 1/1 @@ -1258,21 +2182,21 @@ fn run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( let t213 = circuit_mul(t212, in12); let t214 = circuit_mul(t209, in11); let t215 = circuit_mul(t182, in12); - let t216 = circuit_mul(t159, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t217 = circuit_add(t157, t216); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t218 = circuit_add(t217, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t219 = circuit_mul(t160, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t220 = circuit_add(t218, t219); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t221 = circuit_mul(t161, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t222 = circuit_add(t220, t221); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t216 = circuit_mul(t159, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 + let t217 = circuit_add(t157, t216); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 + let t218 = circuit_add(t217, t1); // Eval sparse poly line_1p_1 step + 1*z^3 + let t219 = circuit_mul(t160, t4); // Eval sparse poly line_1p_1 step coeff_6 * z^6 + let t220 = circuit_add(t218, t219); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 + let t221 = circuit_mul(t161, t6); // Eval sparse poly line_1p_1 step coeff_8 * z^8 + let t222 = circuit_add(t220, t221); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t223 = circuit_mul(t121, t222); - let t224 = circuit_mul(t213, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t225 = circuit_add(t211, t224); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t226 = circuit_add(t225, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t227 = circuit_mul(t214, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t228 = circuit_add(t226, t227); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t229 = circuit_mul(t215, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t230 = circuit_add(t228, t229); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t224 = circuit_mul(t213, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 + let t225 = circuit_add(t211, t224); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 + let t226 = circuit_add(t225, t1); // Eval sparse poly line_1p_2 step + 1*z^3 + let t227 = circuit_mul(t214, t4); // Eval sparse poly line_1p_2 step coeff_6 * z^6 + let t228 = circuit_add(t226, t227); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 + let t229 = circuit_mul(t215, t6); // Eval sparse poly line_1p_2 step coeff_8 * z^8 + let t230 = circuit_add(t228, t229); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t231 = circuit_mul(t223, t230); let t232 = circuit_sub(in25, in29); // Fp2 sub coeff 0/1 let t233 = circuit_sub(in26, in30); // Fp2 sub coeff 1/1 @@ -1368,45 +2292,45 @@ fn run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( let t323 = circuit_mul(t322, in22); let t324 = circuit_mul(t319, in21); let t325 = circuit_mul(t292, in22); - let t326 = circuit_mul(t269, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t327 = circuit_add(t267, t326); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t328 = circuit_add(t327, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t329 = circuit_mul(t270, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t330 = circuit_add(t328, t329); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t331 = circuit_mul(t271, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t332 = circuit_add(t330, t331); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t326 = circuit_mul(t269, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 + let t327 = circuit_add(t267, t326); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 + let t328 = circuit_add(t327, t1); // Eval sparse poly line_2p_1 step + 1*z^3 + let t329 = circuit_mul(t270, t4); // Eval sparse poly line_2p_1 step coeff_6 * z^6 + let t330 = circuit_add(t328, t329); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 + let t331 = circuit_mul(t271, t6); // Eval sparse poly line_2p_1 step coeff_8 * z^8 + let t332 = circuit_add(t330, t331); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t333 = circuit_mul(t231, t332); - let t334 = circuit_mul(t323, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t335 = circuit_add(t321, t334); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t336 = circuit_add(t335, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t337 = circuit_mul(t324, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t338 = circuit_add(t336, t337); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t339 = circuit_mul(t325, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t340 = circuit_add(t338, t339); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t334 = circuit_mul(t323, t0); // Eval sparse poly line_2p_2 step coeff_2 * z^2 + let t335 = circuit_add(t321, t334); // Eval sparse poly line_2p_2 step + coeff_2 * z^2 + let t336 = circuit_add(t335, t1); // Eval sparse poly line_2p_2 step + 1*z^3 + let t337 = circuit_mul(t324, t4); // Eval sparse poly line_2p_2 step coeff_6 * z^6 + let t338 = circuit_add(t336, t337); // Eval sparse poly line_2p_2 step + coeff_6 * z^6 + let t339 = circuit_mul(t325, t6); // Eval sparse poly line_2p_2 step coeff_8 * z^8 + let t340 = circuit_add(t338, t339); // Eval sparse poly line_2p_2 step + coeff_8 * z^8 let t341 = circuit_mul(t333, t340); let t342 = circuit_mul(t341, in45); - let t343 = circuit_mul(in34, in46); // Eval UnnamedPoly step coeff_1 * z^1 - let t344 = circuit_add(in33, t343); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t345 = circuit_mul(in35, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t346 = circuit_add(t344, t345); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t347 = circuit_mul(in36, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t348 = circuit_add(t346, t347); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t349 = circuit_mul(in37, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t350 = circuit_add(t348, t349); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t351 = circuit_mul(in38, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t352 = circuit_add(t350, t351); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t353 = circuit_mul(in39, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t354 = circuit_add(t352, t353); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t355 = circuit_mul(in40, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t356 = circuit_add(t354, t355); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t357 = circuit_mul(in41, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t358 = circuit_add(t356, t357); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t359 = circuit_mul(in42, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t360 = circuit_add(t358, t359); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t361 = circuit_mul(in43, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t362 = circuit_add(t360, t361); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t363 = circuit_mul(in44, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t364 = circuit_add(t362, t363); // Eval UnnamedPoly step + (coeff_11 * z^11) + let t343 = circuit_mul(in34, in46); // Eval R step coeff_1 * z^1 + let t344 = circuit_add(in33, t343); // Eval R step + (coeff_1 * z^1) + let t345 = circuit_mul(in35, t0); // Eval R step coeff_2 * z^2 + let t346 = circuit_add(t344, t345); // Eval R step + (coeff_2 * z^2) + let t347 = circuit_mul(in36, t1); // Eval R step coeff_3 * z^3 + let t348 = circuit_add(t346, t347); // Eval R step + (coeff_3 * z^3) + let t349 = circuit_mul(in37, t2); // Eval R step coeff_4 * z^4 + let t350 = circuit_add(t348, t349); // Eval R step + (coeff_4 * z^4) + let t351 = circuit_mul(in38, t3); // Eval R step coeff_5 * z^5 + let t352 = circuit_add(t350, t351); // Eval R step + (coeff_5 * z^5) + let t353 = circuit_mul(in39, t4); // Eval R step coeff_6 * z^6 + let t354 = circuit_add(t352, t353); // Eval R step + (coeff_6 * z^6) + let t355 = circuit_mul(in40, t5); // Eval R step coeff_7 * z^7 + let t356 = circuit_add(t354, t355); // Eval R step + (coeff_7 * z^7) + let t357 = circuit_mul(in41, t6); // Eval R step coeff_8 * z^8 + let t358 = circuit_add(t356, t357); // Eval R step + (coeff_8 * z^8) + let t359 = circuit_mul(in42, t7); // Eval R step coeff_9 * z^9 + let t360 = circuit_add(t358, t359); // Eval R step + (coeff_9 * z^9) + let t361 = circuit_mul(in43, t8); // Eval R step coeff_10 * z^10 + let t362 = circuit_add(t360, t361); // Eval R step + (coeff_10 * z^10) + let t363 = circuit_mul(in44, t9); // Eval R step coeff_11 * z^11 + let t364 = circuit_add(t362, t363); // Eval R step + (coeff_11 * z^11) let t365 = circuit_sub(t342, t364); let t366 = circuit_mul(t10, t365); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) let t367 = circuit_add(in31, t366); @@ -1555,6 +2479,20 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( let (in68, in69) = (CE::> {}, CE::> {}); let (in70, in71) = (CE::> {}, CE::> {}); let (in72, in73) = (CE::> {}, CE::> {}); + let (in74, in75) = (CE::> {}, CE::> {}); + let (in76, in77) = (CE::> {}, CE::> {}); + let (in78, in79) = (CE::> {}, CE::> {}); + let (in80, in81) = (CE::> {}, CE::> {}); + let (in82, in83) = (CE::> {}, CE::> {}); + let (in84, in85) = (CE::> {}, CE::> {}); + let (in86, in87) = (CE::> {}, CE::> {}); + let (in88, in89) = (CE::> {}, CE::> {}); + let (in90, in91) = (CE::> {}, CE::> {}); + let (in92, in93) = (CE::> {}, CE::> {}); + let (in94, in95) = (CE::> {}, CE::> {}); + let (in96, in97) = (CE::> {}, CE::> {}); + let (in98, in99) = (CE::> {}, CE::> {}); + let in100 = CE::> {}; let t0 = circuit_mul(in16, in16); // Compute z^2 let t1 = circuit_mul(t0, in16); // Compute z^3 let t2 = circuit_mul(t1, in16); // Compute z^4 @@ -1607,145 +2545,226 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( let t49 = circuit_mul(t48, in16); // Compute z^51 let t50 = circuit_mul(t49, in16); // Compute z^52 let t51 = circuit_mul(t50, in16); // Compute z^53 - let t52 = circuit_mul(in14, in14); - let t53 = circuit_mul(in3, in16); // Eval UnnamedPoly step coeff_1 * z^1 - let t54 = circuit_add(in2, t53); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t55 = circuit_mul(in4, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t56 = circuit_add(t54, t55); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t57 = circuit_mul(in5, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t58 = circuit_add(t56, t57); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t59 = circuit_mul(in6, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t60 = circuit_add(t58, t59); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t61 = circuit_mul(in7, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t62 = circuit_add(t60, t61); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t63 = circuit_mul(in8, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t64 = circuit_add(t62, t63); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t65 = circuit_mul(in9, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t66 = circuit_add(t64, t65); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t67 = circuit_mul(in10, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t68 = circuit_add(t66, t67); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t69 = circuit_mul(in11, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t70 = circuit_add(t68, t69); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t71 = circuit_mul(in12, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t72 = circuit_add(t70, t71); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t73 = circuit_mul(in13, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t74 = circuit_add(t72, t73); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t75 = circuit_mul(in19, in17); - let t76 = circuit_mul(t75, in15); - let t77 = circuit_sub(t76, t74); - let t78 = circuit_mul(t52, t77); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) - let t79 = circuit_add(in18, t78); // previous_lhs + lhs_n_minus_1 - let t80 = circuit_mul(in1, t4); // Eval sparse poly P_irr step coeff_6 * z^6 - let t81 = circuit_add(in0, t80); // Eval sparse poly P_irr step + coeff_6 * z^6 - let t82 = circuit_add(t81, t10); // Eval sparse poly P_irr step + 1*z^12 - let t83 = circuit_mul(in21, in16); // Eval big_Q step coeff_1 * z^1 - let t84 = circuit_add(in20, t83); // Eval big_Q step + (coeff_1 * z^1) - let t85 = circuit_mul(in22, t0); // Eval big_Q step coeff_2 * z^2 - let t86 = circuit_add(t84, t85); // Eval big_Q step + (coeff_2 * z^2) - let t87 = circuit_mul(in23, t1); // Eval big_Q step coeff_3 * z^3 - let t88 = circuit_add(t86, t87); // Eval big_Q step + (coeff_3 * z^3) - let t89 = circuit_mul(in24, t2); // Eval big_Q step coeff_4 * z^4 - let t90 = circuit_add(t88, t89); // Eval big_Q step + (coeff_4 * z^4) - let t91 = circuit_mul(in25, t3); // Eval big_Q step coeff_5 * z^5 - let t92 = circuit_add(t90, t91); // Eval big_Q step + (coeff_5 * z^5) - let t93 = circuit_mul(in26, t4); // Eval big_Q step coeff_6 * z^6 - let t94 = circuit_add(t92, t93); // Eval big_Q step + (coeff_6 * z^6) - let t95 = circuit_mul(in27, t5); // Eval big_Q step coeff_7 * z^7 - let t96 = circuit_add(t94, t95); // Eval big_Q step + (coeff_7 * z^7) - let t97 = circuit_mul(in28, t6); // Eval big_Q step coeff_8 * z^8 - let t98 = circuit_add(t96, t97); // Eval big_Q step + (coeff_8 * z^8) - let t99 = circuit_mul(in29, t7); // Eval big_Q step coeff_9 * z^9 - let t100 = circuit_add(t98, t99); // Eval big_Q step + (coeff_9 * z^9) - let t101 = circuit_mul(in30, t8); // Eval big_Q step coeff_10 * z^10 - let t102 = circuit_add(t100, t101); // Eval big_Q step + (coeff_10 * z^10) - let t103 = circuit_mul(in31, t9); // Eval big_Q step coeff_11 * z^11 - let t104 = circuit_add(t102, t103); // Eval big_Q step + (coeff_11 * z^11) - let t105 = circuit_mul(in32, t10); // Eval big_Q step coeff_12 * z^12 - let t106 = circuit_add(t104, t105); // Eval big_Q step + (coeff_12 * z^12) - let t107 = circuit_mul(in33, t11); // Eval big_Q step coeff_13 * z^13 - let t108 = circuit_add(t106, t107); // Eval big_Q step + (coeff_13 * z^13) - let t109 = circuit_mul(in34, t12); // Eval big_Q step coeff_14 * z^14 - let t110 = circuit_add(t108, t109); // Eval big_Q step + (coeff_14 * z^14) - let t111 = circuit_mul(in35, t13); // Eval big_Q step coeff_15 * z^15 - let t112 = circuit_add(t110, t111); // Eval big_Q step + (coeff_15 * z^15) - let t113 = circuit_mul(in36, t14); // Eval big_Q step coeff_16 * z^16 - let t114 = circuit_add(t112, t113); // Eval big_Q step + (coeff_16 * z^16) - let t115 = circuit_mul(in37, t15); // Eval big_Q step coeff_17 * z^17 - let t116 = circuit_add(t114, t115); // Eval big_Q step + (coeff_17 * z^17) - let t117 = circuit_mul(in38, t16); // Eval big_Q step coeff_18 * z^18 - let t118 = circuit_add(t116, t117); // Eval big_Q step + (coeff_18 * z^18) - let t119 = circuit_mul(in39, t17); // Eval big_Q step coeff_19 * z^19 - let t120 = circuit_add(t118, t119); // Eval big_Q step + (coeff_19 * z^19) - let t121 = circuit_mul(in40, t18); // Eval big_Q step coeff_20 * z^20 - let t122 = circuit_add(t120, t121); // Eval big_Q step + (coeff_20 * z^20) - let t123 = circuit_mul(in41, t19); // Eval big_Q step coeff_21 * z^21 - let t124 = circuit_add(t122, t123); // Eval big_Q step + (coeff_21 * z^21) - let t125 = circuit_mul(in42, t20); // Eval big_Q step coeff_22 * z^22 - let t126 = circuit_add(t124, t125); // Eval big_Q step + (coeff_22 * z^22) - let t127 = circuit_mul(in43, t21); // Eval big_Q step coeff_23 * z^23 - let t128 = circuit_add(t126, t127); // Eval big_Q step + (coeff_23 * z^23) - let t129 = circuit_mul(in44, t22); // Eval big_Q step coeff_24 * z^24 - let t130 = circuit_add(t128, t129); // Eval big_Q step + (coeff_24 * z^24) - let t131 = circuit_mul(in45, t23); // Eval big_Q step coeff_25 * z^25 - let t132 = circuit_add(t130, t131); // Eval big_Q step + (coeff_25 * z^25) - let t133 = circuit_mul(in46, t24); // Eval big_Q step coeff_26 * z^26 - let t134 = circuit_add(t132, t133); // Eval big_Q step + (coeff_26 * z^26) - let t135 = circuit_mul(in47, t25); // Eval big_Q step coeff_27 * z^27 - let t136 = circuit_add(t134, t135); // Eval big_Q step + (coeff_27 * z^27) - let t137 = circuit_mul(in48, t26); // Eval big_Q step coeff_28 * z^28 - let t138 = circuit_add(t136, t137); // Eval big_Q step + (coeff_28 * z^28) - let t139 = circuit_mul(in49, t27); // Eval big_Q step coeff_29 * z^29 - let t140 = circuit_add(t138, t139); // Eval big_Q step + (coeff_29 * z^29) - let t141 = circuit_mul(in50, t28); // Eval big_Q step coeff_30 * z^30 - let t142 = circuit_add(t140, t141); // Eval big_Q step + (coeff_30 * z^30) - let t143 = circuit_mul(in51, t29); // Eval big_Q step coeff_31 * z^31 - let t144 = circuit_add(t142, t143); // Eval big_Q step + (coeff_31 * z^31) - let t145 = circuit_mul(in52, t30); // Eval big_Q step coeff_32 * z^32 - let t146 = circuit_add(t144, t145); // Eval big_Q step + (coeff_32 * z^32) - let t147 = circuit_mul(in53, t31); // Eval big_Q step coeff_33 * z^33 - let t148 = circuit_add(t146, t147); // Eval big_Q step + (coeff_33 * z^33) - let t149 = circuit_mul(in54, t32); // Eval big_Q step coeff_34 * z^34 - let t150 = circuit_add(t148, t149); // Eval big_Q step + (coeff_34 * z^34) - let t151 = circuit_mul(in55, t33); // Eval big_Q step coeff_35 * z^35 - let t152 = circuit_add(t150, t151); // Eval big_Q step + (coeff_35 * z^35) - let t153 = circuit_mul(in56, t34); // Eval big_Q step coeff_36 * z^36 - let t154 = circuit_add(t152, t153); // Eval big_Q step + (coeff_36 * z^36) - let t155 = circuit_mul(in57, t35); // Eval big_Q step coeff_37 * z^37 - let t156 = circuit_add(t154, t155); // Eval big_Q step + (coeff_37 * z^37) - let t157 = circuit_mul(in58, t36); // Eval big_Q step coeff_38 * z^38 - let t158 = circuit_add(t156, t157); // Eval big_Q step + (coeff_38 * z^38) - let t159 = circuit_mul(in59, t37); // Eval big_Q step coeff_39 * z^39 - let t160 = circuit_add(t158, t159); // Eval big_Q step + (coeff_39 * z^39) - let t161 = circuit_mul(in60, t38); // Eval big_Q step coeff_40 * z^40 - let t162 = circuit_add(t160, t161); // Eval big_Q step + (coeff_40 * z^40) - let t163 = circuit_mul(in61, t39); // Eval big_Q step coeff_41 * z^41 - let t164 = circuit_add(t162, t163); // Eval big_Q step + (coeff_41 * z^41) - let t165 = circuit_mul(in62, t40); // Eval big_Q step coeff_42 * z^42 - let t166 = circuit_add(t164, t165); // Eval big_Q step + (coeff_42 * z^42) - let t167 = circuit_mul(in63, t41); // Eval big_Q step coeff_43 * z^43 - let t168 = circuit_add(t166, t167); // Eval big_Q step + (coeff_43 * z^43) - let t169 = circuit_mul(in64, t42); // Eval big_Q step coeff_44 * z^44 - let t170 = circuit_add(t168, t169); // Eval big_Q step + (coeff_44 * z^44) - let t171 = circuit_mul(in65, t43); // Eval big_Q step coeff_45 * z^45 - let t172 = circuit_add(t170, t171); // Eval big_Q step + (coeff_45 * z^45) - let t173 = circuit_mul(in66, t44); // Eval big_Q step coeff_46 * z^46 - let t174 = circuit_add(t172, t173); // Eval big_Q step + (coeff_46 * z^46) - let t175 = circuit_mul(in67, t45); // Eval big_Q step coeff_47 * z^47 - let t176 = circuit_add(t174, t175); // Eval big_Q step + (coeff_47 * z^47) - let t177 = circuit_mul(in68, t46); // Eval big_Q step coeff_48 * z^48 - let t178 = circuit_add(t176, t177); // Eval big_Q step + (coeff_48 * z^48) - let t179 = circuit_mul(in69, t47); // Eval big_Q step coeff_49 * z^49 - let t180 = circuit_add(t178, t179); // Eval big_Q step + (coeff_49 * z^49) - let t181 = circuit_mul(in70, t48); // Eval big_Q step coeff_50 * z^50 - let t182 = circuit_add(t180, t181); // Eval big_Q step + (coeff_50 * z^50) - let t183 = circuit_mul(in71, t49); // Eval big_Q step coeff_51 * z^51 - let t184 = circuit_add(t182, t183); // Eval big_Q step + (coeff_51 * z^51) - let t185 = circuit_mul(in72, t50); // Eval big_Q step coeff_52 * z^52 - let t186 = circuit_add(t184, t185); // Eval big_Q step + (coeff_52 * z^52) - let t187 = circuit_mul(in73, t51); // Eval big_Q step coeff_53 * z^53 - let t188 = circuit_add(t186, t187); // Eval big_Q step + (coeff_53 * z^53) - let t189 = circuit_mul(t188, t82); // Q(z) * P(z) - let t190 = circuit_sub(t79, t189); // final_lhs - Q(z) * P(z) + let t52 = circuit_mul(t51, in16); // Compute z^54 + let t53 = circuit_mul(t52, in16); // Compute z^55 + let t54 = circuit_mul(t53, in16); // Compute z^56 + let t55 = circuit_mul(t54, in16); // Compute z^57 + let t56 = circuit_mul(t55, in16); // Compute z^58 + let t57 = circuit_mul(t56, in16); // Compute z^59 + let t58 = circuit_mul(t57, in16); // Compute z^60 + let t59 = circuit_mul(t58, in16); // Compute z^61 + let t60 = circuit_mul(t59, in16); // Compute z^62 + let t61 = circuit_mul(t60, in16); // Compute z^63 + let t62 = circuit_mul(t61, in16); // Compute z^64 + let t63 = circuit_mul(t62, in16); // Compute z^65 + let t64 = circuit_mul(t63, in16); // Compute z^66 + let t65 = circuit_mul(t64, in16); // Compute z^67 + let t66 = circuit_mul(t65, in16); // Compute z^68 + let t67 = circuit_mul(t66, in16); // Compute z^69 + let t68 = circuit_mul(t67, in16); // Compute z^70 + let t69 = circuit_mul(t68, in16); // Compute z^71 + let t70 = circuit_mul(t69, in16); // Compute z^72 + let t71 = circuit_mul(t70, in16); // Compute z^73 + let t72 = circuit_mul(t71, in16); // Compute z^74 + let t73 = circuit_mul(t72, in16); // Compute z^75 + let t74 = circuit_mul(t73, in16); // Compute z^76 + let t75 = circuit_mul(t74, in16); // Compute z^77 + let t76 = circuit_mul(t75, in16); // Compute z^78 + let t77 = circuit_mul(t76, in16); // Compute z^79 + let t78 = circuit_mul(t77, in16); // Compute z^80 + let t79 = circuit_mul(in14, in14); + let t80 = circuit_mul(in3, in16); // Eval R_n_minus_1 step coeff_1 * z^1 + let t81 = circuit_add(in2, t80); // Eval R_n_minus_1 step + (coeff_1 * z^1) + let t82 = circuit_mul(in4, t0); // Eval R_n_minus_1 step coeff_2 * z^2 + let t83 = circuit_add(t81, t82); // Eval R_n_minus_1 step + (coeff_2 * z^2) + let t84 = circuit_mul(in5, t1); // Eval R_n_minus_1 step coeff_3 * z^3 + let t85 = circuit_add(t83, t84); // Eval R_n_minus_1 step + (coeff_3 * z^3) + let t86 = circuit_mul(in6, t2); // Eval R_n_minus_1 step coeff_4 * z^4 + let t87 = circuit_add(t85, t86); // Eval R_n_minus_1 step + (coeff_4 * z^4) + let t88 = circuit_mul(in7, t3); // Eval R_n_minus_1 step coeff_5 * z^5 + let t89 = circuit_add(t87, t88); // Eval R_n_minus_1 step + (coeff_5 * z^5) + let t90 = circuit_mul(in8, t4); // Eval R_n_minus_1 step coeff_6 * z^6 + let t91 = circuit_add(t89, t90); // Eval R_n_minus_1 step + (coeff_6 * z^6) + let t92 = circuit_mul(in9, t5); // Eval R_n_minus_1 step coeff_7 * z^7 + let t93 = circuit_add(t91, t92); // Eval R_n_minus_1 step + (coeff_7 * z^7) + let t94 = circuit_mul(in10, t6); // Eval R_n_minus_1 step coeff_8 * z^8 + let t95 = circuit_add(t93, t94); // Eval R_n_minus_1 step + (coeff_8 * z^8) + let t96 = circuit_mul(in11, t7); // Eval R_n_minus_1 step coeff_9 * z^9 + let t97 = circuit_add(t95, t96); // Eval R_n_minus_1 step + (coeff_9 * z^9) + let t98 = circuit_mul(in12, t8); // Eval R_n_minus_1 step coeff_10 * z^10 + let t99 = circuit_add(t97, t98); // Eval R_n_minus_1 step + (coeff_10 * z^10) + let t100 = circuit_mul(in13, t9); // Eval R_n_minus_1 step coeff_11 * z^11 + let t101 = circuit_add(t99, t100); // Eval R_n_minus_1 step + (coeff_11 * z^11) + let t102 = circuit_mul(in19, in17); + let t103 = circuit_mul(t102, in15); + let t104 = circuit_sub(t103, t101); + let t105 = circuit_mul(t79, t104); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) + let t106 = circuit_add(in18, t105); // previous_lhs + lhs_n_minus_1 + let t107 = circuit_mul(in1, t4); // Eval sparse poly P_irr step coeff_6 * z^6 + let t108 = circuit_add(in0, t107); // Eval sparse poly P_irr step + coeff_6 * z^6 + let t109 = circuit_add(t108, t10); // Eval sparse poly P_irr step + 1*z^12 + let t110 = circuit_mul(in21, in16); // Eval big_Q step coeff_1 * z^1 + let t111 = circuit_add(in20, t110); // Eval big_Q step + (coeff_1 * z^1) + let t112 = circuit_mul(in22, t0); // Eval big_Q step coeff_2 * z^2 + let t113 = circuit_add(t111, t112); // Eval big_Q step + (coeff_2 * z^2) + let t114 = circuit_mul(in23, t1); // Eval big_Q step coeff_3 * z^3 + let t115 = circuit_add(t113, t114); // Eval big_Q step + (coeff_3 * z^3) + let t116 = circuit_mul(in24, t2); // Eval big_Q step coeff_4 * z^4 + let t117 = circuit_add(t115, t116); // Eval big_Q step + (coeff_4 * z^4) + let t118 = circuit_mul(in25, t3); // Eval big_Q step coeff_5 * z^5 + let t119 = circuit_add(t117, t118); // Eval big_Q step + (coeff_5 * z^5) + let t120 = circuit_mul(in26, t4); // Eval big_Q step coeff_6 * z^6 + let t121 = circuit_add(t119, t120); // Eval big_Q step + (coeff_6 * z^6) + let t122 = circuit_mul(in27, t5); // Eval big_Q step coeff_7 * z^7 + let t123 = circuit_add(t121, t122); // Eval big_Q step + (coeff_7 * z^7) + let t124 = circuit_mul(in28, t6); // Eval big_Q step coeff_8 * z^8 + let t125 = circuit_add(t123, t124); // Eval big_Q step + (coeff_8 * z^8) + let t126 = circuit_mul(in29, t7); // Eval big_Q step coeff_9 * z^9 + let t127 = circuit_add(t125, t126); // Eval big_Q step + (coeff_9 * z^9) + let t128 = circuit_mul(in30, t8); // Eval big_Q step coeff_10 * z^10 + let t129 = circuit_add(t127, t128); // Eval big_Q step + (coeff_10 * z^10) + let t130 = circuit_mul(in31, t9); // Eval big_Q step coeff_11 * z^11 + let t131 = circuit_add(t129, t130); // Eval big_Q step + (coeff_11 * z^11) + let t132 = circuit_mul(in32, t10); // Eval big_Q step coeff_12 * z^12 + let t133 = circuit_add(t131, t132); // Eval big_Q step + (coeff_12 * z^12) + let t134 = circuit_mul(in33, t11); // Eval big_Q step coeff_13 * z^13 + let t135 = circuit_add(t133, t134); // Eval big_Q step + (coeff_13 * z^13) + let t136 = circuit_mul(in34, t12); // Eval big_Q step coeff_14 * z^14 + let t137 = circuit_add(t135, t136); // Eval big_Q step + (coeff_14 * z^14) + let t138 = circuit_mul(in35, t13); // Eval big_Q step coeff_15 * z^15 + let t139 = circuit_add(t137, t138); // Eval big_Q step + (coeff_15 * z^15) + let t140 = circuit_mul(in36, t14); // Eval big_Q step coeff_16 * z^16 + let t141 = circuit_add(t139, t140); // Eval big_Q step + (coeff_16 * z^16) + let t142 = circuit_mul(in37, t15); // Eval big_Q step coeff_17 * z^17 + let t143 = circuit_add(t141, t142); // Eval big_Q step + (coeff_17 * z^17) + let t144 = circuit_mul(in38, t16); // Eval big_Q step coeff_18 * z^18 + let t145 = circuit_add(t143, t144); // Eval big_Q step + (coeff_18 * z^18) + let t146 = circuit_mul(in39, t17); // Eval big_Q step coeff_19 * z^19 + let t147 = circuit_add(t145, t146); // Eval big_Q step + (coeff_19 * z^19) + let t148 = circuit_mul(in40, t18); // Eval big_Q step coeff_20 * z^20 + let t149 = circuit_add(t147, t148); // Eval big_Q step + (coeff_20 * z^20) + let t150 = circuit_mul(in41, t19); // Eval big_Q step coeff_21 * z^21 + let t151 = circuit_add(t149, t150); // Eval big_Q step + (coeff_21 * z^21) + let t152 = circuit_mul(in42, t20); // Eval big_Q step coeff_22 * z^22 + let t153 = circuit_add(t151, t152); // Eval big_Q step + (coeff_22 * z^22) + let t154 = circuit_mul(in43, t21); // Eval big_Q step coeff_23 * z^23 + let t155 = circuit_add(t153, t154); // Eval big_Q step + (coeff_23 * z^23) + let t156 = circuit_mul(in44, t22); // Eval big_Q step coeff_24 * z^24 + let t157 = circuit_add(t155, t156); // Eval big_Q step + (coeff_24 * z^24) + let t158 = circuit_mul(in45, t23); // Eval big_Q step coeff_25 * z^25 + let t159 = circuit_add(t157, t158); // Eval big_Q step + (coeff_25 * z^25) + let t160 = circuit_mul(in46, t24); // Eval big_Q step coeff_26 * z^26 + let t161 = circuit_add(t159, t160); // Eval big_Q step + (coeff_26 * z^26) + let t162 = circuit_mul(in47, t25); // Eval big_Q step coeff_27 * z^27 + let t163 = circuit_add(t161, t162); // Eval big_Q step + (coeff_27 * z^27) + let t164 = circuit_mul(in48, t26); // Eval big_Q step coeff_28 * z^28 + let t165 = circuit_add(t163, t164); // Eval big_Q step + (coeff_28 * z^28) + let t166 = circuit_mul(in49, t27); // Eval big_Q step coeff_29 * z^29 + let t167 = circuit_add(t165, t166); // Eval big_Q step + (coeff_29 * z^29) + let t168 = circuit_mul(in50, t28); // Eval big_Q step coeff_30 * z^30 + let t169 = circuit_add(t167, t168); // Eval big_Q step + (coeff_30 * z^30) + let t170 = circuit_mul(in51, t29); // Eval big_Q step coeff_31 * z^31 + let t171 = circuit_add(t169, t170); // Eval big_Q step + (coeff_31 * z^31) + let t172 = circuit_mul(in52, t30); // Eval big_Q step coeff_32 * z^32 + let t173 = circuit_add(t171, t172); // Eval big_Q step + (coeff_32 * z^32) + let t174 = circuit_mul(in53, t31); // Eval big_Q step coeff_33 * z^33 + let t175 = circuit_add(t173, t174); // Eval big_Q step + (coeff_33 * z^33) + let t176 = circuit_mul(in54, t32); // Eval big_Q step coeff_34 * z^34 + let t177 = circuit_add(t175, t176); // Eval big_Q step + (coeff_34 * z^34) + let t178 = circuit_mul(in55, t33); // Eval big_Q step coeff_35 * z^35 + let t179 = circuit_add(t177, t178); // Eval big_Q step + (coeff_35 * z^35) + let t180 = circuit_mul(in56, t34); // Eval big_Q step coeff_36 * z^36 + let t181 = circuit_add(t179, t180); // Eval big_Q step + (coeff_36 * z^36) + let t182 = circuit_mul(in57, t35); // Eval big_Q step coeff_37 * z^37 + let t183 = circuit_add(t181, t182); // Eval big_Q step + (coeff_37 * z^37) + let t184 = circuit_mul(in58, t36); // Eval big_Q step coeff_38 * z^38 + let t185 = circuit_add(t183, t184); // Eval big_Q step + (coeff_38 * z^38) + let t186 = circuit_mul(in59, t37); // Eval big_Q step coeff_39 * z^39 + let t187 = circuit_add(t185, t186); // Eval big_Q step + (coeff_39 * z^39) + let t188 = circuit_mul(in60, t38); // Eval big_Q step coeff_40 * z^40 + let t189 = circuit_add(t187, t188); // Eval big_Q step + (coeff_40 * z^40) + let t190 = circuit_mul(in61, t39); // Eval big_Q step coeff_41 * z^41 + let t191 = circuit_add(t189, t190); // Eval big_Q step + (coeff_41 * z^41) + let t192 = circuit_mul(in62, t40); // Eval big_Q step coeff_42 * z^42 + let t193 = circuit_add(t191, t192); // Eval big_Q step + (coeff_42 * z^42) + let t194 = circuit_mul(in63, t41); // Eval big_Q step coeff_43 * z^43 + let t195 = circuit_add(t193, t194); // Eval big_Q step + (coeff_43 * z^43) + let t196 = circuit_mul(in64, t42); // Eval big_Q step coeff_44 * z^44 + let t197 = circuit_add(t195, t196); // Eval big_Q step + (coeff_44 * z^44) + let t198 = circuit_mul(in65, t43); // Eval big_Q step coeff_45 * z^45 + let t199 = circuit_add(t197, t198); // Eval big_Q step + (coeff_45 * z^45) + let t200 = circuit_mul(in66, t44); // Eval big_Q step coeff_46 * z^46 + let t201 = circuit_add(t199, t200); // Eval big_Q step + (coeff_46 * z^46) + let t202 = circuit_mul(in67, t45); // Eval big_Q step coeff_47 * z^47 + let t203 = circuit_add(t201, t202); // Eval big_Q step + (coeff_47 * z^47) + let t204 = circuit_mul(in68, t46); // Eval big_Q step coeff_48 * z^48 + let t205 = circuit_add(t203, t204); // Eval big_Q step + (coeff_48 * z^48) + let t206 = circuit_mul(in69, t47); // Eval big_Q step coeff_49 * z^49 + let t207 = circuit_add(t205, t206); // Eval big_Q step + (coeff_49 * z^49) + let t208 = circuit_mul(in70, t48); // Eval big_Q step coeff_50 * z^50 + let t209 = circuit_add(t207, t208); // Eval big_Q step + (coeff_50 * z^50) + let t210 = circuit_mul(in71, t49); // Eval big_Q step coeff_51 * z^51 + let t211 = circuit_add(t209, t210); // Eval big_Q step + (coeff_51 * z^51) + let t212 = circuit_mul(in72, t50); // Eval big_Q step coeff_52 * z^52 + let t213 = circuit_add(t211, t212); // Eval big_Q step + (coeff_52 * z^52) + let t214 = circuit_mul(in73, t51); // Eval big_Q step coeff_53 * z^53 + let t215 = circuit_add(t213, t214); // Eval big_Q step + (coeff_53 * z^53) + let t216 = circuit_mul(in74, t52); // Eval big_Q step coeff_54 * z^54 + let t217 = circuit_add(t215, t216); // Eval big_Q step + (coeff_54 * z^54) + let t218 = circuit_mul(in75, t53); // Eval big_Q step coeff_55 * z^55 + let t219 = circuit_add(t217, t218); // Eval big_Q step + (coeff_55 * z^55) + let t220 = circuit_mul(in76, t54); // Eval big_Q step coeff_56 * z^56 + let t221 = circuit_add(t219, t220); // Eval big_Q step + (coeff_56 * z^56) + let t222 = circuit_mul(in77, t55); // Eval big_Q step coeff_57 * z^57 + let t223 = circuit_add(t221, t222); // Eval big_Q step + (coeff_57 * z^57) + let t224 = circuit_mul(in78, t56); // Eval big_Q step coeff_58 * z^58 + let t225 = circuit_add(t223, t224); // Eval big_Q step + (coeff_58 * z^58) + let t226 = circuit_mul(in79, t57); // Eval big_Q step coeff_59 * z^59 + let t227 = circuit_add(t225, t226); // Eval big_Q step + (coeff_59 * z^59) + let t228 = circuit_mul(in80, t58); // Eval big_Q step coeff_60 * z^60 + let t229 = circuit_add(t227, t228); // Eval big_Q step + (coeff_60 * z^60) + let t230 = circuit_mul(in81, t59); // Eval big_Q step coeff_61 * z^61 + let t231 = circuit_add(t229, t230); // Eval big_Q step + (coeff_61 * z^61) + let t232 = circuit_mul(in82, t60); // Eval big_Q step coeff_62 * z^62 + let t233 = circuit_add(t231, t232); // Eval big_Q step + (coeff_62 * z^62) + let t234 = circuit_mul(in83, t61); // Eval big_Q step coeff_63 * z^63 + let t235 = circuit_add(t233, t234); // Eval big_Q step + (coeff_63 * z^63) + let t236 = circuit_mul(in84, t62); // Eval big_Q step coeff_64 * z^64 + let t237 = circuit_add(t235, t236); // Eval big_Q step + (coeff_64 * z^64) + let t238 = circuit_mul(in85, t63); // Eval big_Q step coeff_65 * z^65 + let t239 = circuit_add(t237, t238); // Eval big_Q step + (coeff_65 * z^65) + let t240 = circuit_mul(in86, t64); // Eval big_Q step coeff_66 * z^66 + let t241 = circuit_add(t239, t240); // Eval big_Q step + (coeff_66 * z^66) + let t242 = circuit_mul(in87, t65); // Eval big_Q step coeff_67 * z^67 + let t243 = circuit_add(t241, t242); // Eval big_Q step + (coeff_67 * z^67) + let t244 = circuit_mul(in88, t66); // Eval big_Q step coeff_68 * z^68 + let t245 = circuit_add(t243, t244); // Eval big_Q step + (coeff_68 * z^68) + let t246 = circuit_mul(in89, t67); // Eval big_Q step coeff_69 * z^69 + let t247 = circuit_add(t245, t246); // Eval big_Q step + (coeff_69 * z^69) + let t248 = circuit_mul(in90, t68); // Eval big_Q step coeff_70 * z^70 + let t249 = circuit_add(t247, t248); // Eval big_Q step + (coeff_70 * z^70) + let t250 = circuit_mul(in91, t69); // Eval big_Q step coeff_71 * z^71 + let t251 = circuit_add(t249, t250); // Eval big_Q step + (coeff_71 * z^71) + let t252 = circuit_mul(in92, t70); // Eval big_Q step coeff_72 * z^72 + let t253 = circuit_add(t251, t252); // Eval big_Q step + (coeff_72 * z^72) + let t254 = circuit_mul(in93, t71); // Eval big_Q step coeff_73 * z^73 + let t255 = circuit_add(t253, t254); // Eval big_Q step + (coeff_73 * z^73) + let t256 = circuit_mul(in94, t72); // Eval big_Q step coeff_74 * z^74 + let t257 = circuit_add(t255, t256); // Eval big_Q step + (coeff_74 * z^74) + let t258 = circuit_mul(in95, t73); // Eval big_Q step coeff_75 * z^75 + let t259 = circuit_add(t257, t258); // Eval big_Q step + (coeff_75 * z^75) + let t260 = circuit_mul(in96, t74); // Eval big_Q step coeff_76 * z^76 + let t261 = circuit_add(t259, t260); // Eval big_Q step + (coeff_76 * z^76) + let t262 = circuit_mul(in97, t75); // Eval big_Q step coeff_77 * z^77 + let t263 = circuit_add(t261, t262); // Eval big_Q step + (coeff_77 * z^77) + let t264 = circuit_mul(in98, t76); // Eval big_Q step coeff_78 * z^78 + let t265 = circuit_add(t263, t264); // Eval big_Q step + (coeff_78 * z^78) + let t266 = circuit_mul(in99, t77); // Eval big_Q step coeff_79 * z^79 + let t267 = circuit_add(t265, t266); // Eval big_Q step + (coeff_79 * z^79) + let t268 = circuit_mul(in100, t78); // Eval big_Q step coeff_80 * z^80 + let t269 = circuit_add(t267, t268); // Eval big_Q step + (coeff_80 * z^80) + let t270 = circuit_mul(t269, t109); // Q(z) * P(z) + let t271 = circuit_sub(t106, t270); // final_lhs - Q(z) * P(z) let modulus = TryInto::< _, CircuitModulus @@ -1759,7 +2778,7 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( ) .unwrap(); - let mut circuit_inputs = (t190,).new_inputs(); + let mut circuit_inputs = (t271,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next([0x2, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs @@ -1799,7 +2818,7 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let final_check: u384 = outputs.get_output(t190); + let final_check: u384 = outputs.get_output(t271); return (final_check,); } fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( @@ -1861,6 +2880,24 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( let (in84, in85) = (CE::> {}, CE::> {}); let (in86, in87) = (CE::> {}, CE::> {}); let (in88, in89) = (CE::> {}, CE::> {}); + let (in90, in91) = (CE::> {}, CE::> {}); + let (in92, in93) = (CE::> {}, CE::> {}); + let (in94, in95) = (CE::> {}, CE::> {}); + let (in96, in97) = (CE::> {}, CE::> {}); + let (in98, in99) = (CE::> {}, CE::> {}); + let (in100, in101) = (CE::> {}, CE::> {}); + let (in102, in103) = (CE::> {}, CE::> {}); + let (in104, in105) = (CE::> {}, CE::> {}); + let (in106, in107) = (CE::> {}, CE::> {}); + let (in108, in109) = (CE::> {}, CE::> {}); + let (in110, in111) = (CE::> {}, CE::> {}); + let (in112, in113) = (CE::> {}, CE::> {}); + let (in114, in115) = (CE::> {}, CE::> {}); + let (in116, in117) = (CE::> {}, CE::> {}); + let (in118, in119) = (CE::> {}, CE::> {}); + let (in120, in121) = (CE::> {}, CE::> {}); + let (in122, in123) = (CE::> {}, CE::> {}); + let in124 = CE::> {}; let t0 = circuit_mul(in16, in16); // Compute z^2 let t1 = circuit_mul(t0, in16); // Compute z^3 let t2 = circuit_mul(t1, in16); // Compute z^4 @@ -1929,177 +2966,282 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( let t65 = circuit_mul(t64, in16); // Compute z^67 let t66 = circuit_mul(t65, in16); // Compute z^68 let t67 = circuit_mul(t66, in16); // Compute z^69 - let t68 = circuit_mul(in14, in14); - let t69 = circuit_mul(in3, in16); // Eval UnnamedPoly step coeff_1 * z^1 - let t70 = circuit_add(in2, t69); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t71 = circuit_mul(in4, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t72 = circuit_add(t70, t71); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t73 = circuit_mul(in5, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t74 = circuit_add(t72, t73); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t75 = circuit_mul(in6, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t76 = circuit_add(t74, t75); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t77 = circuit_mul(in7, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t78 = circuit_add(t76, t77); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t79 = circuit_mul(in8, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t80 = circuit_add(t78, t79); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t81 = circuit_mul(in9, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t82 = circuit_add(t80, t81); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t83 = circuit_mul(in10, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t84 = circuit_add(t82, t83); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t85 = circuit_mul(in11, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t86 = circuit_add(t84, t85); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t87 = circuit_mul(in12, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t88 = circuit_add(t86, t87); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t89 = circuit_mul(in13, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t90 = circuit_add(t88, t89); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t91 = circuit_mul(in19, in17); - let t92 = circuit_mul(t91, in15); - let t93 = circuit_sub(t92, t90); - let t94 = circuit_mul(t68, t93); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) - let t95 = circuit_add(in18, t94); // previous_lhs + lhs_n_minus_1 - let t96 = circuit_mul(in1, t4); // Eval sparse poly P_irr step coeff_6 * z^6 - let t97 = circuit_add(in0, t96); // Eval sparse poly P_irr step + coeff_6 * z^6 - let t98 = circuit_add(t97, t10); // Eval sparse poly P_irr step + 1*z^12 - let t99 = circuit_mul(in21, in16); // Eval big_Q step coeff_1 * z^1 - let t100 = circuit_add(in20, t99); // Eval big_Q step + (coeff_1 * z^1) - let t101 = circuit_mul(in22, t0); // Eval big_Q step coeff_2 * z^2 - let t102 = circuit_add(t100, t101); // Eval big_Q step + (coeff_2 * z^2) - let t103 = circuit_mul(in23, t1); // Eval big_Q step coeff_3 * z^3 - let t104 = circuit_add(t102, t103); // Eval big_Q step + (coeff_3 * z^3) - let t105 = circuit_mul(in24, t2); // Eval big_Q step coeff_4 * z^4 - let t106 = circuit_add(t104, t105); // Eval big_Q step + (coeff_4 * z^4) - let t107 = circuit_mul(in25, t3); // Eval big_Q step coeff_5 * z^5 - let t108 = circuit_add(t106, t107); // Eval big_Q step + (coeff_5 * z^5) - let t109 = circuit_mul(in26, t4); // Eval big_Q step coeff_6 * z^6 - let t110 = circuit_add(t108, t109); // Eval big_Q step + (coeff_6 * z^6) - let t111 = circuit_mul(in27, t5); // Eval big_Q step coeff_7 * z^7 - let t112 = circuit_add(t110, t111); // Eval big_Q step + (coeff_7 * z^7) - let t113 = circuit_mul(in28, t6); // Eval big_Q step coeff_8 * z^8 - let t114 = circuit_add(t112, t113); // Eval big_Q step + (coeff_8 * z^8) - let t115 = circuit_mul(in29, t7); // Eval big_Q step coeff_9 * z^9 - let t116 = circuit_add(t114, t115); // Eval big_Q step + (coeff_9 * z^9) - let t117 = circuit_mul(in30, t8); // Eval big_Q step coeff_10 * z^10 - let t118 = circuit_add(t116, t117); // Eval big_Q step + (coeff_10 * z^10) - let t119 = circuit_mul(in31, t9); // Eval big_Q step coeff_11 * z^11 - let t120 = circuit_add(t118, t119); // Eval big_Q step + (coeff_11 * z^11) - let t121 = circuit_mul(in32, t10); // Eval big_Q step coeff_12 * z^12 - let t122 = circuit_add(t120, t121); // Eval big_Q step + (coeff_12 * z^12) - let t123 = circuit_mul(in33, t11); // Eval big_Q step coeff_13 * z^13 - let t124 = circuit_add(t122, t123); // Eval big_Q step + (coeff_13 * z^13) - let t125 = circuit_mul(in34, t12); // Eval big_Q step coeff_14 * z^14 - let t126 = circuit_add(t124, t125); // Eval big_Q step + (coeff_14 * z^14) - let t127 = circuit_mul(in35, t13); // Eval big_Q step coeff_15 * z^15 - let t128 = circuit_add(t126, t127); // Eval big_Q step + (coeff_15 * z^15) - let t129 = circuit_mul(in36, t14); // Eval big_Q step coeff_16 * z^16 - let t130 = circuit_add(t128, t129); // Eval big_Q step + (coeff_16 * z^16) - let t131 = circuit_mul(in37, t15); // Eval big_Q step coeff_17 * z^17 - let t132 = circuit_add(t130, t131); // Eval big_Q step + (coeff_17 * z^17) - let t133 = circuit_mul(in38, t16); // Eval big_Q step coeff_18 * z^18 - let t134 = circuit_add(t132, t133); // Eval big_Q step + (coeff_18 * z^18) - let t135 = circuit_mul(in39, t17); // Eval big_Q step coeff_19 * z^19 - let t136 = circuit_add(t134, t135); // Eval big_Q step + (coeff_19 * z^19) - let t137 = circuit_mul(in40, t18); // Eval big_Q step coeff_20 * z^20 - let t138 = circuit_add(t136, t137); // Eval big_Q step + (coeff_20 * z^20) - let t139 = circuit_mul(in41, t19); // Eval big_Q step coeff_21 * z^21 - let t140 = circuit_add(t138, t139); // Eval big_Q step + (coeff_21 * z^21) - let t141 = circuit_mul(in42, t20); // Eval big_Q step coeff_22 * z^22 - let t142 = circuit_add(t140, t141); // Eval big_Q step + (coeff_22 * z^22) - let t143 = circuit_mul(in43, t21); // Eval big_Q step coeff_23 * z^23 - let t144 = circuit_add(t142, t143); // Eval big_Q step + (coeff_23 * z^23) - let t145 = circuit_mul(in44, t22); // Eval big_Q step coeff_24 * z^24 - let t146 = circuit_add(t144, t145); // Eval big_Q step + (coeff_24 * z^24) - let t147 = circuit_mul(in45, t23); // Eval big_Q step coeff_25 * z^25 - let t148 = circuit_add(t146, t147); // Eval big_Q step + (coeff_25 * z^25) - let t149 = circuit_mul(in46, t24); // Eval big_Q step coeff_26 * z^26 - let t150 = circuit_add(t148, t149); // Eval big_Q step + (coeff_26 * z^26) - let t151 = circuit_mul(in47, t25); // Eval big_Q step coeff_27 * z^27 - let t152 = circuit_add(t150, t151); // Eval big_Q step + (coeff_27 * z^27) - let t153 = circuit_mul(in48, t26); // Eval big_Q step coeff_28 * z^28 - let t154 = circuit_add(t152, t153); // Eval big_Q step + (coeff_28 * z^28) - let t155 = circuit_mul(in49, t27); // Eval big_Q step coeff_29 * z^29 - let t156 = circuit_add(t154, t155); // Eval big_Q step + (coeff_29 * z^29) - let t157 = circuit_mul(in50, t28); // Eval big_Q step coeff_30 * z^30 - let t158 = circuit_add(t156, t157); // Eval big_Q step + (coeff_30 * z^30) - let t159 = circuit_mul(in51, t29); // Eval big_Q step coeff_31 * z^31 - let t160 = circuit_add(t158, t159); // Eval big_Q step + (coeff_31 * z^31) - let t161 = circuit_mul(in52, t30); // Eval big_Q step coeff_32 * z^32 - let t162 = circuit_add(t160, t161); // Eval big_Q step + (coeff_32 * z^32) - let t163 = circuit_mul(in53, t31); // Eval big_Q step coeff_33 * z^33 - let t164 = circuit_add(t162, t163); // Eval big_Q step + (coeff_33 * z^33) - let t165 = circuit_mul(in54, t32); // Eval big_Q step coeff_34 * z^34 - let t166 = circuit_add(t164, t165); // Eval big_Q step + (coeff_34 * z^34) - let t167 = circuit_mul(in55, t33); // Eval big_Q step coeff_35 * z^35 - let t168 = circuit_add(t166, t167); // Eval big_Q step + (coeff_35 * z^35) - let t169 = circuit_mul(in56, t34); // Eval big_Q step coeff_36 * z^36 - let t170 = circuit_add(t168, t169); // Eval big_Q step + (coeff_36 * z^36) - let t171 = circuit_mul(in57, t35); // Eval big_Q step coeff_37 * z^37 - let t172 = circuit_add(t170, t171); // Eval big_Q step + (coeff_37 * z^37) - let t173 = circuit_mul(in58, t36); // Eval big_Q step coeff_38 * z^38 - let t174 = circuit_add(t172, t173); // Eval big_Q step + (coeff_38 * z^38) - let t175 = circuit_mul(in59, t37); // Eval big_Q step coeff_39 * z^39 - let t176 = circuit_add(t174, t175); // Eval big_Q step + (coeff_39 * z^39) - let t177 = circuit_mul(in60, t38); // Eval big_Q step coeff_40 * z^40 - let t178 = circuit_add(t176, t177); // Eval big_Q step + (coeff_40 * z^40) - let t179 = circuit_mul(in61, t39); // Eval big_Q step coeff_41 * z^41 - let t180 = circuit_add(t178, t179); // Eval big_Q step + (coeff_41 * z^41) - let t181 = circuit_mul(in62, t40); // Eval big_Q step coeff_42 * z^42 - let t182 = circuit_add(t180, t181); // Eval big_Q step + (coeff_42 * z^42) - let t183 = circuit_mul(in63, t41); // Eval big_Q step coeff_43 * z^43 - let t184 = circuit_add(t182, t183); // Eval big_Q step + (coeff_43 * z^43) - let t185 = circuit_mul(in64, t42); // Eval big_Q step coeff_44 * z^44 - let t186 = circuit_add(t184, t185); // Eval big_Q step + (coeff_44 * z^44) - let t187 = circuit_mul(in65, t43); // Eval big_Q step coeff_45 * z^45 - let t188 = circuit_add(t186, t187); // Eval big_Q step + (coeff_45 * z^45) - let t189 = circuit_mul(in66, t44); // Eval big_Q step coeff_46 * z^46 - let t190 = circuit_add(t188, t189); // Eval big_Q step + (coeff_46 * z^46) - let t191 = circuit_mul(in67, t45); // Eval big_Q step coeff_47 * z^47 - let t192 = circuit_add(t190, t191); // Eval big_Q step + (coeff_47 * z^47) - let t193 = circuit_mul(in68, t46); // Eval big_Q step coeff_48 * z^48 - let t194 = circuit_add(t192, t193); // Eval big_Q step + (coeff_48 * z^48) - let t195 = circuit_mul(in69, t47); // Eval big_Q step coeff_49 * z^49 - let t196 = circuit_add(t194, t195); // Eval big_Q step + (coeff_49 * z^49) - let t197 = circuit_mul(in70, t48); // Eval big_Q step coeff_50 * z^50 - let t198 = circuit_add(t196, t197); // Eval big_Q step + (coeff_50 * z^50) - let t199 = circuit_mul(in71, t49); // Eval big_Q step coeff_51 * z^51 - let t200 = circuit_add(t198, t199); // Eval big_Q step + (coeff_51 * z^51) - let t201 = circuit_mul(in72, t50); // Eval big_Q step coeff_52 * z^52 - let t202 = circuit_add(t200, t201); // Eval big_Q step + (coeff_52 * z^52) - let t203 = circuit_mul(in73, t51); // Eval big_Q step coeff_53 * z^53 - let t204 = circuit_add(t202, t203); // Eval big_Q step + (coeff_53 * z^53) - let t205 = circuit_mul(in74, t52); // Eval big_Q step coeff_54 * z^54 - let t206 = circuit_add(t204, t205); // Eval big_Q step + (coeff_54 * z^54) - let t207 = circuit_mul(in75, t53); // Eval big_Q step coeff_55 * z^55 - let t208 = circuit_add(t206, t207); // Eval big_Q step + (coeff_55 * z^55) - let t209 = circuit_mul(in76, t54); // Eval big_Q step coeff_56 * z^56 - let t210 = circuit_add(t208, t209); // Eval big_Q step + (coeff_56 * z^56) - let t211 = circuit_mul(in77, t55); // Eval big_Q step coeff_57 * z^57 - let t212 = circuit_add(t210, t211); // Eval big_Q step + (coeff_57 * z^57) - let t213 = circuit_mul(in78, t56); // Eval big_Q step coeff_58 * z^58 - let t214 = circuit_add(t212, t213); // Eval big_Q step + (coeff_58 * z^58) - let t215 = circuit_mul(in79, t57); // Eval big_Q step coeff_59 * z^59 - let t216 = circuit_add(t214, t215); // Eval big_Q step + (coeff_59 * z^59) - let t217 = circuit_mul(in80, t58); // Eval big_Q step coeff_60 * z^60 - let t218 = circuit_add(t216, t217); // Eval big_Q step + (coeff_60 * z^60) - let t219 = circuit_mul(in81, t59); // Eval big_Q step coeff_61 * z^61 - let t220 = circuit_add(t218, t219); // Eval big_Q step + (coeff_61 * z^61) - let t221 = circuit_mul(in82, t60); // Eval big_Q step coeff_62 * z^62 - let t222 = circuit_add(t220, t221); // Eval big_Q step + (coeff_62 * z^62) - let t223 = circuit_mul(in83, t61); // Eval big_Q step coeff_63 * z^63 - let t224 = circuit_add(t222, t223); // Eval big_Q step + (coeff_63 * z^63) - let t225 = circuit_mul(in84, t62); // Eval big_Q step coeff_64 * z^64 - let t226 = circuit_add(t224, t225); // Eval big_Q step + (coeff_64 * z^64) - let t227 = circuit_mul(in85, t63); // Eval big_Q step coeff_65 * z^65 - let t228 = circuit_add(t226, t227); // Eval big_Q step + (coeff_65 * z^65) - let t229 = circuit_mul(in86, t64); // Eval big_Q step coeff_66 * z^66 - let t230 = circuit_add(t228, t229); // Eval big_Q step + (coeff_66 * z^66) - let t231 = circuit_mul(in87, t65); // Eval big_Q step coeff_67 * z^67 - let t232 = circuit_add(t230, t231); // Eval big_Q step + (coeff_67 * z^67) - let t233 = circuit_mul(in88, t66); // Eval big_Q step coeff_68 * z^68 - let t234 = circuit_add(t232, t233); // Eval big_Q step + (coeff_68 * z^68) - let t235 = circuit_mul(in89, t67); // Eval big_Q step coeff_69 * z^69 - let t236 = circuit_add(t234, t235); // Eval big_Q step + (coeff_69 * z^69) - let t237 = circuit_mul(t236, t98); // Q(z) * P(z) - let t238 = circuit_sub(t95, t237); // final_lhs - Q(z) * P(z) + let t68 = circuit_mul(t67, in16); // Compute z^70 + let t69 = circuit_mul(t68, in16); // Compute z^71 + let t70 = circuit_mul(t69, in16); // Compute z^72 + let t71 = circuit_mul(t70, in16); // Compute z^73 + let t72 = circuit_mul(t71, in16); // Compute z^74 + let t73 = circuit_mul(t72, in16); // Compute z^75 + let t74 = circuit_mul(t73, in16); // Compute z^76 + let t75 = circuit_mul(t74, in16); // Compute z^77 + let t76 = circuit_mul(t75, in16); // Compute z^78 + let t77 = circuit_mul(t76, in16); // Compute z^79 + let t78 = circuit_mul(t77, in16); // Compute z^80 + let t79 = circuit_mul(t78, in16); // Compute z^81 + let t80 = circuit_mul(t79, in16); // Compute z^82 + let t81 = circuit_mul(t80, in16); // Compute z^83 + let t82 = circuit_mul(t81, in16); // Compute z^84 + let t83 = circuit_mul(t82, in16); // Compute z^85 + let t84 = circuit_mul(t83, in16); // Compute z^86 + let t85 = circuit_mul(t84, in16); // Compute z^87 + let t86 = circuit_mul(t85, in16); // Compute z^88 + let t87 = circuit_mul(t86, in16); // Compute z^89 + let t88 = circuit_mul(t87, in16); // Compute z^90 + let t89 = circuit_mul(t88, in16); // Compute z^91 + let t90 = circuit_mul(t89, in16); // Compute z^92 + let t91 = circuit_mul(t90, in16); // Compute z^93 + let t92 = circuit_mul(t91, in16); // Compute z^94 + let t93 = circuit_mul(t92, in16); // Compute z^95 + let t94 = circuit_mul(t93, in16); // Compute z^96 + let t95 = circuit_mul(t94, in16); // Compute z^97 + let t96 = circuit_mul(t95, in16); // Compute z^98 + let t97 = circuit_mul(t96, in16); // Compute z^99 + let t98 = circuit_mul(t97, in16); // Compute z^100 + let t99 = circuit_mul(t98, in16); // Compute z^101 + let t100 = circuit_mul(t99, in16); // Compute z^102 + let t101 = circuit_mul(t100, in16); // Compute z^103 + let t102 = circuit_mul(t101, in16); // Compute z^104 + let t103 = circuit_mul(in14, in14); + let t104 = circuit_mul(in3, in16); // Eval R_n_minus_1 step coeff_1 * z^1 + let t105 = circuit_add(in2, t104); // Eval R_n_minus_1 step + (coeff_1 * z^1) + let t106 = circuit_mul(in4, t0); // Eval R_n_minus_1 step coeff_2 * z^2 + let t107 = circuit_add(t105, t106); // Eval R_n_minus_1 step + (coeff_2 * z^2) + let t108 = circuit_mul(in5, t1); // Eval R_n_minus_1 step coeff_3 * z^3 + let t109 = circuit_add(t107, t108); // Eval R_n_minus_1 step + (coeff_3 * z^3) + let t110 = circuit_mul(in6, t2); // Eval R_n_minus_1 step coeff_4 * z^4 + let t111 = circuit_add(t109, t110); // Eval R_n_minus_1 step + (coeff_4 * z^4) + let t112 = circuit_mul(in7, t3); // Eval R_n_minus_1 step coeff_5 * z^5 + let t113 = circuit_add(t111, t112); // Eval R_n_minus_1 step + (coeff_5 * z^5) + let t114 = circuit_mul(in8, t4); // Eval R_n_minus_1 step coeff_6 * z^6 + let t115 = circuit_add(t113, t114); // Eval R_n_minus_1 step + (coeff_6 * z^6) + let t116 = circuit_mul(in9, t5); // Eval R_n_minus_1 step coeff_7 * z^7 + let t117 = circuit_add(t115, t116); // Eval R_n_minus_1 step + (coeff_7 * z^7) + let t118 = circuit_mul(in10, t6); // Eval R_n_minus_1 step coeff_8 * z^8 + let t119 = circuit_add(t117, t118); // Eval R_n_minus_1 step + (coeff_8 * z^8) + let t120 = circuit_mul(in11, t7); // Eval R_n_minus_1 step coeff_9 * z^9 + let t121 = circuit_add(t119, t120); // Eval R_n_minus_1 step + (coeff_9 * z^9) + let t122 = circuit_mul(in12, t8); // Eval R_n_minus_1 step coeff_10 * z^10 + let t123 = circuit_add(t121, t122); // Eval R_n_minus_1 step + (coeff_10 * z^10) + let t124 = circuit_mul(in13, t9); // Eval R_n_minus_1 step coeff_11 * z^11 + let t125 = circuit_add(t123, t124); // Eval R_n_minus_1 step + (coeff_11 * z^11) + let t126 = circuit_mul(in19, in17); + let t127 = circuit_mul(t126, in15); + let t128 = circuit_sub(t127, t125); + let t129 = circuit_mul(t103, t128); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) + let t130 = circuit_add(in18, t129); // previous_lhs + lhs_n_minus_1 + let t131 = circuit_mul(in1, t4); // Eval sparse poly P_irr step coeff_6 * z^6 + let t132 = circuit_add(in0, t131); // Eval sparse poly P_irr step + coeff_6 * z^6 + let t133 = circuit_add(t132, t10); // Eval sparse poly P_irr step + 1*z^12 + let t134 = circuit_mul(in21, in16); // Eval big_Q step coeff_1 * z^1 + let t135 = circuit_add(in20, t134); // Eval big_Q step + (coeff_1 * z^1) + let t136 = circuit_mul(in22, t0); // Eval big_Q step coeff_2 * z^2 + let t137 = circuit_add(t135, t136); // Eval big_Q step + (coeff_2 * z^2) + let t138 = circuit_mul(in23, t1); // Eval big_Q step coeff_3 * z^3 + let t139 = circuit_add(t137, t138); // Eval big_Q step + (coeff_3 * z^3) + let t140 = circuit_mul(in24, t2); // Eval big_Q step coeff_4 * z^4 + let t141 = circuit_add(t139, t140); // Eval big_Q step + (coeff_4 * z^4) + let t142 = circuit_mul(in25, t3); // Eval big_Q step coeff_5 * z^5 + let t143 = circuit_add(t141, t142); // Eval big_Q step + (coeff_5 * z^5) + let t144 = circuit_mul(in26, t4); // Eval big_Q step coeff_6 * z^6 + let t145 = circuit_add(t143, t144); // Eval big_Q step + (coeff_6 * z^6) + let t146 = circuit_mul(in27, t5); // Eval big_Q step coeff_7 * z^7 + let t147 = circuit_add(t145, t146); // Eval big_Q step + (coeff_7 * z^7) + let t148 = circuit_mul(in28, t6); // Eval big_Q step coeff_8 * z^8 + let t149 = circuit_add(t147, t148); // Eval big_Q step + (coeff_8 * z^8) + let t150 = circuit_mul(in29, t7); // Eval big_Q step coeff_9 * z^9 + let t151 = circuit_add(t149, t150); // Eval big_Q step + (coeff_9 * z^9) + let t152 = circuit_mul(in30, t8); // Eval big_Q step coeff_10 * z^10 + let t153 = circuit_add(t151, t152); // Eval big_Q step + (coeff_10 * z^10) + let t154 = circuit_mul(in31, t9); // Eval big_Q step coeff_11 * z^11 + let t155 = circuit_add(t153, t154); // Eval big_Q step + (coeff_11 * z^11) + let t156 = circuit_mul(in32, t10); // Eval big_Q step coeff_12 * z^12 + let t157 = circuit_add(t155, t156); // Eval big_Q step + (coeff_12 * z^12) + let t158 = circuit_mul(in33, t11); // Eval big_Q step coeff_13 * z^13 + let t159 = circuit_add(t157, t158); // Eval big_Q step + (coeff_13 * z^13) + let t160 = circuit_mul(in34, t12); // Eval big_Q step coeff_14 * z^14 + let t161 = circuit_add(t159, t160); // Eval big_Q step + (coeff_14 * z^14) + let t162 = circuit_mul(in35, t13); // Eval big_Q step coeff_15 * z^15 + let t163 = circuit_add(t161, t162); // Eval big_Q step + (coeff_15 * z^15) + let t164 = circuit_mul(in36, t14); // Eval big_Q step coeff_16 * z^16 + let t165 = circuit_add(t163, t164); // Eval big_Q step + (coeff_16 * z^16) + let t166 = circuit_mul(in37, t15); // Eval big_Q step coeff_17 * z^17 + let t167 = circuit_add(t165, t166); // Eval big_Q step + (coeff_17 * z^17) + let t168 = circuit_mul(in38, t16); // Eval big_Q step coeff_18 * z^18 + let t169 = circuit_add(t167, t168); // Eval big_Q step + (coeff_18 * z^18) + let t170 = circuit_mul(in39, t17); // Eval big_Q step coeff_19 * z^19 + let t171 = circuit_add(t169, t170); // Eval big_Q step + (coeff_19 * z^19) + let t172 = circuit_mul(in40, t18); // Eval big_Q step coeff_20 * z^20 + let t173 = circuit_add(t171, t172); // Eval big_Q step + (coeff_20 * z^20) + let t174 = circuit_mul(in41, t19); // Eval big_Q step coeff_21 * z^21 + let t175 = circuit_add(t173, t174); // Eval big_Q step + (coeff_21 * z^21) + let t176 = circuit_mul(in42, t20); // Eval big_Q step coeff_22 * z^22 + let t177 = circuit_add(t175, t176); // Eval big_Q step + (coeff_22 * z^22) + let t178 = circuit_mul(in43, t21); // Eval big_Q step coeff_23 * z^23 + let t179 = circuit_add(t177, t178); // Eval big_Q step + (coeff_23 * z^23) + let t180 = circuit_mul(in44, t22); // Eval big_Q step coeff_24 * z^24 + let t181 = circuit_add(t179, t180); // Eval big_Q step + (coeff_24 * z^24) + let t182 = circuit_mul(in45, t23); // Eval big_Q step coeff_25 * z^25 + let t183 = circuit_add(t181, t182); // Eval big_Q step + (coeff_25 * z^25) + let t184 = circuit_mul(in46, t24); // Eval big_Q step coeff_26 * z^26 + let t185 = circuit_add(t183, t184); // Eval big_Q step + (coeff_26 * z^26) + let t186 = circuit_mul(in47, t25); // Eval big_Q step coeff_27 * z^27 + let t187 = circuit_add(t185, t186); // Eval big_Q step + (coeff_27 * z^27) + let t188 = circuit_mul(in48, t26); // Eval big_Q step coeff_28 * z^28 + let t189 = circuit_add(t187, t188); // Eval big_Q step + (coeff_28 * z^28) + let t190 = circuit_mul(in49, t27); // Eval big_Q step coeff_29 * z^29 + let t191 = circuit_add(t189, t190); // Eval big_Q step + (coeff_29 * z^29) + let t192 = circuit_mul(in50, t28); // Eval big_Q step coeff_30 * z^30 + let t193 = circuit_add(t191, t192); // Eval big_Q step + (coeff_30 * z^30) + let t194 = circuit_mul(in51, t29); // Eval big_Q step coeff_31 * z^31 + let t195 = circuit_add(t193, t194); // Eval big_Q step + (coeff_31 * z^31) + let t196 = circuit_mul(in52, t30); // Eval big_Q step coeff_32 * z^32 + let t197 = circuit_add(t195, t196); // Eval big_Q step + (coeff_32 * z^32) + let t198 = circuit_mul(in53, t31); // Eval big_Q step coeff_33 * z^33 + let t199 = circuit_add(t197, t198); // Eval big_Q step + (coeff_33 * z^33) + let t200 = circuit_mul(in54, t32); // Eval big_Q step coeff_34 * z^34 + let t201 = circuit_add(t199, t200); // Eval big_Q step + (coeff_34 * z^34) + let t202 = circuit_mul(in55, t33); // Eval big_Q step coeff_35 * z^35 + let t203 = circuit_add(t201, t202); // Eval big_Q step + (coeff_35 * z^35) + let t204 = circuit_mul(in56, t34); // Eval big_Q step coeff_36 * z^36 + let t205 = circuit_add(t203, t204); // Eval big_Q step + (coeff_36 * z^36) + let t206 = circuit_mul(in57, t35); // Eval big_Q step coeff_37 * z^37 + let t207 = circuit_add(t205, t206); // Eval big_Q step + (coeff_37 * z^37) + let t208 = circuit_mul(in58, t36); // Eval big_Q step coeff_38 * z^38 + let t209 = circuit_add(t207, t208); // Eval big_Q step + (coeff_38 * z^38) + let t210 = circuit_mul(in59, t37); // Eval big_Q step coeff_39 * z^39 + let t211 = circuit_add(t209, t210); // Eval big_Q step + (coeff_39 * z^39) + let t212 = circuit_mul(in60, t38); // Eval big_Q step coeff_40 * z^40 + let t213 = circuit_add(t211, t212); // Eval big_Q step + (coeff_40 * z^40) + let t214 = circuit_mul(in61, t39); // Eval big_Q step coeff_41 * z^41 + let t215 = circuit_add(t213, t214); // Eval big_Q step + (coeff_41 * z^41) + let t216 = circuit_mul(in62, t40); // Eval big_Q step coeff_42 * z^42 + let t217 = circuit_add(t215, t216); // Eval big_Q step + (coeff_42 * z^42) + let t218 = circuit_mul(in63, t41); // Eval big_Q step coeff_43 * z^43 + let t219 = circuit_add(t217, t218); // Eval big_Q step + (coeff_43 * z^43) + let t220 = circuit_mul(in64, t42); // Eval big_Q step coeff_44 * z^44 + let t221 = circuit_add(t219, t220); // Eval big_Q step + (coeff_44 * z^44) + let t222 = circuit_mul(in65, t43); // Eval big_Q step coeff_45 * z^45 + let t223 = circuit_add(t221, t222); // Eval big_Q step + (coeff_45 * z^45) + let t224 = circuit_mul(in66, t44); // Eval big_Q step coeff_46 * z^46 + let t225 = circuit_add(t223, t224); // Eval big_Q step + (coeff_46 * z^46) + let t226 = circuit_mul(in67, t45); // Eval big_Q step coeff_47 * z^47 + let t227 = circuit_add(t225, t226); // Eval big_Q step + (coeff_47 * z^47) + let t228 = circuit_mul(in68, t46); // Eval big_Q step coeff_48 * z^48 + let t229 = circuit_add(t227, t228); // Eval big_Q step + (coeff_48 * z^48) + let t230 = circuit_mul(in69, t47); // Eval big_Q step coeff_49 * z^49 + let t231 = circuit_add(t229, t230); // Eval big_Q step + (coeff_49 * z^49) + let t232 = circuit_mul(in70, t48); // Eval big_Q step coeff_50 * z^50 + let t233 = circuit_add(t231, t232); // Eval big_Q step + (coeff_50 * z^50) + let t234 = circuit_mul(in71, t49); // Eval big_Q step coeff_51 * z^51 + let t235 = circuit_add(t233, t234); // Eval big_Q step + (coeff_51 * z^51) + let t236 = circuit_mul(in72, t50); // Eval big_Q step coeff_52 * z^52 + let t237 = circuit_add(t235, t236); // Eval big_Q step + (coeff_52 * z^52) + let t238 = circuit_mul(in73, t51); // Eval big_Q step coeff_53 * z^53 + let t239 = circuit_add(t237, t238); // Eval big_Q step + (coeff_53 * z^53) + let t240 = circuit_mul(in74, t52); // Eval big_Q step coeff_54 * z^54 + let t241 = circuit_add(t239, t240); // Eval big_Q step + (coeff_54 * z^54) + let t242 = circuit_mul(in75, t53); // Eval big_Q step coeff_55 * z^55 + let t243 = circuit_add(t241, t242); // Eval big_Q step + (coeff_55 * z^55) + let t244 = circuit_mul(in76, t54); // Eval big_Q step coeff_56 * z^56 + let t245 = circuit_add(t243, t244); // Eval big_Q step + (coeff_56 * z^56) + let t246 = circuit_mul(in77, t55); // Eval big_Q step coeff_57 * z^57 + let t247 = circuit_add(t245, t246); // Eval big_Q step + (coeff_57 * z^57) + let t248 = circuit_mul(in78, t56); // Eval big_Q step coeff_58 * z^58 + let t249 = circuit_add(t247, t248); // Eval big_Q step + (coeff_58 * z^58) + let t250 = circuit_mul(in79, t57); // Eval big_Q step coeff_59 * z^59 + let t251 = circuit_add(t249, t250); // Eval big_Q step + (coeff_59 * z^59) + let t252 = circuit_mul(in80, t58); // Eval big_Q step coeff_60 * z^60 + let t253 = circuit_add(t251, t252); // Eval big_Q step + (coeff_60 * z^60) + let t254 = circuit_mul(in81, t59); // Eval big_Q step coeff_61 * z^61 + let t255 = circuit_add(t253, t254); // Eval big_Q step + (coeff_61 * z^61) + let t256 = circuit_mul(in82, t60); // Eval big_Q step coeff_62 * z^62 + let t257 = circuit_add(t255, t256); // Eval big_Q step + (coeff_62 * z^62) + let t258 = circuit_mul(in83, t61); // Eval big_Q step coeff_63 * z^63 + let t259 = circuit_add(t257, t258); // Eval big_Q step + (coeff_63 * z^63) + let t260 = circuit_mul(in84, t62); // Eval big_Q step coeff_64 * z^64 + let t261 = circuit_add(t259, t260); // Eval big_Q step + (coeff_64 * z^64) + let t262 = circuit_mul(in85, t63); // Eval big_Q step coeff_65 * z^65 + let t263 = circuit_add(t261, t262); // Eval big_Q step + (coeff_65 * z^65) + let t264 = circuit_mul(in86, t64); // Eval big_Q step coeff_66 * z^66 + let t265 = circuit_add(t263, t264); // Eval big_Q step + (coeff_66 * z^66) + let t266 = circuit_mul(in87, t65); // Eval big_Q step coeff_67 * z^67 + let t267 = circuit_add(t265, t266); // Eval big_Q step + (coeff_67 * z^67) + let t268 = circuit_mul(in88, t66); // Eval big_Q step coeff_68 * z^68 + let t269 = circuit_add(t267, t268); // Eval big_Q step + (coeff_68 * z^68) + let t270 = circuit_mul(in89, t67); // Eval big_Q step coeff_69 * z^69 + let t271 = circuit_add(t269, t270); // Eval big_Q step + (coeff_69 * z^69) + let t272 = circuit_mul(in90, t68); // Eval big_Q step coeff_70 * z^70 + let t273 = circuit_add(t271, t272); // Eval big_Q step + (coeff_70 * z^70) + let t274 = circuit_mul(in91, t69); // Eval big_Q step coeff_71 * z^71 + let t275 = circuit_add(t273, t274); // Eval big_Q step + (coeff_71 * z^71) + let t276 = circuit_mul(in92, t70); // Eval big_Q step coeff_72 * z^72 + let t277 = circuit_add(t275, t276); // Eval big_Q step + (coeff_72 * z^72) + let t278 = circuit_mul(in93, t71); // Eval big_Q step coeff_73 * z^73 + let t279 = circuit_add(t277, t278); // Eval big_Q step + (coeff_73 * z^73) + let t280 = circuit_mul(in94, t72); // Eval big_Q step coeff_74 * z^74 + let t281 = circuit_add(t279, t280); // Eval big_Q step + (coeff_74 * z^74) + let t282 = circuit_mul(in95, t73); // Eval big_Q step coeff_75 * z^75 + let t283 = circuit_add(t281, t282); // Eval big_Q step + (coeff_75 * z^75) + let t284 = circuit_mul(in96, t74); // Eval big_Q step coeff_76 * z^76 + let t285 = circuit_add(t283, t284); // Eval big_Q step + (coeff_76 * z^76) + let t286 = circuit_mul(in97, t75); // Eval big_Q step coeff_77 * z^77 + let t287 = circuit_add(t285, t286); // Eval big_Q step + (coeff_77 * z^77) + let t288 = circuit_mul(in98, t76); // Eval big_Q step coeff_78 * z^78 + let t289 = circuit_add(t287, t288); // Eval big_Q step + (coeff_78 * z^78) + let t290 = circuit_mul(in99, t77); // Eval big_Q step coeff_79 * z^79 + let t291 = circuit_add(t289, t290); // Eval big_Q step + (coeff_79 * z^79) + let t292 = circuit_mul(in100, t78); // Eval big_Q step coeff_80 * z^80 + let t293 = circuit_add(t291, t292); // Eval big_Q step + (coeff_80 * z^80) + let t294 = circuit_mul(in101, t79); // Eval big_Q step coeff_81 * z^81 + let t295 = circuit_add(t293, t294); // Eval big_Q step + (coeff_81 * z^81) + let t296 = circuit_mul(in102, t80); // Eval big_Q step coeff_82 * z^82 + let t297 = circuit_add(t295, t296); // Eval big_Q step + (coeff_82 * z^82) + let t298 = circuit_mul(in103, t81); // Eval big_Q step coeff_83 * z^83 + let t299 = circuit_add(t297, t298); // Eval big_Q step + (coeff_83 * z^83) + let t300 = circuit_mul(in104, t82); // Eval big_Q step coeff_84 * z^84 + let t301 = circuit_add(t299, t300); // Eval big_Q step + (coeff_84 * z^84) + let t302 = circuit_mul(in105, t83); // Eval big_Q step coeff_85 * z^85 + let t303 = circuit_add(t301, t302); // Eval big_Q step + (coeff_85 * z^85) + let t304 = circuit_mul(in106, t84); // Eval big_Q step coeff_86 * z^86 + let t305 = circuit_add(t303, t304); // Eval big_Q step + (coeff_86 * z^86) + let t306 = circuit_mul(in107, t85); // Eval big_Q step coeff_87 * z^87 + let t307 = circuit_add(t305, t306); // Eval big_Q step + (coeff_87 * z^87) + let t308 = circuit_mul(in108, t86); // Eval big_Q step coeff_88 * z^88 + let t309 = circuit_add(t307, t308); // Eval big_Q step + (coeff_88 * z^88) + let t310 = circuit_mul(in109, t87); // Eval big_Q step coeff_89 * z^89 + let t311 = circuit_add(t309, t310); // Eval big_Q step + (coeff_89 * z^89) + let t312 = circuit_mul(in110, t88); // Eval big_Q step coeff_90 * z^90 + let t313 = circuit_add(t311, t312); // Eval big_Q step + (coeff_90 * z^90) + let t314 = circuit_mul(in111, t89); // Eval big_Q step coeff_91 * z^91 + let t315 = circuit_add(t313, t314); // Eval big_Q step + (coeff_91 * z^91) + let t316 = circuit_mul(in112, t90); // Eval big_Q step coeff_92 * z^92 + let t317 = circuit_add(t315, t316); // Eval big_Q step + (coeff_92 * z^92) + let t318 = circuit_mul(in113, t91); // Eval big_Q step coeff_93 * z^93 + let t319 = circuit_add(t317, t318); // Eval big_Q step + (coeff_93 * z^93) + let t320 = circuit_mul(in114, t92); // Eval big_Q step coeff_94 * z^94 + let t321 = circuit_add(t319, t320); // Eval big_Q step + (coeff_94 * z^94) + let t322 = circuit_mul(in115, t93); // Eval big_Q step coeff_95 * z^95 + let t323 = circuit_add(t321, t322); // Eval big_Q step + (coeff_95 * z^95) + let t324 = circuit_mul(in116, t94); // Eval big_Q step coeff_96 * z^96 + let t325 = circuit_add(t323, t324); // Eval big_Q step + (coeff_96 * z^96) + let t326 = circuit_mul(in117, t95); // Eval big_Q step coeff_97 * z^97 + let t327 = circuit_add(t325, t326); // Eval big_Q step + (coeff_97 * z^97) + let t328 = circuit_mul(in118, t96); // Eval big_Q step coeff_98 * z^98 + let t329 = circuit_add(t327, t328); // Eval big_Q step + (coeff_98 * z^98) + let t330 = circuit_mul(in119, t97); // Eval big_Q step coeff_99 * z^99 + let t331 = circuit_add(t329, t330); // Eval big_Q step + (coeff_99 * z^99) + let t332 = circuit_mul(in120, t98); // Eval big_Q step coeff_100 * z^100 + let t333 = circuit_add(t331, t332); // Eval big_Q step + (coeff_100 * z^100) + let t334 = circuit_mul(in121, t99); // Eval big_Q step coeff_101 * z^101 + let t335 = circuit_add(t333, t334); // Eval big_Q step + (coeff_101 * z^101) + let t336 = circuit_mul(in122, t100); // Eval big_Q step coeff_102 * z^102 + let t337 = circuit_add(t335, t336); // Eval big_Q step + (coeff_102 * z^102) + let t338 = circuit_mul(in123, t101); // Eval big_Q step coeff_103 * z^103 + let t339 = circuit_add(t337, t338); // Eval big_Q step + (coeff_103 * z^103) + let t340 = circuit_mul(in124, t102); // Eval big_Q step coeff_104 * z^104 + let t341 = circuit_add(t339, t340); // Eval big_Q step + (coeff_104 * z^104) + let t342 = circuit_mul(t341, t133); // Q(z) * P(z) + let t343 = circuit_sub(t130, t342); // final_lhs - Q(z) * P(z) let modulus = TryInto::< _, CircuitModulus @@ -2113,7 +3255,7 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( ) .unwrap(); - let mut circuit_inputs = (t238,).new_inputs(); + let mut circuit_inputs = (t343,).new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next([0x2, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs @@ -2153,7 +3295,7 @@ fn run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let final_check: u384 = outputs.get_output(t238); + let final_check: u384 = outputs.get_output(t343); return (final_check,); } fn run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit( @@ -2198,28 +3340,28 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit( let t7 = circuit_mul(t6, in28); // Compute z^9 let t8 = circuit_mul(t7, in28); // Compute z^10 let t9 = circuit_mul(t8, in28); // Compute z^11 - let t10 = circuit_mul(in16, in28); // Eval UnnamedPoly step coeff_1 * z^1 - let t11 = circuit_add(in15, t10); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t12 = circuit_mul(in17, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t13 = circuit_add(t11, t12); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t14 = circuit_mul(in18, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t15 = circuit_add(t13, t14); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t16 = circuit_mul(in19, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t17 = circuit_add(t15, t16); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t18 = circuit_mul(in20, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t19 = circuit_add(t17, t18); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t20 = circuit_mul(in21, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t21 = circuit_add(t19, t20); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t22 = circuit_mul(in22, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t23 = circuit_add(t21, t22); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t24 = circuit_mul(in23, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t25 = circuit_add(t23, t24); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t26 = circuit_mul(in24, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t27 = circuit_add(t25, t26); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t28 = circuit_mul(in25, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t29 = circuit_add(t27, t28); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t30 = circuit_mul(in26, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t31 = circuit_add(t29, t30); // Eval UnnamedPoly step + (coeff_11 * z^11) + let t10 = circuit_mul(in16, in28); // Eval R step coeff_1 * z^1 + let t11 = circuit_add(in15, t10); // Eval R step + (coeff_1 * z^1) + let t12 = circuit_mul(in17, t0); // Eval R step coeff_2 * z^2 + let t13 = circuit_add(t11, t12); // Eval R step + (coeff_2 * z^2) + let t14 = circuit_mul(in18, t1); // Eval R step coeff_3 * z^3 + let t15 = circuit_add(t13, t14); // Eval R step + (coeff_3 * z^3) + let t16 = circuit_mul(in19, t2); // Eval R step coeff_4 * z^4 + let t17 = circuit_add(t15, t16); // Eval R step + (coeff_4 * z^4) + let t18 = circuit_mul(in20, t3); // Eval R step coeff_5 * z^5 + let t19 = circuit_add(t17, t18); // Eval R step + (coeff_5 * z^5) + let t20 = circuit_mul(in21, t4); // Eval R step coeff_6 * z^6 + let t21 = circuit_add(t19, t20); // Eval R step + (coeff_6 * z^6) + let t22 = circuit_mul(in22, t5); // Eval R step coeff_7 * z^7 + let t23 = circuit_add(t21, t22); // Eval R step + (coeff_7 * z^7) + let t24 = circuit_mul(in23, t6); // Eval R step coeff_8 * z^8 + let t25 = circuit_add(t23, t24); // Eval R step + (coeff_8 * z^8) + let t26 = circuit_mul(in24, t7); // Eval R step coeff_9 * z^9 + let t27 = circuit_add(t25, t26); // Eval R step + (coeff_9 * z^9) + let t28 = circuit_mul(in25, t8); // Eval R step coeff_10 * z^10 + let t29 = circuit_add(t27, t28); // Eval R step + (coeff_10 * z^10) + let t30 = circuit_mul(in26, t9); // Eval R step coeff_11 * z^11 + let t31 = circuit_add(t29, t30); // Eval R step + (coeff_11 * z^11) let t32 = circuit_mul(in29, in29); let t33 = circuit_mul(in29, t32); let t34 = circuit_add(in5, in6); @@ -2316,21 +3458,21 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit( let t125 = circuit_add(t123, t124); // Fp2 mul imag part end let t126 = circuit_sub(t122, in7); // Fp2 sub coeff 0/1 let t127 = circuit_sub(t125, in8); // Fp2 sub coeff 1/1 - let t128 = circuit_mul(t66, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t129 = circuit_add(t64, t128); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t130 = circuit_add(t129, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t131 = circuit_mul(t67, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t132 = circuit_add(t130, t131); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t133 = circuit_mul(t68, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t134 = circuit_add(t132, t133); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t128 = circuit_mul(t66, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 + let t129 = circuit_add(t64, t128); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 + let t130 = circuit_add(t129, t1); // Eval sparse poly line_0p_1 step + 1*z^3 + let t131 = circuit_mul(t67, t4); // Eval sparse poly line_0p_1 step coeff_6 * z^6 + let t132 = circuit_add(t130, t131); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 + let t133 = circuit_mul(t68, t6); // Eval sparse poly line_0p_1 step coeff_8 * z^8 + let t134 = circuit_add(t132, t133); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t135 = circuit_mul(t33, t134); - let t136 = circuit_mul(t106, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t137 = circuit_add(t104, t136); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t138 = circuit_add(t137, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t139 = circuit_mul(t107, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t140 = circuit_add(t138, t139); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t141 = circuit_mul(t108, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t142 = circuit_add(t140, t141); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t136 = circuit_mul(t106, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 + let t137 = circuit_add(t104, t136); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 + let t138 = circuit_add(t137, t1); // Eval sparse poly line_0p_2 step + 1*z^3 + let t139 = circuit_mul(t107, t4); // Eval sparse poly line_0p_2 step coeff_6 * z^6 + let t140 = circuit_add(t138, t139); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 + let t141 = circuit_mul(t108, t6); // Eval sparse poly line_0p_2 step coeff_8 * z^8 + let t142 = circuit_add(t140, t141); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t143 = circuit_mul(t135, t142); let t144 = circuit_add(in11, in12); let t145 = circuit_sub(in11, in12); @@ -2426,21 +3568,21 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit( let t235 = circuit_add(t233, t234); // Fp2 mul imag part end let t236 = circuit_sub(t232, in13); // Fp2 sub coeff 0/1 let t237 = circuit_sub(t235, in14); // Fp2 sub coeff 1/1 - let t238 = circuit_mul(t176, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t239 = circuit_add(t174, t238); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t240 = circuit_add(t239, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t241 = circuit_mul(t177, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t242 = circuit_add(t240, t241); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t243 = circuit_mul(t178, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t244 = circuit_add(t242, t243); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t238 = circuit_mul(t176, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 + let t239 = circuit_add(t174, t238); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 + let t240 = circuit_add(t239, t1); // Eval sparse poly line_1p_1 step + 1*z^3 + let t241 = circuit_mul(t177, t4); // Eval sparse poly line_1p_1 step coeff_6 * z^6 + let t242 = circuit_add(t240, t241); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 + let t243 = circuit_mul(t178, t6); // Eval sparse poly line_1p_1 step coeff_8 * z^8 + let t244 = circuit_add(t242, t243); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t245 = circuit_mul(t143, t244); - let t246 = circuit_mul(t216, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t247 = circuit_add(t214, t246); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t248 = circuit_add(t247, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t249 = circuit_mul(t217, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t250 = circuit_add(t248, t249); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t251 = circuit_mul(t218, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t252 = circuit_add(t250, t251); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t246 = circuit_mul(t216, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 + let t247 = circuit_add(t214, t246); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 + let t248 = circuit_add(t247, t1); // Eval sparse poly line_1p_2 step + 1*z^3 + let t249 = circuit_mul(t217, t4); // Eval sparse poly line_1p_2 step coeff_6 * z^6 + let t250 = circuit_add(t248, t249); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 + let t251 = circuit_mul(t218, t6); // Eval sparse poly line_1p_2 step coeff_8 * z^8 + let t252 = circuit_add(t250, t251); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t253 = circuit_mul(t245, t252); let t254 = circuit_sub(t253, t31); let t255 = circuit_mul(in27, t254); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) @@ -2559,28 +3701,28 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( let t7 = circuit_mul(t6, in34); // Compute z^9 let t8 = circuit_mul(t7, in34); // Compute z^10 let t9 = circuit_mul(t8, in34); // Compute z^11 - let t10 = circuit_mul(in22, in34); // Eval UnnamedPoly step coeff_1 * z^1 - let t11 = circuit_add(in21, t10); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t12 = circuit_mul(in23, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t13 = circuit_add(t11, t12); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t14 = circuit_mul(in24, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t15 = circuit_add(t13, t14); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t16 = circuit_mul(in25, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t17 = circuit_add(t15, t16); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t18 = circuit_mul(in26, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t19 = circuit_add(t17, t18); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t20 = circuit_mul(in27, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t21 = circuit_add(t19, t20); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t22 = circuit_mul(in28, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t23 = circuit_add(t21, t22); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t24 = circuit_mul(in29, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t25 = circuit_add(t23, t24); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t26 = circuit_mul(in30, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t27 = circuit_add(t25, t26); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t28 = circuit_mul(in31, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t29 = circuit_add(t27, t28); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t30 = circuit_mul(in32, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t31 = circuit_add(t29, t30); // Eval UnnamedPoly step + (coeff_11 * z^11) + let t10 = circuit_mul(in22, in34); // Eval R step coeff_1 * z^1 + let t11 = circuit_add(in21, t10); // Eval R step + (coeff_1 * z^1) + let t12 = circuit_mul(in23, t0); // Eval R step coeff_2 * z^2 + let t13 = circuit_add(t11, t12); // Eval R step + (coeff_2 * z^2) + let t14 = circuit_mul(in24, t1); // Eval R step coeff_3 * z^3 + let t15 = circuit_add(t13, t14); // Eval R step + (coeff_3 * z^3) + let t16 = circuit_mul(in25, t2); // Eval R step coeff_4 * z^4 + let t17 = circuit_add(t15, t16); // Eval R step + (coeff_4 * z^4) + let t18 = circuit_mul(in26, t3); // Eval R step coeff_5 * z^5 + let t19 = circuit_add(t17, t18); // Eval R step + (coeff_5 * z^5) + let t20 = circuit_mul(in27, t4); // Eval R step coeff_6 * z^6 + let t21 = circuit_add(t19, t20); // Eval R step + (coeff_6 * z^6) + let t22 = circuit_mul(in28, t5); // Eval R step coeff_7 * z^7 + let t23 = circuit_add(t21, t22); // Eval R step + (coeff_7 * z^7) + let t24 = circuit_mul(in29, t6); // Eval R step coeff_8 * z^8 + let t25 = circuit_add(t23, t24); // Eval R step + (coeff_8 * z^8) + let t26 = circuit_mul(in30, t7); // Eval R step coeff_9 * z^9 + let t27 = circuit_add(t25, t26); // Eval R step + (coeff_9 * z^9) + let t28 = circuit_mul(in31, t8); // Eval R step coeff_10 * z^10 + let t29 = circuit_add(t27, t28); // Eval R step + (coeff_10 * z^10) + let t30 = circuit_mul(in32, t9); // Eval R step coeff_11 * z^11 + let t31 = circuit_add(t29, t30); // Eval R step + (coeff_11 * z^11) let t32 = circuit_mul(in35, in35); let t33 = circuit_mul(in35, t32); let t34 = circuit_add(in5, in6); @@ -2677,21 +3819,21 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( let t125 = circuit_add(t123, t124); // Fp2 mul imag part end let t126 = circuit_sub(t122, in7); // Fp2 sub coeff 0/1 let t127 = circuit_sub(t125, in8); // Fp2 sub coeff 1/1 - let t128 = circuit_mul(t66, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t129 = circuit_add(t64, t128); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t130 = circuit_add(t129, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t131 = circuit_mul(t67, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t132 = circuit_add(t130, t131); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t133 = circuit_mul(t68, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t134 = circuit_add(t132, t133); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t128 = circuit_mul(t66, t0); // Eval sparse poly line_0p_1 step coeff_2 * z^2 + let t129 = circuit_add(t64, t128); // Eval sparse poly line_0p_1 step + coeff_2 * z^2 + let t130 = circuit_add(t129, t1); // Eval sparse poly line_0p_1 step + 1*z^3 + let t131 = circuit_mul(t67, t4); // Eval sparse poly line_0p_1 step coeff_6 * z^6 + let t132 = circuit_add(t130, t131); // Eval sparse poly line_0p_1 step + coeff_6 * z^6 + let t133 = circuit_mul(t68, t6); // Eval sparse poly line_0p_1 step coeff_8 * z^8 + let t134 = circuit_add(t132, t133); // Eval sparse poly line_0p_1 step + coeff_8 * z^8 let t135 = circuit_mul(t33, t134); - let t136 = circuit_mul(t106, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t137 = circuit_add(t104, t136); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t138 = circuit_add(t137, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t139 = circuit_mul(t107, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t140 = circuit_add(t138, t139); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t141 = circuit_mul(t108, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t142 = circuit_add(t140, t141); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t136 = circuit_mul(t106, t0); // Eval sparse poly line_0p_2 step coeff_2 * z^2 + let t137 = circuit_add(t104, t136); // Eval sparse poly line_0p_2 step + coeff_2 * z^2 + let t138 = circuit_add(t137, t1); // Eval sparse poly line_0p_2 step + 1*z^3 + let t139 = circuit_mul(t107, t4); // Eval sparse poly line_0p_2 step coeff_6 * z^6 + let t140 = circuit_add(t138, t139); // Eval sparse poly line_0p_2 step + coeff_6 * z^6 + let t141 = circuit_mul(t108, t6); // Eval sparse poly line_0p_2 step coeff_8 * z^8 + let t142 = circuit_add(t140, t141); // Eval sparse poly line_0p_2 step + coeff_8 * z^8 let t143 = circuit_mul(t135, t142); let t144 = circuit_add(in11, in12); let t145 = circuit_sub(in11, in12); @@ -2787,21 +3929,21 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( let t235 = circuit_add(t233, t234); // Fp2 mul imag part end let t236 = circuit_sub(t232, in13); // Fp2 sub coeff 0/1 let t237 = circuit_sub(t235, in14); // Fp2 sub coeff 1/1 - let t238 = circuit_mul(t176, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t239 = circuit_add(t174, t238); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t240 = circuit_add(t239, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t241 = circuit_mul(t177, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t242 = circuit_add(t240, t241); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t243 = circuit_mul(t178, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t244 = circuit_add(t242, t243); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t238 = circuit_mul(t176, t0); // Eval sparse poly line_1p_1 step coeff_2 * z^2 + let t239 = circuit_add(t174, t238); // Eval sparse poly line_1p_1 step + coeff_2 * z^2 + let t240 = circuit_add(t239, t1); // Eval sparse poly line_1p_1 step + 1*z^3 + let t241 = circuit_mul(t177, t4); // Eval sparse poly line_1p_1 step coeff_6 * z^6 + let t242 = circuit_add(t240, t241); // Eval sparse poly line_1p_1 step + coeff_6 * z^6 + let t243 = circuit_mul(t178, t6); // Eval sparse poly line_1p_1 step coeff_8 * z^8 + let t244 = circuit_add(t242, t243); // Eval sparse poly line_1p_1 step + coeff_8 * z^8 let t245 = circuit_mul(t143, t244); - let t246 = circuit_mul(t216, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t247 = circuit_add(t214, t246); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t248 = circuit_add(t247, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t249 = circuit_mul(t217, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t250 = circuit_add(t248, t249); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t251 = circuit_mul(t218, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t252 = circuit_add(t250, t251); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t246 = circuit_mul(t216, t0); // Eval sparse poly line_1p_2 step coeff_2 * z^2 + let t247 = circuit_add(t214, t246); // Eval sparse poly line_1p_2 step + coeff_2 * z^2 + let t248 = circuit_add(t247, t1); // Eval sparse poly line_1p_2 step + 1*z^3 + let t249 = circuit_mul(t217, t4); // Eval sparse poly line_1p_2 step coeff_6 * z^6 + let t250 = circuit_add(t248, t249); // Eval sparse poly line_1p_2 step + coeff_6 * z^6 + let t251 = circuit_mul(t218, t6); // Eval sparse poly line_1p_2 step coeff_8 * z^8 + let t252 = circuit_add(t250, t251); // Eval sparse poly line_1p_2 step + coeff_8 * z^8 let t253 = circuit_mul(t245, t252); let t254 = circuit_add(in17, in18); let t255 = circuit_sub(in17, in18); @@ -2897,21 +4039,21 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( let t345 = circuit_add(t343, t344); // Fp2 mul imag part end let t346 = circuit_sub(t342, in19); // Fp2 sub coeff 0/1 let t347 = circuit_sub(t345, in20); // Fp2 sub coeff 1/1 - let t348 = circuit_mul(t286, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t349 = circuit_add(t284, t348); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t350 = circuit_add(t349, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t351 = circuit_mul(t287, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t352 = circuit_add(t350, t351); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t353 = circuit_mul(t288, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t354 = circuit_add(t352, t353); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t348 = circuit_mul(t286, t0); // Eval sparse poly line_2p_1 step coeff_2 * z^2 + let t349 = circuit_add(t284, t348); // Eval sparse poly line_2p_1 step + coeff_2 * z^2 + let t350 = circuit_add(t349, t1); // Eval sparse poly line_2p_1 step + 1*z^3 + let t351 = circuit_mul(t287, t4); // Eval sparse poly line_2p_1 step coeff_6 * z^6 + let t352 = circuit_add(t350, t351); // Eval sparse poly line_2p_1 step + coeff_6 * z^6 + let t353 = circuit_mul(t288, t6); // Eval sparse poly line_2p_1 step coeff_8 * z^8 + let t354 = circuit_add(t352, t353); // Eval sparse poly line_2p_1 step + coeff_8 * z^8 let t355 = circuit_mul(t253, t354); - let t356 = circuit_mul(t326, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t357 = circuit_add(t324, t356); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t358 = circuit_add(t357, t1); // Eval sparse poly UnnamedPoly step + 1*z^3 - let t359 = circuit_mul(t327, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t360 = circuit_add(t358, t359); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t361 = circuit_mul(t328, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t362 = circuit_add(t360, t361); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 + let t356 = circuit_mul(t326, t0); // Eval sparse poly line_2p_2 step coeff_2 * z^2 + let t357 = circuit_add(t324, t356); // Eval sparse poly line_2p_2 step + coeff_2 * z^2 + let t358 = circuit_add(t357, t1); // Eval sparse poly line_2p_2 step + 1*z^3 + let t359 = circuit_mul(t327, t4); // Eval sparse poly line_2p_2 step coeff_6 * z^6 + let t360 = circuit_add(t358, t359); // Eval sparse poly line_2p_2 step + coeff_6 * z^6 + let t361 = circuit_mul(t328, t6); // Eval sparse poly line_2p_2 step coeff_8 * z^8 + let t362 = circuit_add(t360, t361); // Eval sparse poly line_2p_2 step + coeff_8 * z^8 let t363 = circuit_mul(t355, t362); let t364 = circuit_sub(t363, t31); let t365 = circuit_mul(in33, t364); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) @@ -2928,227 +4070,466 @@ fn run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( ) .unwrap(); - let mut circuit_inputs = ( - t116, t117, t126, t127, t226, t227, t236, t237, t336, t337, t346, t347, t365, t31, - ) - .new_inputs(); + let mut circuit_inputs = ( + t116, t117, t126, t127, t226, t227, t236, t237, t336, t337, t346, t347, t365, t31, + ) + .new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(R_i.w0); + circuit_inputs = circuit_inputs.next(R_i.w1); + circuit_inputs = circuit_inputs.next(R_i.w2); + circuit_inputs = circuit_inputs.next(R_i.w3); + circuit_inputs = circuit_inputs.next(R_i.w4); + circuit_inputs = circuit_inputs.next(R_i.w5); + circuit_inputs = circuit_inputs.next(R_i.w6); + circuit_inputs = circuit_inputs.next(R_i.w7); + circuit_inputs = circuit_inputs.next(R_i.w8); + circuit_inputs = circuit_inputs.next(R_i.w9); + circuit_inputs = circuit_inputs.next(R_i.w10); + circuit_inputs = circuit_inputs.next(R_i.w11); + circuit_inputs = circuit_inputs.next(c0); + circuit_inputs = circuit_inputs.next(z); + circuit_inputs = circuit_inputs.next(c_inv_of_z); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let Q0: G2Point = G2Point { + x0: outputs.get_output(t116), + x1: outputs.get_output(t117), + y0: outputs.get_output(t126), + y1: outputs.get_output(t127) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t226), + x1: outputs.get_output(t227), + y0: outputs.get_output(t236), + y1: outputs.get_output(t237) + }; + let Q2: G2Point = G2Point { + x0: outputs.get_output(t336), + x1: outputs.get_output(t337), + y0: outputs.get_output(t346), + y1: outputs.get_output(t347) + }; + let new_lhs: u384 = outputs.get_output(t365); + let f_i_plus_one_of_z: u384 = outputs.get_output(t31); + return (Q0, Q1, Q2, new_lhs, f_i_plus_one_of_z); +} +fn run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( + lambda_root_inverse: E12D, z: u384, scaling_factor: MillerLoopResultScalingFactor +) -> (u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x0 + let in1 = CE::> {}; // 0x2 + let in2 = CE::< + CI<2> + > {}; // 0x18089593cbf626353947d5b1fd0c6d66bb34bc7585f5abdf8f17b50e12c47d65ce514a7c167b027b600febdb244714c5 + let in3 = CE::< + CI<3> + > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffeffff + let in4 = CE::< + CI<4> + > {}; // 0xd5e1c086ffe8016d063c6dad7a2fffc9072bb5785a686bcefeedc2e0124838bdccf325ee5d80be9902109f7dbc79812 + let in5 = CE::< + CI<5> + > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad + let in6 = CE::< + CI<6> + > {}; // 0x1a0111ea397fe6998ce8d956845e1033efa3bf761f6622e9abc9802928bfc912627c4fd7ed3ffffb5dfb00000001aaaf + let in7 = CE::< + CI<7> + > {}; // 0xb659fb20274bfb1be8ff4d69163c08be7302c4818171fdd17d5be9b1d380acd8c747cdc4aff0e653631f5d3000f022c + let in8 = CE::> {}; // -0x1 % p + let in9 = CE::< + CI<9> + > {}; // 0xfc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3 + let in10 = CE::< + CI<10> + > {}; // 0x1f87c566d89c06511d3d204463f3f70a9428f0f6d8f66dfd8191d92e3ec78be505ab5829ad8fd8459ef1424dbb895e6 + let in11 = CE::< + CI<11> + > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac + let in12 = CE::< + CI<12> + > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 + let in13 = CE::< + CI<13> + > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe + let in14 = CE::< + CI<14> + > {}; // 0x144e4211384586c16bd3ad4afa99cc9170df3560e77982d0db45f3536814f0bd5871c1908bd478cd1ee605167ff82995 + let in15 = CE::< + CI<15> + > {}; // 0xe9b7238370b26e88c8bb2dfb1e7ec4b7d471f3cdb6df2e24f5b1405d978eb56923783226654f19a83cd0a2cfff0a87f + + // INPUT stack + let (in16, in17) = (CE::> {}, CE::> {}); + let (in18, in19) = (CE::> {}, CE::> {}); + let (in20, in21) = (CE::> {}, CE::> {}); + let (in22, in23) = (CE::> {}, CE::> {}); + let (in24, in25) = (CE::> {}, CE::> {}); + let (in26, in27) = (CE::> {}, CE::> {}); + let (in28, in29) = (CE::> {}, CE::> {}); + let (in30, in31) = (CE::> {}, CE::> {}); + let (in32, in33) = (CE::> {}, CE::> {}); + let in34 = CE::> {}; + let t0 = circuit_mul(in28, in28); // Compute z^2 + let t1 = circuit_mul(t0, in28); // Compute z^3 + let t2 = circuit_mul(t1, in28); // Compute z^4 + let t3 = circuit_mul(t2, in28); // Compute z^5 + let t4 = circuit_mul(t3, in28); // Compute z^6 + let t5 = circuit_mul(t4, in28); // Compute z^7 + let t6 = circuit_mul(t5, in28); // Compute z^8 + let t7 = circuit_mul(t6, in28); // Compute z^9 + let t8 = circuit_mul(t7, in28); // Compute z^10 + let t9 = circuit_mul(t8, in28); // Compute z^11 + let t10 = circuit_sub(in0, in17); + let t11 = circuit_sub(in0, in19); + let t12 = circuit_sub(in0, in21); + let t13 = circuit_sub(in0, in23); + let t14 = circuit_sub(in0, in25); + let t15 = circuit_sub(in0, in27); + let t16 = circuit_mul(t10, in28); // Eval C_inv step coeff_1 * z^1 + let t17 = circuit_add(in16, t16); // Eval C_inv step + (coeff_1 * z^1) + let t18 = circuit_mul(in18, t0); // Eval C_inv step coeff_2 * z^2 + let t19 = circuit_add(t17, t18); // Eval C_inv step + (coeff_2 * z^2) + let t20 = circuit_mul(t11, t1); // Eval C_inv step coeff_3 * z^3 + let t21 = circuit_add(t19, t20); // Eval C_inv step + (coeff_3 * z^3) + let t22 = circuit_mul(in20, t2); // Eval C_inv step coeff_4 * z^4 + let t23 = circuit_add(t21, t22); // Eval C_inv step + (coeff_4 * z^4) + let t24 = circuit_mul(t12, t3); // Eval C_inv step coeff_5 * z^5 + let t25 = circuit_add(t23, t24); // Eval C_inv step + (coeff_5 * z^5) + let t26 = circuit_mul(in22, t4); // Eval C_inv step coeff_6 * z^6 + let t27 = circuit_add(t25, t26); // Eval C_inv step + (coeff_6 * z^6) + let t28 = circuit_mul(t13, t5); // Eval C_inv step coeff_7 * z^7 + let t29 = circuit_add(t27, t28); // Eval C_inv step + (coeff_7 * z^7) + let t30 = circuit_mul(in24, t6); // Eval C_inv step coeff_8 * z^8 + let t31 = circuit_add(t29, t30); // Eval C_inv step + (coeff_8 * z^8) + let t32 = circuit_mul(t14, t7); // Eval C_inv step coeff_9 * z^9 + let t33 = circuit_add(t31, t32); // Eval C_inv step + (coeff_9 * z^9) + let t34 = circuit_mul(in26, t8); // Eval C_inv step coeff_10 * z^10 + let t35 = circuit_add(t33, t34); // Eval C_inv step + (coeff_10 * z^10) + let t36 = circuit_mul(t15, t9); // Eval C_inv step coeff_11 * z^11 + let t37 = circuit_add(t35, t36); // Eval C_inv step + (coeff_11 * z^11) + let t38 = circuit_mul(in30, t0); // Eval sparse poly W step coeff_2 * z^2 + let t39 = circuit_add(in29, t38); // Eval sparse poly W step + coeff_2 * z^2 + let t40 = circuit_mul(in31, t2); // Eval sparse poly W step coeff_4 * z^4 + let t41 = circuit_add(t39, t40); // Eval sparse poly W step + coeff_4 * z^4 + let t42 = circuit_mul(in32, t4); // Eval sparse poly W step coeff_6 * z^6 + let t43 = circuit_add(t41, t42); // Eval sparse poly W step + coeff_6 * z^6 + let t44 = circuit_mul(in33, t6); // Eval sparse poly W step coeff_8 * z^8 + let t45 = circuit_add(t43, t44); // Eval sparse poly W step + coeff_8 * z^8 + let t46 = circuit_mul(in34, t8); // Eval sparse poly W step coeff_10 * z^10 + let t47 = circuit_add(t45, t46); // Eval sparse poly W step + coeff_10 * z^10 + let t48 = circuit_mul(in22, in1); + let t49 = circuit_add(in16, t48); + let t50 = circuit_mul(t10, in2); + let t51 = circuit_mul(t13, in2); + let t52 = circuit_add(t50, t51); + let t53 = circuit_mul(in18, in3); + let t54 = circuit_mul(t14, in4); + let t55 = circuit_mul(in20, in5); + let t56 = circuit_mul(in26, in6); + let t57 = circuit_add(t55, t56); + let t58 = circuit_mul(t12, in7); + let t59 = circuit_mul(t15, in7); + let t60 = circuit_add(t58, t59); + let t61 = circuit_mul(in22, in8); + let t62 = circuit_mul(t10, in9); + let t63 = circuit_mul(t13, in10); + let t64 = circuit_add(t62, t63); + let t65 = circuit_mul(in18, in11); + let t66 = circuit_mul(in24, in11); + let t67 = circuit_add(t65, t66); + let t68 = circuit_mul(t11, in12); + let t69 = circuit_mul(in26, in13); + let t70 = circuit_mul(t12, in14); + let t71 = circuit_mul(t15, in15); + let t72 = circuit_add(t70, t71); + let t73 = circuit_mul(t52, in28); // Eval C_inv_frob_1 step coeff_1 * z^1 + let t74 = circuit_add(t49, t73); // Eval C_inv_frob_1 step + (coeff_1 * z^1) + let t75 = circuit_mul(t53, t0); // Eval C_inv_frob_1 step coeff_2 * z^2 + let t76 = circuit_add(t74, t75); // Eval C_inv_frob_1 step + (coeff_2 * z^2) + let t77 = circuit_mul(t54, t1); // Eval C_inv_frob_1 step coeff_3 * z^3 + let t78 = circuit_add(t76, t77); // Eval C_inv_frob_1 step + (coeff_3 * z^3) + let t79 = circuit_mul(t57, t2); // Eval C_inv_frob_1 step coeff_4 * z^4 + let t80 = circuit_add(t78, t79); // Eval C_inv_frob_1 step + (coeff_4 * z^4) + let t81 = circuit_mul(t60, t3); // Eval C_inv_frob_1 step coeff_5 * z^5 + let t82 = circuit_add(t80, t81); // Eval C_inv_frob_1 step + (coeff_5 * z^5) + let t83 = circuit_mul(t61, t4); // Eval C_inv_frob_1 step coeff_6 * z^6 + let t84 = circuit_add(t82, t83); // Eval C_inv_frob_1 step + (coeff_6 * z^6) + let t85 = circuit_mul(t64, t5); // Eval C_inv_frob_1 step coeff_7 * z^7 + let t86 = circuit_add(t84, t85); // Eval C_inv_frob_1 step + (coeff_7 * z^7) + let t87 = circuit_mul(t67, t6); // Eval C_inv_frob_1 step coeff_8 * z^8 + let t88 = circuit_add(t86, t87); // Eval C_inv_frob_1 step + (coeff_8 * z^8) + let t89 = circuit_mul(t68, t7); // Eval C_inv_frob_1 step coeff_9 * z^9 + let t90 = circuit_add(t88, t89); // Eval C_inv_frob_1 step + (coeff_9 * z^9) + let t91 = circuit_mul(t69, t8); // Eval C_inv_frob_1 step coeff_10 * z^10 + let t92 = circuit_add(t90, t91); // Eval C_inv_frob_1 step + (coeff_10 * z^10) + let t93 = circuit_mul(t72, t9); // Eval C_inv_frob_1 step coeff_11 * z^11 + let t94 = circuit_add(t92, t93); // Eval C_inv_frob_1 step + (coeff_11 * z^11) + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [ + 54880396502181392957329877675, + 31935979117156477062286671870, + 20826981314825584179608359615, + 8047903782086192180586325942 + ] + ) + .unwrap(); + + let mut circuit_inputs = (t37, t47, t94,).new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x2, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next( + [ + 0x167b027b600febdb244714c5, + 0x8f17b50e12c47d65ce514a7c, + 0xfd0c6d66bb34bc7585f5abdf, + 0x18089593cbf626353947d5b1 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x620a00022e01fffffffeffff, + 0xddb3a93be6f89688de17d813, + 0xdf76ce51ba69c6076a0f77ea, + 0x5f19672f + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0xe5d80be9902109f7dbc79812, + 0xefeedc2e0124838bdccf325e, + 0xd7a2fffc9072bb5785a686bc, + 0xd5e1c086ffe8016d063c6da + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x4f49fffd8bfd00000000aaad, + 0x897d29650fb85f9b409427eb, + 0x63d4de85aa0d857d89759ad4, + 0x1a0111ea397fe699ec024086 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0xed3ffffb5dfb00000001aaaf, + 0xabc9802928bfc912627c4fd7, + 0x845e1033efa3bf761f6622e9, + 0x1a0111ea397fe6998ce8d956 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x4aff0e653631f5d3000f022c, + 0x17d5be9b1d380acd8c747cdc, + 0x9163c08be7302c4818171fdd, + 0xb659fb20274bfb1be8ff4d6 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0xb153ffffb9feffffffffaaaa, + 0x6730d2a0f6b0f6241eabfffe, + 0x434bacd764774b84f38512bf, + 0x1a0111ea397fe69a4b1ba7b6 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x4d6c7ec22cf78a126ddc4af3, + 0xec0c8ec971f63c5f282d5ac1, + 0x231f9fb854a14787b6c7b36f, + 0xfc3e2b36c4e03288e9e902 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x9ad8fd8459ef1424dbb895e6, + 0xd8191d92e3ec78be505ab582, + 0x463f3f70a9428f0f6d8f66df, + 0x1f87c566d89c06511d3d204 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x4f49fffd8bfd00000000aaac, + 0x897d29650fb85f9b409427eb, + 0x63d4de85aa0d857d89759ad4, + 0x1a0111ea397fe699ec024086 + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x72ec05f4c81084fbede3cc09, + 0x77f76e17009241c5ee67992f, + 0x6bd17ffe48395dabc2d3435e, + 0x6af0e0437ff400b6831e36d + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x620a00022e01fffffffefffe, + 0xddb3a93be6f89688de17d813, + 0xdf76ce51ba69c6076a0f77ea, + 0x5f19672f + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x8bd478cd1ee605167ff82995, + 0xdb45f3536814f0bd5871c190, + 0xfa99cc9170df3560e77982d0, + 0x144e4211384586c16bd3ad4a + ] + ); + circuit_inputs = circuit_inputs + .next( + [ + 0x6654f19a83cd0a2cfff0a87f, + 0x4f5b1405d978eb5692378322, + 0xb1e7ec4b7d471f3cdb6df2e2, + 0xe9b7238370b26e88c8bb2df + ] + ); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w0); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w1); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w2); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w3); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w4); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w5); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w6); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w7); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w8); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w9); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w10); + circuit_inputs = circuit_inputs.next(lambda_root_inverse.w11); + circuit_inputs = circuit_inputs.next(z); + circuit_inputs = circuit_inputs.next(scaling_factor.w0); + circuit_inputs = circuit_inputs.next(scaling_factor.w2); + circuit_inputs = circuit_inputs.next(scaling_factor.w4); + circuit_inputs = circuit_inputs.next(scaling_factor.w6); + circuit_inputs = circuit_inputs.next(scaling_factor.w8); + circuit_inputs = circuit_inputs.next(scaling_factor.w10); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let c_inv_of_z: u384 = outputs.get_output(t37); + let scaling_factor_of_z: u384 = outputs.get_output(t47); + let c_inv_frob_1_of_z: u384 = outputs.get_output(t94); + return (c_inv_of_z, scaling_factor_of_z, c_inv_frob_1_of_z); +} +fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit( + p_0: G1Point, p_1: G1Point +) -> (BLSProcessedPair, BLSProcessedPair) { + // CONSTANT stack + let in0 = CE::> {}; // 0x0 + + // INPUT stack + let (in1, in2) = (CE::> {}, CE::> {}); + let (in3, in4) = (CE::> {}, CE::> {}); + let t0 = circuit_inverse(in2); + let t1 = circuit_mul(in1, t0); + let t2 = circuit_sub(in0, t1); + let t3 = circuit_inverse(in4); + let t4 = circuit_mul(in3, t3); + let t5 = circuit_sub(in0, t4); + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [ + 54880396502181392957329877675, + 31935979117156477062286671870, + 20826981314825584179608359615, + 8047903782086192180586325942 + ] + ) + .unwrap(); + + let mut circuit_inputs = (t0, t2, t3, t5,).new_inputs(); // Prefill constants: - circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(yInv_0); - circuit_inputs = circuit_inputs.next(xNegOverY_0); - circuit_inputs = circuit_inputs.next(Q0.x0); - circuit_inputs = circuit_inputs.next(Q0.x1); - circuit_inputs = circuit_inputs.next(Q0.y0); - circuit_inputs = circuit_inputs.next(Q0.y1); - circuit_inputs = circuit_inputs.next(yInv_1); - circuit_inputs = circuit_inputs.next(xNegOverY_1); - circuit_inputs = circuit_inputs.next(Q1.x0); - circuit_inputs = circuit_inputs.next(Q1.x1); - circuit_inputs = circuit_inputs.next(Q1.y0); - circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(yInv_2); - circuit_inputs = circuit_inputs.next(xNegOverY_2); - circuit_inputs = circuit_inputs.next(Q2.x0); - circuit_inputs = circuit_inputs.next(Q2.x1); - circuit_inputs = circuit_inputs.next(Q2.y0); - circuit_inputs = circuit_inputs.next(Q2.y1); - circuit_inputs = circuit_inputs.next(R_i.w0); - circuit_inputs = circuit_inputs.next(R_i.w1); - circuit_inputs = circuit_inputs.next(R_i.w2); - circuit_inputs = circuit_inputs.next(R_i.w3); - circuit_inputs = circuit_inputs.next(R_i.w4); - circuit_inputs = circuit_inputs.next(R_i.w5); - circuit_inputs = circuit_inputs.next(R_i.w6); - circuit_inputs = circuit_inputs.next(R_i.w7); - circuit_inputs = circuit_inputs.next(R_i.w8); - circuit_inputs = circuit_inputs.next(R_i.w9); - circuit_inputs = circuit_inputs.next(R_i.w10); - circuit_inputs = circuit_inputs.next(R_i.w11); - circuit_inputs = circuit_inputs.next(c0); - circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(c_inv_of_z); + circuit_inputs = circuit_inputs.next(p_0.x); + circuit_inputs = circuit_inputs.next(p_0.y); + circuit_inputs = circuit_inputs.next(p_1.x); + circuit_inputs = circuit_inputs.next(p_1.y); let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let Q0: G2Point = G2Point { - x0: outputs.get_output(t116), - x1: outputs.get_output(t117), - y0: outputs.get_output(t126), - y1: outputs.get_output(t127) - }; - let Q1: G2Point = G2Point { - x0: outputs.get_output(t226), - x1: outputs.get_output(t227), - y0: outputs.get_output(t236), - y1: outputs.get_output(t237) + let p_0: BLSProcessedPair = BLSProcessedPair { + yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2) }; - let Q2: G2Point = G2Point { - x0: outputs.get_output(t336), - x1: outputs.get_output(t337), - y0: outputs.get_output(t346), - y1: outputs.get_output(t347) + let p_1: BLSProcessedPair = BLSProcessedPair { + yInv: outputs.get_output(t3), xNegOverY: outputs.get_output(t5) }; - let new_lhs: u384 = outputs.get_output(t365); - let f_i_plus_one_of_z: u384 = outputs.get_output(t31); - return (Q0, Q1, Q2, new_lhs, f_i_plus_one_of_z); + return (p_0, p_1); } -fn run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( - lambda_root_inverse: E12D, z: u384, scaling_factor: MillerLoopResultScalingFactor -) -> (u384, u384, u384) { +fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit( + p_0: G1Point, p_1: G1Point, p_2: G1Point +) -> (BLSProcessedPair, BLSProcessedPair, BLSProcessedPair) { // CONSTANT stack let in0 = CE::> {}; // 0x0 - let in1 = CE::> {}; // 0x2 - let in2 = CE::< - CI<2> - > {}; // 0x18089593cbf626353947d5b1fd0c6d66bb34bc7585f5abdf8f17b50e12c47d65ce514a7c167b027b600febdb244714c5 - let in3 = CE::< - CI<3> - > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffeffff - let in4 = CE::< - CI<4> - > {}; // 0xd5e1c086ffe8016d063c6dad7a2fffc9072bb5785a686bcefeedc2e0124838bdccf325ee5d80be9902109f7dbc79812 - let in5 = CE::< - CI<5> - > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaad - let in6 = CE::< - CI<6> - > {}; // 0x1a0111ea397fe6998ce8d956845e1033efa3bf761f6622e9abc9802928bfc912627c4fd7ed3ffffb5dfb00000001aaaf - let in7 = CE::< - CI<7> - > {}; // 0xb659fb20274bfb1be8ff4d69163c08be7302c4818171fdd17d5be9b1d380acd8c747cdc4aff0e653631f5d3000f022c - let in8 = CE::> {}; // -0x1 % p - let in9 = CE::< - CI<9> - > {}; // 0xfc3e2b36c4e03288e9e902231f9fb854a14787b6c7b36fec0c8ec971f63c5f282d5ac14d6c7ec22cf78a126ddc4af3 - let in10 = CE::< - CI<10> - > {}; // 0x1f87c566d89c06511d3d204463f3f70a9428f0f6d8f66dfd8191d92e3ec78be505ab5829ad8fd8459ef1424dbb895e6 - let in11 = CE::< - CI<11> - > {}; // 0x1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac - let in12 = CE::< - CI<12> - > {}; // 0x6af0e0437ff400b6831e36d6bd17ffe48395dabc2d3435e77f76e17009241c5ee67992f72ec05f4c81084fbede3cc09 - let in13 = CE::< - CI<13> - > {}; // 0x5f19672fdf76ce51ba69c6076a0f77eaddb3a93be6f89688de17d813620a00022e01fffffffefffe - let in14 = CE::< - CI<14> - > {}; // 0x144e4211384586c16bd3ad4afa99cc9170df3560e77982d0db45f3536814f0bd5871c1908bd478cd1ee605167ff82995 - let in15 = CE::< - CI<15> - > {}; // 0xe9b7238370b26e88c8bb2dfb1e7ec4b7d471f3cdb6df2e24f5b1405d978eb56923783226654f19a83cd0a2cfff0a87f // INPUT stack - let (in16, in17) = (CE::> {}, CE::> {}); - let (in18, in19) = (CE::> {}, CE::> {}); - let (in20, in21) = (CE::> {}, CE::> {}); - let (in22, in23) = (CE::> {}, CE::> {}); - let (in24, in25) = (CE::> {}, CE::> {}); - let (in26, in27) = (CE::> {}, CE::> {}); - let (in28, in29) = (CE::> {}, CE::> {}); - let (in30, in31) = (CE::> {}, CE::> {}); - let (in32, in33) = (CE::> {}, CE::> {}); - let in34 = CE::> {}; - let t0 = circuit_mul(in28, in28); // Compute z^2 - let t1 = circuit_mul(t0, in28); // Compute z^3 - let t2 = circuit_mul(t1, in28); // Compute z^4 - let t3 = circuit_mul(t2, in28); // Compute z^5 - let t4 = circuit_mul(t3, in28); // Compute z^6 - let t5 = circuit_mul(t4, in28); // Compute z^7 - let t6 = circuit_mul(t5, in28); // Compute z^8 - let t7 = circuit_mul(t6, in28); // Compute z^9 - let t8 = circuit_mul(t7, in28); // Compute z^10 - let t9 = circuit_mul(t8, in28); // Compute z^11 - let t10 = circuit_sub(in0, in17); - let t11 = circuit_sub(in0, in19); - let t12 = circuit_sub(in0, in21); - let t13 = circuit_sub(in0, in23); - let t14 = circuit_sub(in0, in25); - let t15 = circuit_sub(in0, in27); - let t16 = circuit_mul(t10, in28); // Eval UnnamedPoly step coeff_1 * z^1 - let t17 = circuit_add(in16, t16); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t18 = circuit_mul(in18, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t19 = circuit_add(t17, t18); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t20 = circuit_mul(t11, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t21 = circuit_add(t19, t20); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t22 = circuit_mul(in20, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t23 = circuit_add(t21, t22); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t24 = circuit_mul(t12, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t25 = circuit_add(t23, t24); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t26 = circuit_mul(in22, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t27 = circuit_add(t25, t26); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t28 = circuit_mul(t13, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t29 = circuit_add(t27, t28); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t30 = circuit_mul(in24, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t31 = circuit_add(t29, t30); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t32 = circuit_mul(t14, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t33 = circuit_add(t31, t32); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t34 = circuit_mul(in26, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t35 = circuit_add(t33, t34); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t36 = circuit_mul(t15, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t37 = circuit_add(t35, t36); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t38 = circuit_mul(in30, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t39 = circuit_add(in29, t38); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t40 = circuit_mul(in31, t2); // Eval sparse poly UnnamedPoly step coeff_4 * z^4 - let t41 = circuit_add(t39, t40); // Eval sparse poly UnnamedPoly step + coeff_4 * z^4 - let t42 = circuit_mul(in32, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t43 = circuit_add(t41, t42); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t44 = circuit_mul(in33, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t45 = circuit_add(t43, t44); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t46 = circuit_mul(in34, t8); // Eval sparse poly UnnamedPoly step coeff_10 * z^10 - let t47 = circuit_add(t45, t46); // Eval sparse poly UnnamedPoly step + coeff_10 * z^10 - let t48 = circuit_mul(in22, in1); - let t49 = circuit_add(in16, t48); - let t50 = circuit_mul(t10, in2); - let t51 = circuit_mul(t13, in2); - let t52 = circuit_add(t50, t51); - let t53 = circuit_mul(in18, in3); - let t54 = circuit_mul(t14, in4); - let t55 = circuit_mul(in20, in5); - let t56 = circuit_mul(in26, in6); - let t57 = circuit_add(t55, t56); - let t58 = circuit_mul(t12, in7); - let t59 = circuit_mul(t15, in7); - let t60 = circuit_add(t58, t59); - let t61 = circuit_mul(in22, in8); - let t62 = circuit_mul(t10, in9); - let t63 = circuit_mul(t13, in10); - let t64 = circuit_add(t62, t63); - let t65 = circuit_mul(in18, in11); - let t66 = circuit_mul(in24, in11); - let t67 = circuit_add(t65, t66); - let t68 = circuit_mul(t11, in12); - let t69 = circuit_mul(in26, in13); - let t70 = circuit_mul(t12, in14); - let t71 = circuit_mul(t15, in15); - let t72 = circuit_add(t70, t71); - let t73 = circuit_mul(t52, in28); // Eval UnnamedPoly step coeff_1 * z^1 - let t74 = circuit_add(t49, t73); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t75 = circuit_mul(t53, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t76 = circuit_add(t74, t75); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t77 = circuit_mul(t54, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t78 = circuit_add(t76, t77); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t79 = circuit_mul(t57, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t80 = circuit_add(t78, t79); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t81 = circuit_mul(t60, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t82 = circuit_add(t80, t81); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t83 = circuit_mul(t61, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t84 = circuit_add(t82, t83); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t85 = circuit_mul(t64, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t86 = circuit_add(t84, t85); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t87 = circuit_mul(t67, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t88 = circuit_add(t86, t87); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t89 = circuit_mul(t68, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t90 = circuit_add(t88, t89); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t91 = circuit_mul(t69, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t92 = circuit_add(t90, t91); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t93 = circuit_mul(t72, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t94 = circuit_add(t92, t93); // Eval UnnamedPoly step + (coeff_11 * z^11) + let (in1, in2) = (CE::> {}, CE::> {}); + let (in3, in4) = (CE::> {}, CE::> {}); + let (in5, in6) = (CE::> {}, CE::> {}); + let t0 = circuit_inverse(in2); + let t1 = circuit_mul(in1, t0); + let t2 = circuit_sub(in0, t1); + let t3 = circuit_inverse(in4); + let t4 = circuit_mul(in3, t3); + let t5 = circuit_sub(in0, t4); + let t6 = circuit_inverse(in6); + let t7 = circuit_mul(in5, t6); + let t8 = circuit_sub(in0, t7); let modulus = TryInto::< _, CircuitModulus @@ -3162,269 +4543,984 @@ fn run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( ) .unwrap(); - let mut circuit_inputs = (t37, t47, t94,).new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x2, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next( - [ - 0x167b027b600febdb244714c5, - 0x8f17b50e12c47d65ce514a7c, - 0xfd0c6d66bb34bc7585f5abdf, - 0x18089593cbf626353947d5b1 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x620a00022e01fffffffeffff, - 0xddb3a93be6f89688de17d813, - 0xdf76ce51ba69c6076a0f77ea, - 0x5f19672f - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0xe5d80be9902109f7dbc79812, - 0xefeedc2e0124838bdccf325e, - 0xd7a2fffc9072bb5785a686bc, - 0xd5e1c086ffe8016d063c6da - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x4f49fffd8bfd00000000aaad, - 0x897d29650fb85f9b409427eb, - 0x63d4de85aa0d857d89759ad4, - 0x1a0111ea397fe699ec024086 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0xed3ffffb5dfb00000001aaaf, - 0xabc9802928bfc912627c4fd7, - 0x845e1033efa3bf761f6622e9, - 0x1a0111ea397fe6998ce8d956 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x4aff0e653631f5d3000f022c, - 0x17d5be9b1d380acd8c747cdc, - 0x9163c08be7302c4818171fdd, - 0xb659fb20274bfb1be8ff4d6 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0xb153ffffb9feffffffffaaaa, - 0x6730d2a0f6b0f6241eabfffe, - 0x434bacd764774b84f38512bf, - 0x1a0111ea397fe69a4b1ba7b6 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x4d6c7ec22cf78a126ddc4af3, - 0xec0c8ec971f63c5f282d5ac1, - 0x231f9fb854a14787b6c7b36f, - 0xfc3e2b36c4e03288e9e902 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x9ad8fd8459ef1424dbb895e6, - 0xd8191d92e3ec78be505ab582, - 0x463f3f70a9428f0f6d8f66df, - 0x1f87c566d89c06511d3d204 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x4f49fffd8bfd00000000aaac, - 0x897d29650fb85f9b409427eb, - 0x63d4de85aa0d857d89759ad4, - 0x1a0111ea397fe699ec024086 - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x72ec05f4c81084fbede3cc09, - 0x77f76e17009241c5ee67992f, - 0x6bd17ffe48395dabc2d3435e, - 0x6af0e0437ff400b6831e36d - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x620a00022e01fffffffefffe, - 0xddb3a93be6f89688de17d813, - 0xdf76ce51ba69c6076a0f77ea, - 0x5f19672f - ] - ); - circuit_inputs = circuit_inputs - .next( - [ - 0x8bd478cd1ee605167ff82995, - 0xdb45f3536814f0bd5871c190, - 0xfa99cc9170df3560e77982d0, - 0x144e4211384586c16bd3ad4a - ] - ); + let mut circuit_inputs = (t0, t2, t3, t5, t6, t8,).new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(p_0.x); + circuit_inputs = circuit_inputs.next(p_0.y); + circuit_inputs = circuit_inputs.next(p_1.x); + circuit_inputs = circuit_inputs.next(p_1.y); + circuit_inputs = circuit_inputs.next(p_2.x); + circuit_inputs = circuit_inputs.next(p_2.y); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let p_0: BLSProcessedPair = BLSProcessedPair { + yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2) + }; + let p_1: BLSProcessedPair = BLSProcessedPair { + yInv: outputs.get_output(t3), xNegOverY: outputs.get_output(t5) + }; + let p_2: BLSProcessedPair = BLSProcessedPair { + yInv: outputs.get_output(t6), xNegOverY: outputs.get_output(t8) + }; + return (p_0, p_1, p_2); +} +fn run_BN254_MP_CHECK_BIT00_LOOP_2_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + lhs_i: u384, + f_i_of_z: u384, + f_i_plus_one: E12D, + ci: u384, + z: u384 +) -> (G2Point, G2Point, u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x3 + let in1 = CE::> {}; // 0x6 + let in2 = CE::> {}; // 0x0 + let in3 = CE::> {}; // -0x9 % p + let in4 = CE::> {}; // 0x1 + + // INPUT stack + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in32, in32); // Compute z^2 + let t1 = circuit_mul(t0, in32); // Compute z^3 + let t2 = circuit_mul(t1, in32); // Compute z^4 + let t3 = circuit_mul(t2, in32); // Compute z^5 + let t4 = circuit_mul(t3, in32); // Compute z^6 + let t5 = circuit_mul(t4, in32); // Compute z^7 + let t6 = circuit_mul(t5, in32); // Compute z^8 + let t7 = circuit_mul(t6, in32); // Compute z^9 + let t8 = circuit_mul(t7, in32); // Compute z^10 + let t9 = circuit_mul(t8, in32); // Compute z^11 + let t10 = circuit_mul(in31, in31); // Compute c_i = (c_(i-1))^2 + let t11 = circuit_mul(in18, in18); // Square f evaluation in Z, the result of previous bit. + let t12 = circuit_add(in7, in8); // Doubling slope numerator start + let t13 = circuit_sub(in7, in8); + let t14 = circuit_mul(t12, t13); + let t15 = circuit_mul(in7, in8); + let t16 = circuit_mul(t14, in0); + let t17 = circuit_mul(t15, in1); // Doubling slope numerator end + let t18 = circuit_add(in9, in9); // Fp2 add coeff 0/1 + let t19 = circuit_add(in10, in10); // Fp2 add coeff 1/1 + let t20 = circuit_mul(t18, t18); // Fp2 Div x/y start : Fp2 Inv y start + let t21 = circuit_mul(t19, t19); + let t22 = circuit_add(t20, t21); + let t23 = circuit_inverse(t22); + let t24 = circuit_mul(t18, t23); // Fp2 Inv y real part end + let t25 = circuit_mul(t19, t23); + let t26 = circuit_sub(in2, t25); // Fp2 Inv y imag part end + let t27 = circuit_mul(t16, t24); // Fp2 mul start + let t28 = circuit_mul(t17, t26); + let t29 = circuit_sub(t27, t28); // Fp2 mul real part end + let t30 = circuit_mul(t16, t26); + let t31 = circuit_mul(t17, t24); + let t32 = circuit_add(t30, t31); // Fp2 mul imag part end + let t33 = circuit_add(t29, t32); + let t34 = circuit_sub(t29, t32); + let t35 = circuit_mul(t33, t34); + let t36 = circuit_mul(t29, t32); + let t37 = circuit_add(t36, t36); + let t38 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t39 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t40 = circuit_sub(t35, t38); // Fp2 sub coeff 0/1 + let t41 = circuit_sub(t37, t39); // Fp2 sub coeff 1/1 + let t42 = circuit_sub(in7, t40); // Fp2 sub coeff 0/1 + let t43 = circuit_sub(in8, t41); // Fp2 sub coeff 1/1 + let t44 = circuit_mul(t29, t42); // Fp2 mul start + let t45 = circuit_mul(t32, t43); + let t46 = circuit_sub(t44, t45); // Fp2 mul real part end + let t47 = circuit_mul(t29, t43); + let t48 = circuit_mul(t32, t42); + let t49 = circuit_add(t47, t48); // Fp2 mul imag part end + let t50 = circuit_sub(t46, in9); // Fp2 sub coeff 0/1 + let t51 = circuit_sub(t49, in10); // Fp2 sub coeff 1/1 + let t52 = circuit_mul(t29, in7); // Fp2 mul start + let t53 = circuit_mul(t32, in8); + let t54 = circuit_sub(t52, t53); // Fp2 mul real part end + let t55 = circuit_mul(t29, in8); + let t56 = circuit_mul(t32, in7); + let t57 = circuit_add(t55, t56); // Fp2 mul imag part end + let t58 = circuit_sub(t54, in9); // Fp2 sub coeff 0/1 + let t59 = circuit_sub(t57, in10); // Fp2 sub coeff 1/1 + let t60 = circuit_mul(in3, t32); + let t61 = circuit_add(t29, t60); + let t62 = circuit_mul(t61, in6); + let t63 = circuit_mul(in3, t59); + let t64 = circuit_add(t58, t63); + let t65 = circuit_mul(t64, in5); + let t66 = circuit_mul(t32, in6); + let t67 = circuit_mul(t59, in5); + let t68 = circuit_mul(t62, in32); // Eval sparse poly line_0 step coeff_1 * z^1 + let t69 = circuit_add(in4, t68); // Eval sparse poly line_0 step + coeff_1 * z^1 + let t70 = circuit_mul(t65, t1); // Eval sparse poly line_0 step coeff_3 * z^3 + let t71 = circuit_add(t69, t70); // Eval sparse poly line_0 step + coeff_3 * z^3 + let t72 = circuit_mul(t66, t5); // Eval sparse poly line_0 step coeff_7 * z^7 + let t73 = circuit_add(t71, t72); // Eval sparse poly line_0 step + coeff_7 * z^7 + let t74 = circuit_mul(t67, t7); // Eval sparse poly line_0 step coeff_9 * z^9 + let t75 = circuit_add(t73, t74); // Eval sparse poly line_0 step + coeff_9 * z^9 + let t76 = circuit_mul(t11, t75); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) + let t77 = circuit_add(in13, in14); // Doubling slope numerator start + let t78 = circuit_sub(in13, in14); + let t79 = circuit_mul(t77, t78); + let t80 = circuit_mul(in13, in14); + let t81 = circuit_mul(t79, in0); + let t82 = circuit_mul(t80, in1); // Doubling slope numerator end + let t83 = circuit_add(in15, in15); // Fp2 add coeff 0/1 + let t84 = circuit_add(in16, in16); // Fp2 add coeff 1/1 + let t85 = circuit_mul(t83, t83); // Fp2 Div x/y start : Fp2 Inv y start + let t86 = circuit_mul(t84, t84); + let t87 = circuit_add(t85, t86); + let t88 = circuit_inverse(t87); + let t89 = circuit_mul(t83, t88); // Fp2 Inv y real part end + let t90 = circuit_mul(t84, t88); + let t91 = circuit_sub(in2, t90); // Fp2 Inv y imag part end + let t92 = circuit_mul(t81, t89); // Fp2 mul start + let t93 = circuit_mul(t82, t91); + let t94 = circuit_sub(t92, t93); // Fp2 mul real part end + let t95 = circuit_mul(t81, t91); + let t96 = circuit_mul(t82, t89); + let t97 = circuit_add(t95, t96); // Fp2 mul imag part end + let t98 = circuit_add(t94, t97); + let t99 = circuit_sub(t94, t97); + let t100 = circuit_mul(t98, t99); + let t101 = circuit_mul(t94, t97); + let t102 = circuit_add(t101, t101); + let t103 = circuit_add(in13, in13); // Fp2 add coeff 0/1 + let t104 = circuit_add(in14, in14); // Fp2 add coeff 1/1 + let t105 = circuit_sub(t100, t103); // Fp2 sub coeff 0/1 + let t106 = circuit_sub(t102, t104); // Fp2 sub coeff 1/1 + let t107 = circuit_sub(in13, t105); // Fp2 sub coeff 0/1 + let t108 = circuit_sub(in14, t106); // Fp2 sub coeff 1/1 + let t109 = circuit_mul(t94, t107); // Fp2 mul start + let t110 = circuit_mul(t97, t108); + let t111 = circuit_sub(t109, t110); // Fp2 mul real part end + let t112 = circuit_mul(t94, t108); + let t113 = circuit_mul(t97, t107); + let t114 = circuit_add(t112, t113); // Fp2 mul imag part end + let t115 = circuit_sub(t111, in15); // Fp2 sub coeff 0/1 + let t116 = circuit_sub(t114, in16); // Fp2 sub coeff 1/1 + let t117 = circuit_mul(t94, in13); // Fp2 mul start + let t118 = circuit_mul(t97, in14); + let t119 = circuit_sub(t117, t118); // Fp2 mul real part end + let t120 = circuit_mul(t94, in14); + let t121 = circuit_mul(t97, in13); + let t122 = circuit_add(t120, t121); // Fp2 mul imag part end + let t123 = circuit_sub(t119, in15); // Fp2 sub coeff 0/1 + let t124 = circuit_sub(t122, in16); // Fp2 sub coeff 1/1 + let t125 = circuit_mul(in3, t97); + let t126 = circuit_add(t94, t125); + let t127 = circuit_mul(t126, in12); + let t128 = circuit_mul(in3, t124); + let t129 = circuit_add(t123, t128); + let t130 = circuit_mul(t129, in11); + let t131 = circuit_mul(t97, in12); + let t132 = circuit_mul(t124, in11); + let t133 = circuit_mul(t127, in32); // Eval sparse poly line_1 step coeff_1 * z^1 + let t134 = circuit_add(in4, t133); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t135 = circuit_mul(t130, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t136 = circuit_add(t134, t135); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t137 = circuit_mul(t131, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t138 = circuit_add(t136, t137); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t139 = circuit_mul(t132, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t140 = circuit_add(t138, t139); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t141 = circuit_mul(t76, t140); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) + let t142 = circuit_mul( + t141, t141 + ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 + let t143 = circuit_add(t40, t41); // Doubling slope numerator start + let t144 = circuit_sub(t40, t41); + let t145 = circuit_mul(t143, t144); + let t146 = circuit_mul(t40, t41); + let t147 = circuit_mul(t145, in0); + let t148 = circuit_mul(t146, in1); // Doubling slope numerator end + let t149 = circuit_add(t50, t50); // Fp2 add coeff 0/1 + let t150 = circuit_add(t51, t51); // Fp2 add coeff 1/1 + let t151 = circuit_mul(t149, t149); // Fp2 Div x/y start : Fp2 Inv y start + let t152 = circuit_mul(t150, t150); + let t153 = circuit_add(t151, t152); + let t154 = circuit_inverse(t153); + let t155 = circuit_mul(t149, t154); // Fp2 Inv y real part end + let t156 = circuit_mul(t150, t154); + let t157 = circuit_sub(in2, t156); // Fp2 Inv y imag part end + let t158 = circuit_mul(t147, t155); // Fp2 mul start + let t159 = circuit_mul(t148, t157); + let t160 = circuit_sub(t158, t159); // Fp2 mul real part end + let t161 = circuit_mul(t147, t157); + let t162 = circuit_mul(t148, t155); + let t163 = circuit_add(t161, t162); // Fp2 mul imag part end + let t164 = circuit_add(t160, t163); + let t165 = circuit_sub(t160, t163); + let t166 = circuit_mul(t164, t165); + let t167 = circuit_mul(t160, t163); + let t168 = circuit_add(t167, t167); + let t169 = circuit_add(t40, t40); // Fp2 add coeff 0/1 + let t170 = circuit_add(t41, t41); // Fp2 add coeff 1/1 + let t171 = circuit_sub(t166, t169); // Fp2 sub coeff 0/1 + let t172 = circuit_sub(t168, t170); // Fp2 sub coeff 1/1 + let t173 = circuit_sub(t40, t171); // Fp2 sub coeff 0/1 + let t174 = circuit_sub(t41, t172); // Fp2 sub coeff 1/1 + let t175 = circuit_mul(t160, t173); // Fp2 mul start + let t176 = circuit_mul(t163, t174); + let t177 = circuit_sub(t175, t176); // Fp2 mul real part end + let t178 = circuit_mul(t160, t174); + let t179 = circuit_mul(t163, t173); + let t180 = circuit_add(t178, t179); // Fp2 mul imag part end + let t181 = circuit_sub(t177, t50); // Fp2 sub coeff 0/1 + let t182 = circuit_sub(t180, t51); // Fp2 sub coeff 1/1 + let t183 = circuit_mul(t160, t40); // Fp2 mul start + let t184 = circuit_mul(t163, t41); + let t185 = circuit_sub(t183, t184); // Fp2 mul real part end + let t186 = circuit_mul(t160, t41); + let t187 = circuit_mul(t163, t40); + let t188 = circuit_add(t186, t187); // Fp2 mul imag part end + let t189 = circuit_sub(t185, t50); // Fp2 sub coeff 0/1 + let t190 = circuit_sub(t188, t51); // Fp2 sub coeff 1/1 + let t191 = circuit_mul(in3, t163); + let t192 = circuit_add(t160, t191); + let t193 = circuit_mul(t192, in6); + let t194 = circuit_mul(in3, t190); + let t195 = circuit_add(t189, t194); + let t196 = circuit_mul(t195, in5); + let t197 = circuit_mul(t163, in6); + let t198 = circuit_mul(t190, in5); + let t199 = circuit_mul(t193, in32); // Eval sparse poly line_0 step coeff_1 * z^1 + let t200 = circuit_add(in4, t199); // Eval sparse poly line_0 step + coeff_1 * z^1 + let t201 = circuit_mul(t196, t1); // Eval sparse poly line_0 step coeff_3 * z^3 + let t202 = circuit_add(t200, t201); // Eval sparse poly line_0 step + coeff_3 * z^3 + let t203 = circuit_mul(t197, t5); // Eval sparse poly line_0 step coeff_7 * z^7 + let t204 = circuit_add(t202, t203); // Eval sparse poly line_0 step + coeff_7 * z^7 + let t205 = circuit_mul(t198, t7); // Eval sparse poly line_0 step coeff_9 * z^9 + let t206 = circuit_add(t204, t205); // Eval sparse poly line_0 step + coeff_9 * z^9 + let t207 = circuit_mul(t142, t206); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_0(z) + let t208 = circuit_add(t105, t106); // Doubling slope numerator start + let t209 = circuit_sub(t105, t106); + let t210 = circuit_mul(t208, t209); + let t211 = circuit_mul(t105, t106); + let t212 = circuit_mul(t210, in0); + let t213 = circuit_mul(t211, in1); // Doubling slope numerator end + let t214 = circuit_add(t115, t115); // Fp2 add coeff 0/1 + let t215 = circuit_add(t116, t116); // Fp2 add coeff 1/1 + let t216 = circuit_mul(t214, t214); // Fp2 Div x/y start : Fp2 Inv y start + let t217 = circuit_mul(t215, t215); + let t218 = circuit_add(t216, t217); + let t219 = circuit_inverse(t218); + let t220 = circuit_mul(t214, t219); // Fp2 Inv y real part end + let t221 = circuit_mul(t215, t219); + let t222 = circuit_sub(in2, t221); // Fp2 Inv y imag part end + let t223 = circuit_mul(t212, t220); // Fp2 mul start + let t224 = circuit_mul(t213, t222); + let t225 = circuit_sub(t223, t224); // Fp2 mul real part end + let t226 = circuit_mul(t212, t222); + let t227 = circuit_mul(t213, t220); + let t228 = circuit_add(t226, t227); // Fp2 mul imag part end + let t229 = circuit_add(t225, t228); + let t230 = circuit_sub(t225, t228); + let t231 = circuit_mul(t229, t230); + let t232 = circuit_mul(t225, t228); + let t233 = circuit_add(t232, t232); + let t234 = circuit_add(t105, t105); // Fp2 add coeff 0/1 + let t235 = circuit_add(t106, t106); // Fp2 add coeff 1/1 + let t236 = circuit_sub(t231, t234); // Fp2 sub coeff 0/1 + let t237 = circuit_sub(t233, t235); // Fp2 sub coeff 1/1 + let t238 = circuit_sub(t105, t236); // Fp2 sub coeff 0/1 + let t239 = circuit_sub(t106, t237); // Fp2 sub coeff 1/1 + let t240 = circuit_mul(t225, t238); // Fp2 mul start + let t241 = circuit_mul(t228, t239); + let t242 = circuit_sub(t240, t241); // Fp2 mul real part end + let t243 = circuit_mul(t225, t239); + let t244 = circuit_mul(t228, t238); + let t245 = circuit_add(t243, t244); // Fp2 mul imag part end + let t246 = circuit_sub(t242, t115); // Fp2 sub coeff 0/1 + let t247 = circuit_sub(t245, t116); // Fp2 sub coeff 1/1 + let t248 = circuit_mul(t225, t105); // Fp2 mul start + let t249 = circuit_mul(t228, t106); + let t250 = circuit_sub(t248, t249); // Fp2 mul real part end + let t251 = circuit_mul(t225, t106); + let t252 = circuit_mul(t228, t105); + let t253 = circuit_add(t251, t252); // Fp2 mul imag part end + let t254 = circuit_sub(t250, t115); // Fp2 sub coeff 0/1 + let t255 = circuit_sub(t253, t116); // Fp2 sub coeff 1/1 + let t256 = circuit_mul(in3, t228); + let t257 = circuit_add(t225, t256); + let t258 = circuit_mul(t257, in12); + let t259 = circuit_mul(in3, t255); + let t260 = circuit_add(t254, t259); + let t261 = circuit_mul(t260, in11); + let t262 = circuit_mul(t228, in12); + let t263 = circuit_mul(t255, in11); + let t264 = circuit_mul(t258, in32); // Eval sparse poly line_1 step coeff_1 * z^1 + let t265 = circuit_add(in4, t264); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t266 = circuit_mul(t261, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t267 = circuit_add(t265, t266); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t268 = circuit_mul(t262, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t269 = circuit_add(t267, t268); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t270 = circuit_mul(t263, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t271 = circuit_add(t269, t270); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t272 = circuit_mul(t207, t271); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_1(z) + let t273 = circuit_mul(in20, in32); // Eval R step coeff_1 * z^1 + let t274 = circuit_add(in19, t273); // Eval R step + (coeff_1 * z^1) + let t275 = circuit_mul(in21, t0); // Eval R step coeff_2 * z^2 + let t276 = circuit_add(t274, t275); // Eval R step + (coeff_2 * z^2) + let t277 = circuit_mul(in22, t1); // Eval R step coeff_3 * z^3 + let t278 = circuit_add(t276, t277); // Eval R step + (coeff_3 * z^3) + let t279 = circuit_mul(in23, t2); // Eval R step coeff_4 * z^4 + let t280 = circuit_add(t278, t279); // Eval R step + (coeff_4 * z^4) + let t281 = circuit_mul(in24, t3); // Eval R step coeff_5 * z^5 + let t282 = circuit_add(t280, t281); // Eval R step + (coeff_5 * z^5) + let t283 = circuit_mul(in25, t4); // Eval R step coeff_6 * z^6 + let t284 = circuit_add(t282, t283); // Eval R step + (coeff_6 * z^6) + let t285 = circuit_mul(in26, t5); // Eval R step coeff_7 * z^7 + let t286 = circuit_add(t284, t285); // Eval R step + (coeff_7 * z^7) + let t287 = circuit_mul(in27, t6); // Eval R step coeff_8 * z^8 + let t288 = circuit_add(t286, t287); // Eval R step + (coeff_8 * z^8) + let t289 = circuit_mul(in28, t7); // Eval R step coeff_9 * z^9 + let t290 = circuit_add(t288, t289); // Eval R step + (coeff_9 * z^9) + let t291 = circuit_mul(in29, t8); // Eval R step coeff_10 * z^10 + let t292 = circuit_add(t290, t291); // Eval R step + (coeff_10 * z^10) + let t293 = circuit_mul(in30, t9); // Eval R step coeff_11 * z^11 + let t294 = circuit_add(t292, t293); // Eval R step + (coeff_11 * z^11) + let t295 = circuit_sub(t272, t294); // (Π(i,k) (Pk(z))) - Ri(z) + let t296 = circuit_mul(t10, t295); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t297 = circuit_add(in17, t296); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t171, t172, t181, t182, t236, t237, t246, t247, t294, t297, t10,) + .new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs - .next( - [ - 0x6654f19a83cd0a2cfff0a87f, - 0x4f5b1405d978eb5692378322, - 0xb1e7ec4b7d471f3cdb6df2e2, - 0xe9b7238370b26e88c8bb2df - ] - ); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w0); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w1); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w2); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w3); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w4); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w5); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w6); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w7); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w8); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w9); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w10); - circuit_inputs = circuit_inputs.next(lambda_root_inverse.w11); + .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(lhs_i); + circuit_inputs = circuit_inputs.next(f_i_of_z); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w1); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w2); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w3); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w4); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w5); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w6); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w7); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w8); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); + circuit_inputs = circuit_inputs.next(ci); circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(scaling_factor.w0); - circuit_inputs = circuit_inputs.next(scaling_factor.w2); - circuit_inputs = circuit_inputs.next(scaling_factor.w4); - circuit_inputs = circuit_inputs.next(scaling_factor.w6); - circuit_inputs = circuit_inputs.next(scaling_factor.w8); - circuit_inputs = circuit_inputs.next(scaling_factor.w10); let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let c_inv_of_z: u384 = outputs.get_output(t37); - let scaling_factor_of_z: u384 = outputs.get_output(t47); - let c_inv_frob_1_of_z: u384 = outputs.get_output(t94); - return (c_inv_of_z, scaling_factor_of_z, c_inv_frob_1_of_z); + let Q0: G2Point = G2Point { + x0: outputs.get_output(t171), + x1: outputs.get_output(t172), + y0: outputs.get_output(t181), + y1: outputs.get_output(t182) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t236), + x1: outputs.get_output(t237), + y0: outputs.get_output(t246), + y1: outputs.get_output(t247) + }; + let f_i_plus_one_of_z: u384 = outputs.get_output(t294); + let lhs_i_plus_one: u384 = outputs.get_output(t297); + let ci_plus_one: u384 = outputs.get_output(t10); + return (Q0, Q1, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); } -fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit( - p_0: G1Point, p_1: G1Point -) -> (BLSProcessedPair, BLSProcessedPair) { +fn run_BN254_MP_CHECK_BIT00_LOOP_3_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + yInv_2: u384, + xNegOverY_2: u384, + Q2: G2Point, + lhs_i: u384, + f_i_of_z: u384, + f_i_plus_one: E12D, + ci: u384, + z: u384 +) -> (G2Point, G2Point, G2Point, u384, u384, u384) { // CONSTANT stack - let in0 = CE::> {}; // 0x0 + let in0 = CE::> {}; // 0x3 + let in1 = CE::> {}; // 0x6 + let in2 = CE::> {}; // 0x0 + let in3 = CE::> {}; // -0x9 % p + let in4 = CE::> {}; // 0x1 // INPUT stack - let (in1, in2) = (CE::> {}, CE::> {}); - let (in3, in4) = (CE::> {}, CE::> {}); - let t0 = circuit_inverse(in2); - let t1 = circuit_mul(in1, t0); - let t2 = circuit_sub(in0, t1); - let t3 = circuit_inverse(in4); - let t4 = circuit_mul(in3, t3); - let t5 = circuit_sub(in0, t4); + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let (in33, in34) = (CE::> {}, CE::> {}); + let (in35, in36) = (CE::> {}, CE::> {}); + let (in37, in38) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in38, in38); // Compute z^2 + let t1 = circuit_mul(t0, in38); // Compute z^3 + let t2 = circuit_mul(t1, in38); // Compute z^4 + let t3 = circuit_mul(t2, in38); // Compute z^5 + let t4 = circuit_mul(t3, in38); // Compute z^6 + let t5 = circuit_mul(t4, in38); // Compute z^7 + let t6 = circuit_mul(t5, in38); // Compute z^8 + let t7 = circuit_mul(t6, in38); // Compute z^9 + let t8 = circuit_mul(t7, in38); // Compute z^10 + let t9 = circuit_mul(t8, in38); // Compute z^11 + let t10 = circuit_mul(in37, in37); // Compute c_i = (c_(i-1))^2 + let t11 = circuit_mul(in24, in24); // Square f evaluation in Z, the result of previous bit. + let t12 = circuit_add(in7, in8); // Doubling slope numerator start + let t13 = circuit_sub(in7, in8); + let t14 = circuit_mul(t12, t13); + let t15 = circuit_mul(in7, in8); + let t16 = circuit_mul(t14, in0); + let t17 = circuit_mul(t15, in1); // Doubling slope numerator end + let t18 = circuit_add(in9, in9); // Fp2 add coeff 0/1 + let t19 = circuit_add(in10, in10); // Fp2 add coeff 1/1 + let t20 = circuit_mul(t18, t18); // Fp2 Div x/y start : Fp2 Inv y start + let t21 = circuit_mul(t19, t19); + let t22 = circuit_add(t20, t21); + let t23 = circuit_inverse(t22); + let t24 = circuit_mul(t18, t23); // Fp2 Inv y real part end + let t25 = circuit_mul(t19, t23); + let t26 = circuit_sub(in2, t25); // Fp2 Inv y imag part end + let t27 = circuit_mul(t16, t24); // Fp2 mul start + let t28 = circuit_mul(t17, t26); + let t29 = circuit_sub(t27, t28); // Fp2 mul real part end + let t30 = circuit_mul(t16, t26); + let t31 = circuit_mul(t17, t24); + let t32 = circuit_add(t30, t31); // Fp2 mul imag part end + let t33 = circuit_add(t29, t32); + let t34 = circuit_sub(t29, t32); + let t35 = circuit_mul(t33, t34); + let t36 = circuit_mul(t29, t32); + let t37 = circuit_add(t36, t36); + let t38 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t39 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t40 = circuit_sub(t35, t38); // Fp2 sub coeff 0/1 + let t41 = circuit_sub(t37, t39); // Fp2 sub coeff 1/1 + let t42 = circuit_sub(in7, t40); // Fp2 sub coeff 0/1 + let t43 = circuit_sub(in8, t41); // Fp2 sub coeff 1/1 + let t44 = circuit_mul(t29, t42); // Fp2 mul start + let t45 = circuit_mul(t32, t43); + let t46 = circuit_sub(t44, t45); // Fp2 mul real part end + let t47 = circuit_mul(t29, t43); + let t48 = circuit_mul(t32, t42); + let t49 = circuit_add(t47, t48); // Fp2 mul imag part end + let t50 = circuit_sub(t46, in9); // Fp2 sub coeff 0/1 + let t51 = circuit_sub(t49, in10); // Fp2 sub coeff 1/1 + let t52 = circuit_mul(t29, in7); // Fp2 mul start + let t53 = circuit_mul(t32, in8); + let t54 = circuit_sub(t52, t53); // Fp2 mul real part end + let t55 = circuit_mul(t29, in8); + let t56 = circuit_mul(t32, in7); + let t57 = circuit_add(t55, t56); // Fp2 mul imag part end + let t58 = circuit_sub(t54, in9); // Fp2 sub coeff 0/1 + let t59 = circuit_sub(t57, in10); // Fp2 sub coeff 1/1 + let t60 = circuit_mul(in3, t32); + let t61 = circuit_add(t29, t60); + let t62 = circuit_mul(t61, in6); + let t63 = circuit_mul(in3, t59); + let t64 = circuit_add(t58, t63); + let t65 = circuit_mul(t64, in5); + let t66 = circuit_mul(t32, in6); + let t67 = circuit_mul(t59, in5); + let t68 = circuit_mul(t62, in38); // Eval sparse poly line_0 step coeff_1 * z^1 + let t69 = circuit_add(in4, t68); // Eval sparse poly line_0 step + coeff_1 * z^1 + let t70 = circuit_mul(t65, t1); // Eval sparse poly line_0 step coeff_3 * z^3 + let t71 = circuit_add(t69, t70); // Eval sparse poly line_0 step + coeff_3 * z^3 + let t72 = circuit_mul(t66, t5); // Eval sparse poly line_0 step coeff_7 * z^7 + let t73 = circuit_add(t71, t72); // Eval sparse poly line_0 step + coeff_7 * z^7 + let t74 = circuit_mul(t67, t7); // Eval sparse poly line_0 step coeff_9 * z^9 + let t75 = circuit_add(t73, t74); // Eval sparse poly line_0 step + coeff_9 * z^9 + let t76 = circuit_mul(t11, t75); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_0(z) + let t77 = circuit_add(in13, in14); // Doubling slope numerator start + let t78 = circuit_sub(in13, in14); + let t79 = circuit_mul(t77, t78); + let t80 = circuit_mul(in13, in14); + let t81 = circuit_mul(t79, in0); + let t82 = circuit_mul(t80, in1); // Doubling slope numerator end + let t83 = circuit_add(in15, in15); // Fp2 add coeff 0/1 + let t84 = circuit_add(in16, in16); // Fp2 add coeff 1/1 + let t85 = circuit_mul(t83, t83); // Fp2 Div x/y start : Fp2 Inv y start + let t86 = circuit_mul(t84, t84); + let t87 = circuit_add(t85, t86); + let t88 = circuit_inverse(t87); + let t89 = circuit_mul(t83, t88); // Fp2 Inv y real part end + let t90 = circuit_mul(t84, t88); + let t91 = circuit_sub(in2, t90); // Fp2 Inv y imag part end + let t92 = circuit_mul(t81, t89); // Fp2 mul start + let t93 = circuit_mul(t82, t91); + let t94 = circuit_sub(t92, t93); // Fp2 mul real part end + let t95 = circuit_mul(t81, t91); + let t96 = circuit_mul(t82, t89); + let t97 = circuit_add(t95, t96); // Fp2 mul imag part end + let t98 = circuit_add(t94, t97); + let t99 = circuit_sub(t94, t97); + let t100 = circuit_mul(t98, t99); + let t101 = circuit_mul(t94, t97); + let t102 = circuit_add(t101, t101); + let t103 = circuit_add(in13, in13); // Fp2 add coeff 0/1 + let t104 = circuit_add(in14, in14); // Fp2 add coeff 1/1 + let t105 = circuit_sub(t100, t103); // Fp2 sub coeff 0/1 + let t106 = circuit_sub(t102, t104); // Fp2 sub coeff 1/1 + let t107 = circuit_sub(in13, t105); // Fp2 sub coeff 0/1 + let t108 = circuit_sub(in14, t106); // Fp2 sub coeff 1/1 + let t109 = circuit_mul(t94, t107); // Fp2 mul start + let t110 = circuit_mul(t97, t108); + let t111 = circuit_sub(t109, t110); // Fp2 mul real part end + let t112 = circuit_mul(t94, t108); + let t113 = circuit_mul(t97, t107); + let t114 = circuit_add(t112, t113); // Fp2 mul imag part end + let t115 = circuit_sub(t111, in15); // Fp2 sub coeff 0/1 + let t116 = circuit_sub(t114, in16); // Fp2 sub coeff 1/1 + let t117 = circuit_mul(t94, in13); // Fp2 mul start + let t118 = circuit_mul(t97, in14); + let t119 = circuit_sub(t117, t118); // Fp2 mul real part end + let t120 = circuit_mul(t94, in14); + let t121 = circuit_mul(t97, in13); + let t122 = circuit_add(t120, t121); // Fp2 mul imag part end + let t123 = circuit_sub(t119, in15); // Fp2 sub coeff 0/1 + let t124 = circuit_sub(t122, in16); // Fp2 sub coeff 1/1 + let t125 = circuit_mul(in3, t97); + let t126 = circuit_add(t94, t125); + let t127 = circuit_mul(t126, in12); + let t128 = circuit_mul(in3, t124); + let t129 = circuit_add(t123, t128); + let t130 = circuit_mul(t129, in11); + let t131 = circuit_mul(t97, in12); + let t132 = circuit_mul(t124, in11); + let t133 = circuit_mul(t127, in38); // Eval sparse poly line_1 step coeff_1 * z^1 + let t134 = circuit_add(in4, t133); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t135 = circuit_mul(t130, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t136 = circuit_add(t134, t135); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t137 = circuit_mul(t131, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t138 = circuit_add(t136, t137); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t139 = circuit_mul(t132, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t140 = circuit_add(t138, t139); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t141 = circuit_mul(t76, t140); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_1(z) + let t142 = circuit_add(in19, in20); // Doubling slope numerator start + let t143 = circuit_sub(in19, in20); + let t144 = circuit_mul(t142, t143); + let t145 = circuit_mul(in19, in20); + let t146 = circuit_mul(t144, in0); + let t147 = circuit_mul(t145, in1); // Doubling slope numerator end + let t148 = circuit_add(in21, in21); // Fp2 add coeff 0/1 + let t149 = circuit_add(in22, in22); // Fp2 add coeff 1/1 + let t150 = circuit_mul(t148, t148); // Fp2 Div x/y start : Fp2 Inv y start + let t151 = circuit_mul(t149, t149); + let t152 = circuit_add(t150, t151); + let t153 = circuit_inverse(t152); + let t154 = circuit_mul(t148, t153); // Fp2 Inv y real part end + let t155 = circuit_mul(t149, t153); + let t156 = circuit_sub(in2, t155); // Fp2 Inv y imag part end + let t157 = circuit_mul(t146, t154); // Fp2 mul start + let t158 = circuit_mul(t147, t156); + let t159 = circuit_sub(t157, t158); // Fp2 mul real part end + let t160 = circuit_mul(t146, t156); + let t161 = circuit_mul(t147, t154); + let t162 = circuit_add(t160, t161); // Fp2 mul imag part end + let t163 = circuit_add(t159, t162); + let t164 = circuit_sub(t159, t162); + let t165 = circuit_mul(t163, t164); + let t166 = circuit_mul(t159, t162); + let t167 = circuit_add(t166, t166); + let t168 = circuit_add(in19, in19); // Fp2 add coeff 0/1 + let t169 = circuit_add(in20, in20); // Fp2 add coeff 1/1 + let t170 = circuit_sub(t165, t168); // Fp2 sub coeff 0/1 + let t171 = circuit_sub(t167, t169); // Fp2 sub coeff 1/1 + let t172 = circuit_sub(in19, t170); // Fp2 sub coeff 0/1 + let t173 = circuit_sub(in20, t171); // Fp2 sub coeff 1/1 + let t174 = circuit_mul(t159, t172); // Fp2 mul start + let t175 = circuit_mul(t162, t173); + let t176 = circuit_sub(t174, t175); // Fp2 mul real part end + let t177 = circuit_mul(t159, t173); + let t178 = circuit_mul(t162, t172); + let t179 = circuit_add(t177, t178); // Fp2 mul imag part end + let t180 = circuit_sub(t176, in21); // Fp2 sub coeff 0/1 + let t181 = circuit_sub(t179, in22); // Fp2 sub coeff 1/1 + let t182 = circuit_mul(t159, in19); // Fp2 mul start + let t183 = circuit_mul(t162, in20); + let t184 = circuit_sub(t182, t183); // Fp2 mul real part end + let t185 = circuit_mul(t159, in20); + let t186 = circuit_mul(t162, in19); + let t187 = circuit_add(t185, t186); // Fp2 mul imag part end + let t188 = circuit_sub(t184, in21); // Fp2 sub coeff 0/1 + let t189 = circuit_sub(t187, in22); // Fp2 sub coeff 1/1 + let t190 = circuit_mul(in3, t162); + let t191 = circuit_add(t159, t190); + let t192 = circuit_mul(t191, in18); + let t193 = circuit_mul(in3, t189); + let t194 = circuit_add(t188, t193); + let t195 = circuit_mul(t194, in17); + let t196 = circuit_mul(t162, in18); + let t197 = circuit_mul(t189, in17); + let t198 = circuit_mul(t192, in38); // Eval sparse poly line_2 step coeff_1 * z^1 + let t199 = circuit_add(in4, t198); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t200 = circuit_mul(t195, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t201 = circuit_add(t199, t200); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t202 = circuit_mul(t196, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t203 = circuit_add(t201, t202); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t204 = circuit_mul(t197, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t205 = circuit_add(t203, t204); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t206 = circuit_mul(t141, t205); // Mul (f(z)^2 * Π_0_k-1(line_k(z))) * line_i_2(z) + let t207 = circuit_mul( + t206, t206 + ); // Compute (f^2 * Π(i,k) (line_i,k(z))) ^ 2 = f^4 * (Π(i,k) (line_i,k(z)))^2 + let t208 = circuit_add(t40, t41); // Doubling slope numerator start + let t209 = circuit_sub(t40, t41); + let t210 = circuit_mul(t208, t209); + let t211 = circuit_mul(t40, t41); + let t212 = circuit_mul(t210, in0); + let t213 = circuit_mul(t211, in1); // Doubling slope numerator end + let t214 = circuit_add(t50, t50); // Fp2 add coeff 0/1 + let t215 = circuit_add(t51, t51); // Fp2 add coeff 1/1 + let t216 = circuit_mul(t214, t214); // Fp2 Div x/y start : Fp2 Inv y start + let t217 = circuit_mul(t215, t215); + let t218 = circuit_add(t216, t217); + let t219 = circuit_inverse(t218); + let t220 = circuit_mul(t214, t219); // Fp2 Inv y real part end + let t221 = circuit_mul(t215, t219); + let t222 = circuit_sub(in2, t221); // Fp2 Inv y imag part end + let t223 = circuit_mul(t212, t220); // Fp2 mul start + let t224 = circuit_mul(t213, t222); + let t225 = circuit_sub(t223, t224); // Fp2 mul real part end + let t226 = circuit_mul(t212, t222); + let t227 = circuit_mul(t213, t220); + let t228 = circuit_add(t226, t227); // Fp2 mul imag part end + let t229 = circuit_add(t225, t228); + let t230 = circuit_sub(t225, t228); + let t231 = circuit_mul(t229, t230); + let t232 = circuit_mul(t225, t228); + let t233 = circuit_add(t232, t232); + let t234 = circuit_add(t40, t40); // Fp2 add coeff 0/1 + let t235 = circuit_add(t41, t41); // Fp2 add coeff 1/1 + let t236 = circuit_sub(t231, t234); // Fp2 sub coeff 0/1 + let t237 = circuit_sub(t233, t235); // Fp2 sub coeff 1/1 + let t238 = circuit_sub(t40, t236); // Fp2 sub coeff 0/1 + let t239 = circuit_sub(t41, t237); // Fp2 sub coeff 1/1 + let t240 = circuit_mul(t225, t238); // Fp2 mul start + let t241 = circuit_mul(t228, t239); + let t242 = circuit_sub(t240, t241); // Fp2 mul real part end + let t243 = circuit_mul(t225, t239); + let t244 = circuit_mul(t228, t238); + let t245 = circuit_add(t243, t244); // Fp2 mul imag part end + let t246 = circuit_sub(t242, t50); // Fp2 sub coeff 0/1 + let t247 = circuit_sub(t245, t51); // Fp2 sub coeff 1/1 + let t248 = circuit_mul(t225, t40); // Fp2 mul start + let t249 = circuit_mul(t228, t41); + let t250 = circuit_sub(t248, t249); // Fp2 mul real part end + let t251 = circuit_mul(t225, t41); + let t252 = circuit_mul(t228, t40); + let t253 = circuit_add(t251, t252); // Fp2 mul imag part end + let t254 = circuit_sub(t250, t50); // Fp2 sub coeff 0/1 + let t255 = circuit_sub(t253, t51); // Fp2 sub coeff 1/1 + let t256 = circuit_mul(in3, t228); + let t257 = circuit_add(t225, t256); + let t258 = circuit_mul(t257, in6); + let t259 = circuit_mul(in3, t255); + let t260 = circuit_add(t254, t259); + let t261 = circuit_mul(t260, in5); + let t262 = circuit_mul(t228, in6); + let t263 = circuit_mul(t255, in5); + let t264 = circuit_mul(t258, in38); // Eval sparse poly line_0 step coeff_1 * z^1 + let t265 = circuit_add(in4, t264); // Eval sparse poly line_0 step + coeff_1 * z^1 + let t266 = circuit_mul(t261, t1); // Eval sparse poly line_0 step coeff_3 * z^3 + let t267 = circuit_add(t265, t266); // Eval sparse poly line_0 step + coeff_3 * z^3 + let t268 = circuit_mul(t262, t5); // Eval sparse poly line_0 step coeff_7 * z^7 + let t269 = circuit_add(t267, t268); // Eval sparse poly line_0 step + coeff_7 * z^7 + let t270 = circuit_mul(t263, t7); // Eval sparse poly line_0 step coeff_9 * z^9 + let t271 = circuit_add(t269, t270); // Eval sparse poly line_0 step + coeff_9 * z^9 + let t272 = circuit_mul(t207, t271); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_0(z) + let t273 = circuit_add(t105, t106); // Doubling slope numerator start + let t274 = circuit_sub(t105, t106); + let t275 = circuit_mul(t273, t274); + let t276 = circuit_mul(t105, t106); + let t277 = circuit_mul(t275, in0); + let t278 = circuit_mul(t276, in1); // Doubling slope numerator end + let t279 = circuit_add(t115, t115); // Fp2 add coeff 0/1 + let t280 = circuit_add(t116, t116); // Fp2 add coeff 1/1 + let t281 = circuit_mul(t279, t279); // Fp2 Div x/y start : Fp2 Inv y start + let t282 = circuit_mul(t280, t280); + let t283 = circuit_add(t281, t282); + let t284 = circuit_inverse(t283); + let t285 = circuit_mul(t279, t284); // Fp2 Inv y real part end + let t286 = circuit_mul(t280, t284); + let t287 = circuit_sub(in2, t286); // Fp2 Inv y imag part end + let t288 = circuit_mul(t277, t285); // Fp2 mul start + let t289 = circuit_mul(t278, t287); + let t290 = circuit_sub(t288, t289); // Fp2 mul real part end + let t291 = circuit_mul(t277, t287); + let t292 = circuit_mul(t278, t285); + let t293 = circuit_add(t291, t292); // Fp2 mul imag part end + let t294 = circuit_add(t290, t293); + let t295 = circuit_sub(t290, t293); + let t296 = circuit_mul(t294, t295); + let t297 = circuit_mul(t290, t293); + let t298 = circuit_add(t297, t297); + let t299 = circuit_add(t105, t105); // Fp2 add coeff 0/1 + let t300 = circuit_add(t106, t106); // Fp2 add coeff 1/1 + let t301 = circuit_sub(t296, t299); // Fp2 sub coeff 0/1 + let t302 = circuit_sub(t298, t300); // Fp2 sub coeff 1/1 + let t303 = circuit_sub(t105, t301); // Fp2 sub coeff 0/1 + let t304 = circuit_sub(t106, t302); // Fp2 sub coeff 1/1 + let t305 = circuit_mul(t290, t303); // Fp2 mul start + let t306 = circuit_mul(t293, t304); + let t307 = circuit_sub(t305, t306); // Fp2 mul real part end + let t308 = circuit_mul(t290, t304); + let t309 = circuit_mul(t293, t303); + let t310 = circuit_add(t308, t309); // Fp2 mul imag part end + let t311 = circuit_sub(t307, t115); // Fp2 sub coeff 0/1 + let t312 = circuit_sub(t310, t116); // Fp2 sub coeff 1/1 + let t313 = circuit_mul(t290, t105); // Fp2 mul start + let t314 = circuit_mul(t293, t106); + let t315 = circuit_sub(t313, t314); // Fp2 mul real part end + let t316 = circuit_mul(t290, t106); + let t317 = circuit_mul(t293, t105); + let t318 = circuit_add(t316, t317); // Fp2 mul imag part end + let t319 = circuit_sub(t315, t115); // Fp2 sub coeff 0/1 + let t320 = circuit_sub(t318, t116); // Fp2 sub coeff 1/1 + let t321 = circuit_mul(in3, t293); + let t322 = circuit_add(t290, t321); + let t323 = circuit_mul(t322, in12); + let t324 = circuit_mul(in3, t320); + let t325 = circuit_add(t319, t324); + let t326 = circuit_mul(t325, in11); + let t327 = circuit_mul(t293, in12); + let t328 = circuit_mul(t320, in11); + let t329 = circuit_mul(t323, in38); // Eval sparse poly line_1 step coeff_1 * z^1 + let t330 = circuit_add(in4, t329); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t331 = circuit_mul(t326, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t332 = circuit_add(t330, t331); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t333 = circuit_mul(t327, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t334 = circuit_add(t332, t333); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t335 = circuit_mul(t328, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t336 = circuit_add(t334, t335); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t337 = circuit_mul(t272, t336); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_1(z) + let t338 = circuit_add(t170, t171); // Doubling slope numerator start + let t339 = circuit_sub(t170, t171); + let t340 = circuit_mul(t338, t339); + let t341 = circuit_mul(t170, t171); + let t342 = circuit_mul(t340, in0); + let t343 = circuit_mul(t341, in1); // Doubling slope numerator end + let t344 = circuit_add(t180, t180); // Fp2 add coeff 0/1 + let t345 = circuit_add(t181, t181); // Fp2 add coeff 1/1 + let t346 = circuit_mul(t344, t344); // Fp2 Div x/y start : Fp2 Inv y start + let t347 = circuit_mul(t345, t345); + let t348 = circuit_add(t346, t347); + let t349 = circuit_inverse(t348); + let t350 = circuit_mul(t344, t349); // Fp2 Inv y real part end + let t351 = circuit_mul(t345, t349); + let t352 = circuit_sub(in2, t351); // Fp2 Inv y imag part end + let t353 = circuit_mul(t342, t350); // Fp2 mul start + let t354 = circuit_mul(t343, t352); + let t355 = circuit_sub(t353, t354); // Fp2 mul real part end + let t356 = circuit_mul(t342, t352); + let t357 = circuit_mul(t343, t350); + let t358 = circuit_add(t356, t357); // Fp2 mul imag part end + let t359 = circuit_add(t355, t358); + let t360 = circuit_sub(t355, t358); + let t361 = circuit_mul(t359, t360); + let t362 = circuit_mul(t355, t358); + let t363 = circuit_add(t362, t362); + let t364 = circuit_add(t170, t170); // Fp2 add coeff 0/1 + let t365 = circuit_add(t171, t171); // Fp2 add coeff 1/1 + let t366 = circuit_sub(t361, t364); // Fp2 sub coeff 0/1 + let t367 = circuit_sub(t363, t365); // Fp2 sub coeff 1/1 + let t368 = circuit_sub(t170, t366); // Fp2 sub coeff 0/1 + let t369 = circuit_sub(t171, t367); // Fp2 sub coeff 1/1 + let t370 = circuit_mul(t355, t368); // Fp2 mul start + let t371 = circuit_mul(t358, t369); + let t372 = circuit_sub(t370, t371); // Fp2 mul real part end + let t373 = circuit_mul(t355, t369); + let t374 = circuit_mul(t358, t368); + let t375 = circuit_add(t373, t374); // Fp2 mul imag part end + let t376 = circuit_sub(t372, t180); // Fp2 sub coeff 0/1 + let t377 = circuit_sub(t375, t181); // Fp2 sub coeff 1/1 + let t378 = circuit_mul(t355, t170); // Fp2 mul start + let t379 = circuit_mul(t358, t171); + let t380 = circuit_sub(t378, t379); // Fp2 mul real part end + let t381 = circuit_mul(t355, t171); + let t382 = circuit_mul(t358, t170); + let t383 = circuit_add(t381, t382); // Fp2 mul imag part end + let t384 = circuit_sub(t380, t180); // Fp2 sub coeff 0/1 + let t385 = circuit_sub(t383, t181); // Fp2 sub coeff 1/1 + let t386 = circuit_mul(in3, t358); + let t387 = circuit_add(t355, t386); + let t388 = circuit_mul(t387, in18); + let t389 = circuit_mul(in3, t385); + let t390 = circuit_add(t384, t389); + let t391 = circuit_mul(t390, in17); + let t392 = circuit_mul(t358, in18); + let t393 = circuit_mul(t385, in17); + let t394 = circuit_mul(t388, in38); // Eval sparse poly line_2 step coeff_1 * z^1 + let t395 = circuit_add(in4, t394); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t396 = circuit_mul(t391, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t397 = circuit_add(t395, t396); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t398 = circuit_mul(t392, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t399 = circuit_add(t397, t398); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t400 = circuit_mul(t393, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t401 = circuit_add(t399, t400); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t402 = circuit_mul(t337, t401); // Mul (f^4 * (Π(i,k) (line_i,k(z)))^2) * line_i+1_2(z) + let t403 = circuit_mul(in26, in38); // Eval R step coeff_1 * z^1 + let t404 = circuit_add(in25, t403); // Eval R step + (coeff_1 * z^1) + let t405 = circuit_mul(in27, t0); // Eval R step coeff_2 * z^2 + let t406 = circuit_add(t404, t405); // Eval R step + (coeff_2 * z^2) + let t407 = circuit_mul(in28, t1); // Eval R step coeff_3 * z^3 + let t408 = circuit_add(t406, t407); // Eval R step + (coeff_3 * z^3) + let t409 = circuit_mul(in29, t2); // Eval R step coeff_4 * z^4 + let t410 = circuit_add(t408, t409); // Eval R step + (coeff_4 * z^4) + let t411 = circuit_mul(in30, t3); // Eval R step coeff_5 * z^5 + let t412 = circuit_add(t410, t411); // Eval R step + (coeff_5 * z^5) + let t413 = circuit_mul(in31, t4); // Eval R step coeff_6 * z^6 + let t414 = circuit_add(t412, t413); // Eval R step + (coeff_6 * z^6) + let t415 = circuit_mul(in32, t5); // Eval R step coeff_7 * z^7 + let t416 = circuit_add(t414, t415); // Eval R step + (coeff_7 * z^7) + let t417 = circuit_mul(in33, t6); // Eval R step coeff_8 * z^8 + let t418 = circuit_add(t416, t417); // Eval R step + (coeff_8 * z^8) + let t419 = circuit_mul(in34, t7); // Eval R step coeff_9 * z^9 + let t420 = circuit_add(t418, t419); // Eval R step + (coeff_9 * z^9) + let t421 = circuit_mul(in35, t8); // Eval R step coeff_10 * z^10 + let t422 = circuit_add(t420, t421); // Eval R step + (coeff_10 * z^10) + let t423 = circuit_mul(in36, t9); // Eval R step coeff_11 * z^11 + let t424 = circuit_add(t422, t423); // Eval R step + (coeff_11 * z^11) + let t425 = circuit_sub(t402, t424); // (Π(i,k) (Pk(z))) - Ri(z) + let t426 = circuit_mul(t10, t425); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t427 = circuit_add(in23, t426); // LHS = LHS + ci * ((Π(i,k) (Pk(z)) - Ri(z)) let modulus = TryInto::< _, CircuitModulus >::try_into( - [ - 54880396502181392957329877675, - 31935979117156477062286671870, - 20826981314825584179608359615, - 8047903782086192180586325942 - ] + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] ) .unwrap(); - let mut circuit_inputs = (t0, t2, t3, t5,).new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(p_0.x); - circuit_inputs = circuit_inputs.next(p_0.y); - circuit_inputs = circuit_inputs.next(p_1.x); - circuit_inputs = circuit_inputs.next(p_1.y); - - let outputs = match circuit_inputs.done().eval(modulus) { - Result::Ok(outputs) => { outputs }, - Result::Err(_) => { panic!("Expected success") } - }; - let p_0: BLSProcessedPair = BLSProcessedPair { - yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2) - }; - let p_1: BLSProcessedPair = BLSProcessedPair { - yInv: outputs.get_output(t3), xNegOverY: outputs.get_output(t5) - }; - return (p_0, p_1); -} -fn run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit( - p_0: G1Point, p_1: G1Point, p_2: G1Point -) -> (BLSProcessedPair, BLSProcessedPair, BLSProcessedPair) { - // CONSTANT stack - let in0 = CE::> {}; // 0x0 - - // INPUT stack - let (in1, in2) = (CE::> {}, CE::> {}); - let (in3, in4) = (CE::> {}, CE::> {}); - let (in5, in6) = (CE::> {}, CE::> {}); - let t0 = circuit_inverse(in2); - let t1 = circuit_mul(in1, t0); - let t2 = circuit_sub(in0, t1); - let t3 = circuit_inverse(in4); - let t4 = circuit_mul(in3, t3); - let t5 = circuit_sub(in0, t4); - let t6 = circuit_inverse(in6); - let t7 = circuit_mul(in5, t6); - let t8 = circuit_sub(in0, t7); - - let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [ - 54880396502181392957329877675, - 31935979117156477062286671870, - 20826981314825584179608359615, - 8047903782086192180586325942 - ] + let mut circuit_inputs = ( + t236, t237, t246, t247, t301, t302, t311, t312, t366, t367, t376, t377, t424, t427, t10, ) - .unwrap(); - - let mut circuit_inputs = (t0, t2, t3, t5, t6, t8,).new_inputs(); + .new_inputs(); // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(p_0.x); - circuit_inputs = circuit_inputs.next(p_0.y); - circuit_inputs = circuit_inputs.next(p_1.x); - circuit_inputs = circuit_inputs.next(p_1.y); - circuit_inputs = circuit_inputs.next(p_2.x); - circuit_inputs = circuit_inputs.next(p_2.y); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(lhs_i); + circuit_inputs = circuit_inputs.next(f_i_of_z); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w1); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w2); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w3); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w4); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w5); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w6); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w7); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w8); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); + circuit_inputs = circuit_inputs.next(ci); + circuit_inputs = circuit_inputs.next(z); let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let p_0: BLSProcessedPair = BLSProcessedPair { - yInv: outputs.get_output(t0), xNegOverY: outputs.get_output(t2) + let Q0: G2Point = G2Point { + x0: outputs.get_output(t236), + x1: outputs.get_output(t237), + y0: outputs.get_output(t246), + y1: outputs.get_output(t247) }; - let p_1: BLSProcessedPair = BLSProcessedPair { - yInv: outputs.get_output(t3), xNegOverY: outputs.get_output(t5) + let Q1: G2Point = G2Point { + x0: outputs.get_output(t301), + x1: outputs.get_output(t302), + y0: outputs.get_output(t311), + y1: outputs.get_output(t312) }; - let p_2: BLSProcessedPair = BLSProcessedPair { - yInv: outputs.get_output(t6), xNegOverY: outputs.get_output(t8) + let Q2: G2Point = G2Point { + x0: outputs.get_output(t366), + x1: outputs.get_output(t367), + y0: outputs.get_output(t376), + y1: outputs.get_output(t377) }; - return (p_0, p_1, p_2); + let f_i_plus_one_of_z: u384 = outputs.get_output(t424); + let lhs_i_plus_one: u384 = outputs.get_output(t427); + let ci_plus_one: u384 = outputs.get_output(t10); + return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); } fn run_BN254_MP_CHECK_BIT0_LOOP_2_circuit( yInv_0: u384, @@ -3976,13 +6072,401 @@ fn run_BN254_MP_CHECK_BIT0_LOOP_3_circuit( ) .unwrap(); - let mut circuit_inputs = ( - t40, t41, t50, t51, t105, t106, t115, t116, t170, t171, t180, t181, t228, t231, t10, - ) + let mut circuit_inputs = ( + t40, t41, t50, t51, t105, t106, t115, t116, t170, t171, t180, t181, t228, t231, t10, + ) + .new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(lhs_i); + circuit_inputs = circuit_inputs.next(f_i_of_z); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w1); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w2); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w3); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w4); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w5); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w6); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w7); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w8); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); + circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); + circuit_inputs = circuit_inputs.next(ci); + circuit_inputs = circuit_inputs.next(z); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let Q0: G2Point = G2Point { + x0: outputs.get_output(t40), + x1: outputs.get_output(t41), + y0: outputs.get_output(t50), + y1: outputs.get_output(t51) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t105), + x1: outputs.get_output(t106), + y0: outputs.get_output(t115), + y1: outputs.get_output(t116) + }; + let Q2: G2Point = G2Point { + x0: outputs.get_output(t170), + x1: outputs.get_output(t171), + y0: outputs.get_output(t180), + y1: outputs.get_output(t181) + }; + let f_i_plus_one_of_z: u384 = outputs.get_output(t228); + let lhs_i_plus_one: u384 = outputs.get_output(t231); + let ci_plus_one: u384 = outputs.get_output(t10); + return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); +} +fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + Q_or_Qneg_0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + Q_or_Qneg_1: G2Point, + lhs_i: u384, + f_i_of_z: u384, + f_i_plus_one: E12D, + c_or_cinv_of_z: u384, + z: u384, + ci: u384 +) -> (G2Point, G2Point, u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x0 + let in1 = CE::> {}; // -0x9 % p + let in2 = CE::> {}; // 0x1 + + // INPUT stack + let (in3, in4) = (CE::> {}, CE::> {}); + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let (in33, in34) = (CE::> {}, CE::> {}); + let (in35, in36) = (CE::> {}, CE::> {}); + let (in37, in38) = (CE::> {}, CE::> {}); + let in39 = CE::> {}; + let t0 = circuit_mul(in38, in38); // Compute z^2 + let t1 = circuit_mul(t0, in38); // Compute z^3 + let t2 = circuit_mul(t1, in38); // Compute z^4 + let t3 = circuit_mul(t2, in38); // Compute z^5 + let t4 = circuit_mul(t3, in38); // Compute z^6 + let t5 = circuit_mul(t4, in38); // Compute z^7 + let t6 = circuit_mul(t5, in38); // Compute z^8 + let t7 = circuit_mul(t6, in38); // Compute z^9 + let t8 = circuit_mul(t7, in38); // Compute z^10 + let t9 = circuit_mul(t8, in38); // Compute z^11 + let t10 = circuit_mul(in39, in39); + let t11 = circuit_mul(in24, in24); + let t12 = circuit_sub(in7, in11); // Fp2 sub coeff 0/1 + let t13 = circuit_sub(in8, in12); // Fp2 sub coeff 1/1 + let t14 = circuit_sub(in5, in9); // Fp2 sub coeff 0/1 + let t15 = circuit_sub(in6, in10); // Fp2 sub coeff 1/1 + let t16 = circuit_mul(t14, t14); // Fp2 Div x/y start : Fp2 Inv y start + let t17 = circuit_mul(t15, t15); + let t18 = circuit_add(t16, t17); + let t19 = circuit_inverse(t18); + let t20 = circuit_mul(t14, t19); // Fp2 Inv y real part end + let t21 = circuit_mul(t15, t19); + let t22 = circuit_sub(in0, t21); // Fp2 Inv y imag part end + let t23 = circuit_mul(t12, t20); // Fp2 mul start + let t24 = circuit_mul(t13, t22); + let t25 = circuit_sub(t23, t24); // Fp2 mul real part end + let t26 = circuit_mul(t12, t22); + let t27 = circuit_mul(t13, t20); + let t28 = circuit_add(t26, t27); // Fp2 mul imag part end + let t29 = circuit_add(t25, t28); + let t30 = circuit_sub(t25, t28); + let t31 = circuit_mul(t29, t30); + let t32 = circuit_mul(t25, t28); + let t33 = circuit_add(t32, t32); + let t34 = circuit_add(in5, in9); // Fp2 add coeff 0/1 + let t35 = circuit_add(in6, in10); // Fp2 add coeff 1/1 + let t36 = circuit_sub(t31, t34); // Fp2 sub coeff 0/1 + let t37 = circuit_sub(t33, t35); // Fp2 sub coeff 1/1 + let t38 = circuit_mul(t25, in5); // Fp2 mul start + let t39 = circuit_mul(t28, in6); + let t40 = circuit_sub(t38, t39); // Fp2 mul real part end + let t41 = circuit_mul(t25, in6); + let t42 = circuit_mul(t28, in5); + let t43 = circuit_add(t41, t42); // Fp2 mul imag part end + let t44 = circuit_sub(t40, in7); // Fp2 sub coeff 0/1 + let t45 = circuit_sub(t43, in8); // Fp2 sub coeff 1/1 + let t46 = circuit_mul(in1, t28); + let t47 = circuit_add(t25, t46); + let t48 = circuit_mul(t47, in4); + let t49 = circuit_mul(in1, t45); + let t50 = circuit_add(t44, t49); + let t51 = circuit_mul(t50, in3); + let t52 = circuit_mul(t28, in4); + let t53 = circuit_mul(t45, in3); + let t54 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t55 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t56 = circuit_sub(t36, in5); // Fp2 sub coeff 0/1 + let t57 = circuit_sub(t37, in6); // Fp2 sub coeff 1/1 + let t58 = circuit_mul(t56, t56); // Fp2 Div x/y start : Fp2 Inv y start + let t59 = circuit_mul(t57, t57); + let t60 = circuit_add(t58, t59); + let t61 = circuit_inverse(t60); + let t62 = circuit_mul(t56, t61); // Fp2 Inv y real part end + let t63 = circuit_mul(t57, t61); + let t64 = circuit_sub(in0, t63); // Fp2 Inv y imag part end + let t65 = circuit_mul(t54, t62); // Fp2 mul start + let t66 = circuit_mul(t55, t64); + let t67 = circuit_sub(t65, t66); // Fp2 mul real part end + let t68 = circuit_mul(t54, t64); + let t69 = circuit_mul(t55, t62); + let t70 = circuit_add(t68, t69); // Fp2 mul imag part end + let t71 = circuit_add(t25, t67); // Fp2 add coeff 0/1 + let t72 = circuit_add(t28, t70); // Fp2 add coeff 1/1 + let t73 = circuit_sub(in0, t71); // Fp2 neg coeff 0/1 + let t74 = circuit_sub(in0, t72); // Fp2 neg coeff 1/1 + let t75 = circuit_add(t73, t74); + let t76 = circuit_sub(t73, t74); + let t77 = circuit_mul(t75, t76); + let t78 = circuit_mul(t73, t74); + let t79 = circuit_add(t78, t78); + let t80 = circuit_sub(t77, in5); // Fp2 sub coeff 0/1 + let t81 = circuit_sub(t79, in6); // Fp2 sub coeff 1/1 + let t82 = circuit_sub(t80, t36); // Fp2 sub coeff 0/1 + let t83 = circuit_sub(t81, t37); // Fp2 sub coeff 1/1 + let t84 = circuit_sub(in5, t82); // Fp2 sub coeff 0/1 + let t85 = circuit_sub(in6, t83); // Fp2 sub coeff 1/1 + let t86 = circuit_mul(t73, t84); // Fp2 mul start + let t87 = circuit_mul(t74, t85); + let t88 = circuit_sub(t86, t87); // Fp2 mul real part end + let t89 = circuit_mul(t73, t85); + let t90 = circuit_mul(t74, t84); + let t91 = circuit_add(t89, t90); // Fp2 mul imag part end + let t92 = circuit_sub(t88, in7); // Fp2 sub coeff 0/1 + let t93 = circuit_sub(t91, in8); // Fp2 sub coeff 1/1 + let t94 = circuit_mul(t73, in5); // Fp2 mul start + let t95 = circuit_mul(t74, in6); + let t96 = circuit_sub(t94, t95); // Fp2 mul real part end + let t97 = circuit_mul(t73, in6); + let t98 = circuit_mul(t74, in5); + let t99 = circuit_add(t97, t98); // Fp2 mul imag part end + let t100 = circuit_sub(t96, in7); // Fp2 sub coeff 0/1 + let t101 = circuit_sub(t99, in8); // Fp2 sub coeff 1/1 + let t102 = circuit_mul(in1, t74); + let t103 = circuit_add(t73, t102); + let t104 = circuit_mul(t103, in4); + let t105 = circuit_mul(in1, t101); + let t106 = circuit_add(t100, t105); + let t107 = circuit_mul(t106, in3); + let t108 = circuit_mul(t74, in4); + let t109 = circuit_mul(t101, in3); + let t110 = circuit_mul(t48, in38); // Eval sparse poly line_0p_1 step coeff_1 * z^1 + let t111 = circuit_add(in2, t110); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 + let t112 = circuit_mul(t51, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 + let t113 = circuit_add(t111, t112); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 + let t114 = circuit_mul(t52, t5); // Eval sparse poly line_0p_1 step coeff_7 * z^7 + let t115 = circuit_add(t113, t114); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 + let t116 = circuit_mul(t53, t7); // Eval sparse poly line_0p_1 step coeff_9 * z^9 + let t117 = circuit_add(t115, t116); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 + let t118 = circuit_mul(t11, t117); + let t119 = circuit_mul(t104, in38); // Eval sparse poly line_0p_2 step coeff_1 * z^1 + let t120 = circuit_add(in2, t119); // Eval sparse poly line_0p_2 step + coeff_1 * z^1 + let t121 = circuit_mul(t107, t1); // Eval sparse poly line_0p_2 step coeff_3 * z^3 + let t122 = circuit_add(t120, t121); // Eval sparse poly line_0p_2 step + coeff_3 * z^3 + let t123 = circuit_mul(t108, t5); // Eval sparse poly line_0p_2 step coeff_7 * z^7 + let t124 = circuit_add(t122, t123); // Eval sparse poly line_0p_2 step + coeff_7 * z^7 + let t125 = circuit_mul(t109, t7); // Eval sparse poly line_0p_2 step coeff_9 * z^9 + let t126 = circuit_add(t124, t125); // Eval sparse poly line_0p_2 step + coeff_9 * z^9 + let t127 = circuit_mul(t118, t126); + let t128 = circuit_sub(in17, in21); // Fp2 sub coeff 0/1 + let t129 = circuit_sub(in18, in22); // Fp2 sub coeff 1/1 + let t130 = circuit_sub(in15, in19); // Fp2 sub coeff 0/1 + let t131 = circuit_sub(in16, in20); // Fp2 sub coeff 1/1 + let t132 = circuit_mul(t130, t130); // Fp2 Div x/y start : Fp2 Inv y start + let t133 = circuit_mul(t131, t131); + let t134 = circuit_add(t132, t133); + let t135 = circuit_inverse(t134); + let t136 = circuit_mul(t130, t135); // Fp2 Inv y real part end + let t137 = circuit_mul(t131, t135); + let t138 = circuit_sub(in0, t137); // Fp2 Inv y imag part end + let t139 = circuit_mul(t128, t136); // Fp2 mul start + let t140 = circuit_mul(t129, t138); + let t141 = circuit_sub(t139, t140); // Fp2 mul real part end + let t142 = circuit_mul(t128, t138); + let t143 = circuit_mul(t129, t136); + let t144 = circuit_add(t142, t143); // Fp2 mul imag part end + let t145 = circuit_add(t141, t144); + let t146 = circuit_sub(t141, t144); + let t147 = circuit_mul(t145, t146); + let t148 = circuit_mul(t141, t144); + let t149 = circuit_add(t148, t148); + let t150 = circuit_add(in15, in19); // Fp2 add coeff 0/1 + let t151 = circuit_add(in16, in20); // Fp2 add coeff 1/1 + let t152 = circuit_sub(t147, t150); // Fp2 sub coeff 0/1 + let t153 = circuit_sub(t149, t151); // Fp2 sub coeff 1/1 + let t154 = circuit_mul(t141, in15); // Fp2 mul start + let t155 = circuit_mul(t144, in16); + let t156 = circuit_sub(t154, t155); // Fp2 mul real part end + let t157 = circuit_mul(t141, in16); + let t158 = circuit_mul(t144, in15); + let t159 = circuit_add(t157, t158); // Fp2 mul imag part end + let t160 = circuit_sub(t156, in17); // Fp2 sub coeff 0/1 + let t161 = circuit_sub(t159, in18); // Fp2 sub coeff 1/1 + let t162 = circuit_mul(in1, t144); + let t163 = circuit_add(t141, t162); + let t164 = circuit_mul(t163, in14); + let t165 = circuit_mul(in1, t161); + let t166 = circuit_add(t160, t165); + let t167 = circuit_mul(t166, in13); + let t168 = circuit_mul(t144, in14); + let t169 = circuit_mul(t161, in13); + let t170 = circuit_add(in17, in17); // Fp2 add coeff 0/1 + let t171 = circuit_add(in18, in18); // Fp2 add coeff 1/1 + let t172 = circuit_sub(t152, in15); // Fp2 sub coeff 0/1 + let t173 = circuit_sub(t153, in16); // Fp2 sub coeff 1/1 + let t174 = circuit_mul(t172, t172); // Fp2 Div x/y start : Fp2 Inv y start + let t175 = circuit_mul(t173, t173); + let t176 = circuit_add(t174, t175); + let t177 = circuit_inverse(t176); + let t178 = circuit_mul(t172, t177); // Fp2 Inv y real part end + let t179 = circuit_mul(t173, t177); + let t180 = circuit_sub(in0, t179); // Fp2 Inv y imag part end + let t181 = circuit_mul(t170, t178); // Fp2 mul start + let t182 = circuit_mul(t171, t180); + let t183 = circuit_sub(t181, t182); // Fp2 mul real part end + let t184 = circuit_mul(t170, t180); + let t185 = circuit_mul(t171, t178); + let t186 = circuit_add(t184, t185); // Fp2 mul imag part end + let t187 = circuit_add(t141, t183); // Fp2 add coeff 0/1 + let t188 = circuit_add(t144, t186); // Fp2 add coeff 1/1 + let t189 = circuit_sub(in0, t187); // Fp2 neg coeff 0/1 + let t190 = circuit_sub(in0, t188); // Fp2 neg coeff 1/1 + let t191 = circuit_add(t189, t190); + let t192 = circuit_sub(t189, t190); + let t193 = circuit_mul(t191, t192); + let t194 = circuit_mul(t189, t190); + let t195 = circuit_add(t194, t194); + let t196 = circuit_sub(t193, in15); // Fp2 sub coeff 0/1 + let t197 = circuit_sub(t195, in16); // Fp2 sub coeff 1/1 + let t198 = circuit_sub(t196, t152); // Fp2 sub coeff 0/1 + let t199 = circuit_sub(t197, t153); // Fp2 sub coeff 1/1 + let t200 = circuit_sub(in15, t198); // Fp2 sub coeff 0/1 + let t201 = circuit_sub(in16, t199); // Fp2 sub coeff 1/1 + let t202 = circuit_mul(t189, t200); // Fp2 mul start + let t203 = circuit_mul(t190, t201); + let t204 = circuit_sub(t202, t203); // Fp2 mul real part end + let t205 = circuit_mul(t189, t201); + let t206 = circuit_mul(t190, t200); + let t207 = circuit_add(t205, t206); // Fp2 mul imag part end + let t208 = circuit_sub(t204, in17); // Fp2 sub coeff 0/1 + let t209 = circuit_sub(t207, in18); // Fp2 sub coeff 1/1 + let t210 = circuit_mul(t189, in15); // Fp2 mul start + let t211 = circuit_mul(t190, in16); + let t212 = circuit_sub(t210, t211); // Fp2 mul real part end + let t213 = circuit_mul(t189, in16); + let t214 = circuit_mul(t190, in15); + let t215 = circuit_add(t213, t214); // Fp2 mul imag part end + let t216 = circuit_sub(t212, in17); // Fp2 sub coeff 0/1 + let t217 = circuit_sub(t215, in18); // Fp2 sub coeff 1/1 + let t218 = circuit_mul(in1, t190); + let t219 = circuit_add(t189, t218); + let t220 = circuit_mul(t219, in14); + let t221 = circuit_mul(in1, t217); + let t222 = circuit_add(t216, t221); + let t223 = circuit_mul(t222, in13); + let t224 = circuit_mul(t190, in14); + let t225 = circuit_mul(t217, in13); + let t226 = circuit_mul(t164, in38); // Eval sparse poly line_1p_1 step coeff_1 * z^1 + let t227 = circuit_add(in2, t226); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 + let t228 = circuit_mul(t167, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 + let t229 = circuit_add(t227, t228); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 + let t230 = circuit_mul(t168, t5); // Eval sparse poly line_1p_1 step coeff_7 * z^7 + let t231 = circuit_add(t229, t230); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 + let t232 = circuit_mul(t169, t7); // Eval sparse poly line_1p_1 step coeff_9 * z^9 + let t233 = circuit_add(t231, t232); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 + let t234 = circuit_mul(t127, t233); + let t235 = circuit_mul(t220, in38); // Eval sparse poly line_1p_2 step coeff_1 * z^1 + let t236 = circuit_add(in2, t235); // Eval sparse poly line_1p_2 step + coeff_1 * z^1 + let t237 = circuit_mul(t223, t1); // Eval sparse poly line_1p_2 step coeff_3 * z^3 + let t238 = circuit_add(t236, t237); // Eval sparse poly line_1p_2 step + coeff_3 * z^3 + let t239 = circuit_mul(t224, t5); // Eval sparse poly line_1p_2 step coeff_7 * z^7 + let t240 = circuit_add(t238, t239); // Eval sparse poly line_1p_2 step + coeff_7 * z^7 + let t241 = circuit_mul(t225, t7); // Eval sparse poly line_1p_2 step coeff_9 * z^9 + let t242 = circuit_add(t240, t241); // Eval sparse poly line_1p_2 step + coeff_9 * z^9 + let t243 = circuit_mul(t234, t242); + let t244 = circuit_mul(t243, in37); + let t245 = circuit_mul(in26, in38); // Eval R step coeff_1 * z^1 + let t246 = circuit_add(in25, t245); // Eval R step + (coeff_1 * z^1) + let t247 = circuit_mul(in27, t0); // Eval R step coeff_2 * z^2 + let t248 = circuit_add(t246, t247); // Eval R step + (coeff_2 * z^2) + let t249 = circuit_mul(in28, t1); // Eval R step coeff_3 * z^3 + let t250 = circuit_add(t248, t249); // Eval R step + (coeff_3 * z^3) + let t251 = circuit_mul(in29, t2); // Eval R step coeff_4 * z^4 + let t252 = circuit_add(t250, t251); // Eval R step + (coeff_4 * z^4) + let t253 = circuit_mul(in30, t3); // Eval R step coeff_5 * z^5 + let t254 = circuit_add(t252, t253); // Eval R step + (coeff_5 * z^5) + let t255 = circuit_mul(in31, t4); // Eval R step coeff_6 * z^6 + let t256 = circuit_add(t254, t255); // Eval R step + (coeff_6 * z^6) + let t257 = circuit_mul(in32, t5); // Eval R step coeff_7 * z^7 + let t258 = circuit_add(t256, t257); // Eval R step + (coeff_7 * z^7) + let t259 = circuit_mul(in33, t6); // Eval R step coeff_8 * z^8 + let t260 = circuit_add(t258, t259); // Eval R step + (coeff_8 * z^8) + let t261 = circuit_mul(in34, t7); // Eval R step coeff_9 * z^9 + let t262 = circuit_add(t260, t261); // Eval R step + (coeff_9 * z^9) + let t263 = circuit_mul(in35, t8); // Eval R step coeff_10 * z^10 + let t264 = circuit_add(t262, t263); // Eval R step + (coeff_10 * z^10) + let t265 = circuit_mul(in36, t9); // Eval R step coeff_11 * z^11 + let t266 = circuit_add(t264, t265); // Eval R step + (coeff_11 * z^11) + let t267 = circuit_sub(t244, t266); + let t268 = circuit_mul(t10, t267); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t269 = circuit_add(in23, t268); + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t82, t83, t92, t93, t198, t199, t208, t209, t266, t269, t10,) .new_inputs(); // Prefill constants: - circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); @@ -3993,18 +6477,20 @@ fn run_BN254_MP_CHECK_BIT0_LOOP_3_circuit( circuit_inputs = circuit_inputs.next(Q0.x1); circuit_inputs = circuit_inputs.next(Q0.y0); circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.x0); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.x1); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.y0); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.y1); circuit_inputs = circuit_inputs.next(yInv_1); circuit_inputs = circuit_inputs.next(xNegOverY_1); circuit_inputs = circuit_inputs.next(Q1.x0); circuit_inputs = circuit_inputs.next(Q1.x1); circuit_inputs = circuit_inputs.next(Q1.y0); circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(yInv_2); - circuit_inputs = circuit_inputs.next(xNegOverY_2); - circuit_inputs = circuit_inputs.next(Q2.x0); - circuit_inputs = circuit_inputs.next(Q2.x1); - circuit_inputs = circuit_inputs.next(Q2.y0); - circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.x0); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.x1); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.y0); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.y1); circuit_inputs = circuit_inputs.next(lhs_i); circuit_inputs = circuit_inputs.next(f_i_of_z); circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); @@ -4019,37 +6505,32 @@ fn run_BN254_MP_CHECK_BIT0_LOOP_3_circuit( circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); - circuit_inputs = circuit_inputs.next(ci); + circuit_inputs = circuit_inputs.next(c_or_cinv_of_z); circuit_inputs = circuit_inputs.next(z); + circuit_inputs = circuit_inputs.next(ci); let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; let Q0: G2Point = G2Point { - x0: outputs.get_output(t40), - x1: outputs.get_output(t41), - y0: outputs.get_output(t50), - y1: outputs.get_output(t51) + x0: outputs.get_output(t82), + x1: outputs.get_output(t83), + y0: outputs.get_output(t92), + y1: outputs.get_output(t93) }; let Q1: G2Point = G2Point { - x0: outputs.get_output(t105), - x1: outputs.get_output(t106), - y0: outputs.get_output(t115), - y1: outputs.get_output(t116) - }; - let Q2: G2Point = G2Point { - x0: outputs.get_output(t170), - x1: outputs.get_output(t171), - y0: outputs.get_output(t180), - y1: outputs.get_output(t181) + x0: outputs.get_output(t198), + x1: outputs.get_output(t199), + y0: outputs.get_output(t208), + y1: outputs.get_output(t209) }; - let f_i_plus_one_of_z: u384 = outputs.get_output(t228); - let lhs_i_plus_one: u384 = outputs.get_output(t231); + let f_i_plus_one_of_z: u384 = outputs.get_output(t266); + let lhs_i_plus_one: u384 = outputs.get_output(t269); let ci_plus_one: u384 = outputs.get_output(t10); - return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); + return (Q0, Q1, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); } -fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( +fn run_BN254_MP_CHECK_BIT1_LOOP_3_circuit( yInv_0: u384, xNegOverY_0: u384, Q0: G2Point, @@ -4058,13 +6539,17 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( xNegOverY_1: u384, Q1: G2Point, Q_or_Qneg_1: G2Point, + yInv_2: u384, + xNegOverY_2: u384, + Q2: G2Point, + Q_or_Qneg_2: G2Point, lhs_i: u384, f_i_of_z: u384, f_i_plus_one: E12D, c_or_cinv_of_z: u384, z: u384, ci: u384 -) -> (G2Point, G2Point, u384, u384, u384) { +) -> (G2Point, G2Point, G2Point, u384, u384, u384) { // CONSTANT stack let in0 = CE::> {}; // 0x0 let in1 = CE::> {}; // -0x9 % p @@ -4089,19 +6574,24 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( let (in33, in34) = (CE::> {}, CE::> {}); let (in35, in36) = (CE::> {}, CE::> {}); let (in37, in38) = (CE::> {}, CE::> {}); - let in39 = CE::> {}; - let t0 = circuit_mul(in38, in38); // Compute z^2 - let t1 = circuit_mul(t0, in38); // Compute z^3 - let t2 = circuit_mul(t1, in38); // Compute z^4 - let t3 = circuit_mul(t2, in38); // Compute z^5 - let t4 = circuit_mul(t3, in38); // Compute z^6 - let t5 = circuit_mul(t4, in38); // Compute z^7 - let t6 = circuit_mul(t5, in38); // Compute z^8 - let t7 = circuit_mul(t6, in38); // Compute z^9 - let t8 = circuit_mul(t7, in38); // Compute z^10 - let t9 = circuit_mul(t8, in38); // Compute z^11 - let t10 = circuit_mul(in39, in39); - let t11 = circuit_mul(in24, in24); + let (in39, in40) = (CE::> {}, CE::> {}); + let (in41, in42) = (CE::> {}, CE::> {}); + let (in43, in44) = (CE::> {}, CE::> {}); + let (in45, in46) = (CE::> {}, CE::> {}); + let (in47, in48) = (CE::> {}, CE::> {}); + let in49 = CE::> {}; + let t0 = circuit_mul(in48, in48); // Compute z^2 + let t1 = circuit_mul(t0, in48); // Compute z^3 + let t2 = circuit_mul(t1, in48); // Compute z^4 + let t3 = circuit_mul(t2, in48); // Compute z^5 + let t4 = circuit_mul(t3, in48); // Compute z^6 + let t5 = circuit_mul(t4, in48); // Compute z^7 + let t6 = circuit_mul(t5, in48); // Compute z^8 + let t7 = circuit_mul(t6, in48); // Compute z^9 + let t8 = circuit_mul(t7, in48); // Compute z^10 + let t9 = circuit_mul(t8, in48); // Compute z^11 + let t10 = circuit_mul(in49, in49); + let t11 = circuit_mul(in34, in34); let t12 = circuit_sub(in7, in11); // Fp2 sub coeff 0/1 let t13 = circuit_sub(in8, in12); // Fp2 sub coeff 1/1 let t14 = circuit_sub(in5, in9); // Fp2 sub coeff 0/1 @@ -4200,23 +6690,23 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( let t107 = circuit_mul(t106, in3); let t108 = circuit_mul(t74, in4); let t109 = circuit_mul(t101, in3); - let t110 = circuit_mul(t48, in38); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t111 = circuit_add(in2, t110); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t112 = circuit_mul(t51, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t113 = circuit_add(t111, t112); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t114 = circuit_mul(t52, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t115 = circuit_add(t113, t114); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t116 = circuit_mul(t53, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t117 = circuit_add(t115, t116); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 + let t110 = circuit_mul(t48, in48); // Eval sparse poly line_0p_1 step coeff_1 * z^1 + let t111 = circuit_add(in2, t110); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 + let t112 = circuit_mul(t51, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 + let t113 = circuit_add(t111, t112); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 + let t114 = circuit_mul(t52, t5); // Eval sparse poly line_0p_1 step coeff_7 * z^7 + let t115 = circuit_add(t113, t114); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 + let t116 = circuit_mul(t53, t7); // Eval sparse poly line_0p_1 step coeff_9 * z^9 + let t117 = circuit_add(t115, t116); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 let t118 = circuit_mul(t11, t117); - let t119 = circuit_mul(t104, in38); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t120 = circuit_add(in2, t119); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t121 = circuit_mul(t107, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t122 = circuit_add(t120, t121); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t123 = circuit_mul(t108, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t124 = circuit_add(t122, t123); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t125 = circuit_mul(t109, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t126 = circuit_add(t124, t125); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 + let t119 = circuit_mul(t104, in48); // Eval sparse poly line_0p_2 step coeff_1 * z^1 + let t120 = circuit_add(in2, t119); // Eval sparse poly line_0p_2 step + coeff_1 * z^1 + let t121 = circuit_mul(t107, t1); // Eval sparse poly line_0p_2 step coeff_3 * z^3 + let t122 = circuit_add(t120, t121); // Eval sparse poly line_0p_2 step + coeff_3 * z^3 + let t123 = circuit_mul(t108, t5); // Eval sparse poly line_0p_2 step coeff_7 * z^7 + let t124 = circuit_add(t122, t123); // Eval sparse poly line_0p_2 step + coeff_7 * z^7 + let t125 = circuit_mul(t109, t7); // Eval sparse poly line_0p_2 step coeff_9 * z^9 + let t126 = circuit_add(t124, t125); // Eval sparse poly line_0p_2 step + coeff_9 * z^9 let t127 = circuit_mul(t118, t126); let t128 = circuit_sub(in17, in21); // Fp2 sub coeff 0/1 let t129 = circuit_sub(in18, in22); // Fp2 sub coeff 1/1 @@ -4316,50 +6806,166 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( let t223 = circuit_mul(t222, in13); let t224 = circuit_mul(t190, in14); let t225 = circuit_mul(t217, in13); - let t226 = circuit_mul(t164, in38); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t227 = circuit_add(in2, t226); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t228 = circuit_mul(t167, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t229 = circuit_add(t227, t228); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t230 = circuit_mul(t168, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t231 = circuit_add(t229, t230); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t232 = circuit_mul(t169, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t233 = circuit_add(t231, t232); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 + let t226 = circuit_mul(t164, in48); // Eval sparse poly line_1p_1 step coeff_1 * z^1 + let t227 = circuit_add(in2, t226); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 + let t228 = circuit_mul(t167, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 + let t229 = circuit_add(t227, t228); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 + let t230 = circuit_mul(t168, t5); // Eval sparse poly line_1p_1 step coeff_7 * z^7 + let t231 = circuit_add(t229, t230); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 + let t232 = circuit_mul(t169, t7); // Eval sparse poly line_1p_1 step coeff_9 * z^9 + let t233 = circuit_add(t231, t232); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 let t234 = circuit_mul(t127, t233); - let t235 = circuit_mul(t220, in38); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t236 = circuit_add(in2, t235); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t237 = circuit_mul(t223, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t238 = circuit_add(t236, t237); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t239 = circuit_mul(t224, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t240 = circuit_add(t238, t239); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t241 = circuit_mul(t225, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t242 = circuit_add(t240, t241); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 + let t235 = circuit_mul(t220, in48); // Eval sparse poly line_1p_2 step coeff_1 * z^1 + let t236 = circuit_add(in2, t235); // Eval sparse poly line_1p_2 step + coeff_1 * z^1 + let t237 = circuit_mul(t223, t1); // Eval sparse poly line_1p_2 step coeff_3 * z^3 + let t238 = circuit_add(t236, t237); // Eval sparse poly line_1p_2 step + coeff_3 * z^3 + let t239 = circuit_mul(t224, t5); // Eval sparse poly line_1p_2 step coeff_7 * z^7 + let t240 = circuit_add(t238, t239); // Eval sparse poly line_1p_2 step + coeff_7 * z^7 + let t241 = circuit_mul(t225, t7); // Eval sparse poly line_1p_2 step coeff_9 * z^9 + let t242 = circuit_add(t240, t241); // Eval sparse poly line_1p_2 step + coeff_9 * z^9 let t243 = circuit_mul(t234, t242); - let t244 = circuit_mul(t243, in37); - let t245 = circuit_mul(in26, in38); // Eval UnnamedPoly step coeff_1 * z^1 - let t246 = circuit_add(in25, t245); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t247 = circuit_mul(in27, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t248 = circuit_add(t246, t247); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t249 = circuit_mul(in28, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t250 = circuit_add(t248, t249); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t251 = circuit_mul(in29, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t252 = circuit_add(t250, t251); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t253 = circuit_mul(in30, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t254 = circuit_add(t252, t253); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t255 = circuit_mul(in31, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t256 = circuit_add(t254, t255); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t257 = circuit_mul(in32, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t258 = circuit_add(t256, t257); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t259 = circuit_mul(in33, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t260 = circuit_add(t258, t259); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t261 = circuit_mul(in34, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t262 = circuit_add(t260, t261); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t263 = circuit_mul(in35, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t264 = circuit_add(t262, t263); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t265 = circuit_mul(in36, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t266 = circuit_add(t264, t265); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t267 = circuit_sub(t244, t266); - let t268 = circuit_mul(t10, t267); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) - let t269 = circuit_add(in23, t268); + let t244 = circuit_sub(in27, in31); // Fp2 sub coeff 0/1 + let t245 = circuit_sub(in28, in32); // Fp2 sub coeff 1/1 + let t246 = circuit_sub(in25, in29); // Fp2 sub coeff 0/1 + let t247 = circuit_sub(in26, in30); // Fp2 sub coeff 1/1 + let t248 = circuit_mul(t246, t246); // Fp2 Div x/y start : Fp2 Inv y start + let t249 = circuit_mul(t247, t247); + let t250 = circuit_add(t248, t249); + let t251 = circuit_inverse(t250); + let t252 = circuit_mul(t246, t251); // Fp2 Inv y real part end + let t253 = circuit_mul(t247, t251); + let t254 = circuit_sub(in0, t253); // Fp2 Inv y imag part end + let t255 = circuit_mul(t244, t252); // Fp2 mul start + let t256 = circuit_mul(t245, t254); + let t257 = circuit_sub(t255, t256); // Fp2 mul real part end + let t258 = circuit_mul(t244, t254); + let t259 = circuit_mul(t245, t252); + let t260 = circuit_add(t258, t259); // Fp2 mul imag part end + let t261 = circuit_add(t257, t260); + let t262 = circuit_sub(t257, t260); + let t263 = circuit_mul(t261, t262); + let t264 = circuit_mul(t257, t260); + let t265 = circuit_add(t264, t264); + let t266 = circuit_add(in25, in29); // Fp2 add coeff 0/1 + let t267 = circuit_add(in26, in30); // Fp2 add coeff 1/1 + let t268 = circuit_sub(t263, t266); // Fp2 sub coeff 0/1 + let t269 = circuit_sub(t265, t267); // Fp2 sub coeff 1/1 + let t270 = circuit_mul(t257, in25); // Fp2 mul start + let t271 = circuit_mul(t260, in26); + let t272 = circuit_sub(t270, t271); // Fp2 mul real part end + let t273 = circuit_mul(t257, in26); + let t274 = circuit_mul(t260, in25); + let t275 = circuit_add(t273, t274); // Fp2 mul imag part end + let t276 = circuit_sub(t272, in27); // Fp2 sub coeff 0/1 + let t277 = circuit_sub(t275, in28); // Fp2 sub coeff 1/1 + let t278 = circuit_mul(in1, t260); + let t279 = circuit_add(t257, t278); + let t280 = circuit_mul(t279, in24); + let t281 = circuit_mul(in1, t277); + let t282 = circuit_add(t276, t281); + let t283 = circuit_mul(t282, in23); + let t284 = circuit_mul(t260, in24); + let t285 = circuit_mul(t277, in23); + let t286 = circuit_add(in27, in27); // Fp2 add coeff 0/1 + let t287 = circuit_add(in28, in28); // Fp2 add coeff 1/1 + let t288 = circuit_sub(t268, in25); // Fp2 sub coeff 0/1 + let t289 = circuit_sub(t269, in26); // Fp2 sub coeff 1/1 + let t290 = circuit_mul(t288, t288); // Fp2 Div x/y start : Fp2 Inv y start + let t291 = circuit_mul(t289, t289); + let t292 = circuit_add(t290, t291); + let t293 = circuit_inverse(t292); + let t294 = circuit_mul(t288, t293); // Fp2 Inv y real part end + let t295 = circuit_mul(t289, t293); + let t296 = circuit_sub(in0, t295); // Fp2 Inv y imag part end + let t297 = circuit_mul(t286, t294); // Fp2 mul start + let t298 = circuit_mul(t287, t296); + let t299 = circuit_sub(t297, t298); // Fp2 mul real part end + let t300 = circuit_mul(t286, t296); + let t301 = circuit_mul(t287, t294); + let t302 = circuit_add(t300, t301); // Fp2 mul imag part end + let t303 = circuit_add(t257, t299); // Fp2 add coeff 0/1 + let t304 = circuit_add(t260, t302); // Fp2 add coeff 1/1 + let t305 = circuit_sub(in0, t303); // Fp2 neg coeff 0/1 + let t306 = circuit_sub(in0, t304); // Fp2 neg coeff 1/1 + let t307 = circuit_add(t305, t306); + let t308 = circuit_sub(t305, t306); + let t309 = circuit_mul(t307, t308); + let t310 = circuit_mul(t305, t306); + let t311 = circuit_add(t310, t310); + let t312 = circuit_sub(t309, in25); // Fp2 sub coeff 0/1 + let t313 = circuit_sub(t311, in26); // Fp2 sub coeff 1/1 + let t314 = circuit_sub(t312, t268); // Fp2 sub coeff 0/1 + let t315 = circuit_sub(t313, t269); // Fp2 sub coeff 1/1 + let t316 = circuit_sub(in25, t314); // Fp2 sub coeff 0/1 + let t317 = circuit_sub(in26, t315); // Fp2 sub coeff 1/1 + let t318 = circuit_mul(t305, t316); // Fp2 mul start + let t319 = circuit_mul(t306, t317); + let t320 = circuit_sub(t318, t319); // Fp2 mul real part end + let t321 = circuit_mul(t305, t317); + let t322 = circuit_mul(t306, t316); + let t323 = circuit_add(t321, t322); // Fp2 mul imag part end + let t324 = circuit_sub(t320, in27); // Fp2 sub coeff 0/1 + let t325 = circuit_sub(t323, in28); // Fp2 sub coeff 1/1 + let t326 = circuit_mul(t305, in25); // Fp2 mul start + let t327 = circuit_mul(t306, in26); + let t328 = circuit_sub(t326, t327); // Fp2 mul real part end + let t329 = circuit_mul(t305, in26); + let t330 = circuit_mul(t306, in25); + let t331 = circuit_add(t329, t330); // Fp2 mul imag part end + let t332 = circuit_sub(t328, in27); // Fp2 sub coeff 0/1 + let t333 = circuit_sub(t331, in28); // Fp2 sub coeff 1/1 + let t334 = circuit_mul(in1, t306); + let t335 = circuit_add(t305, t334); + let t336 = circuit_mul(t335, in24); + let t337 = circuit_mul(in1, t333); + let t338 = circuit_add(t332, t337); + let t339 = circuit_mul(t338, in23); + let t340 = circuit_mul(t306, in24); + let t341 = circuit_mul(t333, in23); + let t342 = circuit_mul(t280, in48); // Eval sparse poly line_2p_1 step coeff_1 * z^1 + let t343 = circuit_add(in2, t342); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 + let t344 = circuit_mul(t283, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 + let t345 = circuit_add(t343, t344); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 + let t346 = circuit_mul(t284, t5); // Eval sparse poly line_2p_1 step coeff_7 * z^7 + let t347 = circuit_add(t345, t346); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 + let t348 = circuit_mul(t285, t7); // Eval sparse poly line_2p_1 step coeff_9 * z^9 + let t349 = circuit_add(t347, t348); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 + let t350 = circuit_mul(t243, t349); + let t351 = circuit_mul(t336, in48); // Eval sparse poly line_2p_2 step coeff_1 * z^1 + let t352 = circuit_add(in2, t351); // Eval sparse poly line_2p_2 step + coeff_1 * z^1 + let t353 = circuit_mul(t339, t1); // Eval sparse poly line_2p_2 step coeff_3 * z^3 + let t354 = circuit_add(t352, t353); // Eval sparse poly line_2p_2 step + coeff_3 * z^3 + let t355 = circuit_mul(t340, t5); // Eval sparse poly line_2p_2 step coeff_7 * z^7 + let t356 = circuit_add(t354, t355); // Eval sparse poly line_2p_2 step + coeff_7 * z^7 + let t357 = circuit_mul(t341, t7); // Eval sparse poly line_2p_2 step coeff_9 * z^9 + let t358 = circuit_add(t356, t357); // Eval sparse poly line_2p_2 step + coeff_9 * z^9 + let t359 = circuit_mul(t350, t358); + let t360 = circuit_mul(t359, in47); + let t361 = circuit_mul(in36, in48); // Eval R step coeff_1 * z^1 + let t362 = circuit_add(in35, t361); // Eval R step + (coeff_1 * z^1) + let t363 = circuit_mul(in37, t0); // Eval R step coeff_2 * z^2 + let t364 = circuit_add(t362, t363); // Eval R step + (coeff_2 * z^2) + let t365 = circuit_mul(in38, t1); // Eval R step coeff_3 * z^3 + let t366 = circuit_add(t364, t365); // Eval R step + (coeff_3 * z^3) + let t367 = circuit_mul(in39, t2); // Eval R step coeff_4 * z^4 + let t368 = circuit_add(t366, t367); // Eval R step + (coeff_4 * z^4) + let t369 = circuit_mul(in40, t3); // Eval R step coeff_5 * z^5 + let t370 = circuit_add(t368, t369); // Eval R step + (coeff_5 * z^5) + let t371 = circuit_mul(in41, t4); // Eval R step coeff_6 * z^6 + let t372 = circuit_add(t370, t371); // Eval R step + (coeff_6 * z^6) + let t373 = circuit_mul(in42, t5); // Eval R step coeff_7 * z^7 + let t374 = circuit_add(t372, t373); // Eval R step + (coeff_7 * z^7) + let t375 = circuit_mul(in43, t6); // Eval R step coeff_8 * z^8 + let t376 = circuit_add(t374, t375); // Eval R step + (coeff_8 * z^8) + let t377 = circuit_mul(in44, t7); // Eval R step coeff_9 * z^9 + let t378 = circuit_add(t376, t377); // Eval R step + (coeff_9 * z^9) + let t379 = circuit_mul(in45, t8); // Eval R step coeff_10 * z^10 + let t380 = circuit_add(t378, t379); // Eval R step + (coeff_10 * z^10) + let t381 = circuit_mul(in46, t9); // Eval R step coeff_11 * z^11 + let t382 = circuit_add(t380, t381); // Eval R step + (coeff_11 * z^11) + let t383 = circuit_sub(t360, t382); + let t384 = circuit_mul(t10, t383); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t385 = circuit_add(in33, t384); let modulus = TryInto::< _, CircuitModulus @@ -4368,7 +6974,9 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( ) .unwrap(); - let mut circuit_inputs = (t82, t83, t92, t93, t198, t199, t208, t209, t266, t269, t10,) + let mut circuit_inputs = ( + t82, t83, t92, t93, t198, t199, t208, t209, t314, t315, t324, t325, t382, t385, t10, + ) .new_inputs(); // Prefill constants: circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); @@ -4395,6 +7003,16 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.x1); circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.y0); circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.y1); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.x0); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.x1); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.y0); + circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.y1); circuit_inputs = circuit_inputs.next(lhs_i); circuit_inputs = circuit_inputs.next(f_i_of_z); circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); @@ -4429,1101 +7047,2307 @@ fn run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( y0: outputs.get_output(t208), y1: outputs.get_output(t209) }; - let f_i_plus_one_of_z: u384 = outputs.get_output(t266); - let lhs_i_plus_one: u384 = outputs.get_output(t269); + let Q2: G2Point = G2Point { + x0: outputs.get_output(t314), + x1: outputs.get_output(t315), + y0: outputs.get_output(t324), + y1: outputs.get_output(t325) + }; + let f_i_plus_one_of_z: u384 = outputs.get_output(t382); + let lhs_i_plus_one: u384 = outputs.get_output(t385); let ci_plus_one: u384 = outputs.get_output(t10); - return (Q0, Q1, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); + return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); } -fn run_BN254_MP_CHECK_BIT1_LOOP_3_circuit( - yInv_0: u384, - xNegOverY_0: u384, - Q0: G2Point, - Q_or_Qneg_0: G2Point, - yInv_1: u384, - xNegOverY_1: u384, - Q1: G2Point, - Q_or_Qneg_1: G2Point, - yInv_2: u384, - xNegOverY_2: u384, - Q2: G2Point, - Q_or_Qneg_2: G2Point, - lhs_i: u384, - f_i_of_z: u384, - f_i_plus_one: E12D, - c_or_cinv_of_z: u384, +fn run_BN254_MP_CHECK_FINALIZE_BN_2_circuit( + original_Q0: G2Point, + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + original_Q1: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + R_n_minus_2: E12D, + R_n_minus_1: E12D, + c_n_minus_3: u384, + w_of_z: u384, z: u384, - ci: u384 -) -> (G2Point, G2Point, G2Point, u384, u384, u384) { + c_inv_frob_1_of_z: u384, + c_frob_2_of_z: u384, + c_inv_frob_3_of_z: u384, + previous_lhs: u384, + R_n_minus_3_of_z: u384, + Q: Array +) -> (u384, u384) { // CONSTANT stack - let in0 = CE::> {}; // 0x0 - let in1 = CE::> {}; // -0x9 % p - let in2 = CE::> {}; // 0x1 + let in0 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d + let in1 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 + let in2 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a + let in3 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 + let in4 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 + let in5 = CE::> {}; // 0x1 + let in6 = CE::> {}; // 0x0 + let in7 = CE::> {}; // -0x9 % p + let in8 = CE::> {}; // 0x52 + let in9 = CE::> {}; // -0x12 % p // INPUT stack - let (in3, in4) = (CE::> {}, CE::> {}); - let (in5, in6) = (CE::> {}, CE::> {}); - let (in7, in8) = (CE::> {}, CE::> {}); - let (in9, in10) = (CE::> {}, CE::> {}); - let (in11, in12) = (CE::> {}, CE::> {}); - let (in13, in14) = (CE::> {}, CE::> {}); - let (in15, in16) = (CE::> {}, CE::> {}); - let (in17, in18) = (CE::> {}, CE::> {}); - let (in19, in20) = (CE::> {}, CE::> {}); - let (in21, in22) = (CE::> {}, CE::> {}); - let (in23, in24) = (CE::> {}, CE::> {}); - let (in25, in26) = (CE::> {}, CE::> {}); - let (in27, in28) = (CE::> {}, CE::> {}); - let (in29, in30) = (CE::> {}, CE::> {}); - let (in31, in32) = (CE::> {}, CE::> {}); - let (in33, in34) = (CE::> {}, CE::> {}); - let (in35, in36) = (CE::> {}, CE::> {}); - let (in37, in38) = (CE::> {}, CE::> {}); - let (in39, in40) = (CE::> {}, CE::> {}); - let (in41, in42) = (CE::> {}, CE::> {}); - let (in43, in44) = (CE::> {}, CE::> {}); - let (in45, in46) = (CE::> {}, CE::> {}); - let (in47, in48) = (CE::> {}, CE::> {}); - let in49 = CE::> {}; - let t0 = circuit_mul(in48, in48); // Compute z^2 - let t1 = circuit_mul(t0, in48); // Compute z^3 - let t2 = circuit_mul(t1, in48); // Compute z^4 - let t3 = circuit_mul(t2, in48); // Compute z^5 - let t4 = circuit_mul(t3, in48); // Compute z^6 - let t5 = circuit_mul(t4, in48); // Compute z^7 - let t6 = circuit_mul(t5, in48); // Compute z^8 - let t7 = circuit_mul(t6, in48); // Compute z^9 - let t8 = circuit_mul(t7, in48); // Compute z^10 - let t9 = circuit_mul(t8, in48); // Compute z^11 - let t10 = circuit_mul(in49, in49); - let t11 = circuit_mul(in34, in34); - let t12 = circuit_sub(in7, in11); // Fp2 sub coeff 0/1 - let t13 = circuit_sub(in8, in12); // Fp2 sub coeff 1/1 - let t14 = circuit_sub(in5, in9); // Fp2 sub coeff 0/1 - let t15 = circuit_sub(in6, in10); // Fp2 sub coeff 1/1 - let t16 = circuit_mul(t14, t14); // Fp2 Div x/y start : Fp2 Inv y start - let t17 = circuit_mul(t15, t15); - let t18 = circuit_add(t16, t17); - let t19 = circuit_inverse(t18); - let t20 = circuit_mul(t14, t19); // Fp2 Inv y real part end - let t21 = circuit_mul(t15, t19); - let t22 = circuit_sub(in0, t21); // Fp2 Inv y imag part end - let t23 = circuit_mul(t12, t20); // Fp2 mul start - let t24 = circuit_mul(t13, t22); - let t25 = circuit_sub(t23, t24); // Fp2 mul real part end - let t26 = circuit_mul(t12, t22); - let t27 = circuit_mul(t13, t20); - let t28 = circuit_add(t26, t27); // Fp2 mul imag part end - let t29 = circuit_add(t25, t28); - let t30 = circuit_sub(t25, t28); - let t31 = circuit_mul(t29, t30); - let t32 = circuit_mul(t25, t28); - let t33 = circuit_add(t32, t32); - let t34 = circuit_add(in5, in9); // Fp2 add coeff 0/1 - let t35 = circuit_add(in6, in10); // Fp2 add coeff 1/1 - let t36 = circuit_sub(t31, t34); // Fp2 sub coeff 0/1 - let t37 = circuit_sub(t33, t35); // Fp2 sub coeff 1/1 - let t38 = circuit_mul(t25, in5); // Fp2 mul start - let t39 = circuit_mul(t28, in6); - let t40 = circuit_sub(t38, t39); // Fp2 mul real part end - let t41 = circuit_mul(t25, in6); - let t42 = circuit_mul(t28, in5); - let t43 = circuit_add(t41, t42); // Fp2 mul imag part end - let t44 = circuit_sub(t40, in7); // Fp2 sub coeff 0/1 - let t45 = circuit_sub(t43, in8); // Fp2 sub coeff 1/1 - let t46 = circuit_mul(in1, t28); - let t47 = circuit_add(t25, t46); - let t48 = circuit_mul(t47, in4); - let t49 = circuit_mul(in1, t45); - let t50 = circuit_add(t44, t49); - let t51 = circuit_mul(t50, in3); - let t52 = circuit_mul(t28, in4); - let t53 = circuit_mul(t45, in3); - let t54 = circuit_add(in7, in7); // Fp2 add coeff 0/1 - let t55 = circuit_add(in8, in8); // Fp2 add coeff 1/1 - let t56 = circuit_sub(t36, in5); // Fp2 sub coeff 0/1 - let t57 = circuit_sub(t37, in6); // Fp2 sub coeff 1/1 - let t58 = circuit_mul(t56, t56); // Fp2 Div x/y start : Fp2 Inv y start - let t59 = circuit_mul(t57, t57); - let t60 = circuit_add(t58, t59); - let t61 = circuit_inverse(t60); - let t62 = circuit_mul(t56, t61); // Fp2 Inv y real part end - let t63 = circuit_mul(t57, t61); - let t64 = circuit_sub(in0, t63); // Fp2 Inv y imag part end - let t65 = circuit_mul(t54, t62); // Fp2 mul start - let t66 = circuit_mul(t55, t64); - let t67 = circuit_sub(t65, t66); // Fp2 mul real part end - let t68 = circuit_mul(t54, t64); - let t69 = circuit_mul(t55, t62); - let t70 = circuit_add(t68, t69); // Fp2 mul imag part end - let t71 = circuit_add(t25, t67); // Fp2 add coeff 0/1 - let t72 = circuit_add(t28, t70); // Fp2 add coeff 1/1 - let t73 = circuit_sub(in0, t71); // Fp2 neg coeff 0/1 - let t74 = circuit_sub(in0, t72); // Fp2 neg coeff 1/1 - let t75 = circuit_add(t73, t74); - let t76 = circuit_sub(t73, t74); - let t77 = circuit_mul(t75, t76); - let t78 = circuit_mul(t73, t74); - let t79 = circuit_add(t78, t78); - let t80 = circuit_sub(t77, in5); // Fp2 sub coeff 0/1 - let t81 = circuit_sub(t79, in6); // Fp2 sub coeff 1/1 - let t82 = circuit_sub(t80, t36); // Fp2 sub coeff 0/1 - let t83 = circuit_sub(t81, t37); // Fp2 sub coeff 1/1 - let t84 = circuit_sub(in5, t82); // Fp2 sub coeff 0/1 - let t85 = circuit_sub(in6, t83); // Fp2 sub coeff 1/1 - let t86 = circuit_mul(t73, t84); // Fp2 mul start - let t87 = circuit_mul(t74, t85); - let t88 = circuit_sub(t86, t87); // Fp2 mul real part end - let t89 = circuit_mul(t73, t85); - let t90 = circuit_mul(t74, t84); - let t91 = circuit_add(t89, t90); // Fp2 mul imag part end - let t92 = circuit_sub(t88, in7); // Fp2 sub coeff 0/1 - let t93 = circuit_sub(t91, in8); // Fp2 sub coeff 1/1 - let t94 = circuit_mul(t73, in5); // Fp2 mul start - let t95 = circuit_mul(t74, in6); - let t96 = circuit_sub(t94, t95); // Fp2 mul real part end - let t97 = circuit_mul(t73, in6); - let t98 = circuit_mul(t74, in5); - let t99 = circuit_add(t97, t98); // Fp2 mul imag part end - let t100 = circuit_sub(t96, in7); // Fp2 sub coeff 0/1 - let t101 = circuit_sub(t99, in8); // Fp2 sub coeff 1/1 - let t102 = circuit_mul(in1, t74); - let t103 = circuit_add(t73, t102); - let t104 = circuit_mul(t103, in4); - let t105 = circuit_mul(in1, t101); - let t106 = circuit_add(t100, t105); - let t107 = circuit_mul(t106, in3); - let t108 = circuit_mul(t74, in4); - let t109 = circuit_mul(t101, in3); - let t110 = circuit_mul(t48, in48); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t111 = circuit_add(in2, t110); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t112 = circuit_mul(t51, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t113 = circuit_add(t111, t112); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t114 = circuit_mul(t52, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t115 = circuit_add(t113, t114); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t116 = circuit_mul(t53, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t117 = circuit_add(t115, t116); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t118 = circuit_mul(t11, t117); - let t119 = circuit_mul(t104, in48); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t120 = circuit_add(in2, t119); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t121 = circuit_mul(t107, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t122 = circuit_add(t120, t121); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t123 = circuit_mul(t108, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t124 = circuit_add(t122, t123); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t125 = circuit_mul(t109, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t126 = circuit_add(t124, t125); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t127 = circuit_mul(t118, t126); - let t128 = circuit_sub(in17, in21); // Fp2 sub coeff 0/1 - let t129 = circuit_sub(in18, in22); // Fp2 sub coeff 1/1 - let t130 = circuit_sub(in15, in19); // Fp2 sub coeff 0/1 - let t131 = circuit_sub(in16, in20); // Fp2 sub coeff 1/1 - let t132 = circuit_mul(t130, t130); // Fp2 Div x/y start : Fp2 Inv y start - let t133 = circuit_mul(t131, t131); - let t134 = circuit_add(t132, t133); - let t135 = circuit_inverse(t134); - let t136 = circuit_mul(t130, t135); // Fp2 Inv y real part end - let t137 = circuit_mul(t131, t135); - let t138 = circuit_sub(in0, t137); // Fp2 Inv y imag part end - let t139 = circuit_mul(t128, t136); // Fp2 mul start - let t140 = circuit_mul(t129, t138); + let (in10, in11) = (CE::> {}, CE::> {}); + let (in12, in13) = (CE::> {}, CE::> {}); + let (in14, in15) = (CE::> {}, CE::> {}); + let (in16, in17) = (CE::> {}, CE::> {}); + let (in18, in19) = (CE::> {}, CE::> {}); + let (in20, in21) = (CE::> {}, CE::> {}); + let (in22, in23) = (CE::> {}, CE::> {}); + let (in24, in25) = (CE::> {}, CE::> {}); + let (in26, in27) = (CE::> {}, CE::> {}); + let (in28, in29) = (CE::> {}, CE::> {}); + let (in30, in31) = (CE::> {}, CE::> {}); + let (in32, in33) = (CE::> {}, CE::> {}); + let (in34, in35) = (CE::> {}, CE::> {}); + let (in36, in37) = (CE::> {}, CE::> {}); + let (in38, in39) = (CE::> {}, CE::> {}); + let (in40, in41) = (CE::> {}, CE::> {}); + let (in42, in43) = (CE::> {}, CE::> {}); + let (in44, in45) = (CE::> {}, CE::> {}); + let (in46, in47) = (CE::> {}, CE::> {}); + let (in48, in49) = (CE::> {}, CE::> {}); + let (in50, in51) = (CE::> {}, CE::> {}); + let (in52, in53) = (CE::> {}, CE::> {}); + let (in54, in55) = (CE::> {}, CE::> {}); + let (in56, in57) = (CE::> {}, CE::> {}); + let (in58, in59) = (CE::> {}, CE::> {}); + let (in60, in61) = (CE::> {}, CE::> {}); + let (in62, in63) = (CE::> {}, CE::> {}); + let (in64, in65) = (CE::> {}, CE::> {}); + let (in66, in67) = (CE::> {}, CE::> {}); + let (in68, in69) = (CE::> {}, CE::> {}); + let (in70, in71) = (CE::> {}, CE::> {}); + let (in72, in73) = (CE::> {}, CE::> {}); + let (in74, in75) = (CE::> {}, CE::> {}); + let (in76, in77) = (CE::> {}, CE::> {}); + let (in78, in79) = (CE::> {}, CE::> {}); + let (in80, in81) = (CE::> {}, CE::> {}); + let (in82, in83) = (CE::> {}, CE::> {}); + let (in84, in85) = (CE::> {}, CE::> {}); + let (in86, in87) = (CE::> {}, CE::> {}); + let (in88, in89) = (CE::> {}, CE::> {}); + let (in90, in91) = (CE::> {}, CE::> {}); + let (in92, in93) = (CE::> {}, CE::> {}); + let (in94, in95) = (CE::> {}, CE::> {}); + let (in96, in97) = (CE::> {}, CE::> {}); + let (in98, in99) = (CE::> {}, CE::> {}); + let (in100, in101) = (CE::> {}, CE::> {}); + let (in102, in103) = (CE::> {}, CE::> {}); + let (in104, in105) = (CE::> {}, CE::> {}); + let (in106, in107) = (CE::> {}, CE::> {}); + let (in108, in109) = (CE::> {}, CE::> {}); + let (in110, in111) = (CE::> {}, CE::> {}); + let (in112, in113) = (CE::> {}, CE::> {}); + let (in114, in115) = (CE::> {}, CE::> {}); + let (in116, in117) = (CE::> {}, CE::> {}); + let (in118, in119) = (CE::> {}, CE::> {}); + let (in120, in121) = (CE::> {}, CE::> {}); + let (in122, in123) = (CE::> {}, CE::> {}); + let (in124, in125) = (CE::> {}, CE::> {}); + let (in126, in127) = (CE::> {}, CE::> {}); + let (in128, in129) = (CE::> {}, CE::> {}); + let (in130, in131) = (CE::> {}, CE::> {}); + let (in132, in133) = (CE::> {}, CE::> {}); + let (in134, in135) = (CE::> {}, CE::> {}); + let (in136, in137) = (CE::> {}, CE::> {}); + let (in138, in139) = (CE::> {}, CE::> {}); + let (in140, in141) = (CE::> {}, CE::> {}); + let (in142, in143) = (CE::> {}, CE::> {}); + let (in144, in145) = (CE::> {}, CE::> {}); + let (in146, in147) = (CE::> {}, CE::> {}); + let in148 = CE::> {}; + let t0 = circuit_mul(in56, in56); // Compute z^2 + let t1 = circuit_mul(t0, in56); // Compute z^3 + let t2 = circuit_mul(t1, in56); // Compute z^4 + let t3 = circuit_mul(t2, in56); // Compute z^5 + let t4 = circuit_mul(t3, in56); // Compute z^6 + let t5 = circuit_mul(t4, in56); // Compute z^7 + let t6 = circuit_mul(t5, in56); // Compute z^8 + let t7 = circuit_mul(t6, in56); // Compute z^9 + let t8 = circuit_mul(t7, in56); // Compute z^10 + let t9 = circuit_mul(t8, in56); // Compute z^11 + let t10 = circuit_mul(t9, in56); // Compute z^12 + let t11 = circuit_mul(t10, in56); // Compute z^13 + let t12 = circuit_mul(t11, in56); // Compute z^14 + let t13 = circuit_mul(t12, in56); // Compute z^15 + let t14 = circuit_mul(t13, in56); // Compute z^16 + let t15 = circuit_mul(t14, in56); // Compute z^17 + let t16 = circuit_mul(t15, in56); // Compute z^18 + let t17 = circuit_mul(t16, in56); // Compute z^19 + let t18 = circuit_mul(t17, in56); // Compute z^20 + let t19 = circuit_mul(t18, in56); // Compute z^21 + let t20 = circuit_mul(t19, in56); // Compute z^22 + let t21 = circuit_mul(t20, in56); // Compute z^23 + let t22 = circuit_mul(t21, in56); // Compute z^24 + let t23 = circuit_mul(t22, in56); // Compute z^25 + let t24 = circuit_mul(t23, in56); // Compute z^26 + let t25 = circuit_mul(t24, in56); // Compute z^27 + let t26 = circuit_mul(t25, in56); // Compute z^28 + let t27 = circuit_mul(t26, in56); // Compute z^29 + let t28 = circuit_mul(t27, in56); // Compute z^30 + let t29 = circuit_mul(t28, in56); // Compute z^31 + let t30 = circuit_mul(t29, in56); // Compute z^32 + let t31 = circuit_mul(t30, in56); // Compute z^33 + let t32 = circuit_mul(t31, in56); // Compute z^34 + let t33 = circuit_mul(t32, in56); // Compute z^35 + let t34 = circuit_mul(t33, in56); // Compute z^36 + let t35 = circuit_mul(t34, in56); // Compute z^37 + let t36 = circuit_mul(t35, in56); // Compute z^38 + let t37 = circuit_mul(t36, in56); // Compute z^39 + let t38 = circuit_mul(t37, in56); // Compute z^40 + let t39 = circuit_mul(t38, in56); // Compute z^41 + let t40 = circuit_mul(t39, in56); // Compute z^42 + let t41 = circuit_mul(t40, in56); // Compute z^43 + let t42 = circuit_mul(t41, in56); // Compute z^44 + let t43 = circuit_mul(t42, in56); // Compute z^45 + let t44 = circuit_mul(t43, in56); // Compute z^46 + let t45 = circuit_mul(t44, in56); // Compute z^47 + let t46 = circuit_mul(t45, in56); // Compute z^48 + let t47 = circuit_mul(t46, in56); // Compute z^49 + let t48 = circuit_mul(t47, in56); // Compute z^50 + let t49 = circuit_mul(t48, in56); // Compute z^51 + let t50 = circuit_mul(t49, in56); // Compute z^52 + let t51 = circuit_mul(t50, in56); // Compute z^53 + let t52 = circuit_mul(t51, in56); // Compute z^54 + let t53 = circuit_mul(t52, in56); // Compute z^55 + let t54 = circuit_mul(t53, in56); // Compute z^56 + let t55 = circuit_mul(t54, in56); // Compute z^57 + let t56 = circuit_mul(t55, in56); // Compute z^58 + let t57 = circuit_mul(t56, in56); // Compute z^59 + let t58 = circuit_mul(t57, in56); // Compute z^60 + let t59 = circuit_mul(t58, in56); // Compute z^61 + let t60 = circuit_mul(t59, in56); // Compute z^62 + let t61 = circuit_mul(t60, in56); // Compute z^63 + let t62 = circuit_mul(t61, in56); // Compute z^64 + let t63 = circuit_mul(t62, in56); // Compute z^65 + let t64 = circuit_mul(t63, in56); // Compute z^66 + let t65 = circuit_mul(t64, in56); // Compute z^67 + let t66 = circuit_mul(t65, in56); // Compute z^68 + let t67 = circuit_mul(t66, in56); // Compute z^69 + let t68 = circuit_mul(t67, in56); // Compute z^70 + let t69 = circuit_mul(t68, in56); // Compute z^71 + let t70 = circuit_mul(t69, in56); // Compute z^72 + let t71 = circuit_mul(t70, in56); // Compute z^73 + let t72 = circuit_mul(t71, in56); // Compute z^74 + let t73 = circuit_mul(t72, in56); // Compute z^75 + let t74 = circuit_mul(t73, in56); // Compute z^76 + let t75 = circuit_mul(t74, in56); // Compute z^77 + let t76 = circuit_mul(t75, in56); // Compute z^78 + let t77 = circuit_mul(t76, in56); // Compute z^79 + let t78 = circuit_mul(t77, in56); // Compute z^80 + let t79 = circuit_mul(t78, in56); // Compute z^81 + let t80 = circuit_mul(t79, in56); // Compute z^82 + let t81 = circuit_mul(t80, in56); // Compute z^83 + let t82 = circuit_mul(t81, in56); // Compute z^84 + let t83 = circuit_mul(t82, in56); // Compute z^85 + let t84 = circuit_mul(t83, in56); // Compute z^86 + let t85 = circuit_mul(in54, in54); + let t86 = circuit_mul(t85, t85); + let t87 = circuit_mul(in31, in56); // Eval R_n_minus_2 step coeff_1 * z^1 + let t88 = circuit_add(in30, t87); // Eval R_n_minus_2 step + (coeff_1 * z^1) + let t89 = circuit_mul(in32, t0); // Eval R_n_minus_2 step coeff_2 * z^2 + let t90 = circuit_add(t88, t89); // Eval R_n_minus_2 step + (coeff_2 * z^2) + let t91 = circuit_mul(in33, t1); // Eval R_n_minus_2 step coeff_3 * z^3 + let t92 = circuit_add(t90, t91); // Eval R_n_minus_2 step + (coeff_3 * z^3) + let t93 = circuit_mul(in34, t2); // Eval R_n_minus_2 step coeff_4 * z^4 + let t94 = circuit_add(t92, t93); // Eval R_n_minus_2 step + (coeff_4 * z^4) + let t95 = circuit_mul(in35, t3); // Eval R_n_minus_2 step coeff_5 * z^5 + let t96 = circuit_add(t94, t95); // Eval R_n_minus_2 step + (coeff_5 * z^5) + let t97 = circuit_mul(in36, t4); // Eval R_n_minus_2 step coeff_6 * z^6 + let t98 = circuit_add(t96, t97); // Eval R_n_minus_2 step + (coeff_6 * z^6) + let t99 = circuit_mul(in37, t5); // Eval R_n_minus_2 step coeff_7 * z^7 + let t100 = circuit_add(t98, t99); // Eval R_n_minus_2 step + (coeff_7 * z^7) + let t101 = circuit_mul(in38, t6); // Eval R_n_minus_2 step coeff_8 * z^8 + let t102 = circuit_add(t100, t101); // Eval R_n_minus_2 step + (coeff_8 * z^8) + let t103 = circuit_mul(in39, t7); // Eval R_n_minus_2 step coeff_9 * z^9 + let t104 = circuit_add(t102, t103); // Eval R_n_minus_2 step + (coeff_9 * z^9) + let t105 = circuit_mul(in40, t8); // Eval R_n_minus_2 step coeff_10 * z^10 + let t106 = circuit_add(t104, t105); // Eval R_n_minus_2 step + (coeff_10 * z^10) + let t107 = circuit_mul(in41, t9); // Eval R_n_minus_2 step coeff_11 * z^11 + let t108 = circuit_add(t106, t107); // Eval R_n_minus_2 step + (coeff_11 * z^11) + let t109 = circuit_mul(in43, in56); // Eval R_n_minus_1 step coeff_1 * z^1 + let t110 = circuit_add(in42, t109); // Eval R_n_minus_1 step + (coeff_1 * z^1) + let t111 = circuit_mul(in44, t0); // Eval R_n_minus_1 step coeff_2 * z^2 + let t112 = circuit_add(t110, t111); // Eval R_n_minus_1 step + (coeff_2 * z^2) + let t113 = circuit_mul(in45, t1); // Eval R_n_minus_1 step coeff_3 * z^3 + let t114 = circuit_add(t112, t113); // Eval R_n_minus_1 step + (coeff_3 * z^3) + let t115 = circuit_mul(in46, t2); // Eval R_n_minus_1 step coeff_4 * z^4 + let t116 = circuit_add(t114, t115); // Eval R_n_minus_1 step + (coeff_4 * z^4) + let t117 = circuit_mul(in47, t3); // Eval R_n_minus_1 step coeff_5 * z^5 + let t118 = circuit_add(t116, t117); // Eval R_n_minus_1 step + (coeff_5 * z^5) + let t119 = circuit_mul(in48, t4); // Eval R_n_minus_1 step coeff_6 * z^6 + let t120 = circuit_add(t118, t119); // Eval R_n_minus_1 step + (coeff_6 * z^6) + let t121 = circuit_mul(in49, t5); // Eval R_n_minus_1 step coeff_7 * z^7 + let t122 = circuit_add(t120, t121); // Eval R_n_minus_1 step + (coeff_7 * z^7) + let t123 = circuit_mul(in50, t6); // Eval R_n_minus_1 step coeff_8 * z^8 + let t124 = circuit_add(t122, t123); // Eval R_n_minus_1 step + (coeff_8 * z^8) + let t125 = circuit_mul(in51, t7); // Eval R_n_minus_1 step coeff_9 * z^9 + let t126 = circuit_add(t124, t125); // Eval R_n_minus_1 step + (coeff_9 * z^9) + let t127 = circuit_mul(in52, t8); // Eval R_n_minus_1 step coeff_10 * z^10 + let t128 = circuit_add(t126, t127); // Eval R_n_minus_1 step + (coeff_10 * z^10) + let t129 = circuit_mul(in53, t9); // Eval R_n_minus_1 step coeff_11 * z^11 + let t130 = circuit_add(t128, t129); // Eval R_n_minus_1 step + (coeff_11 * z^11) + let t131 = circuit_sub(in6, in11); + let t132 = circuit_sub(in6, in13); + let t133 = circuit_mul(in10, in0); // Fp2 mul start + let t134 = circuit_mul(t131, in1); + let t135 = circuit_sub(t133, t134); // Fp2 mul real part end + let t136 = circuit_mul(in10, in1); + let t137 = circuit_mul(t131, in0); + let t138 = circuit_add(t136, t137); // Fp2 mul imag part end + let t139 = circuit_mul(in12, in2); // Fp2 mul start + let t140 = circuit_mul(t132, in3); let t141 = circuit_sub(t139, t140); // Fp2 mul real part end - let t142 = circuit_mul(t128, t138); - let t143 = circuit_mul(t129, t136); + let t142 = circuit_mul(in12, in3); + let t143 = circuit_mul(t132, in2); let t144 = circuit_add(t142, t143); // Fp2 mul imag part end - let t145 = circuit_add(t141, t144); - let t146 = circuit_sub(t141, t144); - let t147 = circuit_mul(t145, t146); - let t148 = circuit_mul(t141, t144); - let t149 = circuit_add(t148, t148); - let t150 = circuit_add(in15, in19); // Fp2 add coeff 0/1 - let t151 = circuit_add(in16, in20); // Fp2 add coeff 1/1 - let t152 = circuit_sub(t147, t150); // Fp2 sub coeff 0/1 - let t153 = circuit_sub(t149, t151); // Fp2 sub coeff 1/1 - let t154 = circuit_mul(t141, in15); // Fp2 mul start - let t155 = circuit_mul(t144, in16); - let t156 = circuit_sub(t154, t155); // Fp2 mul real part end - let t157 = circuit_mul(t141, in16); - let t158 = circuit_mul(t144, in15); - let t159 = circuit_add(t157, t158); // Fp2 mul imag part end - let t160 = circuit_sub(t156, in17); // Fp2 sub coeff 0/1 - let t161 = circuit_sub(t159, in18); // Fp2 sub coeff 1/1 - let t162 = circuit_mul(in1, t144); - let t163 = circuit_add(t141, t162); - let t164 = circuit_mul(t163, in14); - let t165 = circuit_mul(in1, t161); - let t166 = circuit_add(t160, t165); - let t167 = circuit_mul(t166, in13); - let t168 = circuit_mul(t144, in14); - let t169 = circuit_mul(t161, in13); - let t170 = circuit_add(in17, in17); // Fp2 add coeff 0/1 - let t171 = circuit_add(in18, in18); // Fp2 add coeff 1/1 - let t172 = circuit_sub(t152, in15); // Fp2 sub coeff 0/1 - let t173 = circuit_sub(t153, in16); // Fp2 sub coeff 1/1 - let t174 = circuit_mul(t172, t172); // Fp2 Div x/y start : Fp2 Inv y start - let t175 = circuit_mul(t173, t173); - let t176 = circuit_add(t174, t175); - let t177 = circuit_inverse(t176); - let t178 = circuit_mul(t172, t177); // Fp2 Inv y real part end - let t179 = circuit_mul(t173, t177); - let t180 = circuit_sub(in0, t179); // Fp2 Inv y imag part end - let t181 = circuit_mul(t170, t178); // Fp2 mul start - let t182 = circuit_mul(t171, t180); - let t183 = circuit_sub(t181, t182); // Fp2 mul real part end - let t184 = circuit_mul(t170, t180); - let t185 = circuit_mul(t171, t178); - let t186 = circuit_add(t184, t185); // Fp2 mul imag part end - let t187 = circuit_add(t141, t183); // Fp2 add coeff 0/1 - let t188 = circuit_add(t144, t186); // Fp2 add coeff 1/1 - let t189 = circuit_sub(in0, t187); // Fp2 neg coeff 0/1 - let t190 = circuit_sub(in0, t188); // Fp2 neg coeff 1/1 - let t191 = circuit_add(t189, t190); - let t192 = circuit_sub(t189, t190); - let t193 = circuit_mul(t191, t192); - let t194 = circuit_mul(t189, t190); - let t195 = circuit_add(t194, t194); - let t196 = circuit_sub(t193, in15); // Fp2 sub coeff 0/1 - let t197 = circuit_sub(t195, in16); // Fp2 sub coeff 1/1 - let t198 = circuit_sub(t196, t152); // Fp2 sub coeff 0/1 - let t199 = circuit_sub(t197, t153); // Fp2 sub coeff 1/1 - let t200 = circuit_sub(in15, t198); // Fp2 sub coeff 0/1 - let t201 = circuit_sub(in16, t199); // Fp2 sub coeff 1/1 - let t202 = circuit_mul(t189, t200); // Fp2 mul start - let t203 = circuit_mul(t190, t201); - let t204 = circuit_sub(t202, t203); // Fp2 mul real part end - let t205 = circuit_mul(t189, t201); - let t206 = circuit_mul(t190, t200); - let t207 = circuit_add(t205, t206); // Fp2 mul imag part end - let t208 = circuit_sub(t204, in17); // Fp2 sub coeff 0/1 - let t209 = circuit_sub(t207, in18); // Fp2 sub coeff 1/1 - let t210 = circuit_mul(t189, in15); // Fp2 mul start - let t211 = circuit_mul(t190, in16); - let t212 = circuit_sub(t210, t211); // Fp2 mul real part end - let t213 = circuit_mul(t189, in16); - let t214 = circuit_mul(t190, in15); - let t215 = circuit_add(t213, t214); // Fp2 mul imag part end - let t216 = circuit_sub(t212, in17); // Fp2 sub coeff 0/1 - let t217 = circuit_sub(t215, in18); // Fp2 sub coeff 1/1 - let t218 = circuit_mul(in1, t190); - let t219 = circuit_add(t189, t218); - let t220 = circuit_mul(t219, in14); - let t221 = circuit_mul(in1, t217); - let t222 = circuit_add(t216, t221); - let t223 = circuit_mul(t222, in13); - let t224 = circuit_mul(t190, in14); - let t225 = circuit_mul(t217, in13); - let t226 = circuit_mul(t164, in48); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t227 = circuit_add(in2, t226); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t228 = circuit_mul(t167, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t229 = circuit_add(t227, t228); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t230 = circuit_mul(t168, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t231 = circuit_add(t229, t230); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t232 = circuit_mul(t169, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t233 = circuit_add(t231, t232); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t234 = circuit_mul(t127, t233); - let t235 = circuit_mul(t220, in48); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t236 = circuit_add(in2, t235); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t237 = circuit_mul(t223, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t238 = circuit_add(t236, t237); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t239 = circuit_mul(t224, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t240 = circuit_add(t238, t239); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t241 = circuit_mul(t225, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t242 = circuit_add(t240, t241); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t243 = circuit_mul(t234, t242); - let t244 = circuit_sub(in27, in31); // Fp2 sub coeff 0/1 - let t245 = circuit_sub(in28, in32); // Fp2 sub coeff 1/1 - let t246 = circuit_sub(in25, in29); // Fp2 sub coeff 0/1 - let t247 = circuit_sub(in26, in30); // Fp2 sub coeff 1/1 - let t248 = circuit_mul(t246, t246); // Fp2 Div x/y start : Fp2 Inv y start - let t249 = circuit_mul(t247, t247); - let t250 = circuit_add(t248, t249); - let t251 = circuit_inverse(t250); - let t252 = circuit_mul(t246, t251); // Fp2 Inv y real part end - let t253 = circuit_mul(t247, t251); - let t254 = circuit_sub(in0, t253); // Fp2 Inv y imag part end - let t255 = circuit_mul(t244, t252); // Fp2 mul start - let t256 = circuit_mul(t245, t254); - let t257 = circuit_sub(t255, t256); // Fp2 mul real part end - let t258 = circuit_mul(t244, t254); - let t259 = circuit_mul(t245, t252); - let t260 = circuit_add(t258, t259); // Fp2 mul imag part end - let t261 = circuit_add(t257, t260); - let t262 = circuit_sub(t257, t260); - let t263 = circuit_mul(t261, t262); - let t264 = circuit_mul(t257, t260); - let t265 = circuit_add(t264, t264); - let t266 = circuit_add(in25, in29); // Fp2 add coeff 0/1 - let t267 = circuit_add(in26, in30); // Fp2 add coeff 1/1 - let t268 = circuit_sub(t263, t266); // Fp2 sub coeff 0/1 - let t269 = circuit_sub(t265, t267); // Fp2 sub coeff 1/1 - let t270 = circuit_mul(t257, in25); // Fp2 mul start - let t271 = circuit_mul(t260, in26); - let t272 = circuit_sub(t270, t271); // Fp2 mul real part end - let t273 = circuit_mul(t257, in26); - let t274 = circuit_mul(t260, in25); - let t275 = circuit_add(t273, t274); // Fp2 mul imag part end - let t276 = circuit_sub(t272, in27); // Fp2 sub coeff 0/1 - let t277 = circuit_sub(t275, in28); // Fp2 sub coeff 1/1 - let t278 = circuit_mul(in1, t260); - let t279 = circuit_add(t257, t278); - let t280 = circuit_mul(t279, in24); - let t281 = circuit_mul(in1, t277); - let t282 = circuit_add(t276, t281); - let t283 = circuit_mul(t282, in23); - let t284 = circuit_mul(t260, in24); - let t285 = circuit_mul(t277, in23); - let t286 = circuit_add(in27, in27); // Fp2 add coeff 0/1 - let t287 = circuit_add(in28, in28); // Fp2 add coeff 1/1 - let t288 = circuit_sub(t268, in25); // Fp2 sub coeff 0/1 - let t289 = circuit_sub(t269, in26); // Fp2 sub coeff 1/1 - let t290 = circuit_mul(t288, t288); // Fp2 Div x/y start : Fp2 Inv y start - let t291 = circuit_mul(t289, t289); - let t292 = circuit_add(t290, t291); - let t293 = circuit_inverse(t292); - let t294 = circuit_mul(t288, t293); // Fp2 Inv y real part end - let t295 = circuit_mul(t289, t293); - let t296 = circuit_sub(in0, t295); // Fp2 Inv y imag part end - let t297 = circuit_mul(t286, t294); // Fp2 mul start - let t298 = circuit_mul(t287, t296); - let t299 = circuit_sub(t297, t298); // Fp2 mul real part end - let t300 = circuit_mul(t286, t296); - let t301 = circuit_mul(t287, t294); - let t302 = circuit_add(t300, t301); // Fp2 mul imag part end - let t303 = circuit_add(t257, t299); // Fp2 add coeff 0/1 - let t304 = circuit_add(t260, t302); // Fp2 add coeff 1/1 - let t305 = circuit_sub(in0, t303); // Fp2 neg coeff 0/1 - let t306 = circuit_sub(in0, t304); // Fp2 neg coeff 1/1 - let t307 = circuit_add(t305, t306); - let t308 = circuit_sub(t305, t306); - let t309 = circuit_mul(t307, t308); - let t310 = circuit_mul(t305, t306); - let t311 = circuit_add(t310, t310); - let t312 = circuit_sub(t309, in25); // Fp2 sub coeff 0/1 - let t313 = circuit_sub(t311, in26); // Fp2 sub coeff 1/1 - let t314 = circuit_sub(t312, t268); // Fp2 sub coeff 0/1 - let t315 = circuit_sub(t313, t269); // Fp2 sub coeff 1/1 - let t316 = circuit_sub(in25, t314); // Fp2 sub coeff 0/1 - let t317 = circuit_sub(in26, t315); // Fp2 sub coeff 1/1 - let t318 = circuit_mul(t305, t316); // Fp2 mul start - let t319 = circuit_mul(t306, t317); - let t320 = circuit_sub(t318, t319); // Fp2 mul real part end - let t321 = circuit_mul(t305, t317); - let t322 = circuit_mul(t306, t316); - let t323 = circuit_add(t321, t322); // Fp2 mul imag part end - let t324 = circuit_sub(t320, in27); // Fp2 sub coeff 0/1 - let t325 = circuit_sub(t323, in28); // Fp2 sub coeff 1/1 - let t326 = circuit_mul(t305, in25); // Fp2 mul start - let t327 = circuit_mul(t306, in26); - let t328 = circuit_sub(t326, t327); // Fp2 mul real part end - let t329 = circuit_mul(t305, in26); - let t330 = circuit_mul(t306, in25); - let t331 = circuit_add(t329, t330); // Fp2 mul imag part end - let t332 = circuit_sub(t328, in27); // Fp2 sub coeff 0/1 - let t333 = circuit_sub(t331, in28); // Fp2 sub coeff 1/1 - let t334 = circuit_mul(in1, t306); - let t335 = circuit_add(t305, t334); - let t336 = circuit_mul(t335, in24); - let t337 = circuit_mul(in1, t333); - let t338 = circuit_add(t332, t337); - let t339 = circuit_mul(t338, in23); - let t340 = circuit_mul(t306, in24); - let t341 = circuit_mul(t333, in23); - let t342 = circuit_mul(t280, in48); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t343 = circuit_add(in2, t342); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t344 = circuit_mul(t283, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t345 = circuit_add(t343, t344); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t346 = circuit_mul(t284, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t347 = circuit_add(t345, t346); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t348 = circuit_mul(t285, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t349 = circuit_add(t347, t348); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t350 = circuit_mul(t243, t349); - let t351 = circuit_mul(t336, in48); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t352 = circuit_add(in2, t351); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t353 = circuit_mul(t339, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t354 = circuit_add(t352, t353); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t355 = circuit_mul(t340, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t356 = circuit_add(t354, t355); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t357 = circuit_mul(t341, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t358 = circuit_add(t356, t357); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t359 = circuit_mul(t350, t358); - let t360 = circuit_mul(t359, in47); - let t361 = circuit_mul(in36, in48); // Eval UnnamedPoly step coeff_1 * z^1 - let t362 = circuit_add(in35, t361); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t363 = circuit_mul(in37, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t364 = circuit_add(t362, t363); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t365 = circuit_mul(in38, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t366 = circuit_add(t364, t365); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t367 = circuit_mul(in39, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t368 = circuit_add(t366, t367); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t369 = circuit_mul(in40, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t370 = circuit_add(t368, t369); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t371 = circuit_mul(in41, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t372 = circuit_add(t370, t371); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t373 = circuit_mul(in42, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t374 = circuit_add(t372, t373); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t375 = circuit_mul(in43, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t376 = circuit_add(t374, t375); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t377 = circuit_mul(in44, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t378 = circuit_add(t376, t377); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t379 = circuit_mul(in45, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t380 = circuit_add(t378, t379); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t381 = circuit_mul(in46, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t382 = circuit_add(t380, t381); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t383 = circuit_sub(t360, t382); - let t384 = circuit_mul(t10, t383); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) - let t385 = circuit_add(in33, t384); + let t145 = circuit_mul(in10, in4); // Fp2 scalar mul coeff 0/1 + let t146 = circuit_mul(in11, in4); // Fp2 scalar mul coeff 1/1 + let t147 = circuit_mul(in12, in5); // Fp2 scalar mul coeff 0/1 + let t148 = circuit_mul(in13, in5); // Fp2 scalar mul coeff 1/1 + let t149 = circuit_sub(in18, t141); // Fp2 sub coeff 0/1 + let t150 = circuit_sub(in19, t144); // Fp2 sub coeff 1/1 + let t151 = circuit_sub(in16, t135); // Fp2 sub coeff 0/1 + let t152 = circuit_sub(in17, t138); // Fp2 sub coeff 1/1 + let t153 = circuit_mul(t151, t151); // Fp2 Div x/y start : Fp2 Inv y start + let t154 = circuit_mul(t152, t152); + let t155 = circuit_add(t153, t154); + let t156 = circuit_inverse(t155); + let t157 = circuit_mul(t151, t156); // Fp2 Inv y real part end + let t158 = circuit_mul(t152, t156); + let t159 = circuit_sub(in6, t158); // Fp2 Inv y imag part end + let t160 = circuit_mul(t149, t157); // Fp2 mul start + let t161 = circuit_mul(t150, t159); + let t162 = circuit_sub(t160, t161); // Fp2 mul real part end + let t163 = circuit_mul(t149, t159); + let t164 = circuit_mul(t150, t157); + let t165 = circuit_add(t163, t164); // Fp2 mul imag part end + let t166 = circuit_add(t162, t165); + let t167 = circuit_sub(t162, t165); + let t168 = circuit_mul(t166, t167); + let t169 = circuit_mul(t162, t165); + let t170 = circuit_add(t169, t169); + let t171 = circuit_add(in16, t135); // Fp2 add coeff 0/1 + let t172 = circuit_add(in17, t138); // Fp2 add coeff 1/1 + let t173 = circuit_sub(t168, t171); // Fp2 sub coeff 0/1 + let t174 = circuit_sub(t170, t172); // Fp2 sub coeff 1/1 + let t175 = circuit_sub(in16, t173); // Fp2 sub coeff 0/1 + let t176 = circuit_sub(in17, t174); // Fp2 sub coeff 1/1 + let t177 = circuit_mul(t162, t175); // Fp2 mul start + let t178 = circuit_mul(t165, t176); + let t179 = circuit_sub(t177, t178); // Fp2 mul real part end + let t180 = circuit_mul(t162, t176); + let t181 = circuit_mul(t165, t175); + let t182 = circuit_add(t180, t181); // Fp2 mul imag part end + let t183 = circuit_sub(t179, in18); // Fp2 sub coeff 0/1 + let t184 = circuit_sub(t182, in19); // Fp2 sub coeff 1/1 + let t185 = circuit_mul(t162, in16); // Fp2 mul start + let t186 = circuit_mul(t165, in17); + let t187 = circuit_sub(t185, t186); // Fp2 mul real part end + let t188 = circuit_mul(t162, in17); + let t189 = circuit_mul(t165, in16); + let t190 = circuit_add(t188, t189); // Fp2 mul imag part end + let t191 = circuit_sub(t187, in18); // Fp2 sub coeff 0/1 + let t192 = circuit_sub(t190, in19); // Fp2 sub coeff 1/1 + let t193 = circuit_mul(in7, t165); + let t194 = circuit_add(t162, t193); + let t195 = circuit_mul(t194, in15); + let t196 = circuit_mul(in7, t192); + let t197 = circuit_add(t191, t196); + let t198 = circuit_mul(t197, in14); + let t199 = circuit_mul(t165, in15); + let t200 = circuit_mul(t192, in14); + let t201 = circuit_sub(t183, t147); // Fp2 sub coeff 0/1 + let t202 = circuit_sub(t184, t148); // Fp2 sub coeff 1/1 + let t203 = circuit_sub(t173, t145); // Fp2 sub coeff 0/1 + let t204 = circuit_sub(t174, t146); // Fp2 sub coeff 1/1 + let t205 = circuit_mul(t203, t203); // Fp2 Div x/y start : Fp2 Inv y start + let t206 = circuit_mul(t204, t204); + let t207 = circuit_add(t205, t206); + let t208 = circuit_inverse(t207); + let t209 = circuit_mul(t203, t208); // Fp2 Inv y real part end + let t210 = circuit_mul(t204, t208); + let t211 = circuit_sub(in6, t210); // Fp2 Inv y imag part end + let t212 = circuit_mul(t201, t209); // Fp2 mul start + let t213 = circuit_mul(t202, t211); + let t214 = circuit_sub(t212, t213); // Fp2 mul real part end + let t215 = circuit_mul(t201, t211); + let t216 = circuit_mul(t202, t209); + let t217 = circuit_add(t215, t216); // Fp2 mul imag part end + let t218 = circuit_mul(t214, t173); // Fp2 mul start + let t219 = circuit_mul(t217, t174); + let t220 = circuit_sub(t218, t219); // Fp2 mul real part end + let t221 = circuit_mul(t214, t174); + let t222 = circuit_mul(t217, t173); + let t223 = circuit_add(t221, t222); // Fp2 mul imag part end + let t224 = circuit_sub(t220, t183); // Fp2 sub coeff 0/1 + let t225 = circuit_sub(t223, t184); // Fp2 sub coeff 1/1 + let t226 = circuit_mul(in7, t217); + let t227 = circuit_add(t214, t226); + let t228 = circuit_mul(t227, in15); + let t229 = circuit_mul(in7, t225); + let t230 = circuit_add(t224, t229); + let t231 = circuit_mul(t230, in14); + let t232 = circuit_mul(t217, in15); + let t233 = circuit_mul(t225, in14); + let t234 = circuit_sub(in6, in21); + let t235 = circuit_sub(in6, in23); + let t236 = circuit_mul(in20, in0); // Fp2 mul start + let t237 = circuit_mul(t234, in1); + let t238 = circuit_sub(t236, t237); // Fp2 mul real part end + let t239 = circuit_mul(in20, in1); + let t240 = circuit_mul(t234, in0); + let t241 = circuit_add(t239, t240); // Fp2 mul imag part end + let t242 = circuit_mul(in22, in2); // Fp2 mul start + let t243 = circuit_mul(t235, in3); + let t244 = circuit_sub(t242, t243); // Fp2 mul real part end + let t245 = circuit_mul(in22, in3); + let t246 = circuit_mul(t235, in2); + let t247 = circuit_add(t245, t246); // Fp2 mul imag part end + let t248 = circuit_mul(in20, in4); // Fp2 scalar mul coeff 0/1 + let t249 = circuit_mul(in21, in4); // Fp2 scalar mul coeff 1/1 + let t250 = circuit_mul(in22, in5); // Fp2 scalar mul coeff 0/1 + let t251 = circuit_mul(in23, in5); // Fp2 scalar mul coeff 1/1 + let t252 = circuit_sub(in28, t244); // Fp2 sub coeff 0/1 + let t253 = circuit_sub(in29, t247); // Fp2 sub coeff 1/1 + let t254 = circuit_sub(in26, t238); // Fp2 sub coeff 0/1 + let t255 = circuit_sub(in27, t241); // Fp2 sub coeff 1/1 + let t256 = circuit_mul(t254, t254); // Fp2 Div x/y start : Fp2 Inv y start + let t257 = circuit_mul(t255, t255); + let t258 = circuit_add(t256, t257); + let t259 = circuit_inverse(t258); + let t260 = circuit_mul(t254, t259); // Fp2 Inv y real part end + let t261 = circuit_mul(t255, t259); + let t262 = circuit_sub(in6, t261); // Fp2 Inv y imag part end + let t263 = circuit_mul(t252, t260); // Fp2 mul start + let t264 = circuit_mul(t253, t262); + let t265 = circuit_sub(t263, t264); // Fp2 mul real part end + let t266 = circuit_mul(t252, t262); + let t267 = circuit_mul(t253, t260); + let t268 = circuit_add(t266, t267); // Fp2 mul imag part end + let t269 = circuit_add(t265, t268); + let t270 = circuit_sub(t265, t268); + let t271 = circuit_mul(t269, t270); + let t272 = circuit_mul(t265, t268); + let t273 = circuit_add(t272, t272); + let t274 = circuit_add(in26, t238); // Fp2 add coeff 0/1 + let t275 = circuit_add(in27, t241); // Fp2 add coeff 1/1 + let t276 = circuit_sub(t271, t274); // Fp2 sub coeff 0/1 + let t277 = circuit_sub(t273, t275); // Fp2 sub coeff 1/1 + let t278 = circuit_sub(in26, t276); // Fp2 sub coeff 0/1 + let t279 = circuit_sub(in27, t277); // Fp2 sub coeff 1/1 + let t280 = circuit_mul(t265, t278); // Fp2 mul start + let t281 = circuit_mul(t268, t279); + let t282 = circuit_sub(t280, t281); // Fp2 mul real part end + let t283 = circuit_mul(t265, t279); + let t284 = circuit_mul(t268, t278); + let t285 = circuit_add(t283, t284); // Fp2 mul imag part end + let t286 = circuit_sub(t282, in28); // Fp2 sub coeff 0/1 + let t287 = circuit_sub(t285, in29); // Fp2 sub coeff 1/1 + let t288 = circuit_mul(t265, in26); // Fp2 mul start + let t289 = circuit_mul(t268, in27); + let t290 = circuit_sub(t288, t289); // Fp2 mul real part end + let t291 = circuit_mul(t265, in27); + let t292 = circuit_mul(t268, in26); + let t293 = circuit_add(t291, t292); // Fp2 mul imag part end + let t294 = circuit_sub(t290, in28); // Fp2 sub coeff 0/1 + let t295 = circuit_sub(t293, in29); // Fp2 sub coeff 1/1 + let t296 = circuit_mul(in7, t268); + let t297 = circuit_add(t265, t296); + let t298 = circuit_mul(t297, in25); + let t299 = circuit_mul(in7, t295); + let t300 = circuit_add(t294, t299); + let t301 = circuit_mul(t300, in24); + let t302 = circuit_mul(t268, in25); + let t303 = circuit_mul(t295, in24); + let t304 = circuit_sub(t286, t250); // Fp2 sub coeff 0/1 + let t305 = circuit_sub(t287, t251); // Fp2 sub coeff 1/1 + let t306 = circuit_sub(t276, t248); // Fp2 sub coeff 0/1 + let t307 = circuit_sub(t277, t249); // Fp2 sub coeff 1/1 + let t308 = circuit_mul(t306, t306); // Fp2 Div x/y start : Fp2 Inv y start + let t309 = circuit_mul(t307, t307); + let t310 = circuit_add(t308, t309); + let t311 = circuit_inverse(t310); + let t312 = circuit_mul(t306, t311); // Fp2 Inv y real part end + let t313 = circuit_mul(t307, t311); + let t314 = circuit_sub(in6, t313); // Fp2 Inv y imag part end + let t315 = circuit_mul(t304, t312); // Fp2 mul start + let t316 = circuit_mul(t305, t314); + let t317 = circuit_sub(t315, t316); // Fp2 mul real part end + let t318 = circuit_mul(t304, t314); + let t319 = circuit_mul(t305, t312); + let t320 = circuit_add(t318, t319); // Fp2 mul imag part end + let t321 = circuit_mul(t317, t276); // Fp2 mul start + let t322 = circuit_mul(t320, t277); + let t323 = circuit_sub(t321, t322); // Fp2 mul real part end + let t324 = circuit_mul(t317, t277); + let t325 = circuit_mul(t320, t276); + let t326 = circuit_add(t324, t325); // Fp2 mul imag part end + let t327 = circuit_sub(t323, t286); // Fp2 sub coeff 0/1 + let t328 = circuit_sub(t326, t287); // Fp2 sub coeff 1/1 + let t329 = circuit_mul(in7, t320); + let t330 = circuit_add(t317, t329); + let t331 = circuit_mul(t330, in25); + let t332 = circuit_mul(in7, t328); + let t333 = circuit_add(t327, t332); + let t334 = circuit_mul(t333, in24); + let t335 = circuit_mul(t320, in25); + let t336 = circuit_mul(t328, in24); + let t337 = circuit_mul(t195, in56); // Eval sparse poly line_1 step coeff_1 * z^1 + let t338 = circuit_add(in5, t337); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t339 = circuit_mul(t198, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t340 = circuit_add(t338, t339); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t341 = circuit_mul(t199, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t342 = circuit_add(t340, t341); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t343 = circuit_mul(t200, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t344 = circuit_add(t342, t343); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t345 = circuit_mul(in61, t344); + let t346 = circuit_mul(t228, in56); // Eval sparse poly line_1 step coeff_1 * z^1 + let t347 = circuit_add(in5, t346); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t348 = circuit_mul(t231, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t349 = circuit_add(t347, t348); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t350 = circuit_mul(t232, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t351 = circuit_add(t349, t350); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t352 = circuit_mul(t233, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t353 = circuit_add(t351, t352); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t354 = circuit_mul(t345, t353); + let t355 = circuit_mul(t298, in56); // Eval sparse poly line_1 step coeff_1 * z^1 + let t356 = circuit_add(in5, t355); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t357 = circuit_mul(t301, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t358 = circuit_add(t356, t357); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t359 = circuit_mul(t302, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t360 = circuit_add(t358, t359); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t361 = circuit_mul(t303, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t362 = circuit_add(t360, t361); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t363 = circuit_mul(t354, t362); + let t364 = circuit_mul(t331, in56); // Eval sparse poly line_1 step coeff_1 * z^1 + let t365 = circuit_add(in5, t364); // Eval sparse poly line_1 step + coeff_1 * z^1 + let t366 = circuit_mul(t334, t1); // Eval sparse poly line_1 step coeff_3 * z^3 + let t367 = circuit_add(t365, t366); // Eval sparse poly line_1 step + coeff_3 * z^3 + let t368 = circuit_mul(t335, t5); // Eval sparse poly line_1 step coeff_7 * z^7 + let t369 = circuit_add(t367, t368); // Eval sparse poly line_1 step + coeff_7 * z^7 + let t370 = circuit_mul(t336, t7); // Eval sparse poly line_1 step coeff_9 * z^9 + let t371 = circuit_add(t369, t370); // Eval sparse poly line_1 step + coeff_9 * z^9 + let t372 = circuit_mul(t363, t371); + let t373 = circuit_sub(t372, t108); + let t374 = circuit_mul(t85, t373); // c_n_minus_2 * ((Π(n-2,k) (Pk(z)) - R_n_minus_2(z)) + let t375 = circuit_mul(t108, in57); + let t376 = circuit_mul(t375, in58); + let t377 = circuit_mul(t376, in59); + let t378 = circuit_mul(t377, in55); + let t379 = circuit_sub(t378, t130); + let t380 = circuit_mul(t86, t379); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) + let t381 = circuit_add(in60, t374); + let t382 = circuit_add(t381, t380); + let t383 = circuit_mul(in63, in56); // Eval big_Q step coeff_1 * z^1 + let t384 = circuit_add(in62, t383); // Eval big_Q step + (coeff_1 * z^1) + let t385 = circuit_mul(in64, t0); // Eval big_Q step coeff_2 * z^2 + let t386 = circuit_add(t384, t385); // Eval big_Q step + (coeff_2 * z^2) + let t387 = circuit_mul(in65, t1); // Eval big_Q step coeff_3 * z^3 + let t388 = circuit_add(t386, t387); // Eval big_Q step + (coeff_3 * z^3) + let t389 = circuit_mul(in66, t2); // Eval big_Q step coeff_4 * z^4 + let t390 = circuit_add(t388, t389); // Eval big_Q step + (coeff_4 * z^4) + let t391 = circuit_mul(in67, t3); // Eval big_Q step coeff_5 * z^5 + let t392 = circuit_add(t390, t391); // Eval big_Q step + (coeff_5 * z^5) + let t393 = circuit_mul(in68, t4); // Eval big_Q step coeff_6 * z^6 + let t394 = circuit_add(t392, t393); // Eval big_Q step + (coeff_6 * z^6) + let t395 = circuit_mul(in69, t5); // Eval big_Q step coeff_7 * z^7 + let t396 = circuit_add(t394, t395); // Eval big_Q step + (coeff_7 * z^7) + let t397 = circuit_mul(in70, t6); // Eval big_Q step coeff_8 * z^8 + let t398 = circuit_add(t396, t397); // Eval big_Q step + (coeff_8 * z^8) + let t399 = circuit_mul(in71, t7); // Eval big_Q step coeff_9 * z^9 + let t400 = circuit_add(t398, t399); // Eval big_Q step + (coeff_9 * z^9) + let t401 = circuit_mul(in72, t8); // Eval big_Q step coeff_10 * z^10 + let t402 = circuit_add(t400, t401); // Eval big_Q step + (coeff_10 * z^10) + let t403 = circuit_mul(in73, t9); // Eval big_Q step coeff_11 * z^11 + let t404 = circuit_add(t402, t403); // Eval big_Q step + (coeff_11 * z^11) + let t405 = circuit_mul(in74, t10); // Eval big_Q step coeff_12 * z^12 + let t406 = circuit_add(t404, t405); // Eval big_Q step + (coeff_12 * z^12) + let t407 = circuit_mul(in75, t11); // Eval big_Q step coeff_13 * z^13 + let t408 = circuit_add(t406, t407); // Eval big_Q step + (coeff_13 * z^13) + let t409 = circuit_mul(in76, t12); // Eval big_Q step coeff_14 * z^14 + let t410 = circuit_add(t408, t409); // Eval big_Q step + (coeff_14 * z^14) + let t411 = circuit_mul(in77, t13); // Eval big_Q step coeff_15 * z^15 + let t412 = circuit_add(t410, t411); // Eval big_Q step + (coeff_15 * z^15) + let t413 = circuit_mul(in78, t14); // Eval big_Q step coeff_16 * z^16 + let t414 = circuit_add(t412, t413); // Eval big_Q step + (coeff_16 * z^16) + let t415 = circuit_mul(in79, t15); // Eval big_Q step coeff_17 * z^17 + let t416 = circuit_add(t414, t415); // Eval big_Q step + (coeff_17 * z^17) + let t417 = circuit_mul(in80, t16); // Eval big_Q step coeff_18 * z^18 + let t418 = circuit_add(t416, t417); // Eval big_Q step + (coeff_18 * z^18) + let t419 = circuit_mul(in81, t17); // Eval big_Q step coeff_19 * z^19 + let t420 = circuit_add(t418, t419); // Eval big_Q step + (coeff_19 * z^19) + let t421 = circuit_mul(in82, t18); // Eval big_Q step coeff_20 * z^20 + let t422 = circuit_add(t420, t421); // Eval big_Q step + (coeff_20 * z^20) + let t423 = circuit_mul(in83, t19); // Eval big_Q step coeff_21 * z^21 + let t424 = circuit_add(t422, t423); // Eval big_Q step + (coeff_21 * z^21) + let t425 = circuit_mul(in84, t20); // Eval big_Q step coeff_22 * z^22 + let t426 = circuit_add(t424, t425); // Eval big_Q step + (coeff_22 * z^22) + let t427 = circuit_mul(in85, t21); // Eval big_Q step coeff_23 * z^23 + let t428 = circuit_add(t426, t427); // Eval big_Q step + (coeff_23 * z^23) + let t429 = circuit_mul(in86, t22); // Eval big_Q step coeff_24 * z^24 + let t430 = circuit_add(t428, t429); // Eval big_Q step + (coeff_24 * z^24) + let t431 = circuit_mul(in87, t23); // Eval big_Q step coeff_25 * z^25 + let t432 = circuit_add(t430, t431); // Eval big_Q step + (coeff_25 * z^25) + let t433 = circuit_mul(in88, t24); // Eval big_Q step coeff_26 * z^26 + let t434 = circuit_add(t432, t433); // Eval big_Q step + (coeff_26 * z^26) + let t435 = circuit_mul(in89, t25); // Eval big_Q step coeff_27 * z^27 + let t436 = circuit_add(t434, t435); // Eval big_Q step + (coeff_27 * z^27) + let t437 = circuit_mul(in90, t26); // Eval big_Q step coeff_28 * z^28 + let t438 = circuit_add(t436, t437); // Eval big_Q step + (coeff_28 * z^28) + let t439 = circuit_mul(in91, t27); // Eval big_Q step coeff_29 * z^29 + let t440 = circuit_add(t438, t439); // Eval big_Q step + (coeff_29 * z^29) + let t441 = circuit_mul(in92, t28); // Eval big_Q step coeff_30 * z^30 + let t442 = circuit_add(t440, t441); // Eval big_Q step + (coeff_30 * z^30) + let t443 = circuit_mul(in93, t29); // Eval big_Q step coeff_31 * z^31 + let t444 = circuit_add(t442, t443); // Eval big_Q step + (coeff_31 * z^31) + let t445 = circuit_mul(in94, t30); // Eval big_Q step coeff_32 * z^32 + let t446 = circuit_add(t444, t445); // Eval big_Q step + (coeff_32 * z^32) + let t447 = circuit_mul(in95, t31); // Eval big_Q step coeff_33 * z^33 + let t448 = circuit_add(t446, t447); // Eval big_Q step + (coeff_33 * z^33) + let t449 = circuit_mul(in96, t32); // Eval big_Q step coeff_34 * z^34 + let t450 = circuit_add(t448, t449); // Eval big_Q step + (coeff_34 * z^34) + let t451 = circuit_mul(in97, t33); // Eval big_Q step coeff_35 * z^35 + let t452 = circuit_add(t450, t451); // Eval big_Q step + (coeff_35 * z^35) + let t453 = circuit_mul(in98, t34); // Eval big_Q step coeff_36 * z^36 + let t454 = circuit_add(t452, t453); // Eval big_Q step + (coeff_36 * z^36) + let t455 = circuit_mul(in99, t35); // Eval big_Q step coeff_37 * z^37 + let t456 = circuit_add(t454, t455); // Eval big_Q step + (coeff_37 * z^37) + let t457 = circuit_mul(in100, t36); // Eval big_Q step coeff_38 * z^38 + let t458 = circuit_add(t456, t457); // Eval big_Q step + (coeff_38 * z^38) + let t459 = circuit_mul(in101, t37); // Eval big_Q step coeff_39 * z^39 + let t460 = circuit_add(t458, t459); // Eval big_Q step + (coeff_39 * z^39) + let t461 = circuit_mul(in102, t38); // Eval big_Q step coeff_40 * z^40 + let t462 = circuit_add(t460, t461); // Eval big_Q step + (coeff_40 * z^40) + let t463 = circuit_mul(in103, t39); // Eval big_Q step coeff_41 * z^41 + let t464 = circuit_add(t462, t463); // Eval big_Q step + (coeff_41 * z^41) + let t465 = circuit_mul(in104, t40); // Eval big_Q step coeff_42 * z^42 + let t466 = circuit_add(t464, t465); // Eval big_Q step + (coeff_42 * z^42) + let t467 = circuit_mul(in105, t41); // Eval big_Q step coeff_43 * z^43 + let t468 = circuit_add(t466, t467); // Eval big_Q step + (coeff_43 * z^43) + let t469 = circuit_mul(in106, t42); // Eval big_Q step coeff_44 * z^44 + let t470 = circuit_add(t468, t469); // Eval big_Q step + (coeff_44 * z^44) + let t471 = circuit_mul(in107, t43); // Eval big_Q step coeff_45 * z^45 + let t472 = circuit_add(t470, t471); // Eval big_Q step + (coeff_45 * z^45) + let t473 = circuit_mul(in108, t44); // Eval big_Q step coeff_46 * z^46 + let t474 = circuit_add(t472, t473); // Eval big_Q step + (coeff_46 * z^46) + let t475 = circuit_mul(in109, t45); // Eval big_Q step coeff_47 * z^47 + let t476 = circuit_add(t474, t475); // Eval big_Q step + (coeff_47 * z^47) + let t477 = circuit_mul(in110, t46); // Eval big_Q step coeff_48 * z^48 + let t478 = circuit_add(t476, t477); // Eval big_Q step + (coeff_48 * z^48) + let t479 = circuit_mul(in111, t47); // Eval big_Q step coeff_49 * z^49 + let t480 = circuit_add(t478, t479); // Eval big_Q step + (coeff_49 * z^49) + let t481 = circuit_mul(in112, t48); // Eval big_Q step coeff_50 * z^50 + let t482 = circuit_add(t480, t481); // Eval big_Q step + (coeff_50 * z^50) + let t483 = circuit_mul(in113, t49); // Eval big_Q step coeff_51 * z^51 + let t484 = circuit_add(t482, t483); // Eval big_Q step + (coeff_51 * z^51) + let t485 = circuit_mul(in114, t50); // Eval big_Q step coeff_52 * z^52 + let t486 = circuit_add(t484, t485); // Eval big_Q step + (coeff_52 * z^52) + let t487 = circuit_mul(in115, t51); // Eval big_Q step coeff_53 * z^53 + let t488 = circuit_add(t486, t487); // Eval big_Q step + (coeff_53 * z^53) + let t489 = circuit_mul(in116, t52); // Eval big_Q step coeff_54 * z^54 + let t490 = circuit_add(t488, t489); // Eval big_Q step + (coeff_54 * z^54) + let t491 = circuit_mul(in117, t53); // Eval big_Q step coeff_55 * z^55 + let t492 = circuit_add(t490, t491); // Eval big_Q step + (coeff_55 * z^55) + let t493 = circuit_mul(in118, t54); // Eval big_Q step coeff_56 * z^56 + let t494 = circuit_add(t492, t493); // Eval big_Q step + (coeff_56 * z^56) + let t495 = circuit_mul(in119, t55); // Eval big_Q step coeff_57 * z^57 + let t496 = circuit_add(t494, t495); // Eval big_Q step + (coeff_57 * z^57) + let t497 = circuit_mul(in120, t56); // Eval big_Q step coeff_58 * z^58 + let t498 = circuit_add(t496, t497); // Eval big_Q step + (coeff_58 * z^58) + let t499 = circuit_mul(in121, t57); // Eval big_Q step coeff_59 * z^59 + let t500 = circuit_add(t498, t499); // Eval big_Q step + (coeff_59 * z^59) + let t501 = circuit_mul(in122, t58); // Eval big_Q step coeff_60 * z^60 + let t502 = circuit_add(t500, t501); // Eval big_Q step + (coeff_60 * z^60) + let t503 = circuit_mul(in123, t59); // Eval big_Q step coeff_61 * z^61 + let t504 = circuit_add(t502, t503); // Eval big_Q step + (coeff_61 * z^61) + let t505 = circuit_mul(in124, t60); // Eval big_Q step coeff_62 * z^62 + let t506 = circuit_add(t504, t505); // Eval big_Q step + (coeff_62 * z^62) + let t507 = circuit_mul(in125, t61); // Eval big_Q step coeff_63 * z^63 + let t508 = circuit_add(t506, t507); // Eval big_Q step + (coeff_63 * z^63) + let t509 = circuit_mul(in126, t62); // Eval big_Q step coeff_64 * z^64 + let t510 = circuit_add(t508, t509); // Eval big_Q step + (coeff_64 * z^64) + let t511 = circuit_mul(in127, t63); // Eval big_Q step coeff_65 * z^65 + let t512 = circuit_add(t510, t511); // Eval big_Q step + (coeff_65 * z^65) + let t513 = circuit_mul(in128, t64); // Eval big_Q step coeff_66 * z^66 + let t514 = circuit_add(t512, t513); // Eval big_Q step + (coeff_66 * z^66) + let t515 = circuit_mul(in129, t65); // Eval big_Q step coeff_67 * z^67 + let t516 = circuit_add(t514, t515); // Eval big_Q step + (coeff_67 * z^67) + let t517 = circuit_mul(in130, t66); // Eval big_Q step coeff_68 * z^68 + let t518 = circuit_add(t516, t517); // Eval big_Q step + (coeff_68 * z^68) + let t519 = circuit_mul(in131, t67); // Eval big_Q step coeff_69 * z^69 + let t520 = circuit_add(t518, t519); // Eval big_Q step + (coeff_69 * z^69) + let t521 = circuit_mul(in132, t68); // Eval big_Q step coeff_70 * z^70 + let t522 = circuit_add(t520, t521); // Eval big_Q step + (coeff_70 * z^70) + let t523 = circuit_mul(in133, t69); // Eval big_Q step coeff_71 * z^71 + let t524 = circuit_add(t522, t523); // Eval big_Q step + (coeff_71 * z^71) + let t525 = circuit_mul(in134, t70); // Eval big_Q step coeff_72 * z^72 + let t526 = circuit_add(t524, t525); // Eval big_Q step + (coeff_72 * z^72) + let t527 = circuit_mul(in135, t71); // Eval big_Q step coeff_73 * z^73 + let t528 = circuit_add(t526, t527); // Eval big_Q step + (coeff_73 * z^73) + let t529 = circuit_mul(in136, t72); // Eval big_Q step coeff_74 * z^74 + let t530 = circuit_add(t528, t529); // Eval big_Q step + (coeff_74 * z^74) + let t531 = circuit_mul(in137, t73); // Eval big_Q step coeff_75 * z^75 + let t532 = circuit_add(t530, t531); // Eval big_Q step + (coeff_75 * z^75) + let t533 = circuit_mul(in138, t74); // Eval big_Q step coeff_76 * z^76 + let t534 = circuit_add(t532, t533); // Eval big_Q step + (coeff_76 * z^76) + let t535 = circuit_mul(in139, t75); // Eval big_Q step coeff_77 * z^77 + let t536 = circuit_add(t534, t535); // Eval big_Q step + (coeff_77 * z^77) + let t537 = circuit_mul(in140, t76); // Eval big_Q step coeff_78 * z^78 + let t538 = circuit_add(t536, t537); // Eval big_Q step + (coeff_78 * z^78) + let t539 = circuit_mul(in141, t77); // Eval big_Q step coeff_79 * z^79 + let t540 = circuit_add(t538, t539); // Eval big_Q step + (coeff_79 * z^79) + let t541 = circuit_mul(in142, t78); // Eval big_Q step coeff_80 * z^80 + let t542 = circuit_add(t540, t541); // Eval big_Q step + (coeff_80 * z^80) + let t543 = circuit_mul(in143, t79); // Eval big_Q step coeff_81 * z^81 + let t544 = circuit_add(t542, t543); // Eval big_Q step + (coeff_81 * z^81) + let t545 = circuit_mul(in144, t80); // Eval big_Q step coeff_82 * z^82 + let t546 = circuit_add(t544, t545); // Eval big_Q step + (coeff_82 * z^82) + let t547 = circuit_mul(in145, t81); // Eval big_Q step coeff_83 * z^83 + let t548 = circuit_add(t546, t547); // Eval big_Q step + (coeff_83 * z^83) + let t549 = circuit_mul(in146, t82); // Eval big_Q step coeff_84 * z^84 + let t550 = circuit_add(t548, t549); // Eval big_Q step + (coeff_84 * z^84) + let t551 = circuit_mul(in147, t83); // Eval big_Q step coeff_85 * z^85 + let t552 = circuit_add(t550, t551); // Eval big_Q step + (coeff_85 * z^85) + let t553 = circuit_mul(in148, t84); // Eval big_Q step coeff_86 * z^86 + let t554 = circuit_add(t552, t553); // Eval big_Q step + (coeff_86 * z^86) + let t555 = circuit_mul(in9, t4); // Eval sparse poly P_irr step coeff_6 * z^6 + let t556 = circuit_add(in8, t555); // Eval sparse poly P_irr step + coeff_6 * z^6 + let t557 = circuit_add(t556, t10); // Eval sparse poly P_irr step + 1*z^12 + let t558 = circuit_mul(t554, t557); + let t559 = circuit_sub(t382, t558); + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t559, t381,).new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs + .next([0xc2c3330c99e39557176f553d, 0x4c0bec3cf559b143b78cc310, 0x2fb347984f7911f7, 0x0]); + circuit_inputs = circuit_inputs + .next([0xb7c9dce1665d51c640fcba2, 0x4ba4cc8bd75a079432ae2a1d, 0x16c9e55061ebae20, 0x0]); + circuit_inputs = circuit_inputs + .next([0xa9c95998dc54014671a0135a, 0xdc5ec698b6e2f9b9dbaae0ed, 0x63cf305489af5dc, 0x0]); + circuit_inputs = circuit_inputs + .next([0x8fa25bd282d37f632623b0e3, 0x704b5a7ec796f2b21807dc9, 0x7c03cbcac41049a, 0x0]); + circuit_inputs = circuit_inputs + .next([0xbb966e3de4bd44e5607cfd48, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x52, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd35, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next(original_Q0.x0); + circuit_inputs = circuit_inputs.next(original_Q0.x1); + circuit_inputs = circuit_inputs.next(original_Q0.y0); + circuit_inputs = circuit_inputs.next(original_Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(original_Q1.x0); + circuit_inputs = circuit_inputs.next(original_Q1.x1); + circuit_inputs = circuit_inputs.next(original_Q1.y0); + circuit_inputs = circuit_inputs.next(original_Q1.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w0); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w1); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w2); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w3); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w4); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w5); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w6); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w7); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w8); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w9); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w10); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w11); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w0); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w1); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w2); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w3); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w4); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w5); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w6); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w7); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w8); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w9); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w10); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w11); + circuit_inputs = circuit_inputs.next(c_n_minus_3); + circuit_inputs = circuit_inputs.next(w_of_z); + circuit_inputs = circuit_inputs.next(z); + circuit_inputs = circuit_inputs.next(c_inv_frob_1_of_z); + circuit_inputs = circuit_inputs.next(c_frob_2_of_z); + circuit_inputs = circuit_inputs.next(c_inv_frob_3_of_z); + circuit_inputs = circuit_inputs.next(previous_lhs); + circuit_inputs = circuit_inputs.next(R_n_minus_3_of_z); + + let mut Q = Q; + while let Option::Some(val) = Q.pop_front() { + circuit_inputs = circuit_inputs.next(val); + }; + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let final_check: u384 = outputs.get_output(t559); + let _final_lhs: u384 = outputs.get_output(t381); + return (final_check, _final_lhs); +} +fn run_BN254_MP_CHECK_FINALIZE_BN_3_circuit( + original_Q0: G2Point, + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + original_Q1: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + original_Q2: G2Point, + yInv_2: u384, + xNegOverY_2: u384, + Q2: G2Point, + R_n_minus_2: E12D, + R_n_minus_1: E12D, + c_n_minus_3: u384, + w_of_z: u384, + z: u384, + c_inv_frob_1_of_z: u384, + c_frob_2_of_z: u384, + c_inv_frob_3_of_z: u384, + previous_lhs: u384, + R_n_minus_3_of_z: u384, + Q: Array +) -> (u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d + let in1 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 + let in2 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a + let in3 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 + let in4 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 + let in5 = CE::> {}; // 0x1 + let in6 = CE::> {}; // 0x0 + let in7 = CE::> {}; // -0x9 % p + let in8 = CE::> {}; // 0x52 + let in9 = CE::> {}; // -0x12 % p + + // INPUT stack + let (in10, in11) = (CE::> {}, CE::> {}); + let (in12, in13) = (CE::> {}, CE::> {}); + let (in14, in15) = (CE::> {}, CE::> {}); + let (in16, in17) = (CE::> {}, CE::> {}); + let (in18, in19) = (CE::> {}, CE::> {}); + let (in20, in21) = (CE::> {}, CE::> {}); + let (in22, in23) = (CE::> {}, CE::> {}); + let (in24, in25) = (CE::> {}, CE::> {}); + let (in26, in27) = (CE::> {}, CE::> {}); + let (in28, in29) = (CE::> {}, CE::> {}); + let (in30, in31) = (CE::> {}, CE::> {}); + let (in32, in33) = (CE::> {}, CE::> {}); + let (in34, in35) = (CE::> {}, CE::> {}); + let (in36, in37) = (CE::> {}, CE::> {}); + let (in38, in39) = (CE::> {}, CE::> {}); + let (in40, in41) = (CE::> {}, CE::> {}); + let (in42, in43) = (CE::> {}, CE::> {}); + let (in44, in45) = (CE::> {}, CE::> {}); + let (in46, in47) = (CE::> {}, CE::> {}); + let (in48, in49) = (CE::> {}, CE::> {}); + let (in50, in51) = (CE::> {}, CE::> {}); + let (in52, in53) = (CE::> {}, CE::> {}); + let (in54, in55) = (CE::> {}, CE::> {}); + let (in56, in57) = (CE::> {}, CE::> {}); + let (in58, in59) = (CE::> {}, CE::> {}); + let (in60, in61) = (CE::> {}, CE::> {}); + let (in62, in63) = (CE::> {}, CE::> {}); + let (in64, in65) = (CE::> {}, CE::> {}); + let (in66, in67) = (CE::> {}, CE::> {}); + let (in68, in69) = (CE::> {}, CE::> {}); + let (in70, in71) = (CE::> {}, CE::> {}); + let (in72, in73) = (CE::> {}, CE::> {}); + let (in74, in75) = (CE::> {}, CE::> {}); + let (in76, in77) = (CE::> {}, CE::> {}); + let (in78, in79) = (CE::> {}, CE::> {}); + let (in80, in81) = (CE::> {}, CE::> {}); + let (in82, in83) = (CE::> {}, CE::> {}); + let (in84, in85) = (CE::> {}, CE::> {}); + let (in86, in87) = (CE::> {}, CE::> {}); + let (in88, in89) = (CE::> {}, CE::> {}); + let (in90, in91) = (CE::> {}, CE::> {}); + let (in92, in93) = (CE::> {}, CE::> {}); + let (in94, in95) = (CE::> {}, CE::> {}); + let (in96, in97) = (CE::> {}, CE::> {}); + let (in98, in99) = (CE::> {}, CE::> {}); + let (in100, in101) = (CE::> {}, CE::> {}); + let (in102, in103) = (CE::> {}, CE::> {}); + let (in104, in105) = (CE::> {}, CE::> {}); + let (in106, in107) = (CE::> {}, CE::> {}); + let (in108, in109) = (CE::> {}, CE::> {}); + let (in110, in111) = (CE::> {}, CE::> {}); + let (in112, in113) = (CE::> {}, CE::> {}); + let (in114, in115) = (CE::> {}, CE::> {}); + let (in116, in117) = (CE::> {}, CE::> {}); + let (in118, in119) = (CE::> {}, CE::> {}); + let (in120, in121) = (CE::> {}, CE::> {}); + let (in122, in123) = (CE::> {}, CE::> {}); + let (in124, in125) = (CE::> {}, CE::> {}); + let (in126, in127) = (CE::> {}, CE::> {}); + let (in128, in129) = (CE::> {}, CE::> {}); + let (in130, in131) = (CE::> {}, CE::> {}); + let (in132, in133) = (CE::> {}, CE::> {}); + let (in134, in135) = (CE::> {}, CE::> {}); + let (in136, in137) = (CE::> {}, CE::> {}); + let (in138, in139) = (CE::> {}, CE::> {}); + let (in140, in141) = (CE::> {}, CE::> {}); + let (in142, in143) = (CE::> {}, CE::> {}); + let (in144, in145) = (CE::> {}, CE::> {}); + let (in146, in147) = (CE::> {}, CE::> {}); + let (in148, in149) = (CE::> {}, CE::> {}); + let (in150, in151) = (CE::> {}, CE::> {}); + let (in152, in153) = (CE::> {}, CE::> {}); + let (in154, in155) = (CE::> {}, CE::> {}); + let (in156, in157) = (CE::> {}, CE::> {}); + let (in158, in159) = (CE::> {}, CE::> {}); + let (in160, in161) = (CE::> {}, CE::> {}); + let (in162, in163) = (CE::> {}, CE::> {}); + let (in164, in165) = (CE::> {}, CE::> {}); + let (in166, in167) = (CE::> {}, CE::> {}); + let (in168, in169) = (CE::> {}, CE::> {}); + let (in170, in171) = (CE::> {}, CE::> {}); + let (in172, in173) = (CE::> {}, CE::> {}); + let (in174, in175) = (CE::> {}, CE::> {}); + let (in176, in177) = (CE::> {}, CE::> {}); + let (in178, in179) = (CE::> {}, CE::> {}); + let (in180, in181) = (CE::> {}, CE::> {}); + let (in182, in183) = (CE::> {}, CE::> {}); + let (in184, in185) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in66, in66); // Compute z^2 + let t1 = circuit_mul(t0, in66); // Compute z^3 + let t2 = circuit_mul(t1, in66); // Compute z^4 + let t3 = circuit_mul(t2, in66); // Compute z^5 + let t4 = circuit_mul(t3, in66); // Compute z^6 + let t5 = circuit_mul(t4, in66); // Compute z^7 + let t6 = circuit_mul(t5, in66); // Compute z^8 + let t7 = circuit_mul(t6, in66); // Compute z^9 + let t8 = circuit_mul(t7, in66); // Compute z^10 + let t9 = circuit_mul(t8, in66); // Compute z^11 + let t10 = circuit_mul(t9, in66); // Compute z^12 + let t11 = circuit_mul(t10, in66); // Compute z^13 + let t12 = circuit_mul(t11, in66); // Compute z^14 + let t13 = circuit_mul(t12, in66); // Compute z^15 + let t14 = circuit_mul(t13, in66); // Compute z^16 + let t15 = circuit_mul(t14, in66); // Compute z^17 + let t16 = circuit_mul(t15, in66); // Compute z^18 + let t17 = circuit_mul(t16, in66); // Compute z^19 + let t18 = circuit_mul(t17, in66); // Compute z^20 + let t19 = circuit_mul(t18, in66); // Compute z^21 + let t20 = circuit_mul(t19, in66); // Compute z^22 + let t21 = circuit_mul(t20, in66); // Compute z^23 + let t22 = circuit_mul(t21, in66); // Compute z^24 + let t23 = circuit_mul(t22, in66); // Compute z^25 + let t24 = circuit_mul(t23, in66); // Compute z^26 + let t25 = circuit_mul(t24, in66); // Compute z^27 + let t26 = circuit_mul(t25, in66); // Compute z^28 + let t27 = circuit_mul(t26, in66); // Compute z^29 + let t28 = circuit_mul(t27, in66); // Compute z^30 + let t29 = circuit_mul(t28, in66); // Compute z^31 + let t30 = circuit_mul(t29, in66); // Compute z^32 + let t31 = circuit_mul(t30, in66); // Compute z^33 + let t32 = circuit_mul(t31, in66); // Compute z^34 + let t33 = circuit_mul(t32, in66); // Compute z^35 + let t34 = circuit_mul(t33, in66); // Compute z^36 + let t35 = circuit_mul(t34, in66); // Compute z^37 + let t36 = circuit_mul(t35, in66); // Compute z^38 + let t37 = circuit_mul(t36, in66); // Compute z^39 + let t38 = circuit_mul(t37, in66); // Compute z^40 + let t39 = circuit_mul(t38, in66); // Compute z^41 + let t40 = circuit_mul(t39, in66); // Compute z^42 + let t41 = circuit_mul(t40, in66); // Compute z^43 + let t42 = circuit_mul(t41, in66); // Compute z^44 + let t43 = circuit_mul(t42, in66); // Compute z^45 + let t44 = circuit_mul(t43, in66); // Compute z^46 + let t45 = circuit_mul(t44, in66); // Compute z^47 + let t46 = circuit_mul(t45, in66); // Compute z^48 + let t47 = circuit_mul(t46, in66); // Compute z^49 + let t48 = circuit_mul(t47, in66); // Compute z^50 + let t49 = circuit_mul(t48, in66); // Compute z^51 + let t50 = circuit_mul(t49, in66); // Compute z^52 + let t51 = circuit_mul(t50, in66); // Compute z^53 + let t52 = circuit_mul(t51, in66); // Compute z^54 + let t53 = circuit_mul(t52, in66); // Compute z^55 + let t54 = circuit_mul(t53, in66); // Compute z^56 + let t55 = circuit_mul(t54, in66); // Compute z^57 + let t56 = circuit_mul(t55, in66); // Compute z^58 + let t57 = circuit_mul(t56, in66); // Compute z^59 + let t58 = circuit_mul(t57, in66); // Compute z^60 + let t59 = circuit_mul(t58, in66); // Compute z^61 + let t60 = circuit_mul(t59, in66); // Compute z^62 + let t61 = circuit_mul(t60, in66); // Compute z^63 + let t62 = circuit_mul(t61, in66); // Compute z^64 + let t63 = circuit_mul(t62, in66); // Compute z^65 + let t64 = circuit_mul(t63, in66); // Compute z^66 + let t65 = circuit_mul(t64, in66); // Compute z^67 + let t66 = circuit_mul(t65, in66); // Compute z^68 + let t67 = circuit_mul(t66, in66); // Compute z^69 + let t68 = circuit_mul(t67, in66); // Compute z^70 + let t69 = circuit_mul(t68, in66); // Compute z^71 + let t70 = circuit_mul(t69, in66); // Compute z^72 + let t71 = circuit_mul(t70, in66); // Compute z^73 + let t72 = circuit_mul(t71, in66); // Compute z^74 + let t73 = circuit_mul(t72, in66); // Compute z^75 + let t74 = circuit_mul(t73, in66); // Compute z^76 + let t75 = circuit_mul(t74, in66); // Compute z^77 + let t76 = circuit_mul(t75, in66); // Compute z^78 + let t77 = circuit_mul(t76, in66); // Compute z^79 + let t78 = circuit_mul(t77, in66); // Compute z^80 + let t79 = circuit_mul(t78, in66); // Compute z^81 + let t80 = circuit_mul(t79, in66); // Compute z^82 + let t81 = circuit_mul(t80, in66); // Compute z^83 + let t82 = circuit_mul(t81, in66); // Compute z^84 + let t83 = circuit_mul(t82, in66); // Compute z^85 + let t84 = circuit_mul(t83, in66); // Compute z^86 + let t85 = circuit_mul(t84, in66); // Compute z^87 + let t86 = circuit_mul(t85, in66); // Compute z^88 + let t87 = circuit_mul(t86, in66); // Compute z^89 + let t88 = circuit_mul(t87, in66); // Compute z^90 + let t89 = circuit_mul(t88, in66); // Compute z^91 + let t90 = circuit_mul(t89, in66); // Compute z^92 + let t91 = circuit_mul(t90, in66); // Compute z^93 + let t92 = circuit_mul(t91, in66); // Compute z^94 + let t93 = circuit_mul(t92, in66); // Compute z^95 + let t94 = circuit_mul(t93, in66); // Compute z^96 + let t95 = circuit_mul(t94, in66); // Compute z^97 + let t96 = circuit_mul(t95, in66); // Compute z^98 + let t97 = circuit_mul(t96, in66); // Compute z^99 + let t98 = circuit_mul(t97, in66); // Compute z^100 + let t99 = circuit_mul(t98, in66); // Compute z^101 + let t100 = circuit_mul(t99, in66); // Compute z^102 + let t101 = circuit_mul(t100, in66); // Compute z^103 + let t102 = circuit_mul(t101, in66); // Compute z^104 + let t103 = circuit_mul(t102, in66); // Compute z^105 + let t104 = circuit_mul(t103, in66); // Compute z^106 + let t105 = circuit_mul(t104, in66); // Compute z^107 + let t106 = circuit_mul(t105, in66); // Compute z^108 + let t107 = circuit_mul(t106, in66); // Compute z^109 + let t108 = circuit_mul(t107, in66); // Compute z^110 + let t109 = circuit_mul(t108, in66); // Compute z^111 + let t110 = circuit_mul(t109, in66); // Compute z^112 + let t111 = circuit_mul(t110, in66); // Compute z^113 + let t112 = circuit_mul(in64, in64); + let t113 = circuit_mul(t112, t112); + let t114 = circuit_mul(in41, in66); // Eval R_n_minus_2 step coeff_1 * z^1 + let t115 = circuit_add(in40, t114); // Eval R_n_minus_2 step + (coeff_1 * z^1) + let t116 = circuit_mul(in42, t0); // Eval R_n_minus_2 step coeff_2 * z^2 + let t117 = circuit_add(t115, t116); // Eval R_n_minus_2 step + (coeff_2 * z^2) + let t118 = circuit_mul(in43, t1); // Eval R_n_minus_2 step coeff_3 * z^3 + let t119 = circuit_add(t117, t118); // Eval R_n_minus_2 step + (coeff_3 * z^3) + let t120 = circuit_mul(in44, t2); // Eval R_n_minus_2 step coeff_4 * z^4 + let t121 = circuit_add(t119, t120); // Eval R_n_minus_2 step + (coeff_4 * z^4) + let t122 = circuit_mul(in45, t3); // Eval R_n_minus_2 step coeff_5 * z^5 + let t123 = circuit_add(t121, t122); // Eval R_n_minus_2 step + (coeff_5 * z^5) + let t124 = circuit_mul(in46, t4); // Eval R_n_minus_2 step coeff_6 * z^6 + let t125 = circuit_add(t123, t124); // Eval R_n_minus_2 step + (coeff_6 * z^6) + let t126 = circuit_mul(in47, t5); // Eval R_n_minus_2 step coeff_7 * z^7 + let t127 = circuit_add(t125, t126); // Eval R_n_minus_2 step + (coeff_7 * z^7) + let t128 = circuit_mul(in48, t6); // Eval R_n_minus_2 step coeff_8 * z^8 + let t129 = circuit_add(t127, t128); // Eval R_n_minus_2 step + (coeff_8 * z^8) + let t130 = circuit_mul(in49, t7); // Eval R_n_minus_2 step coeff_9 * z^9 + let t131 = circuit_add(t129, t130); // Eval R_n_minus_2 step + (coeff_9 * z^9) + let t132 = circuit_mul(in50, t8); // Eval R_n_minus_2 step coeff_10 * z^10 + let t133 = circuit_add(t131, t132); // Eval R_n_minus_2 step + (coeff_10 * z^10) + let t134 = circuit_mul(in51, t9); // Eval R_n_minus_2 step coeff_11 * z^11 + let t135 = circuit_add(t133, t134); // Eval R_n_minus_2 step + (coeff_11 * z^11) + let t136 = circuit_mul(in53, in66); // Eval R_n_minus_1 step coeff_1 * z^1 + let t137 = circuit_add(in52, t136); // Eval R_n_minus_1 step + (coeff_1 * z^1) + let t138 = circuit_mul(in54, t0); // Eval R_n_minus_1 step coeff_2 * z^2 + let t139 = circuit_add(t137, t138); // Eval R_n_minus_1 step + (coeff_2 * z^2) + let t140 = circuit_mul(in55, t1); // Eval R_n_minus_1 step coeff_3 * z^3 + let t141 = circuit_add(t139, t140); // Eval R_n_minus_1 step + (coeff_3 * z^3) + let t142 = circuit_mul(in56, t2); // Eval R_n_minus_1 step coeff_4 * z^4 + let t143 = circuit_add(t141, t142); // Eval R_n_minus_1 step + (coeff_4 * z^4) + let t144 = circuit_mul(in57, t3); // Eval R_n_minus_1 step coeff_5 * z^5 + let t145 = circuit_add(t143, t144); // Eval R_n_minus_1 step + (coeff_5 * z^5) + let t146 = circuit_mul(in58, t4); // Eval R_n_minus_1 step coeff_6 * z^6 + let t147 = circuit_add(t145, t146); // Eval R_n_minus_1 step + (coeff_6 * z^6) + let t148 = circuit_mul(in59, t5); // Eval R_n_minus_1 step coeff_7 * z^7 + let t149 = circuit_add(t147, t148); // Eval R_n_minus_1 step + (coeff_7 * z^7) + let t150 = circuit_mul(in60, t6); // Eval R_n_minus_1 step coeff_8 * z^8 + let t151 = circuit_add(t149, t150); // Eval R_n_minus_1 step + (coeff_8 * z^8) + let t152 = circuit_mul(in61, t7); // Eval R_n_minus_1 step coeff_9 * z^9 + let t153 = circuit_add(t151, t152); // Eval R_n_minus_1 step + (coeff_9 * z^9) + let t154 = circuit_mul(in62, t8); // Eval R_n_minus_1 step coeff_10 * z^10 + let t155 = circuit_add(t153, t154); // Eval R_n_minus_1 step + (coeff_10 * z^10) + let t156 = circuit_mul(in63, t9); // Eval R_n_minus_1 step coeff_11 * z^11 + let t157 = circuit_add(t155, t156); // Eval R_n_minus_1 step + (coeff_11 * z^11) + let t158 = circuit_sub(in6, in11); + let t159 = circuit_sub(in6, in13); + let t160 = circuit_mul(in10, in0); // Fp2 mul start + let t161 = circuit_mul(t158, in1); + let t162 = circuit_sub(t160, t161); // Fp2 mul real part end + let t163 = circuit_mul(in10, in1); + let t164 = circuit_mul(t158, in0); + let t165 = circuit_add(t163, t164); // Fp2 mul imag part end + let t166 = circuit_mul(in12, in2); // Fp2 mul start + let t167 = circuit_mul(t159, in3); + let t168 = circuit_sub(t166, t167); // Fp2 mul real part end + let t169 = circuit_mul(in12, in3); + let t170 = circuit_mul(t159, in2); + let t171 = circuit_add(t169, t170); // Fp2 mul imag part end + let t172 = circuit_mul(in10, in4); // Fp2 scalar mul coeff 0/1 + let t173 = circuit_mul(in11, in4); // Fp2 scalar mul coeff 1/1 + let t174 = circuit_mul(in12, in5); // Fp2 scalar mul coeff 0/1 + let t175 = circuit_mul(in13, in5); // Fp2 scalar mul coeff 1/1 + let t176 = circuit_sub(in18, t168); // Fp2 sub coeff 0/1 + let t177 = circuit_sub(in19, t171); // Fp2 sub coeff 1/1 + let t178 = circuit_sub(in16, t162); // Fp2 sub coeff 0/1 + let t179 = circuit_sub(in17, t165); // Fp2 sub coeff 1/1 + let t180 = circuit_mul(t178, t178); // Fp2 Div x/y start : Fp2 Inv y start + let t181 = circuit_mul(t179, t179); + let t182 = circuit_add(t180, t181); + let t183 = circuit_inverse(t182); + let t184 = circuit_mul(t178, t183); // Fp2 Inv y real part end + let t185 = circuit_mul(t179, t183); + let t186 = circuit_sub(in6, t185); // Fp2 Inv y imag part end + let t187 = circuit_mul(t176, t184); // Fp2 mul start + let t188 = circuit_mul(t177, t186); + let t189 = circuit_sub(t187, t188); // Fp2 mul real part end + let t190 = circuit_mul(t176, t186); + let t191 = circuit_mul(t177, t184); + let t192 = circuit_add(t190, t191); // Fp2 mul imag part end + let t193 = circuit_add(t189, t192); + let t194 = circuit_sub(t189, t192); + let t195 = circuit_mul(t193, t194); + let t196 = circuit_mul(t189, t192); + let t197 = circuit_add(t196, t196); + let t198 = circuit_add(in16, t162); // Fp2 add coeff 0/1 + let t199 = circuit_add(in17, t165); // Fp2 add coeff 1/1 + let t200 = circuit_sub(t195, t198); // Fp2 sub coeff 0/1 + let t201 = circuit_sub(t197, t199); // Fp2 sub coeff 1/1 + let t202 = circuit_sub(in16, t200); // Fp2 sub coeff 0/1 + let t203 = circuit_sub(in17, t201); // Fp2 sub coeff 1/1 + let t204 = circuit_mul(t189, t202); // Fp2 mul start + let t205 = circuit_mul(t192, t203); + let t206 = circuit_sub(t204, t205); // Fp2 mul real part end + let t207 = circuit_mul(t189, t203); + let t208 = circuit_mul(t192, t202); + let t209 = circuit_add(t207, t208); // Fp2 mul imag part end + let t210 = circuit_sub(t206, in18); // Fp2 sub coeff 0/1 + let t211 = circuit_sub(t209, in19); // Fp2 sub coeff 1/1 + let t212 = circuit_mul(t189, in16); // Fp2 mul start + let t213 = circuit_mul(t192, in17); + let t214 = circuit_sub(t212, t213); // Fp2 mul real part end + let t215 = circuit_mul(t189, in17); + let t216 = circuit_mul(t192, in16); + let t217 = circuit_add(t215, t216); // Fp2 mul imag part end + let t218 = circuit_sub(t214, in18); // Fp2 sub coeff 0/1 + let t219 = circuit_sub(t217, in19); // Fp2 sub coeff 1/1 + let t220 = circuit_mul(in7, t192); + let t221 = circuit_add(t189, t220); + let t222 = circuit_mul(t221, in15); + let t223 = circuit_mul(in7, t219); + let t224 = circuit_add(t218, t223); + let t225 = circuit_mul(t224, in14); + let t226 = circuit_mul(t192, in15); + let t227 = circuit_mul(t219, in14); + let t228 = circuit_sub(t210, t174); // Fp2 sub coeff 0/1 + let t229 = circuit_sub(t211, t175); // Fp2 sub coeff 1/1 + let t230 = circuit_sub(t200, t172); // Fp2 sub coeff 0/1 + let t231 = circuit_sub(t201, t173); // Fp2 sub coeff 1/1 + let t232 = circuit_mul(t230, t230); // Fp2 Div x/y start : Fp2 Inv y start + let t233 = circuit_mul(t231, t231); + let t234 = circuit_add(t232, t233); + let t235 = circuit_inverse(t234); + let t236 = circuit_mul(t230, t235); // Fp2 Inv y real part end + let t237 = circuit_mul(t231, t235); + let t238 = circuit_sub(in6, t237); // Fp2 Inv y imag part end + let t239 = circuit_mul(t228, t236); // Fp2 mul start + let t240 = circuit_mul(t229, t238); + let t241 = circuit_sub(t239, t240); // Fp2 mul real part end + let t242 = circuit_mul(t228, t238); + let t243 = circuit_mul(t229, t236); + let t244 = circuit_add(t242, t243); // Fp2 mul imag part end + let t245 = circuit_mul(t241, t200); // Fp2 mul start + let t246 = circuit_mul(t244, t201); + let t247 = circuit_sub(t245, t246); // Fp2 mul real part end + let t248 = circuit_mul(t241, t201); + let t249 = circuit_mul(t244, t200); + let t250 = circuit_add(t248, t249); // Fp2 mul imag part end + let t251 = circuit_sub(t247, t210); // Fp2 sub coeff 0/1 + let t252 = circuit_sub(t250, t211); // Fp2 sub coeff 1/1 + let t253 = circuit_mul(in7, t244); + let t254 = circuit_add(t241, t253); + let t255 = circuit_mul(t254, in15); + let t256 = circuit_mul(in7, t252); + let t257 = circuit_add(t251, t256); + let t258 = circuit_mul(t257, in14); + let t259 = circuit_mul(t244, in15); + let t260 = circuit_mul(t252, in14); + let t261 = circuit_sub(in6, in21); + let t262 = circuit_sub(in6, in23); + let t263 = circuit_mul(in20, in0); // Fp2 mul start + let t264 = circuit_mul(t261, in1); + let t265 = circuit_sub(t263, t264); // Fp2 mul real part end + let t266 = circuit_mul(in20, in1); + let t267 = circuit_mul(t261, in0); + let t268 = circuit_add(t266, t267); // Fp2 mul imag part end + let t269 = circuit_mul(in22, in2); // Fp2 mul start + let t270 = circuit_mul(t262, in3); + let t271 = circuit_sub(t269, t270); // Fp2 mul real part end + let t272 = circuit_mul(in22, in3); + let t273 = circuit_mul(t262, in2); + let t274 = circuit_add(t272, t273); // Fp2 mul imag part end + let t275 = circuit_mul(in20, in4); // Fp2 scalar mul coeff 0/1 + let t276 = circuit_mul(in21, in4); // Fp2 scalar mul coeff 1/1 + let t277 = circuit_mul(in22, in5); // Fp2 scalar mul coeff 0/1 + let t278 = circuit_mul(in23, in5); // Fp2 scalar mul coeff 1/1 + let t279 = circuit_sub(in28, t271); // Fp2 sub coeff 0/1 + let t280 = circuit_sub(in29, t274); // Fp2 sub coeff 1/1 + let t281 = circuit_sub(in26, t265); // Fp2 sub coeff 0/1 + let t282 = circuit_sub(in27, t268); // Fp2 sub coeff 1/1 + let t283 = circuit_mul(t281, t281); // Fp2 Div x/y start : Fp2 Inv y start + let t284 = circuit_mul(t282, t282); + let t285 = circuit_add(t283, t284); + let t286 = circuit_inverse(t285); + let t287 = circuit_mul(t281, t286); // Fp2 Inv y real part end + let t288 = circuit_mul(t282, t286); + let t289 = circuit_sub(in6, t288); // Fp2 Inv y imag part end + let t290 = circuit_mul(t279, t287); // Fp2 mul start + let t291 = circuit_mul(t280, t289); + let t292 = circuit_sub(t290, t291); // Fp2 mul real part end + let t293 = circuit_mul(t279, t289); + let t294 = circuit_mul(t280, t287); + let t295 = circuit_add(t293, t294); // Fp2 mul imag part end + let t296 = circuit_add(t292, t295); + let t297 = circuit_sub(t292, t295); + let t298 = circuit_mul(t296, t297); + let t299 = circuit_mul(t292, t295); + let t300 = circuit_add(t299, t299); + let t301 = circuit_add(in26, t265); // Fp2 add coeff 0/1 + let t302 = circuit_add(in27, t268); // Fp2 add coeff 1/1 + let t303 = circuit_sub(t298, t301); // Fp2 sub coeff 0/1 + let t304 = circuit_sub(t300, t302); // Fp2 sub coeff 1/1 + let t305 = circuit_sub(in26, t303); // Fp2 sub coeff 0/1 + let t306 = circuit_sub(in27, t304); // Fp2 sub coeff 1/1 + let t307 = circuit_mul(t292, t305); // Fp2 mul start + let t308 = circuit_mul(t295, t306); + let t309 = circuit_sub(t307, t308); // Fp2 mul real part end + let t310 = circuit_mul(t292, t306); + let t311 = circuit_mul(t295, t305); + let t312 = circuit_add(t310, t311); // Fp2 mul imag part end + let t313 = circuit_sub(t309, in28); // Fp2 sub coeff 0/1 + let t314 = circuit_sub(t312, in29); // Fp2 sub coeff 1/1 + let t315 = circuit_mul(t292, in26); // Fp2 mul start + let t316 = circuit_mul(t295, in27); + let t317 = circuit_sub(t315, t316); // Fp2 mul real part end + let t318 = circuit_mul(t292, in27); + let t319 = circuit_mul(t295, in26); + let t320 = circuit_add(t318, t319); // Fp2 mul imag part end + let t321 = circuit_sub(t317, in28); // Fp2 sub coeff 0/1 + let t322 = circuit_sub(t320, in29); // Fp2 sub coeff 1/1 + let t323 = circuit_mul(in7, t295); + let t324 = circuit_add(t292, t323); + let t325 = circuit_mul(t324, in25); + let t326 = circuit_mul(in7, t322); + let t327 = circuit_add(t321, t326); + let t328 = circuit_mul(t327, in24); + let t329 = circuit_mul(t295, in25); + let t330 = circuit_mul(t322, in24); + let t331 = circuit_sub(t313, t277); // Fp2 sub coeff 0/1 + let t332 = circuit_sub(t314, t278); // Fp2 sub coeff 1/1 + let t333 = circuit_sub(t303, t275); // Fp2 sub coeff 0/1 + let t334 = circuit_sub(t304, t276); // Fp2 sub coeff 1/1 + let t335 = circuit_mul(t333, t333); // Fp2 Div x/y start : Fp2 Inv y start + let t336 = circuit_mul(t334, t334); + let t337 = circuit_add(t335, t336); + let t338 = circuit_inverse(t337); + let t339 = circuit_mul(t333, t338); // Fp2 Inv y real part end + let t340 = circuit_mul(t334, t338); + let t341 = circuit_sub(in6, t340); // Fp2 Inv y imag part end + let t342 = circuit_mul(t331, t339); // Fp2 mul start + let t343 = circuit_mul(t332, t341); + let t344 = circuit_sub(t342, t343); // Fp2 mul real part end + let t345 = circuit_mul(t331, t341); + let t346 = circuit_mul(t332, t339); + let t347 = circuit_add(t345, t346); // Fp2 mul imag part end + let t348 = circuit_mul(t344, t303); // Fp2 mul start + let t349 = circuit_mul(t347, t304); + let t350 = circuit_sub(t348, t349); // Fp2 mul real part end + let t351 = circuit_mul(t344, t304); + let t352 = circuit_mul(t347, t303); + let t353 = circuit_add(t351, t352); // Fp2 mul imag part end + let t354 = circuit_sub(t350, t313); // Fp2 sub coeff 0/1 + let t355 = circuit_sub(t353, t314); // Fp2 sub coeff 1/1 + let t356 = circuit_mul(in7, t347); + let t357 = circuit_add(t344, t356); + let t358 = circuit_mul(t357, in25); + let t359 = circuit_mul(in7, t355); + let t360 = circuit_add(t354, t359); + let t361 = circuit_mul(t360, in24); + let t362 = circuit_mul(t347, in25); + let t363 = circuit_mul(t355, in24); + let t364 = circuit_sub(in6, in31); + let t365 = circuit_sub(in6, in33); + let t366 = circuit_mul(in30, in0); // Fp2 mul start + let t367 = circuit_mul(t364, in1); + let t368 = circuit_sub(t366, t367); // Fp2 mul real part end + let t369 = circuit_mul(in30, in1); + let t370 = circuit_mul(t364, in0); + let t371 = circuit_add(t369, t370); // Fp2 mul imag part end + let t372 = circuit_mul(in32, in2); // Fp2 mul start + let t373 = circuit_mul(t365, in3); + let t374 = circuit_sub(t372, t373); // Fp2 mul real part end + let t375 = circuit_mul(in32, in3); + let t376 = circuit_mul(t365, in2); + let t377 = circuit_add(t375, t376); // Fp2 mul imag part end + let t378 = circuit_mul(in30, in4); // Fp2 scalar mul coeff 0/1 + let t379 = circuit_mul(in31, in4); // Fp2 scalar mul coeff 1/1 + let t380 = circuit_mul(in32, in5); // Fp2 scalar mul coeff 0/1 + let t381 = circuit_mul(in33, in5); // Fp2 scalar mul coeff 1/1 + let t382 = circuit_sub(in38, t374); // Fp2 sub coeff 0/1 + let t383 = circuit_sub(in39, t377); // Fp2 sub coeff 1/1 + let t384 = circuit_sub(in36, t368); // Fp2 sub coeff 0/1 + let t385 = circuit_sub(in37, t371); // Fp2 sub coeff 1/1 + let t386 = circuit_mul(t384, t384); // Fp2 Div x/y start : Fp2 Inv y start + let t387 = circuit_mul(t385, t385); + let t388 = circuit_add(t386, t387); + let t389 = circuit_inverse(t388); + let t390 = circuit_mul(t384, t389); // Fp2 Inv y real part end + let t391 = circuit_mul(t385, t389); + let t392 = circuit_sub(in6, t391); // Fp2 Inv y imag part end + let t393 = circuit_mul(t382, t390); // Fp2 mul start + let t394 = circuit_mul(t383, t392); + let t395 = circuit_sub(t393, t394); // Fp2 mul real part end + let t396 = circuit_mul(t382, t392); + let t397 = circuit_mul(t383, t390); + let t398 = circuit_add(t396, t397); // Fp2 mul imag part end + let t399 = circuit_add(t395, t398); + let t400 = circuit_sub(t395, t398); + let t401 = circuit_mul(t399, t400); + let t402 = circuit_mul(t395, t398); + let t403 = circuit_add(t402, t402); + let t404 = circuit_add(in36, t368); // Fp2 add coeff 0/1 + let t405 = circuit_add(in37, t371); // Fp2 add coeff 1/1 + let t406 = circuit_sub(t401, t404); // Fp2 sub coeff 0/1 + let t407 = circuit_sub(t403, t405); // Fp2 sub coeff 1/1 + let t408 = circuit_sub(in36, t406); // Fp2 sub coeff 0/1 + let t409 = circuit_sub(in37, t407); // Fp2 sub coeff 1/1 + let t410 = circuit_mul(t395, t408); // Fp2 mul start + let t411 = circuit_mul(t398, t409); + let t412 = circuit_sub(t410, t411); // Fp2 mul real part end + let t413 = circuit_mul(t395, t409); + let t414 = circuit_mul(t398, t408); + let t415 = circuit_add(t413, t414); // Fp2 mul imag part end + let t416 = circuit_sub(t412, in38); // Fp2 sub coeff 0/1 + let t417 = circuit_sub(t415, in39); // Fp2 sub coeff 1/1 + let t418 = circuit_mul(t395, in36); // Fp2 mul start + let t419 = circuit_mul(t398, in37); + let t420 = circuit_sub(t418, t419); // Fp2 mul real part end + let t421 = circuit_mul(t395, in37); + let t422 = circuit_mul(t398, in36); + let t423 = circuit_add(t421, t422); // Fp2 mul imag part end + let t424 = circuit_sub(t420, in38); // Fp2 sub coeff 0/1 + let t425 = circuit_sub(t423, in39); // Fp2 sub coeff 1/1 + let t426 = circuit_mul(in7, t398); + let t427 = circuit_add(t395, t426); + let t428 = circuit_mul(t427, in35); + let t429 = circuit_mul(in7, t425); + let t430 = circuit_add(t424, t429); + let t431 = circuit_mul(t430, in34); + let t432 = circuit_mul(t398, in35); + let t433 = circuit_mul(t425, in34); + let t434 = circuit_sub(t416, t380); // Fp2 sub coeff 0/1 + let t435 = circuit_sub(t417, t381); // Fp2 sub coeff 1/1 + let t436 = circuit_sub(t406, t378); // Fp2 sub coeff 0/1 + let t437 = circuit_sub(t407, t379); // Fp2 sub coeff 1/1 + let t438 = circuit_mul(t436, t436); // Fp2 Div x/y start : Fp2 Inv y start + let t439 = circuit_mul(t437, t437); + let t440 = circuit_add(t438, t439); + let t441 = circuit_inverse(t440); + let t442 = circuit_mul(t436, t441); // Fp2 Inv y real part end + let t443 = circuit_mul(t437, t441); + let t444 = circuit_sub(in6, t443); // Fp2 Inv y imag part end + let t445 = circuit_mul(t434, t442); // Fp2 mul start + let t446 = circuit_mul(t435, t444); + let t447 = circuit_sub(t445, t446); // Fp2 mul real part end + let t448 = circuit_mul(t434, t444); + let t449 = circuit_mul(t435, t442); + let t450 = circuit_add(t448, t449); // Fp2 mul imag part end + let t451 = circuit_mul(t447, t406); // Fp2 mul start + let t452 = circuit_mul(t450, t407); + let t453 = circuit_sub(t451, t452); // Fp2 mul real part end + let t454 = circuit_mul(t447, t407); + let t455 = circuit_mul(t450, t406); + let t456 = circuit_add(t454, t455); // Fp2 mul imag part end + let t457 = circuit_sub(t453, t416); // Fp2 sub coeff 0/1 + let t458 = circuit_sub(t456, t417); // Fp2 sub coeff 1/1 + let t459 = circuit_mul(in7, t450); + let t460 = circuit_add(t447, t459); + let t461 = circuit_mul(t460, in35); + let t462 = circuit_mul(in7, t458); + let t463 = circuit_add(t457, t462); + let t464 = circuit_mul(t463, in34); + let t465 = circuit_mul(t450, in35); + let t466 = circuit_mul(t458, in34); + let t467 = circuit_mul(t222, in66); // Eval sparse poly line_2 step coeff_1 * z^1 + let t468 = circuit_add(in5, t467); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t469 = circuit_mul(t225, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t470 = circuit_add(t468, t469); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t471 = circuit_mul(t226, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t472 = circuit_add(t470, t471); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t473 = circuit_mul(t227, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t474 = circuit_add(t472, t473); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t475 = circuit_mul(in71, t474); + let t476 = circuit_mul(t255, in66); // Eval sparse poly line_2 step coeff_1 * z^1 + let t477 = circuit_add(in5, t476); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t478 = circuit_mul(t258, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t479 = circuit_add(t477, t478); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t480 = circuit_mul(t259, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t481 = circuit_add(t479, t480); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t482 = circuit_mul(t260, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t483 = circuit_add(t481, t482); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t484 = circuit_mul(t475, t483); + let t485 = circuit_mul(t325, in66); // Eval sparse poly line_2 step coeff_1 * z^1 + let t486 = circuit_add(in5, t485); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t487 = circuit_mul(t328, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t488 = circuit_add(t486, t487); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t489 = circuit_mul(t329, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t490 = circuit_add(t488, t489); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t491 = circuit_mul(t330, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t492 = circuit_add(t490, t491); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t493 = circuit_mul(t484, t492); + let t494 = circuit_mul(t358, in66); // Eval sparse poly line_2 step coeff_1 * z^1 + let t495 = circuit_add(in5, t494); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t496 = circuit_mul(t361, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t497 = circuit_add(t495, t496); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t498 = circuit_mul(t362, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t499 = circuit_add(t497, t498); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t500 = circuit_mul(t363, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t501 = circuit_add(t499, t500); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t502 = circuit_mul(t493, t501); + let t503 = circuit_mul(t428, in66); // Eval sparse poly line_2 step coeff_1 * z^1 + let t504 = circuit_add(in5, t503); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t505 = circuit_mul(t431, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t506 = circuit_add(t504, t505); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t507 = circuit_mul(t432, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t508 = circuit_add(t506, t507); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t509 = circuit_mul(t433, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t510 = circuit_add(t508, t509); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t511 = circuit_mul(t502, t510); + let t512 = circuit_mul(t461, in66); // Eval sparse poly line_2 step coeff_1 * z^1 + let t513 = circuit_add(in5, t512); // Eval sparse poly line_2 step + coeff_1 * z^1 + let t514 = circuit_mul(t464, t1); // Eval sparse poly line_2 step coeff_3 * z^3 + let t515 = circuit_add(t513, t514); // Eval sparse poly line_2 step + coeff_3 * z^3 + let t516 = circuit_mul(t465, t5); // Eval sparse poly line_2 step coeff_7 * z^7 + let t517 = circuit_add(t515, t516); // Eval sparse poly line_2 step + coeff_7 * z^7 + let t518 = circuit_mul(t466, t7); // Eval sparse poly line_2 step coeff_9 * z^9 + let t519 = circuit_add(t517, t518); // Eval sparse poly line_2 step + coeff_9 * z^9 + let t520 = circuit_mul(t511, t519); + let t521 = circuit_sub(t520, t135); + let t522 = circuit_mul(t112, t521); // c_n_minus_2 * ((Π(n-2,k) (Pk(z)) - R_n_minus_2(z)) + let t523 = circuit_mul(t135, in67); + let t524 = circuit_mul(t523, in68); + let t525 = circuit_mul(t524, in69); + let t526 = circuit_mul(t525, in65); + let t527 = circuit_sub(t526, t157); + let t528 = circuit_mul(t113, t527); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) + let t529 = circuit_add(in70, t522); + let t530 = circuit_add(t529, t528); + let t531 = circuit_mul(in73, in66); // Eval big_Q step coeff_1 * z^1 + let t532 = circuit_add(in72, t531); // Eval big_Q step + (coeff_1 * z^1) + let t533 = circuit_mul(in74, t0); // Eval big_Q step coeff_2 * z^2 + let t534 = circuit_add(t532, t533); // Eval big_Q step + (coeff_2 * z^2) + let t535 = circuit_mul(in75, t1); // Eval big_Q step coeff_3 * z^3 + let t536 = circuit_add(t534, t535); // Eval big_Q step + (coeff_3 * z^3) + let t537 = circuit_mul(in76, t2); // Eval big_Q step coeff_4 * z^4 + let t538 = circuit_add(t536, t537); // Eval big_Q step + (coeff_4 * z^4) + let t539 = circuit_mul(in77, t3); // Eval big_Q step coeff_5 * z^5 + let t540 = circuit_add(t538, t539); // Eval big_Q step + (coeff_5 * z^5) + let t541 = circuit_mul(in78, t4); // Eval big_Q step coeff_6 * z^6 + let t542 = circuit_add(t540, t541); // Eval big_Q step + (coeff_6 * z^6) + let t543 = circuit_mul(in79, t5); // Eval big_Q step coeff_7 * z^7 + let t544 = circuit_add(t542, t543); // Eval big_Q step + (coeff_7 * z^7) + let t545 = circuit_mul(in80, t6); // Eval big_Q step coeff_8 * z^8 + let t546 = circuit_add(t544, t545); // Eval big_Q step + (coeff_8 * z^8) + let t547 = circuit_mul(in81, t7); // Eval big_Q step coeff_9 * z^9 + let t548 = circuit_add(t546, t547); // Eval big_Q step + (coeff_9 * z^9) + let t549 = circuit_mul(in82, t8); // Eval big_Q step coeff_10 * z^10 + let t550 = circuit_add(t548, t549); // Eval big_Q step + (coeff_10 * z^10) + let t551 = circuit_mul(in83, t9); // Eval big_Q step coeff_11 * z^11 + let t552 = circuit_add(t550, t551); // Eval big_Q step + (coeff_11 * z^11) + let t553 = circuit_mul(in84, t10); // Eval big_Q step coeff_12 * z^12 + let t554 = circuit_add(t552, t553); // Eval big_Q step + (coeff_12 * z^12) + let t555 = circuit_mul(in85, t11); // Eval big_Q step coeff_13 * z^13 + let t556 = circuit_add(t554, t555); // Eval big_Q step + (coeff_13 * z^13) + let t557 = circuit_mul(in86, t12); // Eval big_Q step coeff_14 * z^14 + let t558 = circuit_add(t556, t557); // Eval big_Q step + (coeff_14 * z^14) + let t559 = circuit_mul(in87, t13); // Eval big_Q step coeff_15 * z^15 + let t560 = circuit_add(t558, t559); // Eval big_Q step + (coeff_15 * z^15) + let t561 = circuit_mul(in88, t14); // Eval big_Q step coeff_16 * z^16 + let t562 = circuit_add(t560, t561); // Eval big_Q step + (coeff_16 * z^16) + let t563 = circuit_mul(in89, t15); // Eval big_Q step coeff_17 * z^17 + let t564 = circuit_add(t562, t563); // Eval big_Q step + (coeff_17 * z^17) + let t565 = circuit_mul(in90, t16); // Eval big_Q step coeff_18 * z^18 + let t566 = circuit_add(t564, t565); // Eval big_Q step + (coeff_18 * z^18) + let t567 = circuit_mul(in91, t17); // Eval big_Q step coeff_19 * z^19 + let t568 = circuit_add(t566, t567); // Eval big_Q step + (coeff_19 * z^19) + let t569 = circuit_mul(in92, t18); // Eval big_Q step coeff_20 * z^20 + let t570 = circuit_add(t568, t569); // Eval big_Q step + (coeff_20 * z^20) + let t571 = circuit_mul(in93, t19); // Eval big_Q step coeff_21 * z^21 + let t572 = circuit_add(t570, t571); // Eval big_Q step + (coeff_21 * z^21) + let t573 = circuit_mul(in94, t20); // Eval big_Q step coeff_22 * z^22 + let t574 = circuit_add(t572, t573); // Eval big_Q step + (coeff_22 * z^22) + let t575 = circuit_mul(in95, t21); // Eval big_Q step coeff_23 * z^23 + let t576 = circuit_add(t574, t575); // Eval big_Q step + (coeff_23 * z^23) + let t577 = circuit_mul(in96, t22); // Eval big_Q step coeff_24 * z^24 + let t578 = circuit_add(t576, t577); // Eval big_Q step + (coeff_24 * z^24) + let t579 = circuit_mul(in97, t23); // Eval big_Q step coeff_25 * z^25 + let t580 = circuit_add(t578, t579); // Eval big_Q step + (coeff_25 * z^25) + let t581 = circuit_mul(in98, t24); // Eval big_Q step coeff_26 * z^26 + let t582 = circuit_add(t580, t581); // Eval big_Q step + (coeff_26 * z^26) + let t583 = circuit_mul(in99, t25); // Eval big_Q step coeff_27 * z^27 + let t584 = circuit_add(t582, t583); // Eval big_Q step + (coeff_27 * z^27) + let t585 = circuit_mul(in100, t26); // Eval big_Q step coeff_28 * z^28 + let t586 = circuit_add(t584, t585); // Eval big_Q step + (coeff_28 * z^28) + let t587 = circuit_mul(in101, t27); // Eval big_Q step coeff_29 * z^29 + let t588 = circuit_add(t586, t587); // Eval big_Q step + (coeff_29 * z^29) + let t589 = circuit_mul(in102, t28); // Eval big_Q step coeff_30 * z^30 + let t590 = circuit_add(t588, t589); // Eval big_Q step + (coeff_30 * z^30) + let t591 = circuit_mul(in103, t29); // Eval big_Q step coeff_31 * z^31 + let t592 = circuit_add(t590, t591); // Eval big_Q step + (coeff_31 * z^31) + let t593 = circuit_mul(in104, t30); // Eval big_Q step coeff_32 * z^32 + let t594 = circuit_add(t592, t593); // Eval big_Q step + (coeff_32 * z^32) + let t595 = circuit_mul(in105, t31); // Eval big_Q step coeff_33 * z^33 + let t596 = circuit_add(t594, t595); // Eval big_Q step + (coeff_33 * z^33) + let t597 = circuit_mul(in106, t32); // Eval big_Q step coeff_34 * z^34 + let t598 = circuit_add(t596, t597); // Eval big_Q step + (coeff_34 * z^34) + let t599 = circuit_mul(in107, t33); // Eval big_Q step coeff_35 * z^35 + let t600 = circuit_add(t598, t599); // Eval big_Q step + (coeff_35 * z^35) + let t601 = circuit_mul(in108, t34); // Eval big_Q step coeff_36 * z^36 + let t602 = circuit_add(t600, t601); // Eval big_Q step + (coeff_36 * z^36) + let t603 = circuit_mul(in109, t35); // Eval big_Q step coeff_37 * z^37 + let t604 = circuit_add(t602, t603); // Eval big_Q step + (coeff_37 * z^37) + let t605 = circuit_mul(in110, t36); // Eval big_Q step coeff_38 * z^38 + let t606 = circuit_add(t604, t605); // Eval big_Q step + (coeff_38 * z^38) + let t607 = circuit_mul(in111, t37); // Eval big_Q step coeff_39 * z^39 + let t608 = circuit_add(t606, t607); // Eval big_Q step + (coeff_39 * z^39) + let t609 = circuit_mul(in112, t38); // Eval big_Q step coeff_40 * z^40 + let t610 = circuit_add(t608, t609); // Eval big_Q step + (coeff_40 * z^40) + let t611 = circuit_mul(in113, t39); // Eval big_Q step coeff_41 * z^41 + let t612 = circuit_add(t610, t611); // Eval big_Q step + (coeff_41 * z^41) + let t613 = circuit_mul(in114, t40); // Eval big_Q step coeff_42 * z^42 + let t614 = circuit_add(t612, t613); // Eval big_Q step + (coeff_42 * z^42) + let t615 = circuit_mul(in115, t41); // Eval big_Q step coeff_43 * z^43 + let t616 = circuit_add(t614, t615); // Eval big_Q step + (coeff_43 * z^43) + let t617 = circuit_mul(in116, t42); // Eval big_Q step coeff_44 * z^44 + let t618 = circuit_add(t616, t617); // Eval big_Q step + (coeff_44 * z^44) + let t619 = circuit_mul(in117, t43); // Eval big_Q step coeff_45 * z^45 + let t620 = circuit_add(t618, t619); // Eval big_Q step + (coeff_45 * z^45) + let t621 = circuit_mul(in118, t44); // Eval big_Q step coeff_46 * z^46 + let t622 = circuit_add(t620, t621); // Eval big_Q step + (coeff_46 * z^46) + let t623 = circuit_mul(in119, t45); // Eval big_Q step coeff_47 * z^47 + let t624 = circuit_add(t622, t623); // Eval big_Q step + (coeff_47 * z^47) + let t625 = circuit_mul(in120, t46); // Eval big_Q step coeff_48 * z^48 + let t626 = circuit_add(t624, t625); // Eval big_Q step + (coeff_48 * z^48) + let t627 = circuit_mul(in121, t47); // Eval big_Q step coeff_49 * z^49 + let t628 = circuit_add(t626, t627); // Eval big_Q step + (coeff_49 * z^49) + let t629 = circuit_mul(in122, t48); // Eval big_Q step coeff_50 * z^50 + let t630 = circuit_add(t628, t629); // Eval big_Q step + (coeff_50 * z^50) + let t631 = circuit_mul(in123, t49); // Eval big_Q step coeff_51 * z^51 + let t632 = circuit_add(t630, t631); // Eval big_Q step + (coeff_51 * z^51) + let t633 = circuit_mul(in124, t50); // Eval big_Q step coeff_52 * z^52 + let t634 = circuit_add(t632, t633); // Eval big_Q step + (coeff_52 * z^52) + let t635 = circuit_mul(in125, t51); // Eval big_Q step coeff_53 * z^53 + let t636 = circuit_add(t634, t635); // Eval big_Q step + (coeff_53 * z^53) + let t637 = circuit_mul(in126, t52); // Eval big_Q step coeff_54 * z^54 + let t638 = circuit_add(t636, t637); // Eval big_Q step + (coeff_54 * z^54) + let t639 = circuit_mul(in127, t53); // Eval big_Q step coeff_55 * z^55 + let t640 = circuit_add(t638, t639); // Eval big_Q step + (coeff_55 * z^55) + let t641 = circuit_mul(in128, t54); // Eval big_Q step coeff_56 * z^56 + let t642 = circuit_add(t640, t641); // Eval big_Q step + (coeff_56 * z^56) + let t643 = circuit_mul(in129, t55); // Eval big_Q step coeff_57 * z^57 + let t644 = circuit_add(t642, t643); // Eval big_Q step + (coeff_57 * z^57) + let t645 = circuit_mul(in130, t56); // Eval big_Q step coeff_58 * z^58 + let t646 = circuit_add(t644, t645); // Eval big_Q step + (coeff_58 * z^58) + let t647 = circuit_mul(in131, t57); // Eval big_Q step coeff_59 * z^59 + let t648 = circuit_add(t646, t647); // Eval big_Q step + (coeff_59 * z^59) + let t649 = circuit_mul(in132, t58); // Eval big_Q step coeff_60 * z^60 + let t650 = circuit_add(t648, t649); // Eval big_Q step + (coeff_60 * z^60) + let t651 = circuit_mul(in133, t59); // Eval big_Q step coeff_61 * z^61 + let t652 = circuit_add(t650, t651); // Eval big_Q step + (coeff_61 * z^61) + let t653 = circuit_mul(in134, t60); // Eval big_Q step coeff_62 * z^62 + let t654 = circuit_add(t652, t653); // Eval big_Q step + (coeff_62 * z^62) + let t655 = circuit_mul(in135, t61); // Eval big_Q step coeff_63 * z^63 + let t656 = circuit_add(t654, t655); // Eval big_Q step + (coeff_63 * z^63) + let t657 = circuit_mul(in136, t62); // Eval big_Q step coeff_64 * z^64 + let t658 = circuit_add(t656, t657); // Eval big_Q step + (coeff_64 * z^64) + let t659 = circuit_mul(in137, t63); // Eval big_Q step coeff_65 * z^65 + let t660 = circuit_add(t658, t659); // Eval big_Q step + (coeff_65 * z^65) + let t661 = circuit_mul(in138, t64); // Eval big_Q step coeff_66 * z^66 + let t662 = circuit_add(t660, t661); // Eval big_Q step + (coeff_66 * z^66) + let t663 = circuit_mul(in139, t65); // Eval big_Q step coeff_67 * z^67 + let t664 = circuit_add(t662, t663); // Eval big_Q step + (coeff_67 * z^67) + let t665 = circuit_mul(in140, t66); // Eval big_Q step coeff_68 * z^68 + let t666 = circuit_add(t664, t665); // Eval big_Q step + (coeff_68 * z^68) + let t667 = circuit_mul(in141, t67); // Eval big_Q step coeff_69 * z^69 + let t668 = circuit_add(t666, t667); // Eval big_Q step + (coeff_69 * z^69) + let t669 = circuit_mul(in142, t68); // Eval big_Q step coeff_70 * z^70 + let t670 = circuit_add(t668, t669); // Eval big_Q step + (coeff_70 * z^70) + let t671 = circuit_mul(in143, t69); // Eval big_Q step coeff_71 * z^71 + let t672 = circuit_add(t670, t671); // Eval big_Q step + (coeff_71 * z^71) + let t673 = circuit_mul(in144, t70); // Eval big_Q step coeff_72 * z^72 + let t674 = circuit_add(t672, t673); // Eval big_Q step + (coeff_72 * z^72) + let t675 = circuit_mul(in145, t71); // Eval big_Q step coeff_73 * z^73 + let t676 = circuit_add(t674, t675); // Eval big_Q step + (coeff_73 * z^73) + let t677 = circuit_mul(in146, t72); // Eval big_Q step coeff_74 * z^74 + let t678 = circuit_add(t676, t677); // Eval big_Q step + (coeff_74 * z^74) + let t679 = circuit_mul(in147, t73); // Eval big_Q step coeff_75 * z^75 + let t680 = circuit_add(t678, t679); // Eval big_Q step + (coeff_75 * z^75) + let t681 = circuit_mul(in148, t74); // Eval big_Q step coeff_76 * z^76 + let t682 = circuit_add(t680, t681); // Eval big_Q step + (coeff_76 * z^76) + let t683 = circuit_mul(in149, t75); // Eval big_Q step coeff_77 * z^77 + let t684 = circuit_add(t682, t683); // Eval big_Q step + (coeff_77 * z^77) + let t685 = circuit_mul(in150, t76); // Eval big_Q step coeff_78 * z^78 + let t686 = circuit_add(t684, t685); // Eval big_Q step + (coeff_78 * z^78) + let t687 = circuit_mul(in151, t77); // Eval big_Q step coeff_79 * z^79 + let t688 = circuit_add(t686, t687); // Eval big_Q step + (coeff_79 * z^79) + let t689 = circuit_mul(in152, t78); // Eval big_Q step coeff_80 * z^80 + let t690 = circuit_add(t688, t689); // Eval big_Q step + (coeff_80 * z^80) + let t691 = circuit_mul(in153, t79); // Eval big_Q step coeff_81 * z^81 + let t692 = circuit_add(t690, t691); // Eval big_Q step + (coeff_81 * z^81) + let t693 = circuit_mul(in154, t80); // Eval big_Q step coeff_82 * z^82 + let t694 = circuit_add(t692, t693); // Eval big_Q step + (coeff_82 * z^82) + let t695 = circuit_mul(in155, t81); // Eval big_Q step coeff_83 * z^83 + let t696 = circuit_add(t694, t695); // Eval big_Q step + (coeff_83 * z^83) + let t697 = circuit_mul(in156, t82); // Eval big_Q step coeff_84 * z^84 + let t698 = circuit_add(t696, t697); // Eval big_Q step + (coeff_84 * z^84) + let t699 = circuit_mul(in157, t83); // Eval big_Q step coeff_85 * z^85 + let t700 = circuit_add(t698, t699); // Eval big_Q step + (coeff_85 * z^85) + let t701 = circuit_mul(in158, t84); // Eval big_Q step coeff_86 * z^86 + let t702 = circuit_add(t700, t701); // Eval big_Q step + (coeff_86 * z^86) + let t703 = circuit_mul(in159, t85); // Eval big_Q step coeff_87 * z^87 + let t704 = circuit_add(t702, t703); // Eval big_Q step + (coeff_87 * z^87) + let t705 = circuit_mul(in160, t86); // Eval big_Q step coeff_88 * z^88 + let t706 = circuit_add(t704, t705); // Eval big_Q step + (coeff_88 * z^88) + let t707 = circuit_mul(in161, t87); // Eval big_Q step coeff_89 * z^89 + let t708 = circuit_add(t706, t707); // Eval big_Q step + (coeff_89 * z^89) + let t709 = circuit_mul(in162, t88); // Eval big_Q step coeff_90 * z^90 + let t710 = circuit_add(t708, t709); // Eval big_Q step + (coeff_90 * z^90) + let t711 = circuit_mul(in163, t89); // Eval big_Q step coeff_91 * z^91 + let t712 = circuit_add(t710, t711); // Eval big_Q step + (coeff_91 * z^91) + let t713 = circuit_mul(in164, t90); // Eval big_Q step coeff_92 * z^92 + let t714 = circuit_add(t712, t713); // Eval big_Q step + (coeff_92 * z^92) + let t715 = circuit_mul(in165, t91); // Eval big_Q step coeff_93 * z^93 + let t716 = circuit_add(t714, t715); // Eval big_Q step + (coeff_93 * z^93) + let t717 = circuit_mul(in166, t92); // Eval big_Q step coeff_94 * z^94 + let t718 = circuit_add(t716, t717); // Eval big_Q step + (coeff_94 * z^94) + let t719 = circuit_mul(in167, t93); // Eval big_Q step coeff_95 * z^95 + let t720 = circuit_add(t718, t719); // Eval big_Q step + (coeff_95 * z^95) + let t721 = circuit_mul(in168, t94); // Eval big_Q step coeff_96 * z^96 + let t722 = circuit_add(t720, t721); // Eval big_Q step + (coeff_96 * z^96) + let t723 = circuit_mul(in169, t95); // Eval big_Q step coeff_97 * z^97 + let t724 = circuit_add(t722, t723); // Eval big_Q step + (coeff_97 * z^97) + let t725 = circuit_mul(in170, t96); // Eval big_Q step coeff_98 * z^98 + let t726 = circuit_add(t724, t725); // Eval big_Q step + (coeff_98 * z^98) + let t727 = circuit_mul(in171, t97); // Eval big_Q step coeff_99 * z^99 + let t728 = circuit_add(t726, t727); // Eval big_Q step + (coeff_99 * z^99) + let t729 = circuit_mul(in172, t98); // Eval big_Q step coeff_100 * z^100 + let t730 = circuit_add(t728, t729); // Eval big_Q step + (coeff_100 * z^100) + let t731 = circuit_mul(in173, t99); // Eval big_Q step coeff_101 * z^101 + let t732 = circuit_add(t730, t731); // Eval big_Q step + (coeff_101 * z^101) + let t733 = circuit_mul(in174, t100); // Eval big_Q step coeff_102 * z^102 + let t734 = circuit_add(t732, t733); // Eval big_Q step + (coeff_102 * z^102) + let t735 = circuit_mul(in175, t101); // Eval big_Q step coeff_103 * z^103 + let t736 = circuit_add(t734, t735); // Eval big_Q step + (coeff_103 * z^103) + let t737 = circuit_mul(in176, t102); // Eval big_Q step coeff_104 * z^104 + let t738 = circuit_add(t736, t737); // Eval big_Q step + (coeff_104 * z^104) + let t739 = circuit_mul(in177, t103); // Eval big_Q step coeff_105 * z^105 + let t740 = circuit_add(t738, t739); // Eval big_Q step + (coeff_105 * z^105) + let t741 = circuit_mul(in178, t104); // Eval big_Q step coeff_106 * z^106 + let t742 = circuit_add(t740, t741); // Eval big_Q step + (coeff_106 * z^106) + let t743 = circuit_mul(in179, t105); // Eval big_Q step coeff_107 * z^107 + let t744 = circuit_add(t742, t743); // Eval big_Q step + (coeff_107 * z^107) + let t745 = circuit_mul(in180, t106); // Eval big_Q step coeff_108 * z^108 + let t746 = circuit_add(t744, t745); // Eval big_Q step + (coeff_108 * z^108) + let t747 = circuit_mul(in181, t107); // Eval big_Q step coeff_109 * z^109 + let t748 = circuit_add(t746, t747); // Eval big_Q step + (coeff_109 * z^109) + let t749 = circuit_mul(in182, t108); // Eval big_Q step coeff_110 * z^110 + let t750 = circuit_add(t748, t749); // Eval big_Q step + (coeff_110 * z^110) + let t751 = circuit_mul(in183, t109); // Eval big_Q step coeff_111 * z^111 + let t752 = circuit_add(t750, t751); // Eval big_Q step + (coeff_111 * z^111) + let t753 = circuit_mul(in184, t110); // Eval big_Q step coeff_112 * z^112 + let t754 = circuit_add(t752, t753); // Eval big_Q step + (coeff_112 * z^112) + let t755 = circuit_mul(in185, t111); // Eval big_Q step coeff_113 * z^113 + let t756 = circuit_add(t754, t755); // Eval big_Q step + (coeff_113 * z^113) + let t757 = circuit_mul(in9, t4); // Eval sparse poly P_irr step coeff_6 * z^6 + let t758 = circuit_add(in8, t757); // Eval sparse poly P_irr step + coeff_6 * z^6 + let t759 = circuit_add(t758, t10); // Eval sparse poly P_irr step + 1*z^12 + let t760 = circuit_mul(t756, t759); + let t761 = circuit_sub(t530, t760); + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t761, t529,).new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs + .next([0xc2c3330c99e39557176f553d, 0x4c0bec3cf559b143b78cc310, 0x2fb347984f7911f7, 0x0]); + circuit_inputs = circuit_inputs + .next([0xb7c9dce1665d51c640fcba2, 0x4ba4cc8bd75a079432ae2a1d, 0x16c9e55061ebae20, 0x0]); + circuit_inputs = circuit_inputs + .next([0xa9c95998dc54014671a0135a, 0xdc5ec698b6e2f9b9dbaae0ed, 0x63cf305489af5dc, 0x0]); + circuit_inputs = circuit_inputs + .next([0x8fa25bd282d37f632623b0e3, 0x704b5a7ec796f2b21807dc9, 0x7c03cbcac41049a, 0x0]); + circuit_inputs = circuit_inputs + .next([0xbb966e3de4bd44e5607cfd48, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x52, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd35, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next(original_Q0.x0); + circuit_inputs = circuit_inputs.next(original_Q0.x1); + circuit_inputs = circuit_inputs.next(original_Q0.y0); + circuit_inputs = circuit_inputs.next(original_Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(original_Q1.x0); + circuit_inputs = circuit_inputs.next(original_Q1.x1); + circuit_inputs = circuit_inputs.next(original_Q1.y0); + circuit_inputs = circuit_inputs.next(original_Q1.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(original_Q2.x0); + circuit_inputs = circuit_inputs.next(original_Q2.x1); + circuit_inputs = circuit_inputs.next(original_Q2.y0); + circuit_inputs = circuit_inputs.next(original_Q2.y1); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w0); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w1); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w2); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w3); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w4); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w5); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w6); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w7); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w8); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w9); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w10); + circuit_inputs = circuit_inputs.next(R_n_minus_2.w11); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w0); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w1); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w2); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w3); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w4); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w5); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w6); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w7); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w8); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w9); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w10); + circuit_inputs = circuit_inputs.next(R_n_minus_1.w11); + circuit_inputs = circuit_inputs.next(c_n_minus_3); + circuit_inputs = circuit_inputs.next(w_of_z); + circuit_inputs = circuit_inputs.next(z); + circuit_inputs = circuit_inputs.next(c_inv_frob_1_of_z); + circuit_inputs = circuit_inputs.next(c_frob_2_of_z); + circuit_inputs = circuit_inputs.next(c_inv_frob_3_of_z); + circuit_inputs = circuit_inputs.next(previous_lhs); + circuit_inputs = circuit_inputs.next(R_n_minus_3_of_z); + + let mut Q = Q; + while let Option::Some(val) = Q.pop_front() { + circuit_inputs = circuit_inputs.next(val); + }; + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let final_check: u384 = outputs.get_output(t761); + let _final_lhs: u384 = outputs.get_output(t529); + return (final_check, _final_lhs); +} +fn run_BN254_MP_CHECK_INIT_BIT_2_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + R_i: E12D, + c0: u384, + z: u384, + c_inv_of_z: u384, + previous_lhs: u384 +) -> (G2Point, G2Point, u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x3 + let in1 = CE::> {}; // 0x6 + let in2 = CE::> {}; // 0x0 + let in3 = CE::> {}; // -0x9 % p + let in4 = CE::> {}; // 0x1 + + // INPUT stack + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in30, in30); // Compute z^2 + let t1 = circuit_mul(t0, in30); // Compute z^3 + let t2 = circuit_mul(t1, in30); // Compute z^4 + let t3 = circuit_mul(t2, in30); // Compute z^5 + let t4 = circuit_mul(t3, in30); // Compute z^6 + let t5 = circuit_mul(t4, in30); // Compute z^7 + let t6 = circuit_mul(t5, in30); // Compute z^8 + let t7 = circuit_mul(t6, in30); // Compute z^9 + let t8 = circuit_mul(t7, in30); // Compute z^10 + let t9 = circuit_mul(t8, in30); // Compute z^11 + let t10 = circuit_mul(in18, in30); // Eval R step coeff_1 * z^1 + let t11 = circuit_add(in17, t10); // Eval R step + (coeff_1 * z^1) + let t12 = circuit_mul(in19, t0); // Eval R step coeff_2 * z^2 + let t13 = circuit_add(t11, t12); // Eval R step + (coeff_2 * z^2) + let t14 = circuit_mul(in20, t1); // Eval R step coeff_3 * z^3 + let t15 = circuit_add(t13, t14); // Eval R step + (coeff_3 * z^3) + let t16 = circuit_mul(in21, t2); // Eval R step coeff_4 * z^4 + let t17 = circuit_add(t15, t16); // Eval R step + (coeff_4 * z^4) + let t18 = circuit_mul(in22, t3); // Eval R step coeff_5 * z^5 + let t19 = circuit_add(t17, t18); // Eval R step + (coeff_5 * z^5) + let t20 = circuit_mul(in23, t4); // Eval R step coeff_6 * z^6 + let t21 = circuit_add(t19, t20); // Eval R step + (coeff_6 * z^6) + let t22 = circuit_mul(in24, t5); // Eval R step coeff_7 * z^7 + let t23 = circuit_add(t21, t22); // Eval R step + (coeff_7 * z^7) + let t24 = circuit_mul(in25, t6); // Eval R step coeff_8 * z^8 + let t25 = circuit_add(t23, t24); // Eval R step + (coeff_8 * z^8) + let t26 = circuit_mul(in26, t7); // Eval R step coeff_9 * z^9 + let t27 = circuit_add(t25, t26); // Eval R step + (coeff_9 * z^9) + let t28 = circuit_mul(in27, t8); // Eval R step coeff_10 * z^10 + let t29 = circuit_add(t27, t28); // Eval R step + (coeff_10 * z^10) + let t30 = circuit_mul(in28, t9); // Eval R step coeff_11 * z^11 + let t31 = circuit_add(t29, t30); // Eval R step + (coeff_11 * z^11) + let t32 = circuit_mul(in31, in31); + let t33 = circuit_mul(in29, in29); + let t34 = circuit_add(in7, in8); // Doubling slope numerator start + let t35 = circuit_sub(in7, in8); + let t36 = circuit_mul(t34, t35); + let t37 = circuit_mul(in7, in8); + let t38 = circuit_mul(t36, in0); + let t39 = circuit_mul(t37, in1); // Doubling slope numerator end + let t40 = circuit_add(in9, in9); // Fp2 add coeff 0/1 + let t41 = circuit_add(in10, in10); // Fp2 add coeff 1/1 + let t42 = circuit_mul(t40, t40); // Fp2 Div x/y start : Fp2 Inv y start + let t43 = circuit_mul(t41, t41); + let t44 = circuit_add(t42, t43); + let t45 = circuit_inverse(t44); + let t46 = circuit_mul(t40, t45); // Fp2 Inv y real part end + let t47 = circuit_mul(t41, t45); + let t48 = circuit_sub(in2, t47); // Fp2 Inv y imag part end + let t49 = circuit_mul(t38, t46); // Fp2 mul start + let t50 = circuit_mul(t39, t48); + let t51 = circuit_sub(t49, t50); // Fp2 mul real part end + let t52 = circuit_mul(t38, t48); + let t53 = circuit_mul(t39, t46); + let t54 = circuit_add(t52, t53); // Fp2 mul imag part end + let t55 = circuit_add(t51, t54); + let t56 = circuit_sub(t51, t54); + let t57 = circuit_mul(t55, t56); + let t58 = circuit_mul(t51, t54); + let t59 = circuit_add(t58, t58); + let t60 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t61 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t62 = circuit_sub(t57, t60); // Fp2 sub coeff 0/1 + let t63 = circuit_sub(t59, t61); // Fp2 sub coeff 1/1 + let t64 = circuit_sub(in7, t62); // Fp2 sub coeff 0/1 + let t65 = circuit_sub(in8, t63); // Fp2 sub coeff 1/1 + let t66 = circuit_mul(t51, t64); // Fp2 mul start + let t67 = circuit_mul(t54, t65); + let t68 = circuit_sub(t66, t67); // Fp2 mul real part end + let t69 = circuit_mul(t51, t65); + let t70 = circuit_mul(t54, t64); + let t71 = circuit_add(t69, t70); // Fp2 mul imag part end + let t72 = circuit_sub(t68, in9); // Fp2 sub coeff 0/1 + let t73 = circuit_sub(t71, in10); // Fp2 sub coeff 1/1 + let t74 = circuit_mul(t51, in7); // Fp2 mul start + let t75 = circuit_mul(t54, in8); + let t76 = circuit_sub(t74, t75); // Fp2 mul real part end + let t77 = circuit_mul(t51, in8); + let t78 = circuit_mul(t54, in7); + let t79 = circuit_add(t77, t78); // Fp2 mul imag part end + let t80 = circuit_sub(t76, in9); // Fp2 sub coeff 0/1 + let t81 = circuit_sub(t79, in10); // Fp2 sub coeff 1/1 + let t82 = circuit_mul(in3, t54); + let t83 = circuit_add(t51, t82); + let t84 = circuit_mul(t83, in6); + let t85 = circuit_mul(in3, t81); + let t86 = circuit_add(t80, t85); + let t87 = circuit_mul(t86, in5); + let t88 = circuit_mul(t54, in6); + let t89 = circuit_mul(t81, in5); + let t90 = circuit_mul(t84, in30); // Eval sparse poly line_0p_1 step coeff_1 * z^1 + let t91 = circuit_add(in4, t90); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 + let t92 = circuit_mul(t87, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 + let t93 = circuit_add(t91, t92); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 + let t94 = circuit_mul(t88, t5); // Eval sparse poly line_0p_1 step coeff_7 * z^7 + let t95 = circuit_add(t93, t94); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 + let t96 = circuit_mul(t89, t7); // Eval sparse poly line_0p_1 step coeff_9 * z^9 + let t97 = circuit_add(t95, t96); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 + let t98 = circuit_mul(t32, t97); + let t99 = circuit_add(in13, in14); // Doubling slope numerator start + let t100 = circuit_sub(in13, in14); + let t101 = circuit_mul(t99, t100); + let t102 = circuit_mul(in13, in14); + let t103 = circuit_mul(t101, in0); + let t104 = circuit_mul(t102, in1); // Doubling slope numerator end + let t105 = circuit_add(in15, in15); // Fp2 add coeff 0/1 + let t106 = circuit_add(in16, in16); // Fp2 add coeff 1/1 + let t107 = circuit_mul(t105, t105); // Fp2 Div x/y start : Fp2 Inv y start + let t108 = circuit_mul(t106, t106); + let t109 = circuit_add(t107, t108); + let t110 = circuit_inverse(t109); + let t111 = circuit_mul(t105, t110); // Fp2 Inv y real part end + let t112 = circuit_mul(t106, t110); + let t113 = circuit_sub(in2, t112); // Fp2 Inv y imag part end + let t114 = circuit_mul(t103, t111); // Fp2 mul start + let t115 = circuit_mul(t104, t113); + let t116 = circuit_sub(t114, t115); // Fp2 mul real part end + let t117 = circuit_mul(t103, t113); + let t118 = circuit_mul(t104, t111); + let t119 = circuit_add(t117, t118); // Fp2 mul imag part end + let t120 = circuit_add(t116, t119); + let t121 = circuit_sub(t116, t119); + let t122 = circuit_mul(t120, t121); + let t123 = circuit_mul(t116, t119); + let t124 = circuit_add(t123, t123); + let t125 = circuit_add(in13, in13); // Fp2 add coeff 0/1 + let t126 = circuit_add(in14, in14); // Fp2 add coeff 1/1 + let t127 = circuit_sub(t122, t125); // Fp2 sub coeff 0/1 + let t128 = circuit_sub(t124, t126); // Fp2 sub coeff 1/1 + let t129 = circuit_sub(in13, t127); // Fp2 sub coeff 0/1 + let t130 = circuit_sub(in14, t128); // Fp2 sub coeff 1/1 + let t131 = circuit_mul(t116, t129); // Fp2 mul start + let t132 = circuit_mul(t119, t130); + let t133 = circuit_sub(t131, t132); // Fp2 mul real part end + let t134 = circuit_mul(t116, t130); + let t135 = circuit_mul(t119, t129); + let t136 = circuit_add(t134, t135); // Fp2 mul imag part end + let t137 = circuit_sub(t133, in15); // Fp2 sub coeff 0/1 + let t138 = circuit_sub(t136, in16); // Fp2 sub coeff 1/1 + let t139 = circuit_mul(t116, in13); // Fp2 mul start + let t140 = circuit_mul(t119, in14); + let t141 = circuit_sub(t139, t140); // Fp2 mul real part end + let t142 = circuit_mul(t116, in14); + let t143 = circuit_mul(t119, in13); + let t144 = circuit_add(t142, t143); // Fp2 mul imag part end + let t145 = circuit_sub(t141, in15); // Fp2 sub coeff 0/1 + let t146 = circuit_sub(t144, in16); // Fp2 sub coeff 1/1 + let t147 = circuit_mul(in3, t119); + let t148 = circuit_add(t116, t147); + let t149 = circuit_mul(t148, in12); + let t150 = circuit_mul(in3, t146); + let t151 = circuit_add(t145, t150); + let t152 = circuit_mul(t151, in11); + let t153 = circuit_mul(t119, in12); + let t154 = circuit_mul(t146, in11); + let t155 = circuit_mul(t149, in30); // Eval sparse poly line_1p_1 step coeff_1 * z^1 + let t156 = circuit_add(in4, t155); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 + let t157 = circuit_mul(t152, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 + let t158 = circuit_add(t156, t157); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 + let t159 = circuit_mul(t153, t5); // Eval sparse poly line_1p_1 step coeff_7 * z^7 + let t160 = circuit_add(t158, t159); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 + let t161 = circuit_mul(t154, t7); // Eval sparse poly line_1p_1 step coeff_9 * z^9 + let t162 = circuit_add(t160, t161); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 + let t163 = circuit_mul(t98, t162); + let t164 = circuit_sub(t163, t31); + let t165 = circuit_mul(t33, t164); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t166 = circuit_add(t165, in32); let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] - ) - .unwrap(); - - let mut circuit_inputs = ( - t82, t83, t92, t93, t198, t199, t208, t209, t314, t315, t324, t325, t382, t385, t10, - ) - .new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(yInv_0); - circuit_inputs = circuit_inputs.next(xNegOverY_0); - circuit_inputs = circuit_inputs.next(Q0.x0); - circuit_inputs = circuit_inputs.next(Q0.x1); - circuit_inputs = circuit_inputs.next(Q0.y0); - circuit_inputs = circuit_inputs.next(Q0.y1); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.x0); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.x1); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.y0); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_0.y1); - circuit_inputs = circuit_inputs.next(yInv_1); - circuit_inputs = circuit_inputs.next(xNegOverY_1); - circuit_inputs = circuit_inputs.next(Q1.x0); - circuit_inputs = circuit_inputs.next(Q1.x1); - circuit_inputs = circuit_inputs.next(Q1.y0); - circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.x0); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.x1); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.y0); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_1.y1); - circuit_inputs = circuit_inputs.next(yInv_2); - circuit_inputs = circuit_inputs.next(xNegOverY_2); - circuit_inputs = circuit_inputs.next(Q2.x0); - circuit_inputs = circuit_inputs.next(Q2.x1); - circuit_inputs = circuit_inputs.next(Q2.y0); - circuit_inputs = circuit_inputs.next(Q2.y1); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.x0); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.x1); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.y0); - circuit_inputs = circuit_inputs.next(Q_or_Qneg_2.y1); - circuit_inputs = circuit_inputs.next(lhs_i); - circuit_inputs = circuit_inputs.next(f_i_of_z); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w0); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w1); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w2); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w3); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w4); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w5); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w6); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w7); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w8); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w9); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w10); - circuit_inputs = circuit_inputs.next(f_i_plus_one.w11); - circuit_inputs = circuit_inputs.next(c_or_cinv_of_z); - circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(ci); - - let outputs = match circuit_inputs.done().eval(modulus) { - Result::Ok(outputs) => { outputs }, - Result::Err(_) => { panic!("Expected success") } - }; - let Q0: G2Point = G2Point { - x0: outputs.get_output(t82), - x1: outputs.get_output(t83), - y0: outputs.get_output(t92), - y1: outputs.get_output(t93) - }; - let Q1: G2Point = G2Point { - x0: outputs.get_output(t198), - x1: outputs.get_output(t199), - y0: outputs.get_output(t208), - y1: outputs.get_output(t209) - }; - let Q2: G2Point = G2Point { - x0: outputs.get_output(t314), - x1: outputs.get_output(t315), - y0: outputs.get_output(t324), - y1: outputs.get_output(t325) - }; - let f_i_plus_one_of_z: u384 = outputs.get_output(t382); - let lhs_i_plus_one: u384 = outputs.get_output(t385); - let ci_plus_one: u384 = outputs.get_output(t10); - return (Q0, Q1, Q2, f_i_plus_one_of_z, lhs_i_plus_one, ci_plus_one); -} -fn run_BN254_MP_CHECK_FINALIZE_BN_2_circuit( - original_Q0: G2Point, - yInv_0: u384, - xNegOverY_0: u384, - Q0: G2Point, - original_Q1: G2Point, - yInv_1: u384, - xNegOverY_1: u384, - Q1: G2Point, - R_n_minus_2: E12D, - R_n_minus_1: E12D, - c_n_minus_3: u384, - w_of_z: u384, - z: u384, - c_inv_frob_1_of_z: u384, - c_frob_2_of_z: u384, - c_inv_frob_3_of_z: u384, - previous_lhs: u384, - R_n_minus_3_of_z: u384, - Q: Array -) -> (u384,) { - // CONSTANT stack - let in0 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d - let in1 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 - let in2 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a - let in3 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 - let in4 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 - let in5 = CE::> {}; // 0x1 - let in6 = CE::> {}; // 0x0 - let in7 = CE::> {}; // -0x9 % p - let in8 = CE::> {}; // 0x52 - let in9 = CE::> {}; // -0x12 % p - - // INPUT stack - let (in10, in11) = (CE::> {}, CE::> {}); - let (in12, in13) = (CE::> {}, CE::> {}); - let (in14, in15) = (CE::> {}, CE::> {}); - let (in16, in17) = (CE::> {}, CE::> {}); - let (in18, in19) = (CE::> {}, CE::> {}); - let (in20, in21) = (CE::> {}, CE::> {}); - let (in22, in23) = (CE::> {}, CE::> {}); - let (in24, in25) = (CE::> {}, CE::> {}); - let (in26, in27) = (CE::> {}, CE::> {}); - let (in28, in29) = (CE::> {}, CE::> {}); - let (in30, in31) = (CE::> {}, CE::> {}); - let (in32, in33) = (CE::> {}, CE::> {}); - let (in34, in35) = (CE::> {}, CE::> {}); - let (in36, in37) = (CE::> {}, CE::> {}); - let (in38, in39) = (CE::> {}, CE::> {}); - let (in40, in41) = (CE::> {}, CE::> {}); - let (in42, in43) = (CE::> {}, CE::> {}); - let (in44, in45) = (CE::> {}, CE::> {}); - let (in46, in47) = (CE::> {}, CE::> {}); - let (in48, in49) = (CE::> {}, CE::> {}); - let (in50, in51) = (CE::> {}, CE::> {}); - let (in52, in53) = (CE::> {}, CE::> {}); - let (in54, in55) = (CE::> {}, CE::> {}); - let (in56, in57) = (CE::> {}, CE::> {}); - let (in58, in59) = (CE::> {}, CE::> {}); - let (in60, in61) = (CE::> {}, CE::> {}); - let (in62, in63) = (CE::> {}, CE::> {}); - let (in64, in65) = (CE::> {}, CE::> {}); - let (in66, in67) = (CE::> {}, CE::> {}); - let (in68, in69) = (CE::> {}, CE::> {}); - let (in70, in71) = (CE::> {}, CE::> {}); - let (in72, in73) = (CE::> {}, CE::> {}); - let (in74, in75) = (CE::> {}, CE::> {}); - let (in76, in77) = (CE::> {}, CE::> {}); - let (in78, in79) = (CE::> {}, CE::> {}); - let (in80, in81) = (CE::> {}, CE::> {}); - let (in82, in83) = (CE::> {}, CE::> {}); - let (in84, in85) = (CE::> {}, CE::> {}); - let (in86, in87) = (CE::> {}, CE::> {}); - let (in88, in89) = (CE::> {}, CE::> {}); - let (in90, in91) = (CE::> {}, CE::> {}); - let (in92, in93) = (CE::> {}, CE::> {}); - let (in94, in95) = (CE::> {}, CE::> {}); - let (in96, in97) = (CE::> {}, CE::> {}); - let (in98, in99) = (CE::> {}, CE::> {}); - let (in100, in101) = (CE::> {}, CE::> {}); - let (in102, in103) = (CE::> {}, CE::> {}); - let (in104, in105) = (CE::> {}, CE::> {}); - let (in106, in107) = (CE::> {}, CE::> {}); - let (in108, in109) = (CE::> {}, CE::> {}); - let (in110, in111) = (CE::> {}, CE::> {}); - let (in112, in113) = (CE::> {}, CE::> {}); - let (in114, in115) = (CE::> {}, CE::> {}); - let (in116, in117) = (CE::> {}, CE::> {}); - let (in118, in119) = (CE::> {}, CE::> {}); - let t0 = circuit_mul(in56, in56); // Compute z^2 - let t1 = circuit_mul(t0, in56); // Compute z^3 - let t2 = circuit_mul(t1, in56); // Compute z^4 - let t3 = circuit_mul(t2, in56); // Compute z^5 - let t4 = circuit_mul(t3, in56); // Compute z^6 - let t5 = circuit_mul(t4, in56); // Compute z^7 - let t6 = circuit_mul(t5, in56); // Compute z^8 - let t7 = circuit_mul(t6, in56); // Compute z^9 - let t8 = circuit_mul(t7, in56); // Compute z^10 - let t9 = circuit_mul(t8, in56); // Compute z^11 - let t10 = circuit_mul(t9, in56); // Compute z^12 - let t11 = circuit_mul(t10, in56); // Compute z^13 - let t12 = circuit_mul(t11, in56); // Compute z^14 - let t13 = circuit_mul(t12, in56); // Compute z^15 - let t14 = circuit_mul(t13, in56); // Compute z^16 - let t15 = circuit_mul(t14, in56); // Compute z^17 - let t16 = circuit_mul(t15, in56); // Compute z^18 - let t17 = circuit_mul(t16, in56); // Compute z^19 - let t18 = circuit_mul(t17, in56); // Compute z^20 - let t19 = circuit_mul(t18, in56); // Compute z^21 - let t20 = circuit_mul(t19, in56); // Compute z^22 - let t21 = circuit_mul(t20, in56); // Compute z^23 - let t22 = circuit_mul(t21, in56); // Compute z^24 - let t23 = circuit_mul(t22, in56); // Compute z^25 - let t24 = circuit_mul(t23, in56); // Compute z^26 - let t25 = circuit_mul(t24, in56); // Compute z^27 - let t26 = circuit_mul(t25, in56); // Compute z^28 - let t27 = circuit_mul(t26, in56); // Compute z^29 - let t28 = circuit_mul(t27, in56); // Compute z^30 - let t29 = circuit_mul(t28, in56); // Compute z^31 - let t30 = circuit_mul(t29, in56); // Compute z^32 - let t31 = circuit_mul(t30, in56); // Compute z^33 - let t32 = circuit_mul(t31, in56); // Compute z^34 - let t33 = circuit_mul(t32, in56); // Compute z^35 - let t34 = circuit_mul(t33, in56); // Compute z^36 - let t35 = circuit_mul(t34, in56); // Compute z^37 - let t36 = circuit_mul(t35, in56); // Compute z^38 - let t37 = circuit_mul(t36, in56); // Compute z^39 - let t38 = circuit_mul(t37, in56); // Compute z^40 - let t39 = circuit_mul(t38, in56); // Compute z^41 - let t40 = circuit_mul(t39, in56); // Compute z^42 - let t41 = circuit_mul(t40, in56); // Compute z^43 - let t42 = circuit_mul(t41, in56); // Compute z^44 - let t43 = circuit_mul(t42, in56); // Compute z^45 - let t44 = circuit_mul(t43, in56); // Compute z^46 - let t45 = circuit_mul(t44, in56); // Compute z^47 - let t46 = circuit_mul(t45, in56); // Compute z^48 - let t47 = circuit_mul(t46, in56); // Compute z^49 - let t48 = circuit_mul(t47, in56); // Compute z^50 - let t49 = circuit_mul(t48, in56); // Compute z^51 - let t50 = circuit_mul(t49, in56); // Compute z^52 - let t51 = circuit_mul(t50, in56); // Compute z^53 - let t52 = circuit_mul(t51, in56); // Compute z^54 - let t53 = circuit_mul(t52, in56); // Compute z^55 - let t54 = circuit_mul(t53, in56); // Compute z^56 - let t55 = circuit_mul(t54, in56); // Compute z^57 - let t56 = circuit_mul(in54, in54); - let t57 = circuit_mul(t56, in54); - let t58 = circuit_mul(in31, in56); // Eval UnnamedPoly step coeff_1 * z^1 - let t59 = circuit_add(in30, t58); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t60 = circuit_mul(in32, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t61 = circuit_add(t59, t60); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t62 = circuit_mul(in33, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t63 = circuit_add(t61, t62); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t64 = circuit_mul(in34, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t65 = circuit_add(t63, t64); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t66 = circuit_mul(in35, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t67 = circuit_add(t65, t66); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t68 = circuit_mul(in36, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t69 = circuit_add(t67, t68); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t70 = circuit_mul(in37, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t71 = circuit_add(t69, t70); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t72 = circuit_mul(in38, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t73 = circuit_add(t71, t72); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t74 = circuit_mul(in39, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t75 = circuit_add(t73, t74); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t76 = circuit_mul(in40, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t77 = circuit_add(t75, t76); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t78 = circuit_mul(in41, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t79 = circuit_add(t77, t78); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t80 = circuit_mul(in43, in56); // Eval UnnamedPoly step coeff_1 * z^1 - let t81 = circuit_add(in42, t80); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t82 = circuit_mul(in44, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t83 = circuit_add(t81, t82); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t84 = circuit_mul(in45, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t85 = circuit_add(t83, t84); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t86 = circuit_mul(in46, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t87 = circuit_add(t85, t86); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t88 = circuit_mul(in47, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t89 = circuit_add(t87, t88); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t90 = circuit_mul(in48, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t91 = circuit_add(t89, t90); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t92 = circuit_mul(in49, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t93 = circuit_add(t91, t92); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t94 = circuit_mul(in50, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t95 = circuit_add(t93, t94); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t96 = circuit_mul(in51, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t97 = circuit_add(t95, t96); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t98 = circuit_mul(in52, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t99 = circuit_add(t97, t98); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t100 = circuit_mul(in53, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t101 = circuit_add(t99, t100); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t102 = circuit_sub(in6, in11); - let t103 = circuit_sub(in6, in13); - let t104 = circuit_mul(in10, in0); // Fp2 mul start - let t105 = circuit_mul(t102, in1); - let t106 = circuit_sub(t104, t105); // Fp2 mul real part end - let t107 = circuit_mul(in10, in1); - let t108 = circuit_mul(t102, in0); - let t109 = circuit_add(t107, t108); // Fp2 mul imag part end - let t110 = circuit_mul(in12, in2); // Fp2 mul start - let t111 = circuit_mul(t103, in3); - let t112 = circuit_sub(t110, t111); // Fp2 mul real part end - let t113 = circuit_mul(in12, in3); - let t114 = circuit_mul(t103, in2); - let t115 = circuit_add(t113, t114); // Fp2 mul imag part end - let t116 = circuit_mul(in10, in4); // Fp2 scalar mul coeff 0/1 - let t117 = circuit_mul(in11, in4); // Fp2 scalar mul coeff 1/1 - let t118 = circuit_mul(in12, in5); // Fp2 scalar mul coeff 0/1 - let t119 = circuit_mul(in13, in5); // Fp2 scalar mul coeff 1/1 - let t120 = circuit_sub(in18, t112); // Fp2 sub coeff 0/1 - let t121 = circuit_sub(in19, t115); // Fp2 sub coeff 1/1 - let t122 = circuit_sub(in16, t106); // Fp2 sub coeff 0/1 - let t123 = circuit_sub(in17, t109); // Fp2 sub coeff 1/1 - let t124 = circuit_mul(t122, t122); // Fp2 Div x/y start : Fp2 Inv y start - let t125 = circuit_mul(t123, t123); - let t126 = circuit_add(t124, t125); - let t127 = circuit_inverse(t126); - let t128 = circuit_mul(t122, t127); // Fp2 Inv y real part end - let t129 = circuit_mul(t123, t127); - let t130 = circuit_sub(in6, t129); // Fp2 Inv y imag part end - let t131 = circuit_mul(t120, t128); // Fp2 mul start - let t132 = circuit_mul(t121, t130); + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t62, t63, t72, t73, t127, t128, t137, t138, t166, t33, t31,) + .new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(yInv_0); + circuit_inputs = circuit_inputs.next(xNegOverY_0); + circuit_inputs = circuit_inputs.next(Q0.x0); + circuit_inputs = circuit_inputs.next(Q0.x1); + circuit_inputs = circuit_inputs.next(Q0.y0); + circuit_inputs = circuit_inputs.next(Q0.y1); + circuit_inputs = circuit_inputs.next(yInv_1); + circuit_inputs = circuit_inputs.next(xNegOverY_1); + circuit_inputs = circuit_inputs.next(Q1.x0); + circuit_inputs = circuit_inputs.next(Q1.x1); + circuit_inputs = circuit_inputs.next(Q1.y0); + circuit_inputs = circuit_inputs.next(Q1.y1); + circuit_inputs = circuit_inputs.next(R_i.w0); + circuit_inputs = circuit_inputs.next(R_i.w1); + circuit_inputs = circuit_inputs.next(R_i.w2); + circuit_inputs = circuit_inputs.next(R_i.w3); + circuit_inputs = circuit_inputs.next(R_i.w4); + circuit_inputs = circuit_inputs.next(R_i.w5); + circuit_inputs = circuit_inputs.next(R_i.w6); + circuit_inputs = circuit_inputs.next(R_i.w7); + circuit_inputs = circuit_inputs.next(R_i.w8); + circuit_inputs = circuit_inputs.next(R_i.w9); + circuit_inputs = circuit_inputs.next(R_i.w10); + circuit_inputs = circuit_inputs.next(R_i.w11); + circuit_inputs = circuit_inputs.next(c0); + circuit_inputs = circuit_inputs.next(z); + circuit_inputs = circuit_inputs.next(c_inv_of_z); + circuit_inputs = circuit_inputs.next(previous_lhs); + + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } + }; + let Q0: G2Point = G2Point { + x0: outputs.get_output(t62), + x1: outputs.get_output(t63), + y0: outputs.get_output(t72), + y1: outputs.get_output(t73) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t127), + x1: outputs.get_output(t128), + y0: outputs.get_output(t137), + y1: outputs.get_output(t138) + }; + let new_lhs: u384 = outputs.get_output(t166); + let c_i: u384 = outputs.get_output(t33); + let f_i_plus_one_of_z: u384 = outputs.get_output(t31); + return (Q0, Q1, new_lhs, c_i, f_i_plus_one_of_z); +} +fn run_BN254_MP_CHECK_INIT_BIT_3_circuit( + yInv_0: u384, + xNegOverY_0: u384, + Q0: G2Point, + yInv_1: u384, + xNegOverY_1: u384, + Q1: G2Point, + yInv_2: u384, + xNegOverY_2: u384, + Q2: G2Point, + R_i: E12D, + c0: u384, + z: u384, + c_inv_of_z: u384, + previous_lhs: u384 +) -> (G2Point, G2Point, G2Point, u384, u384, u384) { + // CONSTANT stack + let in0 = CE::> {}; // 0x3 + let in1 = CE::> {}; // 0x6 + let in2 = CE::> {}; // 0x0 + let in3 = CE::> {}; // -0x9 % p + let in4 = CE::> {}; // 0x1 + + // INPUT stack + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let (in9, in10) = (CE::> {}, CE::> {}); + let (in11, in12) = (CE::> {}, CE::> {}); + let (in13, in14) = (CE::> {}, CE::> {}); + let (in15, in16) = (CE::> {}, CE::> {}); + let (in17, in18) = (CE::> {}, CE::> {}); + let (in19, in20) = (CE::> {}, CE::> {}); + let (in21, in22) = (CE::> {}, CE::> {}); + let (in23, in24) = (CE::> {}, CE::> {}); + let (in25, in26) = (CE::> {}, CE::> {}); + let (in27, in28) = (CE::> {}, CE::> {}); + let (in29, in30) = (CE::> {}, CE::> {}); + let (in31, in32) = (CE::> {}, CE::> {}); + let (in33, in34) = (CE::> {}, CE::> {}); + let (in35, in36) = (CE::> {}, CE::> {}); + let (in37, in38) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in36, in36); // Compute z^2 + let t1 = circuit_mul(t0, in36); // Compute z^3 + let t2 = circuit_mul(t1, in36); // Compute z^4 + let t3 = circuit_mul(t2, in36); // Compute z^5 + let t4 = circuit_mul(t3, in36); // Compute z^6 + let t5 = circuit_mul(t4, in36); // Compute z^7 + let t6 = circuit_mul(t5, in36); // Compute z^8 + let t7 = circuit_mul(t6, in36); // Compute z^9 + let t8 = circuit_mul(t7, in36); // Compute z^10 + let t9 = circuit_mul(t8, in36); // Compute z^11 + let t10 = circuit_mul(in24, in36); // Eval R step coeff_1 * z^1 + let t11 = circuit_add(in23, t10); // Eval R step + (coeff_1 * z^1) + let t12 = circuit_mul(in25, t0); // Eval R step coeff_2 * z^2 + let t13 = circuit_add(t11, t12); // Eval R step + (coeff_2 * z^2) + let t14 = circuit_mul(in26, t1); // Eval R step coeff_3 * z^3 + let t15 = circuit_add(t13, t14); // Eval R step + (coeff_3 * z^3) + let t16 = circuit_mul(in27, t2); // Eval R step coeff_4 * z^4 + let t17 = circuit_add(t15, t16); // Eval R step + (coeff_4 * z^4) + let t18 = circuit_mul(in28, t3); // Eval R step coeff_5 * z^5 + let t19 = circuit_add(t17, t18); // Eval R step + (coeff_5 * z^5) + let t20 = circuit_mul(in29, t4); // Eval R step coeff_6 * z^6 + let t21 = circuit_add(t19, t20); // Eval R step + (coeff_6 * z^6) + let t22 = circuit_mul(in30, t5); // Eval R step coeff_7 * z^7 + let t23 = circuit_add(t21, t22); // Eval R step + (coeff_7 * z^7) + let t24 = circuit_mul(in31, t6); // Eval R step coeff_8 * z^8 + let t25 = circuit_add(t23, t24); // Eval R step + (coeff_8 * z^8) + let t26 = circuit_mul(in32, t7); // Eval R step coeff_9 * z^9 + let t27 = circuit_add(t25, t26); // Eval R step + (coeff_9 * z^9) + let t28 = circuit_mul(in33, t8); // Eval R step coeff_10 * z^10 + let t29 = circuit_add(t27, t28); // Eval R step + (coeff_10 * z^10) + let t30 = circuit_mul(in34, t9); // Eval R step coeff_11 * z^11 + let t31 = circuit_add(t29, t30); // Eval R step + (coeff_11 * z^11) + let t32 = circuit_mul(in37, in37); + let t33 = circuit_mul(in35, in35); + let t34 = circuit_add(in7, in8); // Doubling slope numerator start + let t35 = circuit_sub(in7, in8); + let t36 = circuit_mul(t34, t35); + let t37 = circuit_mul(in7, in8); + let t38 = circuit_mul(t36, in0); + let t39 = circuit_mul(t37, in1); // Doubling slope numerator end + let t40 = circuit_add(in9, in9); // Fp2 add coeff 0/1 + let t41 = circuit_add(in10, in10); // Fp2 add coeff 1/1 + let t42 = circuit_mul(t40, t40); // Fp2 Div x/y start : Fp2 Inv y start + let t43 = circuit_mul(t41, t41); + let t44 = circuit_add(t42, t43); + let t45 = circuit_inverse(t44); + let t46 = circuit_mul(t40, t45); // Fp2 Inv y real part end + let t47 = circuit_mul(t41, t45); + let t48 = circuit_sub(in2, t47); // Fp2 Inv y imag part end + let t49 = circuit_mul(t38, t46); // Fp2 mul start + let t50 = circuit_mul(t39, t48); + let t51 = circuit_sub(t49, t50); // Fp2 mul real part end + let t52 = circuit_mul(t38, t48); + let t53 = circuit_mul(t39, t46); + let t54 = circuit_add(t52, t53); // Fp2 mul imag part end + let t55 = circuit_add(t51, t54); + let t56 = circuit_sub(t51, t54); + let t57 = circuit_mul(t55, t56); + let t58 = circuit_mul(t51, t54); + let t59 = circuit_add(t58, t58); + let t60 = circuit_add(in7, in7); // Fp2 add coeff 0/1 + let t61 = circuit_add(in8, in8); // Fp2 add coeff 1/1 + let t62 = circuit_sub(t57, t60); // Fp2 sub coeff 0/1 + let t63 = circuit_sub(t59, t61); // Fp2 sub coeff 1/1 + let t64 = circuit_sub(in7, t62); // Fp2 sub coeff 0/1 + let t65 = circuit_sub(in8, t63); // Fp2 sub coeff 1/1 + let t66 = circuit_mul(t51, t64); // Fp2 mul start + let t67 = circuit_mul(t54, t65); + let t68 = circuit_sub(t66, t67); // Fp2 mul real part end + let t69 = circuit_mul(t51, t65); + let t70 = circuit_mul(t54, t64); + let t71 = circuit_add(t69, t70); // Fp2 mul imag part end + let t72 = circuit_sub(t68, in9); // Fp2 sub coeff 0/1 + let t73 = circuit_sub(t71, in10); // Fp2 sub coeff 1/1 + let t74 = circuit_mul(t51, in7); // Fp2 mul start + let t75 = circuit_mul(t54, in8); + let t76 = circuit_sub(t74, t75); // Fp2 mul real part end + let t77 = circuit_mul(t51, in8); + let t78 = circuit_mul(t54, in7); + let t79 = circuit_add(t77, t78); // Fp2 mul imag part end + let t80 = circuit_sub(t76, in9); // Fp2 sub coeff 0/1 + let t81 = circuit_sub(t79, in10); // Fp2 sub coeff 1/1 + let t82 = circuit_mul(in3, t54); + let t83 = circuit_add(t51, t82); + let t84 = circuit_mul(t83, in6); + let t85 = circuit_mul(in3, t81); + let t86 = circuit_add(t80, t85); + let t87 = circuit_mul(t86, in5); + let t88 = circuit_mul(t54, in6); + let t89 = circuit_mul(t81, in5); + let t90 = circuit_mul(t84, in36); // Eval sparse poly line_0p_1 step coeff_1 * z^1 + let t91 = circuit_add(in4, t90); // Eval sparse poly line_0p_1 step + coeff_1 * z^1 + let t92 = circuit_mul(t87, t1); // Eval sparse poly line_0p_1 step coeff_3 * z^3 + let t93 = circuit_add(t91, t92); // Eval sparse poly line_0p_1 step + coeff_3 * z^3 + let t94 = circuit_mul(t88, t5); // Eval sparse poly line_0p_1 step coeff_7 * z^7 + let t95 = circuit_add(t93, t94); // Eval sparse poly line_0p_1 step + coeff_7 * z^7 + let t96 = circuit_mul(t89, t7); // Eval sparse poly line_0p_1 step coeff_9 * z^9 + let t97 = circuit_add(t95, t96); // Eval sparse poly line_0p_1 step + coeff_9 * z^9 + let t98 = circuit_mul(t32, t97); + let t99 = circuit_add(in13, in14); // Doubling slope numerator start + let t100 = circuit_sub(in13, in14); + let t101 = circuit_mul(t99, t100); + let t102 = circuit_mul(in13, in14); + let t103 = circuit_mul(t101, in0); + let t104 = circuit_mul(t102, in1); // Doubling slope numerator end + let t105 = circuit_add(in15, in15); // Fp2 add coeff 0/1 + let t106 = circuit_add(in16, in16); // Fp2 add coeff 1/1 + let t107 = circuit_mul(t105, t105); // Fp2 Div x/y start : Fp2 Inv y start + let t108 = circuit_mul(t106, t106); + let t109 = circuit_add(t107, t108); + let t110 = circuit_inverse(t109); + let t111 = circuit_mul(t105, t110); // Fp2 Inv y real part end + let t112 = circuit_mul(t106, t110); + let t113 = circuit_sub(in2, t112); // Fp2 Inv y imag part end + let t114 = circuit_mul(t103, t111); // Fp2 mul start + let t115 = circuit_mul(t104, t113); + let t116 = circuit_sub(t114, t115); // Fp2 mul real part end + let t117 = circuit_mul(t103, t113); + let t118 = circuit_mul(t104, t111); + let t119 = circuit_add(t117, t118); // Fp2 mul imag part end + let t120 = circuit_add(t116, t119); + let t121 = circuit_sub(t116, t119); + let t122 = circuit_mul(t120, t121); + let t123 = circuit_mul(t116, t119); + let t124 = circuit_add(t123, t123); + let t125 = circuit_add(in13, in13); // Fp2 add coeff 0/1 + let t126 = circuit_add(in14, in14); // Fp2 add coeff 1/1 + let t127 = circuit_sub(t122, t125); // Fp2 sub coeff 0/1 + let t128 = circuit_sub(t124, t126); // Fp2 sub coeff 1/1 + let t129 = circuit_sub(in13, t127); // Fp2 sub coeff 0/1 + let t130 = circuit_sub(in14, t128); // Fp2 sub coeff 1/1 + let t131 = circuit_mul(t116, t129); // Fp2 mul start + let t132 = circuit_mul(t119, t130); let t133 = circuit_sub(t131, t132); // Fp2 mul real part end - let t134 = circuit_mul(t120, t130); - let t135 = circuit_mul(t121, t128); + let t134 = circuit_mul(t116, t130); + let t135 = circuit_mul(t119, t129); let t136 = circuit_add(t134, t135); // Fp2 mul imag part end - let t137 = circuit_add(t133, t136); - let t138 = circuit_sub(t133, t136); - let t139 = circuit_mul(t137, t138); - let t140 = circuit_mul(t133, t136); - let t141 = circuit_add(t140, t140); - let t142 = circuit_add(in16, t106); // Fp2 add coeff 0/1 - let t143 = circuit_add(in17, t109); // Fp2 add coeff 1/1 - let t144 = circuit_sub(t139, t142); // Fp2 sub coeff 0/1 - let t145 = circuit_sub(t141, t143); // Fp2 sub coeff 1/1 - let t146 = circuit_sub(in16, t144); // Fp2 sub coeff 0/1 - let t147 = circuit_sub(in17, t145); // Fp2 sub coeff 1/1 - let t148 = circuit_mul(t133, t146); // Fp2 mul start - let t149 = circuit_mul(t136, t147); - let t150 = circuit_sub(t148, t149); // Fp2 mul real part end - let t151 = circuit_mul(t133, t147); - let t152 = circuit_mul(t136, t146); - let t153 = circuit_add(t151, t152); // Fp2 mul imag part end - let t154 = circuit_sub(t150, in18); // Fp2 sub coeff 0/1 - let t155 = circuit_sub(t153, in19); // Fp2 sub coeff 1/1 - let t156 = circuit_mul(t133, in16); // Fp2 mul start - let t157 = circuit_mul(t136, in17); - let t158 = circuit_sub(t156, t157); // Fp2 mul real part end - let t159 = circuit_mul(t133, in17); - let t160 = circuit_mul(t136, in16); - let t161 = circuit_add(t159, t160); // Fp2 mul imag part end - let t162 = circuit_sub(t158, in18); // Fp2 sub coeff 0/1 - let t163 = circuit_sub(t161, in19); // Fp2 sub coeff 1/1 - let t164 = circuit_mul(in7, t136); - let t165 = circuit_add(t133, t164); - let t166 = circuit_mul(t165, in15); - let t167 = circuit_mul(in7, t163); - let t168 = circuit_add(t162, t167); - let t169 = circuit_mul(t168, in14); - let t170 = circuit_mul(t136, in15); - let t171 = circuit_mul(t163, in14); - let t172 = circuit_sub(t154, t118); // Fp2 sub coeff 0/1 - let t173 = circuit_sub(t155, t119); // Fp2 sub coeff 1/1 - let t174 = circuit_sub(t144, t116); // Fp2 sub coeff 0/1 - let t175 = circuit_sub(t145, t117); // Fp2 sub coeff 1/1 - let t176 = circuit_mul(t174, t174); // Fp2 Div x/y start : Fp2 Inv y start - let t177 = circuit_mul(t175, t175); - let t178 = circuit_add(t176, t177); - let t179 = circuit_inverse(t178); - let t180 = circuit_mul(t174, t179); // Fp2 Inv y real part end - let t181 = circuit_mul(t175, t179); - let t182 = circuit_sub(in6, t181); // Fp2 Inv y imag part end - let t183 = circuit_mul(t172, t180); // Fp2 mul start - let t184 = circuit_mul(t173, t182); - let t185 = circuit_sub(t183, t184); // Fp2 mul real part end - let t186 = circuit_mul(t172, t182); - let t187 = circuit_mul(t173, t180); - let t188 = circuit_add(t186, t187); // Fp2 mul imag part end - let t189 = circuit_mul(t185, t144); // Fp2 mul start - let t190 = circuit_mul(t188, t145); - let t191 = circuit_sub(t189, t190); // Fp2 mul real part end - let t192 = circuit_mul(t185, t145); - let t193 = circuit_mul(t188, t144); - let t194 = circuit_add(t192, t193); // Fp2 mul imag part end - let t195 = circuit_sub(t191, t154); // Fp2 sub coeff 0/1 - let t196 = circuit_sub(t194, t155); // Fp2 sub coeff 1/1 - let t197 = circuit_mul(in7, t188); - let t198 = circuit_add(t185, t197); - let t199 = circuit_mul(t198, in15); - let t200 = circuit_mul(in7, t196); - let t201 = circuit_add(t195, t200); - let t202 = circuit_mul(t201, in14); - let t203 = circuit_mul(t188, in15); - let t204 = circuit_mul(t196, in14); - let t205 = circuit_sub(in6, in21); - let t206 = circuit_sub(in6, in23); - let t207 = circuit_mul(in20, in0); // Fp2 mul start - let t208 = circuit_mul(t205, in1); - let t209 = circuit_sub(t207, t208); // Fp2 mul real part end - let t210 = circuit_mul(in20, in1); - let t211 = circuit_mul(t205, in0); - let t212 = circuit_add(t210, t211); // Fp2 mul imag part end - let t213 = circuit_mul(in22, in2); // Fp2 mul start - let t214 = circuit_mul(t206, in3); - let t215 = circuit_sub(t213, t214); // Fp2 mul real part end - let t216 = circuit_mul(in22, in3); - let t217 = circuit_mul(t206, in2); - let t218 = circuit_add(t216, t217); // Fp2 mul imag part end - let t219 = circuit_mul(in20, in4); // Fp2 scalar mul coeff 0/1 - let t220 = circuit_mul(in21, in4); // Fp2 scalar mul coeff 1/1 - let t221 = circuit_mul(in22, in5); // Fp2 scalar mul coeff 0/1 - let t222 = circuit_mul(in23, in5); // Fp2 scalar mul coeff 1/1 - let t223 = circuit_sub(in28, t215); // Fp2 sub coeff 0/1 - let t224 = circuit_sub(in29, t218); // Fp2 sub coeff 1/1 - let t225 = circuit_sub(in26, t209); // Fp2 sub coeff 0/1 - let t226 = circuit_sub(in27, t212); // Fp2 sub coeff 1/1 - let t227 = circuit_mul(t225, t225); // Fp2 Div x/y start : Fp2 Inv y start - let t228 = circuit_mul(t226, t226); - let t229 = circuit_add(t227, t228); - let t230 = circuit_inverse(t229); - let t231 = circuit_mul(t225, t230); // Fp2 Inv y real part end - let t232 = circuit_mul(t226, t230); - let t233 = circuit_sub(in6, t232); // Fp2 Inv y imag part end - let t234 = circuit_mul(t223, t231); // Fp2 mul start - let t235 = circuit_mul(t224, t233); - let t236 = circuit_sub(t234, t235); // Fp2 mul real part end - let t237 = circuit_mul(t223, t233); - let t238 = circuit_mul(t224, t231); - let t239 = circuit_add(t237, t238); // Fp2 mul imag part end - let t240 = circuit_add(t236, t239); - let t241 = circuit_sub(t236, t239); - let t242 = circuit_mul(t240, t241); - let t243 = circuit_mul(t236, t239); - let t244 = circuit_add(t243, t243); - let t245 = circuit_add(in26, t209); // Fp2 add coeff 0/1 - let t246 = circuit_add(in27, t212); // Fp2 add coeff 1/1 - let t247 = circuit_sub(t242, t245); // Fp2 sub coeff 0/1 - let t248 = circuit_sub(t244, t246); // Fp2 sub coeff 1/1 - let t249 = circuit_sub(in26, t247); // Fp2 sub coeff 0/1 - let t250 = circuit_sub(in27, t248); // Fp2 sub coeff 1/1 - let t251 = circuit_mul(t236, t249); // Fp2 mul start - let t252 = circuit_mul(t239, t250); - let t253 = circuit_sub(t251, t252); // Fp2 mul real part end - let t254 = circuit_mul(t236, t250); - let t255 = circuit_mul(t239, t249); - let t256 = circuit_add(t254, t255); // Fp2 mul imag part end - let t257 = circuit_sub(t253, in28); // Fp2 sub coeff 0/1 - let t258 = circuit_sub(t256, in29); // Fp2 sub coeff 1/1 - let t259 = circuit_mul(t236, in26); // Fp2 mul start - let t260 = circuit_mul(t239, in27); - let t261 = circuit_sub(t259, t260); // Fp2 mul real part end - let t262 = circuit_mul(t236, in27); - let t263 = circuit_mul(t239, in26); - let t264 = circuit_add(t262, t263); // Fp2 mul imag part end - let t265 = circuit_sub(t261, in28); // Fp2 sub coeff 0/1 - let t266 = circuit_sub(t264, in29); // Fp2 sub coeff 1/1 - let t267 = circuit_mul(in7, t239); - let t268 = circuit_add(t236, t267); - let t269 = circuit_mul(t268, in25); - let t270 = circuit_mul(in7, t266); - let t271 = circuit_add(t265, t270); - let t272 = circuit_mul(t271, in24); - let t273 = circuit_mul(t239, in25); - let t274 = circuit_mul(t266, in24); - let t275 = circuit_sub(t257, t221); // Fp2 sub coeff 0/1 - let t276 = circuit_sub(t258, t222); // Fp2 sub coeff 1/1 - let t277 = circuit_sub(t247, t219); // Fp2 sub coeff 0/1 - let t278 = circuit_sub(t248, t220); // Fp2 sub coeff 1/1 - let t279 = circuit_mul(t277, t277); // Fp2 Div x/y start : Fp2 Inv y start - let t280 = circuit_mul(t278, t278); - let t281 = circuit_add(t279, t280); - let t282 = circuit_inverse(t281); - let t283 = circuit_mul(t277, t282); // Fp2 Inv y real part end - let t284 = circuit_mul(t278, t282); - let t285 = circuit_sub(in6, t284); // Fp2 Inv y imag part end - let t286 = circuit_mul(t275, t283); // Fp2 mul start - let t287 = circuit_mul(t276, t285); - let t288 = circuit_sub(t286, t287); // Fp2 mul real part end - let t289 = circuit_mul(t275, t285); - let t290 = circuit_mul(t276, t283); - let t291 = circuit_add(t289, t290); // Fp2 mul imag part end - let t292 = circuit_mul(t288, t247); // Fp2 mul start - let t293 = circuit_mul(t291, t248); - let t294 = circuit_sub(t292, t293); // Fp2 mul real part end - let t295 = circuit_mul(t288, t248); - let t296 = circuit_mul(t291, t247); - let t297 = circuit_add(t295, t296); // Fp2 mul imag part end - let t298 = circuit_sub(t294, t257); // Fp2 sub coeff 0/1 - let t299 = circuit_sub(t297, t258); // Fp2 sub coeff 1/1 - let t300 = circuit_mul(in7, t291); - let t301 = circuit_add(t288, t300); - let t302 = circuit_mul(t301, in25); - let t303 = circuit_mul(in7, t299); - let t304 = circuit_add(t298, t303); - let t305 = circuit_mul(t304, in24); - let t306 = circuit_mul(t291, in25); - let t307 = circuit_mul(t299, in24); - let t308 = circuit_mul(t166, in56); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t309 = circuit_add(in5, t308); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t310 = circuit_mul(t169, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t311 = circuit_add(t309, t310); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t312 = circuit_mul(t170, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t313 = circuit_add(t311, t312); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t314 = circuit_mul(t171, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t315 = circuit_add(t313, t314); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t316 = circuit_mul(in61, t315); - let t317 = circuit_mul(t199, in56); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t318 = circuit_add(in5, t317); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t319 = circuit_mul(t202, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t320 = circuit_add(t318, t319); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t321 = circuit_mul(t203, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t322 = circuit_add(t320, t321); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t323 = circuit_mul(t204, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t324 = circuit_add(t322, t323); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t325 = circuit_mul(t316, t324); - let t326 = circuit_mul(t269, in56); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t327 = circuit_add(in5, t326); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t328 = circuit_mul(t272, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t329 = circuit_add(t327, t328); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t330 = circuit_mul(t273, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t331 = circuit_add(t329, t330); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t332 = circuit_mul(t274, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t333 = circuit_add(t331, t332); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t334 = circuit_mul(t325, t333); - let t335 = circuit_mul(t302, in56); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t336 = circuit_add(in5, t335); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t337 = circuit_mul(t305, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t338 = circuit_add(t336, t337); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t339 = circuit_mul(t306, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t340 = circuit_add(t338, t339); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t341 = circuit_mul(t307, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t342 = circuit_add(t340, t341); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t343 = circuit_mul(t334, t342); - let t344 = circuit_sub(t343, t79); - let t345 = circuit_mul(t56, t344); // c_n_minus_2 * ((Π(n-2,k) (Pk(z)) - R_n_minus_2(z)) - let t346 = circuit_mul(t79, in57); - let t347 = circuit_mul(t346, in58); - let t348 = circuit_mul(t347, in59); - let t349 = circuit_mul(t348, in55); - let t350 = circuit_sub(t349, t101); - let t351 = circuit_mul(t57, t350); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) - let t352 = circuit_add(t345, t351); - let t353 = circuit_add(in60, t352); - let t354 = circuit_mul(in63, in56); // Eval UnnamedPoly step coeff_1 * z^1 - let t355 = circuit_add(in62, t354); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t356 = circuit_mul(in64, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t357 = circuit_add(t355, t356); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t358 = circuit_mul(in65, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t359 = circuit_add(t357, t358); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t360 = circuit_mul(in66, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t361 = circuit_add(t359, t360); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t362 = circuit_mul(in67, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t363 = circuit_add(t361, t362); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t364 = circuit_mul(in68, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t365 = circuit_add(t363, t364); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t366 = circuit_mul(in69, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t367 = circuit_add(t365, t366); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t368 = circuit_mul(in70, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t369 = circuit_add(t367, t368); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t370 = circuit_mul(in71, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t371 = circuit_add(t369, t370); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t372 = circuit_mul(in72, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t373 = circuit_add(t371, t372); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t374 = circuit_mul(in73, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t375 = circuit_add(t373, t374); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t376 = circuit_mul(in74, t10); // Eval UnnamedPoly step coeff_12 * z^12 - let t377 = circuit_add(t375, t376); // Eval UnnamedPoly step + (coeff_12 * z^12) - let t378 = circuit_mul(in75, t11); // Eval UnnamedPoly step coeff_13 * z^13 - let t379 = circuit_add(t377, t378); // Eval UnnamedPoly step + (coeff_13 * z^13) - let t380 = circuit_mul(in76, t12); // Eval UnnamedPoly step coeff_14 * z^14 - let t381 = circuit_add(t379, t380); // Eval UnnamedPoly step + (coeff_14 * z^14) - let t382 = circuit_mul(in77, t13); // Eval UnnamedPoly step coeff_15 * z^15 - let t383 = circuit_add(t381, t382); // Eval UnnamedPoly step + (coeff_15 * z^15) - let t384 = circuit_mul(in78, t14); // Eval UnnamedPoly step coeff_16 * z^16 - let t385 = circuit_add(t383, t384); // Eval UnnamedPoly step + (coeff_16 * z^16) - let t386 = circuit_mul(in79, t15); // Eval UnnamedPoly step coeff_17 * z^17 - let t387 = circuit_add(t385, t386); // Eval UnnamedPoly step + (coeff_17 * z^17) - let t388 = circuit_mul(in80, t16); // Eval UnnamedPoly step coeff_18 * z^18 - let t389 = circuit_add(t387, t388); // Eval UnnamedPoly step + (coeff_18 * z^18) - let t390 = circuit_mul(in81, t17); // Eval UnnamedPoly step coeff_19 * z^19 - let t391 = circuit_add(t389, t390); // Eval UnnamedPoly step + (coeff_19 * z^19) - let t392 = circuit_mul(in82, t18); // Eval UnnamedPoly step coeff_20 * z^20 - let t393 = circuit_add(t391, t392); // Eval UnnamedPoly step + (coeff_20 * z^20) - let t394 = circuit_mul(in83, t19); // Eval UnnamedPoly step coeff_21 * z^21 - let t395 = circuit_add(t393, t394); // Eval UnnamedPoly step + (coeff_21 * z^21) - let t396 = circuit_mul(in84, t20); // Eval UnnamedPoly step coeff_22 * z^22 - let t397 = circuit_add(t395, t396); // Eval UnnamedPoly step + (coeff_22 * z^22) - let t398 = circuit_mul(in85, t21); // Eval UnnamedPoly step coeff_23 * z^23 - let t399 = circuit_add(t397, t398); // Eval UnnamedPoly step + (coeff_23 * z^23) - let t400 = circuit_mul(in86, t22); // Eval UnnamedPoly step coeff_24 * z^24 - let t401 = circuit_add(t399, t400); // Eval UnnamedPoly step + (coeff_24 * z^24) - let t402 = circuit_mul(in87, t23); // Eval UnnamedPoly step coeff_25 * z^25 - let t403 = circuit_add(t401, t402); // Eval UnnamedPoly step + (coeff_25 * z^25) - let t404 = circuit_mul(in88, t24); // Eval UnnamedPoly step coeff_26 * z^26 - let t405 = circuit_add(t403, t404); // Eval UnnamedPoly step + (coeff_26 * z^26) - let t406 = circuit_mul(in89, t25); // Eval UnnamedPoly step coeff_27 * z^27 - let t407 = circuit_add(t405, t406); // Eval UnnamedPoly step + (coeff_27 * z^27) - let t408 = circuit_mul(in90, t26); // Eval UnnamedPoly step coeff_28 * z^28 - let t409 = circuit_add(t407, t408); // Eval UnnamedPoly step + (coeff_28 * z^28) - let t410 = circuit_mul(in91, t27); // Eval UnnamedPoly step coeff_29 * z^29 - let t411 = circuit_add(t409, t410); // Eval UnnamedPoly step + (coeff_29 * z^29) - let t412 = circuit_mul(in92, t28); // Eval UnnamedPoly step coeff_30 * z^30 - let t413 = circuit_add(t411, t412); // Eval UnnamedPoly step + (coeff_30 * z^30) - let t414 = circuit_mul(in93, t29); // Eval UnnamedPoly step coeff_31 * z^31 - let t415 = circuit_add(t413, t414); // Eval UnnamedPoly step + (coeff_31 * z^31) - let t416 = circuit_mul(in94, t30); // Eval UnnamedPoly step coeff_32 * z^32 - let t417 = circuit_add(t415, t416); // Eval UnnamedPoly step + (coeff_32 * z^32) - let t418 = circuit_mul(in95, t31); // Eval UnnamedPoly step coeff_33 * z^33 - let t419 = circuit_add(t417, t418); // Eval UnnamedPoly step + (coeff_33 * z^33) - let t420 = circuit_mul(in96, t32); // Eval UnnamedPoly step coeff_34 * z^34 - let t421 = circuit_add(t419, t420); // Eval UnnamedPoly step + (coeff_34 * z^34) - let t422 = circuit_mul(in97, t33); // Eval UnnamedPoly step coeff_35 * z^35 - let t423 = circuit_add(t421, t422); // Eval UnnamedPoly step + (coeff_35 * z^35) - let t424 = circuit_mul(in98, t34); // Eval UnnamedPoly step coeff_36 * z^36 - let t425 = circuit_add(t423, t424); // Eval UnnamedPoly step + (coeff_36 * z^36) - let t426 = circuit_mul(in99, t35); // Eval UnnamedPoly step coeff_37 * z^37 - let t427 = circuit_add(t425, t426); // Eval UnnamedPoly step + (coeff_37 * z^37) - let t428 = circuit_mul(in100, t36); // Eval UnnamedPoly step coeff_38 * z^38 - let t429 = circuit_add(t427, t428); // Eval UnnamedPoly step + (coeff_38 * z^38) - let t430 = circuit_mul(in101, t37); // Eval UnnamedPoly step coeff_39 * z^39 - let t431 = circuit_add(t429, t430); // Eval UnnamedPoly step + (coeff_39 * z^39) - let t432 = circuit_mul(in102, t38); // Eval UnnamedPoly step coeff_40 * z^40 - let t433 = circuit_add(t431, t432); // Eval UnnamedPoly step + (coeff_40 * z^40) - let t434 = circuit_mul(in103, t39); // Eval UnnamedPoly step coeff_41 * z^41 - let t435 = circuit_add(t433, t434); // Eval UnnamedPoly step + (coeff_41 * z^41) - let t436 = circuit_mul(in104, t40); // Eval UnnamedPoly step coeff_42 * z^42 - let t437 = circuit_add(t435, t436); // Eval UnnamedPoly step + (coeff_42 * z^42) - let t438 = circuit_mul(in105, t41); // Eval UnnamedPoly step coeff_43 * z^43 - let t439 = circuit_add(t437, t438); // Eval UnnamedPoly step + (coeff_43 * z^43) - let t440 = circuit_mul(in106, t42); // Eval UnnamedPoly step coeff_44 * z^44 - let t441 = circuit_add(t439, t440); // Eval UnnamedPoly step + (coeff_44 * z^44) - let t442 = circuit_mul(in107, t43); // Eval UnnamedPoly step coeff_45 * z^45 - let t443 = circuit_add(t441, t442); // Eval UnnamedPoly step + (coeff_45 * z^45) - let t444 = circuit_mul(in108, t44); // Eval UnnamedPoly step coeff_46 * z^46 - let t445 = circuit_add(t443, t444); // Eval UnnamedPoly step + (coeff_46 * z^46) - let t446 = circuit_mul(in109, t45); // Eval UnnamedPoly step coeff_47 * z^47 - let t447 = circuit_add(t445, t446); // Eval UnnamedPoly step + (coeff_47 * z^47) - let t448 = circuit_mul(in110, t46); // Eval UnnamedPoly step coeff_48 * z^48 - let t449 = circuit_add(t447, t448); // Eval UnnamedPoly step + (coeff_48 * z^48) - let t450 = circuit_mul(in111, t47); // Eval UnnamedPoly step coeff_49 * z^49 - let t451 = circuit_add(t449, t450); // Eval UnnamedPoly step + (coeff_49 * z^49) - let t452 = circuit_mul(in112, t48); // Eval UnnamedPoly step coeff_50 * z^50 - let t453 = circuit_add(t451, t452); // Eval UnnamedPoly step + (coeff_50 * z^50) - let t454 = circuit_mul(in113, t49); // Eval UnnamedPoly step coeff_51 * z^51 - let t455 = circuit_add(t453, t454); // Eval UnnamedPoly step + (coeff_51 * z^51) - let t456 = circuit_mul(in114, t50); // Eval UnnamedPoly step coeff_52 * z^52 - let t457 = circuit_add(t455, t456); // Eval UnnamedPoly step + (coeff_52 * z^52) - let t458 = circuit_mul(in115, t51); // Eval UnnamedPoly step coeff_53 * z^53 - let t459 = circuit_add(t457, t458); // Eval UnnamedPoly step + (coeff_53 * z^53) - let t460 = circuit_mul(in116, t52); // Eval UnnamedPoly step coeff_54 * z^54 - let t461 = circuit_add(t459, t460); // Eval UnnamedPoly step + (coeff_54 * z^54) - let t462 = circuit_mul(in117, t53); // Eval UnnamedPoly step coeff_55 * z^55 - let t463 = circuit_add(t461, t462); // Eval UnnamedPoly step + (coeff_55 * z^55) - let t464 = circuit_mul(in118, t54); // Eval UnnamedPoly step coeff_56 * z^56 - let t465 = circuit_add(t463, t464); // Eval UnnamedPoly step + (coeff_56 * z^56) - let t466 = circuit_mul(in119, t55); // Eval UnnamedPoly step coeff_57 * z^57 - let t467 = circuit_add(t465, t466); // Eval UnnamedPoly step + (coeff_57 * z^57) - let t468 = circuit_mul(in9, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t469 = circuit_add(in8, t468); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t470 = circuit_add(t469, t10); // Eval sparse poly UnnamedPoly step + 1*z^12 - let t471 = circuit_mul(t467, t470); - let t472 = circuit_sub(t353, t471); + let t137 = circuit_sub(t133, in15); // Fp2 sub coeff 0/1 + let t138 = circuit_sub(t136, in16); // Fp2 sub coeff 1/1 + let t139 = circuit_mul(t116, in13); // Fp2 mul start + let t140 = circuit_mul(t119, in14); + let t141 = circuit_sub(t139, t140); // Fp2 mul real part end + let t142 = circuit_mul(t116, in14); + let t143 = circuit_mul(t119, in13); + let t144 = circuit_add(t142, t143); // Fp2 mul imag part end + let t145 = circuit_sub(t141, in15); // Fp2 sub coeff 0/1 + let t146 = circuit_sub(t144, in16); // Fp2 sub coeff 1/1 + let t147 = circuit_mul(in3, t119); + let t148 = circuit_add(t116, t147); + let t149 = circuit_mul(t148, in12); + let t150 = circuit_mul(in3, t146); + let t151 = circuit_add(t145, t150); + let t152 = circuit_mul(t151, in11); + let t153 = circuit_mul(t119, in12); + let t154 = circuit_mul(t146, in11); + let t155 = circuit_mul(t149, in36); // Eval sparse poly line_1p_1 step coeff_1 * z^1 + let t156 = circuit_add(in4, t155); // Eval sparse poly line_1p_1 step + coeff_1 * z^1 + let t157 = circuit_mul(t152, t1); // Eval sparse poly line_1p_1 step coeff_3 * z^3 + let t158 = circuit_add(t156, t157); // Eval sparse poly line_1p_1 step + coeff_3 * z^3 + let t159 = circuit_mul(t153, t5); // Eval sparse poly line_1p_1 step coeff_7 * z^7 + let t160 = circuit_add(t158, t159); // Eval sparse poly line_1p_1 step + coeff_7 * z^7 + let t161 = circuit_mul(t154, t7); // Eval sparse poly line_1p_1 step coeff_9 * z^9 + let t162 = circuit_add(t160, t161); // Eval sparse poly line_1p_1 step + coeff_9 * z^9 + let t163 = circuit_mul(t98, t162); + let t164 = circuit_add(in19, in20); // Doubling slope numerator start + let t165 = circuit_sub(in19, in20); + let t166 = circuit_mul(t164, t165); + let t167 = circuit_mul(in19, in20); + let t168 = circuit_mul(t166, in0); + let t169 = circuit_mul(t167, in1); // Doubling slope numerator end + let t170 = circuit_add(in21, in21); // Fp2 add coeff 0/1 + let t171 = circuit_add(in22, in22); // Fp2 add coeff 1/1 + let t172 = circuit_mul(t170, t170); // Fp2 Div x/y start : Fp2 Inv y start + let t173 = circuit_mul(t171, t171); + let t174 = circuit_add(t172, t173); + let t175 = circuit_inverse(t174); + let t176 = circuit_mul(t170, t175); // Fp2 Inv y real part end + let t177 = circuit_mul(t171, t175); + let t178 = circuit_sub(in2, t177); // Fp2 Inv y imag part end + let t179 = circuit_mul(t168, t176); // Fp2 mul start + let t180 = circuit_mul(t169, t178); + let t181 = circuit_sub(t179, t180); // Fp2 mul real part end + let t182 = circuit_mul(t168, t178); + let t183 = circuit_mul(t169, t176); + let t184 = circuit_add(t182, t183); // Fp2 mul imag part end + let t185 = circuit_add(t181, t184); + let t186 = circuit_sub(t181, t184); + let t187 = circuit_mul(t185, t186); + let t188 = circuit_mul(t181, t184); + let t189 = circuit_add(t188, t188); + let t190 = circuit_add(in19, in19); // Fp2 add coeff 0/1 + let t191 = circuit_add(in20, in20); // Fp2 add coeff 1/1 + let t192 = circuit_sub(t187, t190); // Fp2 sub coeff 0/1 + let t193 = circuit_sub(t189, t191); // Fp2 sub coeff 1/1 + let t194 = circuit_sub(in19, t192); // Fp2 sub coeff 0/1 + let t195 = circuit_sub(in20, t193); // Fp2 sub coeff 1/1 + let t196 = circuit_mul(t181, t194); // Fp2 mul start + let t197 = circuit_mul(t184, t195); + let t198 = circuit_sub(t196, t197); // Fp2 mul real part end + let t199 = circuit_mul(t181, t195); + let t200 = circuit_mul(t184, t194); + let t201 = circuit_add(t199, t200); // Fp2 mul imag part end + let t202 = circuit_sub(t198, in21); // Fp2 sub coeff 0/1 + let t203 = circuit_sub(t201, in22); // Fp2 sub coeff 1/1 + let t204 = circuit_mul(t181, in19); // Fp2 mul start + let t205 = circuit_mul(t184, in20); + let t206 = circuit_sub(t204, t205); // Fp2 mul real part end + let t207 = circuit_mul(t181, in20); + let t208 = circuit_mul(t184, in19); + let t209 = circuit_add(t207, t208); // Fp2 mul imag part end + let t210 = circuit_sub(t206, in21); // Fp2 sub coeff 0/1 + let t211 = circuit_sub(t209, in22); // Fp2 sub coeff 1/1 + let t212 = circuit_mul(in3, t184); + let t213 = circuit_add(t181, t212); + let t214 = circuit_mul(t213, in18); + let t215 = circuit_mul(in3, t211); + let t216 = circuit_add(t210, t215); + let t217 = circuit_mul(t216, in17); + let t218 = circuit_mul(t184, in18); + let t219 = circuit_mul(t211, in17); + let t220 = circuit_mul(t214, in36); // Eval sparse poly line_2p_1 step coeff_1 * z^1 + let t221 = circuit_add(in4, t220); // Eval sparse poly line_2p_1 step + coeff_1 * z^1 + let t222 = circuit_mul(t217, t1); // Eval sparse poly line_2p_1 step coeff_3 * z^3 + let t223 = circuit_add(t221, t222); // Eval sparse poly line_2p_1 step + coeff_3 * z^3 + let t224 = circuit_mul(t218, t5); // Eval sparse poly line_2p_1 step coeff_7 * z^7 + let t225 = circuit_add(t223, t224); // Eval sparse poly line_2p_1 step + coeff_7 * z^7 + let t226 = circuit_mul(t219, t7); // Eval sparse poly line_2p_1 step coeff_9 * z^9 + let t227 = circuit_add(t225, t226); // Eval sparse poly line_2p_1 step + coeff_9 * z^9 + let t228 = circuit_mul(t163, t227); + let t229 = circuit_sub(t228, t31); + let t230 = circuit_mul(t33, t229); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) + let t231 = circuit_add(t230, in38); let modulus = TryInto::< _, CircuitModulus @@ -5532,845 +9356,405 @@ fn run_BN254_MP_CHECK_FINALIZE_BN_2_circuit( ) .unwrap(); - let mut circuit_inputs = (t472,).new_inputs(); + let mut circuit_inputs = ( + t62, t63, t72, t73, t127, t128, t137, t138, t192, t193, t202, t203, t231, t33, t31, + ) + .new_inputs(); // Prefill constants: - circuit_inputs = circuit_inputs - .next([0xc2c3330c99e39557176f553d, 0x4c0bec3cf559b143b78cc310, 0x2fb347984f7911f7, 0x0]); - circuit_inputs = circuit_inputs - .next([0xb7c9dce1665d51c640fcba2, 0x4ba4cc8bd75a079432ae2a1d, 0x16c9e55061ebae20, 0x0]); - circuit_inputs = circuit_inputs - .next([0xa9c95998dc54014671a0135a, 0xdc5ec698b6e2f9b9dbaae0ed, 0x63cf305489af5dc, 0x0]); - circuit_inputs = circuit_inputs - .next([0x8fa25bd282d37f632623b0e3, 0x704b5a7ec796f2b21807dc9, 0x7c03cbcac41049a, 0x0]); - circuit_inputs = circuit_inputs - .next([0xbb966e3de4bd44e5607cfd48, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x52, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd35, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next(original_Q0.x0); - circuit_inputs = circuit_inputs.next(original_Q0.x1); - circuit_inputs = circuit_inputs.next(original_Q0.y0); - circuit_inputs = circuit_inputs.next(original_Q0.y1); + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs.next(yInv_0); circuit_inputs = circuit_inputs.next(xNegOverY_0); circuit_inputs = circuit_inputs.next(Q0.x0); circuit_inputs = circuit_inputs.next(Q0.x1); circuit_inputs = circuit_inputs.next(Q0.y0); circuit_inputs = circuit_inputs.next(Q0.y1); - circuit_inputs = circuit_inputs.next(original_Q1.x0); - circuit_inputs = circuit_inputs.next(original_Q1.x1); - circuit_inputs = circuit_inputs.next(original_Q1.y0); - circuit_inputs = circuit_inputs.next(original_Q1.y1); circuit_inputs = circuit_inputs.next(yInv_1); circuit_inputs = circuit_inputs.next(xNegOverY_1); circuit_inputs = circuit_inputs.next(Q1.x0); circuit_inputs = circuit_inputs.next(Q1.x1); circuit_inputs = circuit_inputs.next(Q1.y0); circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w0); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w1); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w2); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w3); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w4); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w5); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w6); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w7); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w8); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w9); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w10); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w11); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w0); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w1); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w2); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w3); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w4); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w5); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w6); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w7); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w8); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w9); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w10); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w11); - circuit_inputs = circuit_inputs.next(c_n_minus_3); - circuit_inputs = circuit_inputs.next(w_of_z); + circuit_inputs = circuit_inputs.next(yInv_2); + circuit_inputs = circuit_inputs.next(xNegOverY_2); + circuit_inputs = circuit_inputs.next(Q2.x0); + circuit_inputs = circuit_inputs.next(Q2.x1); + circuit_inputs = circuit_inputs.next(Q2.y0); + circuit_inputs = circuit_inputs.next(Q2.y1); + circuit_inputs = circuit_inputs.next(R_i.w0); + circuit_inputs = circuit_inputs.next(R_i.w1); + circuit_inputs = circuit_inputs.next(R_i.w2); + circuit_inputs = circuit_inputs.next(R_i.w3); + circuit_inputs = circuit_inputs.next(R_i.w4); + circuit_inputs = circuit_inputs.next(R_i.w5); + circuit_inputs = circuit_inputs.next(R_i.w6); + circuit_inputs = circuit_inputs.next(R_i.w7); + circuit_inputs = circuit_inputs.next(R_i.w8); + circuit_inputs = circuit_inputs.next(R_i.w9); + circuit_inputs = circuit_inputs.next(R_i.w10); + circuit_inputs = circuit_inputs.next(R_i.w11); + circuit_inputs = circuit_inputs.next(c0); circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(c_inv_frob_1_of_z); - circuit_inputs = circuit_inputs.next(c_frob_2_of_z); - circuit_inputs = circuit_inputs.next(c_inv_frob_3_of_z); + circuit_inputs = circuit_inputs.next(c_inv_of_z); circuit_inputs = circuit_inputs.next(previous_lhs); - circuit_inputs = circuit_inputs.next(R_n_minus_3_of_z); - - let mut Q = Q; - while let Option::Some(val) = Q.pop_front() { - circuit_inputs = circuit_inputs.next(val); - }; let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let final_check: u384 = outputs.get_output(t472); - return (final_check,); + let Q0: G2Point = G2Point { + x0: outputs.get_output(t62), + x1: outputs.get_output(t63), + y0: outputs.get_output(t72), + y1: outputs.get_output(t73) + }; + let Q1: G2Point = G2Point { + x0: outputs.get_output(t127), + x1: outputs.get_output(t128), + y0: outputs.get_output(t137), + y1: outputs.get_output(t138) + }; + let Q2: G2Point = G2Point { + x0: outputs.get_output(t192), + x1: outputs.get_output(t193), + y0: outputs.get_output(t202), + y1: outputs.get_output(t203) + }; + let new_lhs: u384 = outputs.get_output(t231); + let c_i: u384 = outputs.get_output(t33); + let f_i_plus_one_of_z: u384 = outputs.get_output(t31); + return (Q0, Q1, Q2, new_lhs, c_i, f_i_plus_one_of_z); } -fn run_BN254_MP_CHECK_FINALIZE_BN_3_circuit( - original_Q0: G2Point, - yInv_0: u384, - xNegOverY_0: u384, - Q0: G2Point, - original_Q1: G2Point, - yInv_1: u384, - xNegOverY_1: u384, - Q1: G2Point, - original_Q2: G2Point, - yInv_2: u384, - xNegOverY_2: u384, - Q2: G2Point, - R_n_minus_2: E12D, - R_n_minus_1: E12D, - c_n_minus_3: u384, - w_of_z: u384, +fn run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( + lambda_root: E12D, z: u384, - c_inv_frob_1_of_z: u384, - c_frob_2_of_z: u384, - c_inv_frob_3_of_z: u384, - previous_lhs: u384, - R_n_minus_3_of_z: u384, - Q: Array -) -> (u384,) { + scaling_factor: MillerLoopResultScalingFactor, + c_inv: E12D, + c_0: u384 +) -> (u384, u384, u384, u384, u384, u384, u384) { // CONSTANT stack - let in0 = CE::> {}; // 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d - let in1 = CE::> {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 - let in2 = CE::> {}; // 0x63cf305489af5dcdc5ec698b6e2f9b9dbaae0eda9c95998dc54014671a0135a - let in3 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 - let in4 = CE::> {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 - let in5 = CE::> {}; // 0x1 - let in6 = CE::> {}; // 0x0 - let in7 = CE::> {}; // -0x9 % p - let in8 = CE::> {}; // 0x52 - let in9 = CE::> {}; // -0x12 % p + let in0 = CE::> {}; // 0x1 + let in1 = CE::> {}; // 0x12 + let in2 = CE::> {}; // 0x1d8c8daef3eee1e81b2522ec5eb28ded6895e1cdfde6a43f5daa971f3fa65955 + let in3 = CE::> {}; // 0x217e400dc9351e774e34e2ac06ead4000d14d1e242b29c567e9c385ce480a71a + let in4 = CE::> {}; // 0x242b719062f6737b8481d22c6934ce844d72f250fd28d102c0d147b2f4d521a7 + let in5 = CE::> {}; // 0x359809094bd5c8e1b9c22d81246ffc2e794e17643ac198484b8d9094aa82536 + let in6 = CE::> {}; // 0x21436d48fcb50cc60dd4ef1e69a0c1f0dd2949fa6df7b44cbb259ef7cb58d5ed + let in7 = CE::> {}; // 0x18857a58f3b5bb3038a4311a86919d9c7c6c15f88a4f4f0831364cf35f78f771 + let in8 = CE::> {}; // 0x2c84bbad27c3671562b7adefd44038ab3c0bbad96fc008e7d6998c82f7fc048b + let in9 = CE::> {}; // 0xc33b1c70e4fd11b6d1eab6fcd18b99ad4afd096a8697e0c9c36d8ca3339a7b5 + let in10 = CE::< + CI<10> + > {}; // 0x1b007294a55accce13fe08bea73305ff6bdac77c5371c546d428780a6e3dcfa8 + let in11 = CE::< + CI<11> + > {}; // 0x215d42e7ac7bd17cefe88dd8e6965b3adae92c974f501fe811493d72543a3977 + let in12 = CE::> {}; // -0x1 % p + let in13 = CE::< + CI<13> + > {}; // 0x246996f3b4fae7e6a6327cfe12150b8e747992778eeec7e5ca5cf05f80f362ac + let in14 = CE::< + CI<14> + > {}; // 0x12d7c0c3ed42be419d2b22ca22ceca702eeb88c36a8b264dde75f4f798d6a3f2 + let in15 = CE::< + CI<15> + > {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 + let in16 = CE::> {}; // 0xc38dce27e3b2cae33ce738a184c89d94a0e78406b48f98a7b4f4463e3a7dba0 + let in17 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 + let in18 = CE::> {}; // 0xf20e129e47c9363aa7b569817e0966cba582096fa7a164080faed1f0d24275a + let in19 = CE::< + CI<19> + > {}; // 0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126 + let in20 = CE::> {}; // 0x3df92c5b96e3914559897c6ad411fb25b75afb7f8b1c1a56586ff93e080f8bc + let in21 = CE::< + CI<21> + > {}; // 0x12acf2ca76fd0675a27fb246c7729f7db080cb99678e2ac024c6b8ee6e0c2c4b + let in22 = CE::< + CI<22> + > {}; // 0x1563dbde3bd6d35ba4523cf7da4e525e2ba6a3151500054667f8140c6a3f2d9f + let in23 = CE::< + CI<23> + > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49 + let in24 = CE::< + CI<24> + > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 + let in25 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe + let in26 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff + let in27 = CE::< + CI<27> + > {}; // 0x13d0c369615f7bb0b2bdfa8fef85fa07122bde8d67dfc8fabd3581ad840ddd76 + let in28 = CE::< + CI<28> + > {}; // 0x18a0f4219f4fdff6fc2bf531eb331a053a35744cac285af5685d3f90eacf7a66 + let in29 = CE::> {}; // 0xc3a5e9c462a654779c3e050c9ca2a428908a81264e2b5a5bf22f67654883ae6 + let in30 = CE::< + CI<30> + > {}; // 0x2ce02aa5f9bf8cd65bdd2055c255cf9d9e08c1d9345582cc92fd973c74bd77f4 + let in31 = CE::< + CI<31> + > {}; // 0x17ded419ed7be4f97fac149bfaefbac11b155498de227b850aea3f23790405d6 + let in32 = CE::< + CI<32> + > {}; // 0x1bfe7b214c0294242fb81a8dccd8a9b4441d64f34150a79753fb0cd31cc99cc0 + let in33 = CE::> {}; // 0x697b9c523e0390ed15da0ec97a9b8346513297b9efaf0f0f1a228f0d5662fbd + let in34 = CE::> {}; // 0x7a0e052f2b1c443b5186d6ac4c723b85d3f78a3182d2db0c413901c32b0c6fe + let in35 = CE::< + CI<35> + > {}; // 0x1b76a37fba85f3cd5dc79824a3792597356c892c39c0d06b220500933945267f + let in36 = CE::> {}; // 0xabf8b60be77d7306cbeee33576139d7f03a5e397d439ec7694aa2bf4c0c101 + let in37 = CE::< + CI<37> + > {}; // 0x1c938b097fd2247905924b2691fb5e5685558c04009201927eeb0a69546f1fd1 + let in38 = CE::> {}; // 0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de + let in39 = CE::< + CI<39> + > {}; // 0x2429efd69b073ae23e8c6565b7b72e1b0e78c27f038f14e77cfd95a083f4c261 + let in40 = CE::< + CI<40> + > {}; // 0x28a411b634f09b8fb14b900e9507e9327600ecc7d8cf6ebab94d0cb3b2594c64 + let in41 = CE::< + CI<41> + > {}; // 0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f + let in42 = CE::< + CI<42> + > {}; // 0x1465d351952f0c0588982b28b4a8aea95364059e272122f5e8257f43bbb36087 + let in43 = CE::< + CI<43> + > {}; // 0x16db366a59b1dd0b9fb1b2282a48633d3e2ddaea200280211f25041384282499 + let in44 = CE::< + CI<44> + > {}; // 0x28c36e1fee7fdbe60337d84bbcba34a53a41f1ee50449cdc780cfbfaa5cc3649 // INPUT stack - let (in10, in11) = (CE::> {}, CE::> {}); - let (in12, in13) = (CE::> {}, CE::> {}); - let (in14, in15) = (CE::> {}, CE::> {}); - let (in16, in17) = (CE::> {}, CE::> {}); - let (in18, in19) = (CE::> {}, CE::> {}); - let (in20, in21) = (CE::> {}, CE::> {}); - let (in22, in23) = (CE::> {}, CE::> {}); - let (in24, in25) = (CE::> {}, CE::> {}); - let (in26, in27) = (CE::> {}, CE::> {}); - let (in28, in29) = (CE::> {}, CE::> {}); - let (in30, in31) = (CE::> {}, CE::> {}); - let (in32, in33) = (CE::> {}, CE::> {}); - let (in34, in35) = (CE::> {}, CE::> {}); - let (in36, in37) = (CE::> {}, CE::> {}); - let (in38, in39) = (CE::> {}, CE::> {}); - let (in40, in41) = (CE::> {}, CE::> {}); - let (in42, in43) = (CE::> {}, CE::> {}); - let (in44, in45) = (CE::> {}, CE::> {}); - let (in46, in47) = (CE::> {}, CE::> {}); - let (in48, in49) = (CE::> {}, CE::> {}); - let (in50, in51) = (CE::> {}, CE::> {}); - let (in52, in53) = (CE::> {}, CE::> {}); - let (in54, in55) = (CE::> {}, CE::> {}); - let (in56, in57) = (CE::> {}, CE::> {}); - let (in58, in59) = (CE::> {}, CE::> {}); - let (in60, in61) = (CE::> {}, CE::> {}); - let (in62, in63) = (CE::> {}, CE::> {}); - let (in64, in65) = (CE::> {}, CE::> {}); - let (in66, in67) = (CE::> {}, CE::> {}); - let (in68, in69) = (CE::> {}, CE::> {}); - let (in70, in71) = (CE::> {}, CE::> {}); - let (in72, in73) = (CE::> {}, CE::> {}); - let (in74, in75) = (CE::> {}, CE::> {}); - let (in76, in77) = (CE::> {}, CE::> {}); - let (in78, in79) = (CE::> {}, CE::> {}); - let (in80, in81) = (CE::> {}, CE::> {}); - let (in82, in83) = (CE::> {}, CE::> {}); - let (in84, in85) = (CE::> {}, CE::> {}); - let (in86, in87) = (CE::> {}, CE::> {}); - let (in88, in89) = (CE::> {}, CE::> {}); - let (in90, in91) = (CE::> {}, CE::> {}); - let (in92, in93) = (CE::> {}, CE::> {}); - let (in94, in95) = (CE::> {}, CE::> {}); - let (in96, in97) = (CE::> {}, CE::> {}); - let (in98, in99) = (CE::> {}, CE::> {}); - let (in100, in101) = (CE::> {}, CE::> {}); - let (in102, in103) = (CE::> {}, CE::> {}); - let (in104, in105) = (CE::> {}, CE::> {}); - let (in106, in107) = (CE::> {}, CE::> {}); - let (in108, in109) = (CE::> {}, CE::> {}); - let (in110, in111) = (CE::> {}, CE::> {}); - let (in112, in113) = (CE::> {}, CE::> {}); - let (in114, in115) = (CE::> {}, CE::> {}); - let (in116, in117) = (CE::> {}, CE::> {}); - let (in118, in119) = (CE::> {}, CE::> {}); - let (in120, in121) = (CE::> {}, CE::> {}); - let (in122, in123) = (CE::> {}, CE::> {}); - let (in124, in125) = (CE::> {}, CE::> {}); - let (in126, in127) = (CE::> {}, CE::> {}); - let (in128, in129) = (CE::> {}, CE::> {}); - let (in130, in131) = (CE::> {}, CE::> {}); - let (in132, in133) = (CE::> {}, CE::> {}); - let (in134, in135) = (CE::> {}, CE::> {}); - let (in136, in137) = (CE::> {}, CE::> {}); - let (in138, in139) = (CE::> {}, CE::> {}); - let (in140, in141) = (CE::> {}, CE::> {}); - let (in142, in143) = (CE::> {}, CE::> {}); - let (in144, in145) = (CE::> {}, CE::> {}); - let (in146, in147) = (CE::> {}, CE::> {}); - let t0 = circuit_mul(in66, in66); // Compute z^2 - let t1 = circuit_mul(t0, in66); // Compute z^3 - let t2 = circuit_mul(t1, in66); // Compute z^4 - let t3 = circuit_mul(t2, in66); // Compute z^5 - let t4 = circuit_mul(t3, in66); // Compute z^6 - let t5 = circuit_mul(t4, in66); // Compute z^7 - let t6 = circuit_mul(t5, in66); // Compute z^8 - let t7 = circuit_mul(t6, in66); // Compute z^9 - let t8 = circuit_mul(t7, in66); // Compute z^10 - let t9 = circuit_mul(t8, in66); // Compute z^11 - let t10 = circuit_mul(t9, in66); // Compute z^12 - let t11 = circuit_mul(t10, in66); // Compute z^13 - let t12 = circuit_mul(t11, in66); // Compute z^14 - let t13 = circuit_mul(t12, in66); // Compute z^15 - let t14 = circuit_mul(t13, in66); // Compute z^16 - let t15 = circuit_mul(t14, in66); // Compute z^17 - let t16 = circuit_mul(t15, in66); // Compute z^18 - let t17 = circuit_mul(t16, in66); // Compute z^19 - let t18 = circuit_mul(t17, in66); // Compute z^20 - let t19 = circuit_mul(t18, in66); // Compute z^21 - let t20 = circuit_mul(t19, in66); // Compute z^22 - let t21 = circuit_mul(t20, in66); // Compute z^23 - let t22 = circuit_mul(t21, in66); // Compute z^24 - let t23 = circuit_mul(t22, in66); // Compute z^25 - let t24 = circuit_mul(t23, in66); // Compute z^26 - let t25 = circuit_mul(t24, in66); // Compute z^27 - let t26 = circuit_mul(t25, in66); // Compute z^28 - let t27 = circuit_mul(t26, in66); // Compute z^29 - let t28 = circuit_mul(t27, in66); // Compute z^30 - let t29 = circuit_mul(t28, in66); // Compute z^31 - let t30 = circuit_mul(t29, in66); // Compute z^32 - let t31 = circuit_mul(t30, in66); // Compute z^33 - let t32 = circuit_mul(t31, in66); // Compute z^34 - let t33 = circuit_mul(t32, in66); // Compute z^35 - let t34 = circuit_mul(t33, in66); // Compute z^36 - let t35 = circuit_mul(t34, in66); // Compute z^37 - let t36 = circuit_mul(t35, in66); // Compute z^38 - let t37 = circuit_mul(t36, in66); // Compute z^39 - let t38 = circuit_mul(t37, in66); // Compute z^40 - let t39 = circuit_mul(t38, in66); // Compute z^41 - let t40 = circuit_mul(t39, in66); // Compute z^42 - let t41 = circuit_mul(t40, in66); // Compute z^43 - let t42 = circuit_mul(t41, in66); // Compute z^44 - let t43 = circuit_mul(t42, in66); // Compute z^45 - let t44 = circuit_mul(t43, in66); // Compute z^46 - let t45 = circuit_mul(t44, in66); // Compute z^47 - let t46 = circuit_mul(t45, in66); // Compute z^48 - let t47 = circuit_mul(t46, in66); // Compute z^49 - let t48 = circuit_mul(t47, in66); // Compute z^50 - let t49 = circuit_mul(t48, in66); // Compute z^51 - let t50 = circuit_mul(t49, in66); // Compute z^52 - let t51 = circuit_mul(t50, in66); // Compute z^53 - let t52 = circuit_mul(t51, in66); // Compute z^54 - let t53 = circuit_mul(t52, in66); // Compute z^55 - let t54 = circuit_mul(t53, in66); // Compute z^56 - let t55 = circuit_mul(t54, in66); // Compute z^57 - let t56 = circuit_mul(t55, in66); // Compute z^58 - let t57 = circuit_mul(t56, in66); // Compute z^59 - let t58 = circuit_mul(t57, in66); // Compute z^60 - let t59 = circuit_mul(t58, in66); // Compute z^61 - let t60 = circuit_mul(t59, in66); // Compute z^62 - let t61 = circuit_mul(t60, in66); // Compute z^63 - let t62 = circuit_mul(t61, in66); // Compute z^64 - let t63 = circuit_mul(t62, in66); // Compute z^65 - let t64 = circuit_mul(t63, in66); // Compute z^66 - let t65 = circuit_mul(t64, in66); // Compute z^67 - let t66 = circuit_mul(t65, in66); // Compute z^68 - let t67 = circuit_mul(t66, in66); // Compute z^69 - let t68 = circuit_mul(t67, in66); // Compute z^70 - let t69 = circuit_mul(t68, in66); // Compute z^71 - let t70 = circuit_mul(t69, in66); // Compute z^72 - let t71 = circuit_mul(t70, in66); // Compute z^73 - let t72 = circuit_mul(t71, in66); // Compute z^74 - let t73 = circuit_mul(t72, in66); // Compute z^75 - let t74 = circuit_mul(in64, in64); - let t75 = circuit_mul(t74, in64); - let t76 = circuit_mul(in41, in66); // Eval UnnamedPoly step coeff_1 * z^1 - let t77 = circuit_add(in40, t76); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t78 = circuit_mul(in42, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t79 = circuit_add(t77, t78); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t80 = circuit_mul(in43, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t81 = circuit_add(t79, t80); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t82 = circuit_mul(in44, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t83 = circuit_add(t81, t82); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t84 = circuit_mul(in45, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t85 = circuit_add(t83, t84); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t86 = circuit_mul(in46, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t87 = circuit_add(t85, t86); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t88 = circuit_mul(in47, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t89 = circuit_add(t87, t88); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t90 = circuit_mul(in48, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t91 = circuit_add(t89, t90); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t92 = circuit_mul(in49, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t93 = circuit_add(t91, t92); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t94 = circuit_mul(in50, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t95 = circuit_add(t93, t94); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t96 = circuit_mul(in51, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t97 = circuit_add(t95, t96); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t98 = circuit_mul(in53, in66); // Eval UnnamedPoly step coeff_1 * z^1 - let t99 = circuit_add(in52, t98); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t100 = circuit_mul(in54, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t101 = circuit_add(t99, t100); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t102 = circuit_mul(in55, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t103 = circuit_add(t101, t102); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t104 = circuit_mul(in56, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t105 = circuit_add(t103, t104); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t106 = circuit_mul(in57, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t107 = circuit_add(t105, t106); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t108 = circuit_mul(in58, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t109 = circuit_add(t107, t108); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t110 = circuit_mul(in59, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t111 = circuit_add(t109, t110); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t112 = circuit_mul(in60, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t113 = circuit_add(t111, t112); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t114 = circuit_mul(in61, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t115 = circuit_add(t113, t114); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t116 = circuit_mul(in62, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t117 = circuit_add(t115, t116); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t118 = circuit_mul(in63, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t119 = circuit_add(t117, t118); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t120 = circuit_sub(in6, in11); - let t121 = circuit_sub(in6, in13); - let t122 = circuit_mul(in10, in0); // Fp2 mul start - let t123 = circuit_mul(t120, in1); - let t124 = circuit_sub(t122, t123); // Fp2 mul real part end - let t125 = circuit_mul(in10, in1); - let t126 = circuit_mul(t120, in0); - let t127 = circuit_add(t125, t126); // Fp2 mul imag part end - let t128 = circuit_mul(in12, in2); // Fp2 mul start - let t129 = circuit_mul(t121, in3); - let t130 = circuit_sub(t128, t129); // Fp2 mul real part end - let t131 = circuit_mul(in12, in3); - let t132 = circuit_mul(t121, in2); - let t133 = circuit_add(t131, t132); // Fp2 mul imag part end - let t134 = circuit_mul(in10, in4); // Fp2 scalar mul coeff 0/1 - let t135 = circuit_mul(in11, in4); // Fp2 scalar mul coeff 1/1 - let t136 = circuit_mul(in12, in5); // Fp2 scalar mul coeff 0/1 - let t137 = circuit_mul(in13, in5); // Fp2 scalar mul coeff 1/1 - let t138 = circuit_sub(in18, t130); // Fp2 sub coeff 0/1 - let t139 = circuit_sub(in19, t133); // Fp2 sub coeff 1/1 - let t140 = circuit_sub(in16, t124); // Fp2 sub coeff 0/1 - let t141 = circuit_sub(in17, t127); // Fp2 sub coeff 1/1 - let t142 = circuit_mul(t140, t140); // Fp2 Div x/y start : Fp2 Inv y start - let t143 = circuit_mul(t141, t141); - let t144 = circuit_add(t142, t143); - let t145 = circuit_inverse(t144); - let t146 = circuit_mul(t140, t145); // Fp2 Inv y real part end - let t147 = circuit_mul(t141, t145); - let t148 = circuit_sub(in6, t147); // Fp2 Inv y imag part end - let t149 = circuit_mul(t138, t146); // Fp2 mul start - let t150 = circuit_mul(t139, t148); - let t151 = circuit_sub(t149, t150); // Fp2 mul real part end - let t152 = circuit_mul(t138, t148); - let t153 = circuit_mul(t139, t146); - let t154 = circuit_add(t152, t153); // Fp2 mul imag part end - let t155 = circuit_add(t151, t154); - let t156 = circuit_sub(t151, t154); - let t157 = circuit_mul(t155, t156); - let t158 = circuit_mul(t151, t154); - let t159 = circuit_add(t158, t158); - let t160 = circuit_add(in16, t124); // Fp2 add coeff 0/1 - let t161 = circuit_add(in17, t127); // Fp2 add coeff 1/1 - let t162 = circuit_sub(t157, t160); // Fp2 sub coeff 0/1 - let t163 = circuit_sub(t159, t161); // Fp2 sub coeff 1/1 - let t164 = circuit_sub(in16, t162); // Fp2 sub coeff 0/1 - let t165 = circuit_sub(in17, t163); // Fp2 sub coeff 1/1 - let t166 = circuit_mul(t151, t164); // Fp2 mul start - let t167 = circuit_mul(t154, t165); - let t168 = circuit_sub(t166, t167); // Fp2 mul real part end - let t169 = circuit_mul(t151, t165); - let t170 = circuit_mul(t154, t164); - let t171 = circuit_add(t169, t170); // Fp2 mul imag part end - let t172 = circuit_sub(t168, in18); // Fp2 sub coeff 0/1 - let t173 = circuit_sub(t171, in19); // Fp2 sub coeff 1/1 - let t174 = circuit_mul(t151, in16); // Fp2 mul start - let t175 = circuit_mul(t154, in17); - let t176 = circuit_sub(t174, t175); // Fp2 mul real part end - let t177 = circuit_mul(t151, in17); - let t178 = circuit_mul(t154, in16); - let t179 = circuit_add(t177, t178); // Fp2 mul imag part end - let t180 = circuit_sub(t176, in18); // Fp2 sub coeff 0/1 - let t181 = circuit_sub(t179, in19); // Fp2 sub coeff 1/1 - let t182 = circuit_mul(in7, t154); - let t183 = circuit_add(t151, t182); - let t184 = circuit_mul(t183, in15); - let t185 = circuit_mul(in7, t181); - let t186 = circuit_add(t180, t185); - let t187 = circuit_mul(t186, in14); - let t188 = circuit_mul(t154, in15); - let t189 = circuit_mul(t181, in14); - let t190 = circuit_sub(t172, t136); // Fp2 sub coeff 0/1 - let t191 = circuit_sub(t173, t137); // Fp2 sub coeff 1/1 - let t192 = circuit_sub(t162, t134); // Fp2 sub coeff 0/1 - let t193 = circuit_sub(t163, t135); // Fp2 sub coeff 1/1 - let t194 = circuit_mul(t192, t192); // Fp2 Div x/y start : Fp2 Inv y start - let t195 = circuit_mul(t193, t193); - let t196 = circuit_add(t194, t195); - let t197 = circuit_inverse(t196); - let t198 = circuit_mul(t192, t197); // Fp2 Inv y real part end - let t199 = circuit_mul(t193, t197); - let t200 = circuit_sub(in6, t199); // Fp2 Inv y imag part end - let t201 = circuit_mul(t190, t198); // Fp2 mul start - let t202 = circuit_mul(t191, t200); - let t203 = circuit_sub(t201, t202); // Fp2 mul real part end - let t204 = circuit_mul(t190, t200); - let t205 = circuit_mul(t191, t198); - let t206 = circuit_add(t204, t205); // Fp2 mul imag part end - let t207 = circuit_mul(t203, t162); // Fp2 mul start - let t208 = circuit_mul(t206, t163); - let t209 = circuit_sub(t207, t208); // Fp2 mul real part end - let t210 = circuit_mul(t203, t163); - let t211 = circuit_mul(t206, t162); - let t212 = circuit_add(t210, t211); // Fp2 mul imag part end - let t213 = circuit_sub(t209, t172); // Fp2 sub coeff 0/1 - let t214 = circuit_sub(t212, t173); // Fp2 sub coeff 1/1 - let t215 = circuit_mul(in7, t206); - let t216 = circuit_add(t203, t215); - let t217 = circuit_mul(t216, in15); - let t218 = circuit_mul(in7, t214); - let t219 = circuit_add(t213, t218); - let t220 = circuit_mul(t219, in14); - let t221 = circuit_mul(t206, in15); - let t222 = circuit_mul(t214, in14); - let t223 = circuit_sub(in6, in21); - let t224 = circuit_sub(in6, in23); - let t225 = circuit_mul(in20, in0); // Fp2 mul start - let t226 = circuit_mul(t223, in1); - let t227 = circuit_sub(t225, t226); // Fp2 mul real part end - let t228 = circuit_mul(in20, in1); - let t229 = circuit_mul(t223, in0); - let t230 = circuit_add(t228, t229); // Fp2 mul imag part end - let t231 = circuit_mul(in22, in2); // Fp2 mul start - let t232 = circuit_mul(t224, in3); - let t233 = circuit_sub(t231, t232); // Fp2 mul real part end - let t234 = circuit_mul(in22, in3); - let t235 = circuit_mul(t224, in2); - let t236 = circuit_add(t234, t235); // Fp2 mul imag part end - let t237 = circuit_mul(in20, in4); // Fp2 scalar mul coeff 0/1 - let t238 = circuit_mul(in21, in4); // Fp2 scalar mul coeff 1/1 - let t239 = circuit_mul(in22, in5); // Fp2 scalar mul coeff 0/1 - let t240 = circuit_mul(in23, in5); // Fp2 scalar mul coeff 1/1 - let t241 = circuit_sub(in28, t233); // Fp2 sub coeff 0/1 - let t242 = circuit_sub(in29, t236); // Fp2 sub coeff 1/1 - let t243 = circuit_sub(in26, t227); // Fp2 sub coeff 0/1 - let t244 = circuit_sub(in27, t230); // Fp2 sub coeff 1/1 - let t245 = circuit_mul(t243, t243); // Fp2 Div x/y start : Fp2 Inv y start - let t246 = circuit_mul(t244, t244); - let t247 = circuit_add(t245, t246); - let t248 = circuit_inverse(t247); - let t249 = circuit_mul(t243, t248); // Fp2 Inv y real part end - let t250 = circuit_mul(t244, t248); - let t251 = circuit_sub(in6, t250); // Fp2 Inv y imag part end - let t252 = circuit_mul(t241, t249); // Fp2 mul start - let t253 = circuit_mul(t242, t251); - let t254 = circuit_sub(t252, t253); // Fp2 mul real part end - let t255 = circuit_mul(t241, t251); - let t256 = circuit_mul(t242, t249); - let t257 = circuit_add(t255, t256); // Fp2 mul imag part end - let t258 = circuit_add(t254, t257); - let t259 = circuit_sub(t254, t257); - let t260 = circuit_mul(t258, t259); - let t261 = circuit_mul(t254, t257); - let t262 = circuit_add(t261, t261); - let t263 = circuit_add(in26, t227); // Fp2 add coeff 0/1 - let t264 = circuit_add(in27, t230); // Fp2 add coeff 1/1 - let t265 = circuit_sub(t260, t263); // Fp2 sub coeff 0/1 - let t266 = circuit_sub(t262, t264); // Fp2 sub coeff 1/1 - let t267 = circuit_sub(in26, t265); // Fp2 sub coeff 0/1 - let t268 = circuit_sub(in27, t266); // Fp2 sub coeff 1/1 - let t269 = circuit_mul(t254, t267); // Fp2 mul start - let t270 = circuit_mul(t257, t268); - let t271 = circuit_sub(t269, t270); // Fp2 mul real part end - let t272 = circuit_mul(t254, t268); - let t273 = circuit_mul(t257, t267); - let t274 = circuit_add(t272, t273); // Fp2 mul imag part end - let t275 = circuit_sub(t271, in28); // Fp2 sub coeff 0/1 - let t276 = circuit_sub(t274, in29); // Fp2 sub coeff 1/1 - let t277 = circuit_mul(t254, in26); // Fp2 mul start - let t278 = circuit_mul(t257, in27); - let t279 = circuit_sub(t277, t278); // Fp2 mul real part end - let t280 = circuit_mul(t254, in27); - let t281 = circuit_mul(t257, in26); - let t282 = circuit_add(t280, t281); // Fp2 mul imag part end - let t283 = circuit_sub(t279, in28); // Fp2 sub coeff 0/1 - let t284 = circuit_sub(t282, in29); // Fp2 sub coeff 1/1 - let t285 = circuit_mul(in7, t257); - let t286 = circuit_add(t254, t285); - let t287 = circuit_mul(t286, in25); - let t288 = circuit_mul(in7, t284); - let t289 = circuit_add(t283, t288); - let t290 = circuit_mul(t289, in24); - let t291 = circuit_mul(t257, in25); - let t292 = circuit_mul(t284, in24); - let t293 = circuit_sub(t275, t239); // Fp2 sub coeff 0/1 - let t294 = circuit_sub(t276, t240); // Fp2 sub coeff 1/1 - let t295 = circuit_sub(t265, t237); // Fp2 sub coeff 0/1 - let t296 = circuit_sub(t266, t238); // Fp2 sub coeff 1/1 - let t297 = circuit_mul(t295, t295); // Fp2 Div x/y start : Fp2 Inv y start - let t298 = circuit_mul(t296, t296); - let t299 = circuit_add(t297, t298); - let t300 = circuit_inverse(t299); - let t301 = circuit_mul(t295, t300); // Fp2 Inv y real part end - let t302 = circuit_mul(t296, t300); - let t303 = circuit_sub(in6, t302); // Fp2 Inv y imag part end - let t304 = circuit_mul(t293, t301); // Fp2 mul start - let t305 = circuit_mul(t294, t303); - let t306 = circuit_sub(t304, t305); // Fp2 mul real part end - let t307 = circuit_mul(t293, t303); - let t308 = circuit_mul(t294, t301); - let t309 = circuit_add(t307, t308); // Fp2 mul imag part end - let t310 = circuit_mul(t306, t265); // Fp2 mul start - let t311 = circuit_mul(t309, t266); - let t312 = circuit_sub(t310, t311); // Fp2 mul real part end - let t313 = circuit_mul(t306, t266); - let t314 = circuit_mul(t309, t265); - let t315 = circuit_add(t313, t314); // Fp2 mul imag part end - let t316 = circuit_sub(t312, t275); // Fp2 sub coeff 0/1 - let t317 = circuit_sub(t315, t276); // Fp2 sub coeff 1/1 - let t318 = circuit_mul(in7, t309); - let t319 = circuit_add(t306, t318); - let t320 = circuit_mul(t319, in25); - let t321 = circuit_mul(in7, t317); - let t322 = circuit_add(t316, t321); - let t323 = circuit_mul(t322, in24); - let t324 = circuit_mul(t309, in25); - let t325 = circuit_mul(t317, in24); - let t326 = circuit_sub(in6, in31); - let t327 = circuit_sub(in6, in33); - let t328 = circuit_mul(in30, in0); // Fp2 mul start - let t329 = circuit_mul(t326, in1); - let t330 = circuit_sub(t328, t329); // Fp2 mul real part end - let t331 = circuit_mul(in30, in1); - let t332 = circuit_mul(t326, in0); - let t333 = circuit_add(t331, t332); // Fp2 mul imag part end - let t334 = circuit_mul(in32, in2); // Fp2 mul start - let t335 = circuit_mul(t327, in3); - let t336 = circuit_sub(t334, t335); // Fp2 mul real part end - let t337 = circuit_mul(in32, in3); - let t338 = circuit_mul(t327, in2); - let t339 = circuit_add(t337, t338); // Fp2 mul imag part end - let t340 = circuit_mul(in30, in4); // Fp2 scalar mul coeff 0/1 - let t341 = circuit_mul(in31, in4); // Fp2 scalar mul coeff 1/1 - let t342 = circuit_mul(in32, in5); // Fp2 scalar mul coeff 0/1 - let t343 = circuit_mul(in33, in5); // Fp2 scalar mul coeff 1/1 - let t344 = circuit_sub(in38, t336); // Fp2 sub coeff 0/1 - let t345 = circuit_sub(in39, t339); // Fp2 sub coeff 1/1 - let t346 = circuit_sub(in36, t330); // Fp2 sub coeff 0/1 - let t347 = circuit_sub(in37, t333); // Fp2 sub coeff 1/1 - let t348 = circuit_mul(t346, t346); // Fp2 Div x/y start : Fp2 Inv y start - let t349 = circuit_mul(t347, t347); - let t350 = circuit_add(t348, t349); - let t351 = circuit_inverse(t350); - let t352 = circuit_mul(t346, t351); // Fp2 Inv y real part end - let t353 = circuit_mul(t347, t351); - let t354 = circuit_sub(in6, t353); // Fp2 Inv y imag part end - let t355 = circuit_mul(t344, t352); // Fp2 mul start - let t356 = circuit_mul(t345, t354); - let t357 = circuit_sub(t355, t356); // Fp2 mul real part end - let t358 = circuit_mul(t344, t354); - let t359 = circuit_mul(t345, t352); - let t360 = circuit_add(t358, t359); // Fp2 mul imag part end - let t361 = circuit_add(t357, t360); - let t362 = circuit_sub(t357, t360); - let t363 = circuit_mul(t361, t362); - let t364 = circuit_mul(t357, t360); - let t365 = circuit_add(t364, t364); - let t366 = circuit_add(in36, t330); // Fp2 add coeff 0/1 - let t367 = circuit_add(in37, t333); // Fp2 add coeff 1/1 - let t368 = circuit_sub(t363, t366); // Fp2 sub coeff 0/1 - let t369 = circuit_sub(t365, t367); // Fp2 sub coeff 1/1 - let t370 = circuit_sub(in36, t368); // Fp2 sub coeff 0/1 - let t371 = circuit_sub(in37, t369); // Fp2 sub coeff 1/1 - let t372 = circuit_mul(t357, t370); // Fp2 mul start - let t373 = circuit_mul(t360, t371); - let t374 = circuit_sub(t372, t373); // Fp2 mul real part end - let t375 = circuit_mul(t357, t371); - let t376 = circuit_mul(t360, t370); - let t377 = circuit_add(t375, t376); // Fp2 mul imag part end - let t378 = circuit_sub(t374, in38); // Fp2 sub coeff 0/1 - let t379 = circuit_sub(t377, in39); // Fp2 sub coeff 1/1 - let t380 = circuit_mul(t357, in36); // Fp2 mul start - let t381 = circuit_mul(t360, in37); - let t382 = circuit_sub(t380, t381); // Fp2 mul real part end - let t383 = circuit_mul(t357, in37); - let t384 = circuit_mul(t360, in36); - let t385 = circuit_add(t383, t384); // Fp2 mul imag part end - let t386 = circuit_sub(t382, in38); // Fp2 sub coeff 0/1 - let t387 = circuit_sub(t385, in39); // Fp2 sub coeff 1/1 - let t388 = circuit_mul(in7, t360); - let t389 = circuit_add(t357, t388); - let t390 = circuit_mul(t389, in35); - let t391 = circuit_mul(in7, t387); - let t392 = circuit_add(t386, t391); - let t393 = circuit_mul(t392, in34); - let t394 = circuit_mul(t360, in35); - let t395 = circuit_mul(t387, in34); - let t396 = circuit_sub(t378, t342); // Fp2 sub coeff 0/1 - let t397 = circuit_sub(t379, t343); // Fp2 sub coeff 1/1 - let t398 = circuit_sub(t368, t340); // Fp2 sub coeff 0/1 - let t399 = circuit_sub(t369, t341); // Fp2 sub coeff 1/1 - let t400 = circuit_mul(t398, t398); // Fp2 Div x/y start : Fp2 Inv y start - let t401 = circuit_mul(t399, t399); - let t402 = circuit_add(t400, t401); - let t403 = circuit_inverse(t402); - let t404 = circuit_mul(t398, t403); // Fp2 Inv y real part end - let t405 = circuit_mul(t399, t403); - let t406 = circuit_sub(in6, t405); // Fp2 Inv y imag part end - let t407 = circuit_mul(t396, t404); // Fp2 mul start - let t408 = circuit_mul(t397, t406); - let t409 = circuit_sub(t407, t408); // Fp2 mul real part end - let t410 = circuit_mul(t396, t406); - let t411 = circuit_mul(t397, t404); - let t412 = circuit_add(t410, t411); // Fp2 mul imag part end - let t413 = circuit_mul(t409, t368); // Fp2 mul start - let t414 = circuit_mul(t412, t369); - let t415 = circuit_sub(t413, t414); // Fp2 mul real part end - let t416 = circuit_mul(t409, t369); - let t417 = circuit_mul(t412, t368); - let t418 = circuit_add(t416, t417); // Fp2 mul imag part end - let t419 = circuit_sub(t415, t378); // Fp2 sub coeff 0/1 - let t420 = circuit_sub(t418, t379); // Fp2 sub coeff 1/1 - let t421 = circuit_mul(in7, t412); - let t422 = circuit_add(t409, t421); - let t423 = circuit_mul(t422, in35); - let t424 = circuit_mul(in7, t420); - let t425 = circuit_add(t419, t424); - let t426 = circuit_mul(t425, in34); - let t427 = circuit_mul(t412, in35); - let t428 = circuit_mul(t420, in34); - let t429 = circuit_mul(t184, in66); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t430 = circuit_add(in5, t429); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t431 = circuit_mul(t187, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t432 = circuit_add(t430, t431); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t433 = circuit_mul(t188, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t434 = circuit_add(t432, t433); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t435 = circuit_mul(t189, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t436 = circuit_add(t434, t435); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t437 = circuit_mul(in71, t436); - let t438 = circuit_mul(t217, in66); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t439 = circuit_add(in5, t438); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t440 = circuit_mul(t220, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t441 = circuit_add(t439, t440); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t442 = circuit_mul(t221, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t443 = circuit_add(t441, t442); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t444 = circuit_mul(t222, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t445 = circuit_add(t443, t444); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t446 = circuit_mul(t437, t445); - let t447 = circuit_mul(t287, in66); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t448 = circuit_add(in5, t447); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t449 = circuit_mul(t290, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t450 = circuit_add(t448, t449); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t451 = circuit_mul(t291, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t452 = circuit_add(t450, t451); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t453 = circuit_mul(t292, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t454 = circuit_add(t452, t453); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t455 = circuit_mul(t446, t454); - let t456 = circuit_mul(t320, in66); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t457 = circuit_add(in5, t456); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t458 = circuit_mul(t323, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t459 = circuit_add(t457, t458); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t460 = circuit_mul(t324, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t461 = circuit_add(t459, t460); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t462 = circuit_mul(t325, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t463 = circuit_add(t461, t462); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t464 = circuit_mul(t455, t463); - let t465 = circuit_mul(t390, in66); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t466 = circuit_add(in5, t465); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t467 = circuit_mul(t393, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t468 = circuit_add(t466, t467); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t469 = circuit_mul(t394, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t470 = circuit_add(t468, t469); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t471 = circuit_mul(t395, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t472 = circuit_add(t470, t471); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t473 = circuit_mul(t464, t472); - let t474 = circuit_mul(t423, in66); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t475 = circuit_add(in5, t474); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t476 = circuit_mul(t426, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t477 = circuit_add(t475, t476); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t478 = circuit_mul(t427, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t479 = circuit_add(t477, t478); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t480 = circuit_mul(t428, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t481 = circuit_add(t479, t480); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t482 = circuit_mul(t473, t481); - let t483 = circuit_sub(t482, t97); - let t484 = circuit_mul(t74, t483); // c_n_minus_2 * ((Π(n-2,k) (Pk(z)) - R_n_minus_2(z)) - let t485 = circuit_mul(t97, in67); - let t486 = circuit_mul(t485, in68); - let t487 = circuit_mul(t486, in69); - let t488 = circuit_mul(t487, in65); - let t489 = circuit_sub(t488, t119); - let t490 = circuit_mul(t75, t489); // c_n_minus_1 * ((Π(n-1,k) (Pk(z)) - R_n_minus_1(z)) - let t491 = circuit_add(t484, t490); - let t492 = circuit_add(in70, t491); - let t493 = circuit_mul(in73, in66); // Eval UnnamedPoly step coeff_1 * z^1 - let t494 = circuit_add(in72, t493); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t495 = circuit_mul(in74, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t496 = circuit_add(t494, t495); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t497 = circuit_mul(in75, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t498 = circuit_add(t496, t497); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t499 = circuit_mul(in76, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t500 = circuit_add(t498, t499); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t501 = circuit_mul(in77, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t502 = circuit_add(t500, t501); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t503 = circuit_mul(in78, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t504 = circuit_add(t502, t503); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t505 = circuit_mul(in79, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t506 = circuit_add(t504, t505); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t507 = circuit_mul(in80, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t508 = circuit_add(t506, t507); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t509 = circuit_mul(in81, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t510 = circuit_add(t508, t509); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t511 = circuit_mul(in82, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t512 = circuit_add(t510, t511); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t513 = circuit_mul(in83, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t514 = circuit_add(t512, t513); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t515 = circuit_mul(in84, t10); // Eval UnnamedPoly step coeff_12 * z^12 - let t516 = circuit_add(t514, t515); // Eval UnnamedPoly step + (coeff_12 * z^12) - let t517 = circuit_mul(in85, t11); // Eval UnnamedPoly step coeff_13 * z^13 - let t518 = circuit_add(t516, t517); // Eval UnnamedPoly step + (coeff_13 * z^13) - let t519 = circuit_mul(in86, t12); // Eval UnnamedPoly step coeff_14 * z^14 - let t520 = circuit_add(t518, t519); // Eval UnnamedPoly step + (coeff_14 * z^14) - let t521 = circuit_mul(in87, t13); // Eval UnnamedPoly step coeff_15 * z^15 - let t522 = circuit_add(t520, t521); // Eval UnnamedPoly step + (coeff_15 * z^15) - let t523 = circuit_mul(in88, t14); // Eval UnnamedPoly step coeff_16 * z^16 - let t524 = circuit_add(t522, t523); // Eval UnnamedPoly step + (coeff_16 * z^16) - let t525 = circuit_mul(in89, t15); // Eval UnnamedPoly step coeff_17 * z^17 - let t526 = circuit_add(t524, t525); // Eval UnnamedPoly step + (coeff_17 * z^17) - let t527 = circuit_mul(in90, t16); // Eval UnnamedPoly step coeff_18 * z^18 - let t528 = circuit_add(t526, t527); // Eval UnnamedPoly step + (coeff_18 * z^18) - let t529 = circuit_mul(in91, t17); // Eval UnnamedPoly step coeff_19 * z^19 - let t530 = circuit_add(t528, t529); // Eval UnnamedPoly step + (coeff_19 * z^19) - let t531 = circuit_mul(in92, t18); // Eval UnnamedPoly step coeff_20 * z^20 - let t532 = circuit_add(t530, t531); // Eval UnnamedPoly step + (coeff_20 * z^20) - let t533 = circuit_mul(in93, t19); // Eval UnnamedPoly step coeff_21 * z^21 - let t534 = circuit_add(t532, t533); // Eval UnnamedPoly step + (coeff_21 * z^21) - let t535 = circuit_mul(in94, t20); // Eval UnnamedPoly step coeff_22 * z^22 - let t536 = circuit_add(t534, t535); // Eval UnnamedPoly step + (coeff_22 * z^22) - let t537 = circuit_mul(in95, t21); // Eval UnnamedPoly step coeff_23 * z^23 - let t538 = circuit_add(t536, t537); // Eval UnnamedPoly step + (coeff_23 * z^23) - let t539 = circuit_mul(in96, t22); // Eval UnnamedPoly step coeff_24 * z^24 - let t540 = circuit_add(t538, t539); // Eval UnnamedPoly step + (coeff_24 * z^24) - let t541 = circuit_mul(in97, t23); // Eval UnnamedPoly step coeff_25 * z^25 - let t542 = circuit_add(t540, t541); // Eval UnnamedPoly step + (coeff_25 * z^25) - let t543 = circuit_mul(in98, t24); // Eval UnnamedPoly step coeff_26 * z^26 - let t544 = circuit_add(t542, t543); // Eval UnnamedPoly step + (coeff_26 * z^26) - let t545 = circuit_mul(in99, t25); // Eval UnnamedPoly step coeff_27 * z^27 - let t546 = circuit_add(t544, t545); // Eval UnnamedPoly step + (coeff_27 * z^27) - let t547 = circuit_mul(in100, t26); // Eval UnnamedPoly step coeff_28 * z^28 - let t548 = circuit_add(t546, t547); // Eval UnnamedPoly step + (coeff_28 * z^28) - let t549 = circuit_mul(in101, t27); // Eval UnnamedPoly step coeff_29 * z^29 - let t550 = circuit_add(t548, t549); // Eval UnnamedPoly step + (coeff_29 * z^29) - let t551 = circuit_mul(in102, t28); // Eval UnnamedPoly step coeff_30 * z^30 - let t552 = circuit_add(t550, t551); // Eval UnnamedPoly step + (coeff_30 * z^30) - let t553 = circuit_mul(in103, t29); // Eval UnnamedPoly step coeff_31 * z^31 - let t554 = circuit_add(t552, t553); // Eval UnnamedPoly step + (coeff_31 * z^31) - let t555 = circuit_mul(in104, t30); // Eval UnnamedPoly step coeff_32 * z^32 - let t556 = circuit_add(t554, t555); // Eval UnnamedPoly step + (coeff_32 * z^32) - let t557 = circuit_mul(in105, t31); // Eval UnnamedPoly step coeff_33 * z^33 - let t558 = circuit_add(t556, t557); // Eval UnnamedPoly step + (coeff_33 * z^33) - let t559 = circuit_mul(in106, t32); // Eval UnnamedPoly step coeff_34 * z^34 - let t560 = circuit_add(t558, t559); // Eval UnnamedPoly step + (coeff_34 * z^34) - let t561 = circuit_mul(in107, t33); // Eval UnnamedPoly step coeff_35 * z^35 - let t562 = circuit_add(t560, t561); // Eval UnnamedPoly step + (coeff_35 * z^35) - let t563 = circuit_mul(in108, t34); // Eval UnnamedPoly step coeff_36 * z^36 - let t564 = circuit_add(t562, t563); // Eval UnnamedPoly step + (coeff_36 * z^36) - let t565 = circuit_mul(in109, t35); // Eval UnnamedPoly step coeff_37 * z^37 - let t566 = circuit_add(t564, t565); // Eval UnnamedPoly step + (coeff_37 * z^37) - let t567 = circuit_mul(in110, t36); // Eval UnnamedPoly step coeff_38 * z^38 - let t568 = circuit_add(t566, t567); // Eval UnnamedPoly step + (coeff_38 * z^38) - let t569 = circuit_mul(in111, t37); // Eval UnnamedPoly step coeff_39 * z^39 - let t570 = circuit_add(t568, t569); // Eval UnnamedPoly step + (coeff_39 * z^39) - let t571 = circuit_mul(in112, t38); // Eval UnnamedPoly step coeff_40 * z^40 - let t572 = circuit_add(t570, t571); // Eval UnnamedPoly step + (coeff_40 * z^40) - let t573 = circuit_mul(in113, t39); // Eval UnnamedPoly step coeff_41 * z^41 - let t574 = circuit_add(t572, t573); // Eval UnnamedPoly step + (coeff_41 * z^41) - let t575 = circuit_mul(in114, t40); // Eval UnnamedPoly step coeff_42 * z^42 - let t576 = circuit_add(t574, t575); // Eval UnnamedPoly step + (coeff_42 * z^42) - let t577 = circuit_mul(in115, t41); // Eval UnnamedPoly step coeff_43 * z^43 - let t578 = circuit_add(t576, t577); // Eval UnnamedPoly step + (coeff_43 * z^43) - let t579 = circuit_mul(in116, t42); // Eval UnnamedPoly step coeff_44 * z^44 - let t580 = circuit_add(t578, t579); // Eval UnnamedPoly step + (coeff_44 * z^44) - let t581 = circuit_mul(in117, t43); // Eval UnnamedPoly step coeff_45 * z^45 - let t582 = circuit_add(t580, t581); // Eval UnnamedPoly step + (coeff_45 * z^45) - let t583 = circuit_mul(in118, t44); // Eval UnnamedPoly step coeff_46 * z^46 - let t584 = circuit_add(t582, t583); // Eval UnnamedPoly step + (coeff_46 * z^46) - let t585 = circuit_mul(in119, t45); // Eval UnnamedPoly step coeff_47 * z^47 - let t586 = circuit_add(t584, t585); // Eval UnnamedPoly step + (coeff_47 * z^47) - let t587 = circuit_mul(in120, t46); // Eval UnnamedPoly step coeff_48 * z^48 - let t588 = circuit_add(t586, t587); // Eval UnnamedPoly step + (coeff_48 * z^48) - let t589 = circuit_mul(in121, t47); // Eval UnnamedPoly step coeff_49 * z^49 - let t590 = circuit_add(t588, t589); // Eval UnnamedPoly step + (coeff_49 * z^49) - let t591 = circuit_mul(in122, t48); // Eval UnnamedPoly step coeff_50 * z^50 - let t592 = circuit_add(t590, t591); // Eval UnnamedPoly step + (coeff_50 * z^50) - let t593 = circuit_mul(in123, t49); // Eval UnnamedPoly step coeff_51 * z^51 - let t594 = circuit_add(t592, t593); // Eval UnnamedPoly step + (coeff_51 * z^51) - let t595 = circuit_mul(in124, t50); // Eval UnnamedPoly step coeff_52 * z^52 - let t596 = circuit_add(t594, t595); // Eval UnnamedPoly step + (coeff_52 * z^52) - let t597 = circuit_mul(in125, t51); // Eval UnnamedPoly step coeff_53 * z^53 - let t598 = circuit_add(t596, t597); // Eval UnnamedPoly step + (coeff_53 * z^53) - let t599 = circuit_mul(in126, t52); // Eval UnnamedPoly step coeff_54 * z^54 - let t600 = circuit_add(t598, t599); // Eval UnnamedPoly step + (coeff_54 * z^54) - let t601 = circuit_mul(in127, t53); // Eval UnnamedPoly step coeff_55 * z^55 - let t602 = circuit_add(t600, t601); // Eval UnnamedPoly step + (coeff_55 * z^55) - let t603 = circuit_mul(in128, t54); // Eval UnnamedPoly step coeff_56 * z^56 - let t604 = circuit_add(t602, t603); // Eval UnnamedPoly step + (coeff_56 * z^56) - let t605 = circuit_mul(in129, t55); // Eval UnnamedPoly step coeff_57 * z^57 - let t606 = circuit_add(t604, t605); // Eval UnnamedPoly step + (coeff_57 * z^57) - let t607 = circuit_mul(in130, t56); // Eval UnnamedPoly step coeff_58 * z^58 - let t608 = circuit_add(t606, t607); // Eval UnnamedPoly step + (coeff_58 * z^58) - let t609 = circuit_mul(in131, t57); // Eval UnnamedPoly step coeff_59 * z^59 - let t610 = circuit_add(t608, t609); // Eval UnnamedPoly step + (coeff_59 * z^59) - let t611 = circuit_mul(in132, t58); // Eval UnnamedPoly step coeff_60 * z^60 - let t612 = circuit_add(t610, t611); // Eval UnnamedPoly step + (coeff_60 * z^60) - let t613 = circuit_mul(in133, t59); // Eval UnnamedPoly step coeff_61 * z^61 - let t614 = circuit_add(t612, t613); // Eval UnnamedPoly step + (coeff_61 * z^61) - let t615 = circuit_mul(in134, t60); // Eval UnnamedPoly step coeff_62 * z^62 - let t616 = circuit_add(t614, t615); // Eval UnnamedPoly step + (coeff_62 * z^62) - let t617 = circuit_mul(in135, t61); // Eval UnnamedPoly step coeff_63 * z^63 - let t618 = circuit_add(t616, t617); // Eval UnnamedPoly step + (coeff_63 * z^63) - let t619 = circuit_mul(in136, t62); // Eval UnnamedPoly step coeff_64 * z^64 - let t620 = circuit_add(t618, t619); // Eval UnnamedPoly step + (coeff_64 * z^64) - let t621 = circuit_mul(in137, t63); // Eval UnnamedPoly step coeff_65 * z^65 - let t622 = circuit_add(t620, t621); // Eval UnnamedPoly step + (coeff_65 * z^65) - let t623 = circuit_mul(in138, t64); // Eval UnnamedPoly step coeff_66 * z^66 - let t624 = circuit_add(t622, t623); // Eval UnnamedPoly step + (coeff_66 * z^66) - let t625 = circuit_mul(in139, t65); // Eval UnnamedPoly step coeff_67 * z^67 - let t626 = circuit_add(t624, t625); // Eval UnnamedPoly step + (coeff_67 * z^67) - let t627 = circuit_mul(in140, t66); // Eval UnnamedPoly step coeff_68 * z^68 - let t628 = circuit_add(t626, t627); // Eval UnnamedPoly step + (coeff_68 * z^68) - let t629 = circuit_mul(in141, t67); // Eval UnnamedPoly step coeff_69 * z^69 - let t630 = circuit_add(t628, t629); // Eval UnnamedPoly step + (coeff_69 * z^69) - let t631 = circuit_mul(in142, t68); // Eval UnnamedPoly step coeff_70 * z^70 - let t632 = circuit_add(t630, t631); // Eval UnnamedPoly step + (coeff_70 * z^70) - let t633 = circuit_mul(in143, t69); // Eval UnnamedPoly step coeff_71 * z^71 - let t634 = circuit_add(t632, t633); // Eval UnnamedPoly step + (coeff_71 * z^71) - let t635 = circuit_mul(in144, t70); // Eval UnnamedPoly step coeff_72 * z^72 - let t636 = circuit_add(t634, t635); // Eval UnnamedPoly step + (coeff_72 * z^72) - let t637 = circuit_mul(in145, t71); // Eval UnnamedPoly step coeff_73 * z^73 - let t638 = circuit_add(t636, t637); // Eval UnnamedPoly step + (coeff_73 * z^73) - let t639 = circuit_mul(in146, t72); // Eval UnnamedPoly step coeff_74 * z^74 - let t640 = circuit_add(t638, t639); // Eval UnnamedPoly step + (coeff_74 * z^74) - let t641 = circuit_mul(in147, t73); // Eval UnnamedPoly step coeff_75 * z^75 - let t642 = circuit_add(t640, t641); // Eval UnnamedPoly step + (coeff_75 * z^75) - let t643 = circuit_mul(in9, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t644 = circuit_add(in8, t643); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t645 = circuit_add(t644, t10); // Eval sparse poly UnnamedPoly step + 1*z^12 - let t646 = circuit_mul(t642, t645); - let t647 = circuit_sub(t492, t646); + let (in45, in46) = (CE::> {}, CE::> {}); + let (in47, in48) = (CE::> {}, CE::> {}); + let (in49, in50) = (CE::> {}, CE::> {}); + let (in51, in52) = (CE::> {}, CE::> {}); + let (in53, in54) = (CE::> {}, CE::> {}); + let (in55, in56) = (CE::> {}, CE::> {}); + let (in57, in58) = (CE::> {}, CE::> {}); + let (in59, in60) = (CE::> {}, CE::> {}); + let (in61, in62) = (CE::> {}, CE::> {}); + let (in63, in64) = (CE::> {}, CE::> {}); + let (in65, in66) = (CE::> {}, CE::> {}); + let (in67, in68) = (CE::> {}, CE::> {}); + let (in69, in70) = (CE::> {}, CE::> {}); + let (in71, in72) = (CE::> {}, CE::> {}); + let (in73, in74) = (CE::> {}, CE::> {}); + let (in75, in76) = (CE::> {}, CE::> {}); + let t0 = circuit_mul(in57, in57); // Compute z^2 + let t1 = circuit_mul(t0, in57); // Compute z^3 + let t2 = circuit_mul(t1, in57); // Compute z^4 + let t3 = circuit_mul(t2, in57); // Compute z^5 + let t4 = circuit_mul(t3, in57); // Compute z^6 + let t5 = circuit_mul(t4, in57); // Compute z^7 + let t6 = circuit_mul(t5, in57); // Compute z^8 + let t7 = circuit_mul(t6, in57); // Compute z^9 + let t8 = circuit_mul(t7, in57); // Compute z^10 + let t9 = circuit_mul(t8, in57); // Compute z^11 + let t10 = circuit_mul(in46, in57); // Eval C step coeff_1 * z^1 + let t11 = circuit_add(in45, t10); // Eval C step + (coeff_1 * z^1) + let t12 = circuit_mul(in47, t0); // Eval C step coeff_2 * z^2 + let t13 = circuit_add(t11, t12); // Eval C step + (coeff_2 * z^2) + let t14 = circuit_mul(in48, t1); // Eval C step coeff_3 * z^3 + let t15 = circuit_add(t13, t14); // Eval C step + (coeff_3 * z^3) + let t16 = circuit_mul(in49, t2); // Eval C step coeff_4 * z^4 + let t17 = circuit_add(t15, t16); // Eval C step + (coeff_4 * z^4) + let t18 = circuit_mul(in50, t3); // Eval C step coeff_5 * z^5 + let t19 = circuit_add(t17, t18); // Eval C step + (coeff_5 * z^5) + let t20 = circuit_mul(in51, t4); // Eval C step coeff_6 * z^6 + let t21 = circuit_add(t19, t20); // Eval C step + (coeff_6 * z^6) + let t22 = circuit_mul(in52, t5); // Eval C step coeff_7 * z^7 + let t23 = circuit_add(t21, t22); // Eval C step + (coeff_7 * z^7) + let t24 = circuit_mul(in53, t6); // Eval C step coeff_8 * z^8 + let t25 = circuit_add(t23, t24); // Eval C step + (coeff_8 * z^8) + let t26 = circuit_mul(in54, t7); // Eval C step coeff_9 * z^9 + let t27 = circuit_add(t25, t26); // Eval C step + (coeff_9 * z^9) + let t28 = circuit_mul(in55, t8); // Eval C step coeff_10 * z^10 + let t29 = circuit_add(t27, t28); // Eval C step + (coeff_10 * z^10) + let t30 = circuit_mul(in56, t9); // Eval C step coeff_11 * z^11 + let t31 = circuit_add(t29, t30); // Eval C step + (coeff_11 * z^11) + let t32 = circuit_mul(in59, t0); // Eval sparse poly W step coeff_2 * z^2 + let t33 = circuit_add(in58, t32); // Eval sparse poly W step + coeff_2 * z^2 + let t34 = circuit_mul(in60, t2); // Eval sparse poly W step coeff_4 * z^4 + let t35 = circuit_add(t33, t34); // Eval sparse poly W step + coeff_4 * z^4 + let t36 = circuit_mul(in61, t4); // Eval sparse poly W step coeff_6 * z^6 + let t37 = circuit_add(t35, t36); // Eval sparse poly W step + coeff_6 * z^6 + let t38 = circuit_mul(in62, t6); // Eval sparse poly W step coeff_8 * z^8 + let t39 = circuit_add(t37, t38); // Eval sparse poly W step + coeff_8 * z^8 + let t40 = circuit_mul(in63, t8); // Eval sparse poly W step coeff_10 * z^10 + let t41 = circuit_add(t39, t40); // Eval sparse poly W step + coeff_10 * z^10 + let t42 = circuit_mul(in65, in57); // Eval C_inv step coeff_1 * z^1 + let t43 = circuit_add(in64, t42); // Eval C_inv step + (coeff_1 * z^1) + let t44 = circuit_mul(in66, t0); // Eval C_inv step coeff_2 * z^2 + let t45 = circuit_add(t43, t44); // Eval C_inv step + (coeff_2 * z^2) + let t46 = circuit_mul(in67, t1); // Eval C_inv step coeff_3 * z^3 + let t47 = circuit_add(t45, t46); // Eval C_inv step + (coeff_3 * z^3) + let t48 = circuit_mul(in68, t2); // Eval C_inv step coeff_4 * z^4 + let t49 = circuit_add(t47, t48); // Eval C_inv step + (coeff_4 * z^4) + let t50 = circuit_mul(in69, t3); // Eval C_inv step coeff_5 * z^5 + let t51 = circuit_add(t49, t50); // Eval C_inv step + (coeff_5 * z^5) + let t52 = circuit_mul(in70, t4); // Eval C_inv step coeff_6 * z^6 + let t53 = circuit_add(t51, t52); // Eval C_inv step + (coeff_6 * z^6) + let t54 = circuit_mul(in71, t5); // Eval C_inv step coeff_7 * z^7 + let t55 = circuit_add(t53, t54); // Eval C_inv step + (coeff_7 * z^7) + let t56 = circuit_mul(in72, t6); // Eval C_inv step coeff_8 * z^8 + let t57 = circuit_add(t55, t56); // Eval C_inv step + (coeff_8 * z^8) + let t58 = circuit_mul(in73, t7); // Eval C_inv step coeff_9 * z^9 + let t59 = circuit_add(t57, t58); // Eval C_inv step + (coeff_9 * z^9) + let t60 = circuit_mul(in74, t8); // Eval C_inv step coeff_10 * z^10 + let t61 = circuit_add(t59, t60); // Eval C_inv step + (coeff_10 * z^10) + let t62 = circuit_mul(in75, t9); // Eval C_inv step coeff_11 * z^11 + let t63 = circuit_add(t61, t62); // Eval C_inv step + (coeff_11 * z^11) + let t64 = circuit_mul(t31, t63); + let t65 = circuit_sub(t64, in0); // c_of_z * c_inv_of_z - 1 + let t66 = circuit_mul(t65, in76); // c_0 * (c_of_z * c_inv_of_z - 1) + let t67 = circuit_mul(in70, in1); + let t68 = circuit_add(in64, t67); + let t69 = circuit_mul(in65, in2); + let t70 = circuit_mul(in71, in3); + let t71 = circuit_add(t69, t70); + let t72 = circuit_mul(in66, in4); + let t73 = circuit_mul(in72, in5); + let t74 = circuit_add(t72, t73); + let t75 = circuit_mul(in67, in6); + let t76 = circuit_mul(in73, in7); + let t77 = circuit_add(t75, t76); + let t78 = circuit_mul(in68, in8); + let t79 = circuit_mul(in74, in9); + let t80 = circuit_add(t78, t79); + let t81 = circuit_mul(in69, in10); + let t82 = circuit_mul(in75, in11); + let t83 = circuit_add(t81, t82); + let t84 = circuit_mul(in70, in12); + let t85 = circuit_mul(in65, in13); + let t86 = circuit_mul(in71, in14); + let t87 = circuit_add(t85, t86); + let t88 = circuit_mul(in66, in15); + let t89 = circuit_mul(in72, in16); + let t90 = circuit_add(t88, t89); + let t91 = circuit_mul(in67, in17); + let t92 = circuit_mul(in73, in18); + let t93 = circuit_add(t91, t92); + let t94 = circuit_mul(in68, in19); + let t95 = circuit_mul(in74, in20); + let t96 = circuit_add(t94, t95); + let t97 = circuit_mul(in69, in21); + let t98 = circuit_mul(in75, in22); + let t99 = circuit_add(t97, t98); + let t100 = circuit_mul(in46, in23); + let t101 = circuit_mul(in47, in24); + let t102 = circuit_mul(in48, in12); + let t103 = circuit_mul(in49, in25); + let t104 = circuit_mul(in50, in26); + let t105 = circuit_mul(in52, in23); + let t106 = circuit_mul(in53, in24); + let t107 = circuit_mul(in54, in12); + let t108 = circuit_mul(in55, in25); + let t109 = circuit_mul(in56, in26); + let t110 = circuit_mul(in70, in1); + let t111 = circuit_add(in64, t110); + let t112 = circuit_mul(in65, in27); + let t113 = circuit_mul(in71, in28); + let t114 = circuit_add(t112, t113); + let t115 = circuit_mul(in66, in29); + let t116 = circuit_mul(in72, in30); + let t117 = circuit_add(t115, t116); + let t118 = circuit_mul(in67, in18); + let t119 = circuit_mul(in73, in31); + let t120 = circuit_add(t118, t119); + let t121 = circuit_mul(in68, in32); + let t122 = circuit_mul(in74, in33); + let t123 = circuit_add(t121, t122); + let t124 = circuit_mul(in69, in34); + let t125 = circuit_mul(in75, in35); + let t126 = circuit_add(t124, t125); + let t127 = circuit_mul(in70, in12); + let t128 = circuit_mul(in65, in36); + let t129 = circuit_mul(in71, in37); + let t130 = circuit_add(t128, t129); + let t131 = circuit_mul(in66, in38); + let t132 = circuit_mul(in72, in39); + let t133 = circuit_add(t131, t132); + let t134 = circuit_mul(in67, in40); + let t135 = circuit_mul(in73, in6); + let t136 = circuit_add(t134, t135); + let t137 = circuit_mul(in68, in41); + let t138 = circuit_mul(in74, in42); + let t139 = circuit_add(t137, t138); + let t140 = circuit_mul(in69, in43); + let t141 = circuit_mul(in75, in44); + let t142 = circuit_add(t140, t141); + let t143 = circuit_mul(t71, in57); // Eval C_inv_frob_1 step coeff_1 * z^1 + let t144 = circuit_add(t68, t143); // Eval C_inv_frob_1 step + (coeff_1 * z^1) + let t145 = circuit_mul(t74, t0); // Eval C_inv_frob_1 step coeff_2 * z^2 + let t146 = circuit_add(t144, t145); // Eval C_inv_frob_1 step + (coeff_2 * z^2) + let t147 = circuit_mul(t77, t1); // Eval C_inv_frob_1 step coeff_3 * z^3 + let t148 = circuit_add(t146, t147); // Eval C_inv_frob_1 step + (coeff_3 * z^3) + let t149 = circuit_mul(t80, t2); // Eval C_inv_frob_1 step coeff_4 * z^4 + let t150 = circuit_add(t148, t149); // Eval C_inv_frob_1 step + (coeff_4 * z^4) + let t151 = circuit_mul(t83, t3); // Eval C_inv_frob_1 step coeff_5 * z^5 + let t152 = circuit_add(t150, t151); // Eval C_inv_frob_1 step + (coeff_5 * z^5) + let t153 = circuit_mul(t84, t4); // Eval C_inv_frob_1 step coeff_6 * z^6 + let t154 = circuit_add(t152, t153); // Eval C_inv_frob_1 step + (coeff_6 * z^6) + let t155 = circuit_mul(t87, t5); // Eval C_inv_frob_1 step coeff_7 * z^7 + let t156 = circuit_add(t154, t155); // Eval C_inv_frob_1 step + (coeff_7 * z^7) + let t157 = circuit_mul(t90, t6); // Eval C_inv_frob_1 step coeff_8 * z^8 + let t158 = circuit_add(t156, t157); // Eval C_inv_frob_1 step + (coeff_8 * z^8) + let t159 = circuit_mul(t93, t7); // Eval C_inv_frob_1 step coeff_9 * z^9 + let t160 = circuit_add(t158, t159); // Eval C_inv_frob_1 step + (coeff_9 * z^9) + let t161 = circuit_mul(t96, t8); // Eval C_inv_frob_1 step coeff_10 * z^10 + let t162 = circuit_add(t160, t161); // Eval C_inv_frob_1 step + (coeff_10 * z^10) + let t163 = circuit_mul(t99, t9); // Eval C_inv_frob_1 step coeff_11 * z^11 + let t164 = circuit_add(t162, t163); // Eval C_inv_frob_1 step + (coeff_11 * z^11) + let t165 = circuit_mul(t100, in57); // Eval C_frob_2 step coeff_1 * z^1 + let t166 = circuit_add(in45, t165); // Eval C_frob_2 step + (coeff_1 * z^1) + let t167 = circuit_mul(t101, t0); // Eval C_frob_2 step coeff_2 * z^2 + let t168 = circuit_add(t166, t167); // Eval C_frob_2 step + (coeff_2 * z^2) + let t169 = circuit_mul(t102, t1); // Eval C_frob_2 step coeff_3 * z^3 + let t170 = circuit_add(t168, t169); // Eval C_frob_2 step + (coeff_3 * z^3) + let t171 = circuit_mul(t103, t2); // Eval C_frob_2 step coeff_4 * z^4 + let t172 = circuit_add(t170, t171); // Eval C_frob_2 step + (coeff_4 * z^4) + let t173 = circuit_mul(t104, t3); // Eval C_frob_2 step coeff_5 * z^5 + let t174 = circuit_add(t172, t173); // Eval C_frob_2 step + (coeff_5 * z^5) + let t175 = circuit_mul(in51, t4); // Eval C_frob_2 step coeff_6 * z^6 + let t176 = circuit_add(t174, t175); // Eval C_frob_2 step + (coeff_6 * z^6) + let t177 = circuit_mul(t105, t5); // Eval C_frob_2 step coeff_7 * z^7 + let t178 = circuit_add(t176, t177); // Eval C_frob_2 step + (coeff_7 * z^7) + let t179 = circuit_mul(t106, t6); // Eval C_frob_2 step coeff_8 * z^8 + let t180 = circuit_add(t178, t179); // Eval C_frob_2 step + (coeff_8 * z^8) + let t181 = circuit_mul(t107, t7); // Eval C_frob_2 step coeff_9 * z^9 + let t182 = circuit_add(t180, t181); // Eval C_frob_2 step + (coeff_9 * z^9) + let t183 = circuit_mul(t108, t8); // Eval C_frob_2 step coeff_10 * z^10 + let t184 = circuit_add(t182, t183); // Eval C_frob_2 step + (coeff_10 * z^10) + let t185 = circuit_mul(t109, t9); // Eval C_frob_2 step coeff_11 * z^11 + let t186 = circuit_add(t184, t185); // Eval C_frob_2 step + (coeff_11 * z^11) + let t187 = circuit_mul(t114, in57); // Eval C_inv_frob_3 step coeff_1 * z^1 + let t188 = circuit_add(t111, t187); // Eval C_inv_frob_3 step + (coeff_1 * z^1) + let t189 = circuit_mul(t117, t0); // Eval C_inv_frob_3 step coeff_2 * z^2 + let t190 = circuit_add(t188, t189); // Eval C_inv_frob_3 step + (coeff_2 * z^2) + let t191 = circuit_mul(t120, t1); // Eval C_inv_frob_3 step coeff_3 * z^3 + let t192 = circuit_add(t190, t191); // Eval C_inv_frob_3 step + (coeff_3 * z^3) + let t193 = circuit_mul(t123, t2); // Eval C_inv_frob_3 step coeff_4 * z^4 + let t194 = circuit_add(t192, t193); // Eval C_inv_frob_3 step + (coeff_4 * z^4) + let t195 = circuit_mul(t126, t3); // Eval C_inv_frob_3 step coeff_5 * z^5 + let t196 = circuit_add(t194, t195); // Eval C_inv_frob_3 step + (coeff_5 * z^5) + let t197 = circuit_mul(t127, t4); // Eval C_inv_frob_3 step coeff_6 * z^6 + let t198 = circuit_add(t196, t197); // Eval C_inv_frob_3 step + (coeff_6 * z^6) + let t199 = circuit_mul(t130, t5); // Eval C_inv_frob_3 step coeff_7 * z^7 + let t200 = circuit_add(t198, t199); // Eval C_inv_frob_3 step + (coeff_7 * z^7) + let t201 = circuit_mul(t133, t6); // Eval C_inv_frob_3 step coeff_8 * z^8 + let t202 = circuit_add(t200, t201); // Eval C_inv_frob_3 step + (coeff_8 * z^8) + let t203 = circuit_mul(t136, t7); // Eval C_inv_frob_3 step coeff_9 * z^9 + let t204 = circuit_add(t202, t203); // Eval C_inv_frob_3 step + (coeff_9 * z^9) + let t205 = circuit_mul(t139, t8); // Eval C_inv_frob_3 step coeff_10 * z^10 + let t206 = circuit_add(t204, t205); // Eval C_inv_frob_3 step + (coeff_10 * z^10) + let t207 = circuit_mul(t142, t9); // Eval C_inv_frob_3 step coeff_11 * z^11 + let t208 = circuit_add(t206, t207); // Eval C_inv_frob_3 step + (coeff_11 * z^11) let modulus = TryInto::< _, CircuitModulus @@ -6379,1563 +9763,1857 @@ fn run_BN254_MP_CHECK_FINALIZE_BN_3_circuit( ) .unwrap(); - let mut circuit_inputs = (t647,).new_inputs(); + let mut circuit_inputs = (t31, t41, t63, t66, t164, t186, t208,).new_inputs(); // Prefill constants: + circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next([0x12, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs - .next([0xc2c3330c99e39557176f553d, 0x4c0bec3cf559b143b78cc310, 0x2fb347984f7911f7, 0x0]); + .next([0xfde6a43f5daa971f3fa65955, 0x1b2522ec5eb28ded6895e1cd, 0x1d8c8daef3eee1e8, 0x0]); + circuit_inputs = circuit_inputs + .next([0x42b29c567e9c385ce480a71a, 0x4e34e2ac06ead4000d14d1e2, 0x217e400dc9351e77, 0x0]); + circuit_inputs = circuit_inputs + .next([0xfd28d102c0d147b2f4d521a7, 0x8481d22c6934ce844d72f250, 0x242b719062f6737b, 0x0]); + circuit_inputs = circuit_inputs + .next([0x43ac198484b8d9094aa82536, 0x1b9c22d81246ffc2e794e176, 0x359809094bd5c8e, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6df7b44cbb259ef7cb58d5ed, 0xdd4ef1e69a0c1f0dd2949fa, 0x21436d48fcb50cc6, 0x0]); + circuit_inputs = circuit_inputs + .next([0x8a4f4f0831364cf35f78f771, 0x38a4311a86919d9c7c6c15f8, 0x18857a58f3b5bb30, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6fc008e7d6998c82f7fc048b, 0x62b7adefd44038ab3c0bbad9, 0x2c84bbad27c36715, 0x0]); + circuit_inputs = circuit_inputs + .next([0xa8697e0c9c36d8ca3339a7b5, 0x6d1eab6fcd18b99ad4afd096, 0xc33b1c70e4fd11b, 0x0]); + circuit_inputs = circuit_inputs + .next([0x5371c546d428780a6e3dcfa8, 0x13fe08bea73305ff6bdac77c, 0x1b007294a55accce, 0x0]); + circuit_inputs = circuit_inputs + .next([0x4f501fe811493d72543a3977, 0xefe88dd8e6965b3adae92c97, 0x215d42e7ac7bd17c, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6871ca8d3c208c16d87cfd46, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); + circuit_inputs = circuit_inputs + .next([0x8eeec7e5ca5cf05f80f362ac, 0xa6327cfe12150b8e74799277, 0x246996f3b4fae7e6, 0x0]); + circuit_inputs = circuit_inputs + .next([0x6a8b264dde75f4f798d6a3f2, 0x9d2b22ca22ceca702eeb88c3, 0x12d7c0c3ed42be41, 0x0]); circuit_inputs = circuit_inputs .next([0xb7c9dce1665d51c640fcba2, 0x4ba4cc8bd75a079432ae2a1d, 0x16c9e55061ebae20, 0x0]); circuit_inputs = circuit_inputs - .next([0xa9c95998dc54014671a0135a, 0xdc5ec698b6e2f9b9dbaae0ed, 0x63cf305489af5dc, 0x0]); + .next([0x6b48f98a7b4f4463e3a7dba0, 0x33ce738a184c89d94a0e7840, 0xc38dce27e3b2cae, 0x0]); circuit_inputs = circuit_inputs .next([0x8fa25bd282d37f632623b0e3, 0x704b5a7ec796f2b21807dc9, 0x7c03cbcac41049a, 0x0]); + circuit_inputs = circuit_inputs + .next([0xfa7a164080faed1f0d24275a, 0xaa7b569817e0966cba582096, 0xf20e129e47c9363, 0x0]); + circuit_inputs = circuit_inputs + .next([0x1bdec763c13b4711cd2b8126, 0x9f3a80b03b0b1c923685d2ea, 0x2c145edbe7fd8aee, 0x0]); + circuit_inputs = circuit_inputs + .next([0xf8b1c1a56586ff93e080f8bc, 0x559897c6ad411fb25b75afb7, 0x3df92c5b96e3914, 0x0]); + circuit_inputs = circuit_inputs + .next([0x678e2ac024c6b8ee6e0c2c4b, 0xa27fb246c7729f7db080cb99, 0x12acf2ca76fd0675, 0x0]); + circuit_inputs = circuit_inputs + .next([0x1500054667f8140c6a3f2d9f, 0xa4523cf7da4e525e2ba6a315, 0x1563dbde3bd6d35b, 0x0]); + circuit_inputs = circuit_inputs + .next([0xbb966e3de4bd44e5607cfd49, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); circuit_inputs = circuit_inputs .next([0xbb966e3de4bd44e5607cfd48, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x52, 0x0, 0x0, 0x0]); + .next([0xacdb5c4f5763473177fffffe, 0x59e26bcea0d48bacd4f263f1, 0x0, 0x0]); circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd35, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next(original_Q0.x0); - circuit_inputs = circuit_inputs.next(original_Q0.x1); - circuit_inputs = circuit_inputs.next(original_Q0.y0); - circuit_inputs = circuit_inputs.next(original_Q0.y1); - circuit_inputs = circuit_inputs.next(yInv_0); - circuit_inputs = circuit_inputs.next(xNegOverY_0); - circuit_inputs = circuit_inputs.next(Q0.x0); - circuit_inputs = circuit_inputs.next(Q0.x1); - circuit_inputs = circuit_inputs.next(Q0.y0); - circuit_inputs = circuit_inputs.next(Q0.y1); - circuit_inputs = circuit_inputs.next(original_Q1.x0); - circuit_inputs = circuit_inputs.next(original_Q1.x1); - circuit_inputs = circuit_inputs.next(original_Q1.y0); - circuit_inputs = circuit_inputs.next(original_Q1.y1); - circuit_inputs = circuit_inputs.next(yInv_1); - circuit_inputs = circuit_inputs.next(xNegOverY_1); - circuit_inputs = circuit_inputs.next(Q1.x0); - circuit_inputs = circuit_inputs.next(Q1.x1); - circuit_inputs = circuit_inputs.next(Q1.y0); - circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(original_Q2.x0); - circuit_inputs = circuit_inputs.next(original_Q2.x1); - circuit_inputs = circuit_inputs.next(original_Q2.y0); - circuit_inputs = circuit_inputs.next(original_Q2.y1); - circuit_inputs = circuit_inputs.next(yInv_2); - circuit_inputs = circuit_inputs.next(xNegOverY_2); - circuit_inputs = circuit_inputs.next(Q2.x0); - circuit_inputs = circuit_inputs.next(Q2.x1); - circuit_inputs = circuit_inputs.next(Q2.y0); - circuit_inputs = circuit_inputs.next(Q2.y1); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w0); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w1); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w2); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w3); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w4); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w5); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w6); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w7); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w8); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w9); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w10); - circuit_inputs = circuit_inputs.next(R_n_minus_2.w11); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w0); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w1); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w2); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w3); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w4); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w5); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w6); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w7); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w8); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w9); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w10); - circuit_inputs = circuit_inputs.next(R_n_minus_1.w11); - circuit_inputs = circuit_inputs.next(c_n_minus_3); - circuit_inputs = circuit_inputs.next(w_of_z); + .next([0xacdb5c4f5763473177ffffff, 0x59e26bcea0d48bacd4f263f1, 0x0, 0x0]); + circuit_inputs = circuit_inputs + .next([0x67dfc8fabd3581ad840ddd76, 0xb2bdfa8fef85fa07122bde8d, 0x13d0c369615f7bb0, 0x0]); + circuit_inputs = circuit_inputs + .next([0xac285af5685d3f90eacf7a66, 0xfc2bf531eb331a053a35744c, 0x18a0f4219f4fdff6, 0x0]); + circuit_inputs = circuit_inputs + .next([0x64e2b5a5bf22f67654883ae6, 0x79c3e050c9ca2a428908a812, 0xc3a5e9c462a6547, 0x0]); + circuit_inputs = circuit_inputs + .next([0x345582cc92fd973c74bd77f4, 0x5bdd2055c255cf9d9e08c1d9, 0x2ce02aa5f9bf8cd6, 0x0]); + circuit_inputs = circuit_inputs + .next([0xde227b850aea3f23790405d6, 0x7fac149bfaefbac11b155498, 0x17ded419ed7be4f9, 0x0]); + circuit_inputs = circuit_inputs + .next([0x4150a79753fb0cd31cc99cc0, 0x2fb81a8dccd8a9b4441d64f3, 0x1bfe7b214c029424, 0x0]); + circuit_inputs = circuit_inputs + .next([0x9efaf0f0f1a228f0d5662fbd, 0xd15da0ec97a9b8346513297b, 0x697b9c523e0390e, 0x0]); + circuit_inputs = circuit_inputs + .next([0x182d2db0c413901c32b0c6fe, 0xb5186d6ac4c723b85d3f78a3, 0x7a0e052f2b1c443, 0x0]); + circuit_inputs = circuit_inputs + .next([0x39c0d06b220500933945267f, 0x5dc79824a3792597356c892c, 0x1b76a37fba85f3cd, 0x0]); + circuit_inputs = circuit_inputs + .next([0x97d439ec7694aa2bf4c0c101, 0x6cbeee33576139d7f03a5e3, 0xabf8b60be77d73, 0x0]); + circuit_inputs = circuit_inputs + .next([0x9201927eeb0a69546f1fd1, 0x5924b2691fb5e5685558c04, 0x1c938b097fd22479, 0x0]); + circuit_inputs = circuit_inputs + .next([0x98ff2631380cab2baaa586de, 0xa9f30e6dec26094f0fdf31bf, 0x4f1de41b3d1766f, 0x0]); + circuit_inputs = circuit_inputs + .next([0x38f14e77cfd95a083f4c261, 0x3e8c6565b7b72e1b0e78c27f, 0x2429efd69b073ae2, 0x0]); + circuit_inputs = circuit_inputs + .next([0xd8cf6ebab94d0cb3b2594c64, 0xb14b900e9507e9327600ecc7, 0x28a411b634f09b8f, 0x0]); + circuit_inputs = circuit_inputs + .next([0x737f96e55fe3ed9d730c239f, 0xfeb0f6ef0cd21d04a44a9e08, 0x23d5e999e1910a12, 0x0]); + circuit_inputs = circuit_inputs + .next([0x272122f5e8257f43bbb36087, 0x88982b28b4a8aea95364059e, 0x1465d351952f0c05, 0x0]); + circuit_inputs = circuit_inputs + .next([0x200280211f25041384282499, 0x9fb1b2282a48633d3e2ddaea, 0x16db366a59b1dd0b, 0x0]); + circuit_inputs = circuit_inputs + .next([0x50449cdc780cfbfaa5cc3649, 0x337d84bbcba34a53a41f1ee, 0x28c36e1fee7fdbe6, 0x0]); + circuit_inputs = circuit_inputs.next(lambda_root.w0); + circuit_inputs = circuit_inputs.next(lambda_root.w1); + circuit_inputs = circuit_inputs.next(lambda_root.w2); + circuit_inputs = circuit_inputs.next(lambda_root.w3); + circuit_inputs = circuit_inputs.next(lambda_root.w4); + circuit_inputs = circuit_inputs.next(lambda_root.w5); + circuit_inputs = circuit_inputs.next(lambda_root.w6); + circuit_inputs = circuit_inputs.next(lambda_root.w7); + circuit_inputs = circuit_inputs.next(lambda_root.w8); + circuit_inputs = circuit_inputs.next(lambda_root.w9); + circuit_inputs = circuit_inputs.next(lambda_root.w10); + circuit_inputs = circuit_inputs.next(lambda_root.w11); circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(c_inv_frob_1_of_z); - circuit_inputs = circuit_inputs.next(c_frob_2_of_z); - circuit_inputs = circuit_inputs.next(c_inv_frob_3_of_z); - circuit_inputs = circuit_inputs.next(previous_lhs); - circuit_inputs = circuit_inputs.next(R_n_minus_3_of_z); + circuit_inputs = circuit_inputs.next(scaling_factor.w0); + circuit_inputs = circuit_inputs.next(scaling_factor.w2); + circuit_inputs = circuit_inputs.next(scaling_factor.w4); + circuit_inputs = circuit_inputs.next(scaling_factor.w6); + circuit_inputs = circuit_inputs.next(scaling_factor.w8); + circuit_inputs = circuit_inputs.next(scaling_factor.w10); + circuit_inputs = circuit_inputs.next(c_inv.w0); + circuit_inputs = circuit_inputs.next(c_inv.w1); + circuit_inputs = circuit_inputs.next(c_inv.w2); + circuit_inputs = circuit_inputs.next(c_inv.w3); + circuit_inputs = circuit_inputs.next(c_inv.w4); + circuit_inputs = circuit_inputs.next(c_inv.w5); + circuit_inputs = circuit_inputs.next(c_inv.w6); + circuit_inputs = circuit_inputs.next(c_inv.w7); + circuit_inputs = circuit_inputs.next(c_inv.w8); + circuit_inputs = circuit_inputs.next(c_inv.w9); + circuit_inputs = circuit_inputs.next(c_inv.w10); + circuit_inputs = circuit_inputs.next(c_inv.w11); + circuit_inputs = circuit_inputs.next(c_0); - let mut Q = Q; - while let Option::Some(val) = Q.pop_front() { - circuit_inputs = circuit_inputs.next(val); + let outputs = match circuit_inputs.done().eval(modulus) { + Result::Ok(outputs) => { outputs }, + Result::Err(_) => { panic!("Expected success") } }; + let c_of_z: u384 = outputs.get_output(t31); + let scaling_factor_of_z: u384 = outputs.get_output(t41); + let c_inv_of_z: u384 = outputs.get_output(t63); + let lhs: u384 = outputs.get_output(t66); + let c_inv_frob_1_of_z: u384 = outputs.get_output(t164); + let c_frob_2_of_z: u384 = outputs.get_output(t186); + let c_inv_frob_3_of_z: u384 = outputs.get_output(t208); + return ( + c_of_z, + scaling_factor_of_z, + c_inv_of_z, + lhs, + c_inv_frob_1_of_z, + c_frob_2_of_z, + c_inv_frob_3_of_z + ); +} +fn run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit( + p_0: G1Point, Qy0_0: u384, Qy1_0: u384, p_1: G1Point, Qy0_1: u384, Qy1_1: u384 +) -> (BNProcessedPair, BNProcessedPair) { + // CONSTANT stack + let in0 = CE::> {}; // 0x0 + + // INPUT stack + let (in1, in2) = (CE::> {}, CE::> {}); + let (in3, in4) = (CE::> {}, CE::> {}); + let (in5, in6) = (CE::> {}, CE::> {}); + let (in7, in8) = (CE::> {}, CE::> {}); + let t0 = circuit_inverse(in2); + let t1 = circuit_mul(in1, t0); + let t2 = circuit_sub(in0, t1); + let t3 = circuit_sub(in0, in3); + let t4 = circuit_sub(in0, in4); + let t5 = circuit_inverse(in6); + let t6 = circuit_mul(in5, t5); + let t7 = circuit_sub(in0, t6); + let t8 = circuit_sub(in0, in7); + let t9 = circuit_sub(in0, in8); + + let modulus = TryInto::< + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t0, t2, t3, t4, t5, t7, t8, t9,).new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(p_0.x); + circuit_inputs = circuit_inputs.next(p_0.y); + circuit_inputs = circuit_inputs.next(Qy0_0); + circuit_inputs = circuit_inputs.next(Qy1_0); + circuit_inputs = circuit_inputs.next(p_1.x); + circuit_inputs = circuit_inputs.next(p_1.y); + circuit_inputs = circuit_inputs.next(Qy0_1); + circuit_inputs = circuit_inputs.next(Qy1_1); let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let final_check: u384 = outputs.get_output(t647); - return (final_check,); + let p_0: BNProcessedPair = BNProcessedPair { + yInv: outputs.get_output(t0), + xNegOverY: outputs.get_output(t2), + QyNeg0: outputs.get_output(t3), + QyNeg1: outputs.get_output(t4) + }; + let p_1: BNProcessedPair = BNProcessedPair { + yInv: outputs.get_output(t5), + xNegOverY: outputs.get_output(t7), + QyNeg0: outputs.get_output(t8), + QyNeg1: outputs.get_output(t9) + }; + return (p_0, p_1); } -fn run_BN254_MP_CHECK_INIT_BIT_2_circuit( - yInv_0: u384, - xNegOverY_0: u384, - Q0: G2Point, - yInv_1: u384, - xNegOverY_1: u384, - Q1: G2Point, - R_i: E12D, - c0: u384, - z: u384, - c_inv_of_z: u384, - previous_lhs: u384 -) -> (G2Point, G2Point, u384, u384, u384) { +fn run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit( + p_0: G1Point, + Qy0_0: u384, + Qy1_0: u384, + p_1: G1Point, + Qy0_1: u384, + Qy1_1: u384, + p_2: G1Point, + Qy0_2: u384, + Qy1_2: u384 +) -> (BNProcessedPair, BNProcessedPair, BNProcessedPair) { // CONSTANT stack - let in0 = CE::> {}; // 0x3 - let in1 = CE::> {}; // 0x6 - let in2 = CE::> {}; // 0x0 - let in3 = CE::> {}; // -0x9 % p - let in4 = CE::> {}; // 0x1 + let in0 = CE::> {}; // 0x0 // INPUT stack + let (in1, in2) = (CE::> {}, CE::> {}); + let (in3, in4) = (CE::> {}, CE::> {}); let (in5, in6) = (CE::> {}, CE::> {}); let (in7, in8) = (CE::> {}, CE::> {}); let (in9, in10) = (CE::> {}, CE::> {}); let (in11, in12) = (CE::> {}, CE::> {}); - let (in13, in14) = (CE::> {}, CE::> {}); - let (in15, in16) = (CE::> {}, CE::> {}); - let (in17, in18) = (CE::> {}, CE::> {}); - let (in19, in20) = (CE::> {}, CE::> {}); - let (in21, in22) = (CE::> {}, CE::> {}); - let (in23, in24) = (CE::> {}, CE::> {}); - let (in25, in26) = (CE::> {}, CE::> {}); - let (in27, in28) = (CE::> {}, CE::> {}); - let (in29, in30) = (CE::> {}, CE::> {}); - let (in31, in32) = (CE::> {}, CE::> {}); - let t0 = circuit_mul(in30, in30); // Compute z^2 - let t1 = circuit_mul(t0, in30); // Compute z^3 - let t2 = circuit_mul(t1, in30); // Compute z^4 - let t3 = circuit_mul(t2, in30); // Compute z^5 - let t4 = circuit_mul(t3, in30); // Compute z^6 - let t5 = circuit_mul(t4, in30); // Compute z^7 - let t6 = circuit_mul(t5, in30); // Compute z^8 - let t7 = circuit_mul(t6, in30); // Compute z^9 - let t8 = circuit_mul(t7, in30); // Compute z^10 - let t9 = circuit_mul(t8, in30); // Compute z^11 - let t10 = circuit_mul(in18, in30); // Eval UnnamedPoly step coeff_1 * z^1 - let t11 = circuit_add(in17, t10); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t12 = circuit_mul(in19, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t13 = circuit_add(t11, t12); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t14 = circuit_mul(in20, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t15 = circuit_add(t13, t14); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t16 = circuit_mul(in21, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t17 = circuit_add(t15, t16); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t18 = circuit_mul(in22, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t19 = circuit_add(t17, t18); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t20 = circuit_mul(in23, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t21 = circuit_add(t19, t20); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t22 = circuit_mul(in24, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t23 = circuit_add(t21, t22); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t24 = circuit_mul(in25, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t25 = circuit_add(t23, t24); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t26 = circuit_mul(in26, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t27 = circuit_add(t25, t26); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t28 = circuit_mul(in27, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t29 = circuit_add(t27, t28); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t30 = circuit_mul(in28, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t31 = circuit_add(t29, t30); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t32 = circuit_mul(in31, in31); - let t33 = circuit_mul(in29, in29); - let t34 = circuit_add(in7, in8); // Doubling slope numerator start - let t35 = circuit_sub(in7, in8); - let t36 = circuit_mul(t34, t35); - let t37 = circuit_mul(in7, in8); - let t38 = circuit_mul(t36, in0); - let t39 = circuit_mul(t37, in1); // Doubling slope numerator end - let t40 = circuit_add(in9, in9); // Fp2 add coeff 0/1 - let t41 = circuit_add(in10, in10); // Fp2 add coeff 1/1 - let t42 = circuit_mul(t40, t40); // Fp2 Div x/y start : Fp2 Inv y start - let t43 = circuit_mul(t41, t41); - let t44 = circuit_add(t42, t43); - let t45 = circuit_inverse(t44); - let t46 = circuit_mul(t40, t45); // Fp2 Inv y real part end - let t47 = circuit_mul(t41, t45); - let t48 = circuit_sub(in2, t47); // Fp2 Inv y imag part end - let t49 = circuit_mul(t38, t46); // Fp2 mul start - let t50 = circuit_mul(t39, t48); - let t51 = circuit_sub(t49, t50); // Fp2 mul real part end - let t52 = circuit_mul(t38, t48); - let t53 = circuit_mul(t39, t46); - let t54 = circuit_add(t52, t53); // Fp2 mul imag part end - let t55 = circuit_add(t51, t54); - let t56 = circuit_sub(t51, t54); - let t57 = circuit_mul(t55, t56); - let t58 = circuit_mul(t51, t54); - let t59 = circuit_add(t58, t58); - let t60 = circuit_add(in7, in7); // Fp2 add coeff 0/1 - let t61 = circuit_add(in8, in8); // Fp2 add coeff 1/1 - let t62 = circuit_sub(t57, t60); // Fp2 sub coeff 0/1 - let t63 = circuit_sub(t59, t61); // Fp2 sub coeff 1/1 - let t64 = circuit_sub(in7, t62); // Fp2 sub coeff 0/1 - let t65 = circuit_sub(in8, t63); // Fp2 sub coeff 1/1 - let t66 = circuit_mul(t51, t64); // Fp2 mul start - let t67 = circuit_mul(t54, t65); - let t68 = circuit_sub(t66, t67); // Fp2 mul real part end - let t69 = circuit_mul(t51, t65); - let t70 = circuit_mul(t54, t64); - let t71 = circuit_add(t69, t70); // Fp2 mul imag part end - let t72 = circuit_sub(t68, in9); // Fp2 sub coeff 0/1 - let t73 = circuit_sub(t71, in10); // Fp2 sub coeff 1/1 - let t74 = circuit_mul(t51, in7); // Fp2 mul start - let t75 = circuit_mul(t54, in8); - let t76 = circuit_sub(t74, t75); // Fp2 mul real part end - let t77 = circuit_mul(t51, in8); - let t78 = circuit_mul(t54, in7); - let t79 = circuit_add(t77, t78); // Fp2 mul imag part end - let t80 = circuit_sub(t76, in9); // Fp2 sub coeff 0/1 - let t81 = circuit_sub(t79, in10); // Fp2 sub coeff 1/1 - let t82 = circuit_mul(in3, t54); - let t83 = circuit_add(t51, t82); - let t84 = circuit_mul(t83, in6); - let t85 = circuit_mul(in3, t81); - let t86 = circuit_add(t80, t85); - let t87 = circuit_mul(t86, in5); - let t88 = circuit_mul(t54, in6); - let t89 = circuit_mul(t81, in5); - let t90 = circuit_mul(t84, in30); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t91 = circuit_add(in4, t90); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t92 = circuit_mul(t87, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t93 = circuit_add(t91, t92); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t94 = circuit_mul(t88, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t95 = circuit_add(t93, t94); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t96 = circuit_mul(t89, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t97 = circuit_add(t95, t96); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t98 = circuit_mul(t32, t97); - let t99 = circuit_add(in13, in14); // Doubling slope numerator start - let t100 = circuit_sub(in13, in14); - let t101 = circuit_mul(t99, t100); - let t102 = circuit_mul(in13, in14); - let t103 = circuit_mul(t101, in0); - let t104 = circuit_mul(t102, in1); // Doubling slope numerator end - let t105 = circuit_add(in15, in15); // Fp2 add coeff 0/1 - let t106 = circuit_add(in16, in16); // Fp2 add coeff 1/1 - let t107 = circuit_mul(t105, t105); // Fp2 Div x/y start : Fp2 Inv y start - let t108 = circuit_mul(t106, t106); - let t109 = circuit_add(t107, t108); - let t110 = circuit_inverse(t109); - let t111 = circuit_mul(t105, t110); // Fp2 Inv y real part end - let t112 = circuit_mul(t106, t110); - let t113 = circuit_sub(in2, t112); // Fp2 Inv y imag part end - let t114 = circuit_mul(t103, t111); // Fp2 mul start - let t115 = circuit_mul(t104, t113); - let t116 = circuit_sub(t114, t115); // Fp2 mul real part end - let t117 = circuit_mul(t103, t113); - let t118 = circuit_mul(t104, t111); - let t119 = circuit_add(t117, t118); // Fp2 mul imag part end - let t120 = circuit_add(t116, t119); - let t121 = circuit_sub(t116, t119); - let t122 = circuit_mul(t120, t121); - let t123 = circuit_mul(t116, t119); - let t124 = circuit_add(t123, t123); - let t125 = circuit_add(in13, in13); // Fp2 add coeff 0/1 - let t126 = circuit_add(in14, in14); // Fp2 add coeff 1/1 - let t127 = circuit_sub(t122, t125); // Fp2 sub coeff 0/1 - let t128 = circuit_sub(t124, t126); // Fp2 sub coeff 1/1 - let t129 = circuit_sub(in13, t127); // Fp2 sub coeff 0/1 - let t130 = circuit_sub(in14, t128); // Fp2 sub coeff 1/1 - let t131 = circuit_mul(t116, t129); // Fp2 mul start - let t132 = circuit_mul(t119, t130); - let t133 = circuit_sub(t131, t132); // Fp2 mul real part end - let t134 = circuit_mul(t116, t130); - let t135 = circuit_mul(t119, t129); - let t136 = circuit_add(t134, t135); // Fp2 mul imag part end - let t137 = circuit_sub(t133, in15); // Fp2 sub coeff 0/1 - let t138 = circuit_sub(t136, in16); // Fp2 sub coeff 1/1 - let t139 = circuit_mul(t116, in13); // Fp2 mul start - let t140 = circuit_mul(t119, in14); - let t141 = circuit_sub(t139, t140); // Fp2 mul real part end - let t142 = circuit_mul(t116, in14); - let t143 = circuit_mul(t119, in13); - let t144 = circuit_add(t142, t143); // Fp2 mul imag part end - let t145 = circuit_sub(t141, in15); // Fp2 sub coeff 0/1 - let t146 = circuit_sub(t144, in16); // Fp2 sub coeff 1/1 - let t147 = circuit_mul(in3, t119); - let t148 = circuit_add(t116, t147); - let t149 = circuit_mul(t148, in12); - let t150 = circuit_mul(in3, t146); - let t151 = circuit_add(t145, t150); - let t152 = circuit_mul(t151, in11); - let t153 = circuit_mul(t119, in12); - let t154 = circuit_mul(t146, in11); - let t155 = circuit_mul(t149, in30); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t156 = circuit_add(in4, t155); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t157 = circuit_mul(t152, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t158 = circuit_add(t156, t157); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t159 = circuit_mul(t153, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t160 = circuit_add(t158, t159); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t161 = circuit_mul(t154, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t162 = circuit_add(t160, t161); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t163 = circuit_mul(t98, t162); - let t164 = circuit_sub(t163, t31); - let t165 = circuit_mul(t33, t164); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) - let t166 = circuit_add(t165, in32); + let t0 = circuit_inverse(in2); + let t1 = circuit_mul(in1, t0); + let t2 = circuit_sub(in0, t1); + let t3 = circuit_sub(in0, in3); + let t4 = circuit_sub(in0, in4); + let t5 = circuit_inverse(in6); + let t6 = circuit_mul(in5, t5); + let t7 = circuit_sub(in0, t6); + let t8 = circuit_sub(in0, in7); + let t9 = circuit_sub(in0, in8); + let t10 = circuit_inverse(in10); + let t11 = circuit_mul(in9, t10); + let t12 = circuit_sub(in0, t11); + let t13 = circuit_sub(in0, in11); + let t14 = circuit_sub(in0, in12); let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] - ) - .unwrap(); - - let mut circuit_inputs = (t62, t63, t72, t73, t127, t128, t137, t138, t166, t33, t31,) - .new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(yInv_0); - circuit_inputs = circuit_inputs.next(xNegOverY_0); - circuit_inputs = circuit_inputs.next(Q0.x0); - circuit_inputs = circuit_inputs.next(Q0.x1); - circuit_inputs = circuit_inputs.next(Q0.y0); - circuit_inputs = circuit_inputs.next(Q0.y1); - circuit_inputs = circuit_inputs.next(yInv_1); - circuit_inputs = circuit_inputs.next(xNegOverY_1); - circuit_inputs = circuit_inputs.next(Q1.x0); - circuit_inputs = circuit_inputs.next(Q1.x1); - circuit_inputs = circuit_inputs.next(Q1.y0); - circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(R_i.w0); - circuit_inputs = circuit_inputs.next(R_i.w1); - circuit_inputs = circuit_inputs.next(R_i.w2); - circuit_inputs = circuit_inputs.next(R_i.w3); - circuit_inputs = circuit_inputs.next(R_i.w4); - circuit_inputs = circuit_inputs.next(R_i.w5); - circuit_inputs = circuit_inputs.next(R_i.w6); - circuit_inputs = circuit_inputs.next(R_i.w7); - circuit_inputs = circuit_inputs.next(R_i.w8); - circuit_inputs = circuit_inputs.next(R_i.w9); - circuit_inputs = circuit_inputs.next(R_i.w10); - circuit_inputs = circuit_inputs.next(R_i.w11); - circuit_inputs = circuit_inputs.next(c0); - circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(c_inv_of_z); - circuit_inputs = circuit_inputs.next(previous_lhs); + _, CircuitModulus + >::try_into( + [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] + ) + .unwrap(); + + let mut circuit_inputs = (t0, t2, t3, t4, t5, t7, t8, t9, t10, t12, t13, t14,).new_inputs(); + // Prefill constants: + circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); + circuit_inputs = circuit_inputs.next(p_0.x); + circuit_inputs = circuit_inputs.next(p_0.y); + circuit_inputs = circuit_inputs.next(Qy0_0); + circuit_inputs = circuit_inputs.next(Qy1_0); + circuit_inputs = circuit_inputs.next(p_1.x); + circuit_inputs = circuit_inputs.next(p_1.y); + circuit_inputs = circuit_inputs.next(Qy0_1); + circuit_inputs = circuit_inputs.next(Qy1_1); + circuit_inputs = circuit_inputs.next(p_2.x); + circuit_inputs = circuit_inputs.next(p_2.y); + circuit_inputs = circuit_inputs.next(Qy0_2); + circuit_inputs = circuit_inputs.next(Qy1_2); let outputs = match circuit_inputs.done().eval(modulus) { Result::Ok(outputs) => { outputs }, Result::Err(_) => { panic!("Expected success") } }; - let Q0: G2Point = G2Point { - x0: outputs.get_output(t62), - x1: outputs.get_output(t63), - y0: outputs.get_output(t72), - y1: outputs.get_output(t73) + let p_0: BNProcessedPair = BNProcessedPair { + yInv: outputs.get_output(t0), + xNegOverY: outputs.get_output(t2), + QyNeg0: outputs.get_output(t3), + QyNeg1: outputs.get_output(t4) }; - let Q1: G2Point = G2Point { - x0: outputs.get_output(t127), - x1: outputs.get_output(t128), - y0: outputs.get_output(t137), - y1: outputs.get_output(t138) + let p_1: BNProcessedPair = BNProcessedPair { + yInv: outputs.get_output(t5), + xNegOverY: outputs.get_output(t7), + QyNeg0: outputs.get_output(t8), + QyNeg1: outputs.get_output(t9) }; - let new_lhs: u384 = outputs.get_output(t166); - let c_i: u384 = outputs.get_output(t33); - let f_i_plus_one_of_z: u384 = outputs.get_output(t31); - return (Q0, Q1, new_lhs, c_i, f_i_plus_one_of_z); + let p_2: BNProcessedPair = BNProcessedPair { + yInv: outputs.get_output(t10), + xNegOverY: outputs.get_output(t12), + QyNeg0: outputs.get_output(t13), + QyNeg1: outputs.get_output(t14) + }; + return (p_0, p_1, p_2); } -fn run_BN254_MP_CHECK_INIT_BIT_3_circuit( - yInv_0: u384, - xNegOverY_0: u384, - Q0: G2Point, - yInv_1: u384, - xNegOverY_1: u384, - Q1: G2Point, - yInv_2: u384, - xNegOverY_2: u384, - Q2: G2Point, - R_i: E12D, - c0: u384, - z: u384, - c_inv_of_z: u384, - previous_lhs: u384 -) -> (G2Point, G2Point, G2Point, u384, u384, u384) { - // CONSTANT stack - let in0 = CE::> {}; // 0x3 - let in1 = CE::> {}; // 0x6 - let in2 = CE::> {}; // 0x0 - let in3 = CE::> {}; // -0x9 % p - let in4 = CE::> {}; // 0x1 - // INPUT stack - let (in5, in6) = (CE::> {}, CE::> {}); - let (in7, in8) = (CE::> {}, CE::> {}); - let (in9, in10) = (CE::> {}, CE::> {}); - let (in11, in12) = (CE::> {}, CE::> {}); - let (in13, in14) = (CE::> {}, CE::> {}); - let (in15, in16) = (CE::> {}, CE::> {}); - let (in17, in18) = (CE::> {}, CE::> {}); - let (in19, in20) = (CE::> {}, CE::> {}); - let (in21, in22) = (CE::> {}, CE::> {}); - let (in23, in24) = (CE::> {}, CE::> {}); - let (in25, in26) = (CE::> {}, CE::> {}); - let (in27, in28) = (CE::> {}, CE::> {}); - let (in29, in30) = (CE::> {}, CE::> {}); - let (in31, in32) = (CE::> {}, CE::> {}); - let (in33, in34) = (CE::> {}, CE::> {}); - let (in35, in36) = (CE::> {}, CE::> {}); - let (in37, in38) = (CE::> {}, CE::> {}); - let t0 = circuit_mul(in36, in36); // Compute z^2 - let t1 = circuit_mul(t0, in36); // Compute z^3 - let t2 = circuit_mul(t1, in36); // Compute z^4 - let t3 = circuit_mul(t2, in36); // Compute z^5 - let t4 = circuit_mul(t3, in36); // Compute z^6 - let t5 = circuit_mul(t4, in36); // Compute z^7 - let t6 = circuit_mul(t5, in36); // Compute z^8 - let t7 = circuit_mul(t6, in36); // Compute z^9 - let t8 = circuit_mul(t7, in36); // Compute z^10 - let t9 = circuit_mul(t8, in36); // Compute z^11 - let t10 = circuit_mul(in24, in36); // Eval UnnamedPoly step coeff_1 * z^1 - let t11 = circuit_add(in23, t10); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t12 = circuit_mul(in25, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t13 = circuit_add(t11, t12); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t14 = circuit_mul(in26, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t15 = circuit_add(t13, t14); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t16 = circuit_mul(in27, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t17 = circuit_add(t15, t16); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t18 = circuit_mul(in28, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t19 = circuit_add(t17, t18); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t20 = circuit_mul(in29, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t21 = circuit_add(t19, t20); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t22 = circuit_mul(in30, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t23 = circuit_add(t21, t22); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t24 = circuit_mul(in31, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t25 = circuit_add(t23, t24); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t26 = circuit_mul(in32, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t27 = circuit_add(t25, t26); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t28 = circuit_mul(in33, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t29 = circuit_add(t27, t28); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t30 = circuit_mul(in34, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t31 = circuit_add(t29, t30); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t32 = circuit_mul(in37, in37); - let t33 = circuit_mul(in35, in35); - let t34 = circuit_add(in7, in8); // Doubling slope numerator start - let t35 = circuit_sub(in7, in8); - let t36 = circuit_mul(t34, t35); - let t37 = circuit_mul(in7, in8); - let t38 = circuit_mul(t36, in0); - let t39 = circuit_mul(t37, in1); // Doubling slope numerator end - let t40 = circuit_add(in9, in9); // Fp2 add coeff 0/1 - let t41 = circuit_add(in10, in10); // Fp2 add coeff 1/1 - let t42 = circuit_mul(t40, t40); // Fp2 Div x/y start : Fp2 Inv y start - let t43 = circuit_mul(t41, t41); - let t44 = circuit_add(t42, t43); - let t45 = circuit_inverse(t44); - let t46 = circuit_mul(t40, t45); // Fp2 Inv y real part end - let t47 = circuit_mul(t41, t45); - let t48 = circuit_sub(in2, t47); // Fp2 Inv y imag part end - let t49 = circuit_mul(t38, t46); // Fp2 mul start - let t50 = circuit_mul(t39, t48); - let t51 = circuit_sub(t49, t50); // Fp2 mul real part end - let t52 = circuit_mul(t38, t48); - let t53 = circuit_mul(t39, t46); - let t54 = circuit_add(t52, t53); // Fp2 mul imag part end - let t55 = circuit_add(t51, t54); - let t56 = circuit_sub(t51, t54); - let t57 = circuit_mul(t55, t56); - let t58 = circuit_mul(t51, t54); - let t59 = circuit_add(t58, t58); - let t60 = circuit_add(in7, in7); // Fp2 add coeff 0/1 - let t61 = circuit_add(in8, in8); // Fp2 add coeff 1/1 - let t62 = circuit_sub(t57, t60); // Fp2 sub coeff 0/1 - let t63 = circuit_sub(t59, t61); // Fp2 sub coeff 1/1 - let t64 = circuit_sub(in7, t62); // Fp2 sub coeff 0/1 - let t65 = circuit_sub(in8, t63); // Fp2 sub coeff 1/1 - let t66 = circuit_mul(t51, t64); // Fp2 mul start - let t67 = circuit_mul(t54, t65); - let t68 = circuit_sub(t66, t67); // Fp2 mul real part end - let t69 = circuit_mul(t51, t65); - let t70 = circuit_mul(t54, t64); - let t71 = circuit_add(t69, t70); // Fp2 mul imag part end - let t72 = circuit_sub(t68, in9); // Fp2 sub coeff 0/1 - let t73 = circuit_sub(t71, in10); // Fp2 sub coeff 1/1 - let t74 = circuit_mul(t51, in7); // Fp2 mul start - let t75 = circuit_mul(t54, in8); - let t76 = circuit_sub(t74, t75); // Fp2 mul real part end - let t77 = circuit_mul(t51, in8); - let t78 = circuit_mul(t54, in7); - let t79 = circuit_add(t77, t78); // Fp2 mul imag part end - let t80 = circuit_sub(t76, in9); // Fp2 sub coeff 0/1 - let t81 = circuit_sub(t79, in10); // Fp2 sub coeff 1/1 - let t82 = circuit_mul(in3, t54); - let t83 = circuit_add(t51, t82); - let t84 = circuit_mul(t83, in6); - let t85 = circuit_mul(in3, t81); - let t86 = circuit_add(t80, t85); - let t87 = circuit_mul(t86, in5); - let t88 = circuit_mul(t54, in6); - let t89 = circuit_mul(t81, in5); - let t90 = circuit_mul(t84, in36); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t91 = circuit_add(in4, t90); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t92 = circuit_mul(t87, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t93 = circuit_add(t91, t92); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t94 = circuit_mul(t88, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t95 = circuit_add(t93, t94); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t96 = circuit_mul(t89, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t97 = circuit_add(t95, t96); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t98 = circuit_mul(t32, t97); - let t99 = circuit_add(in13, in14); // Doubling slope numerator start - let t100 = circuit_sub(in13, in14); - let t101 = circuit_mul(t99, t100); - let t102 = circuit_mul(in13, in14); - let t103 = circuit_mul(t101, in0); - let t104 = circuit_mul(t102, in1); // Doubling slope numerator end - let t105 = circuit_add(in15, in15); // Fp2 add coeff 0/1 - let t106 = circuit_add(in16, in16); // Fp2 add coeff 1/1 - let t107 = circuit_mul(t105, t105); // Fp2 Div x/y start : Fp2 Inv y start - let t108 = circuit_mul(t106, t106); - let t109 = circuit_add(t107, t108); - let t110 = circuit_inverse(t109); - let t111 = circuit_mul(t105, t110); // Fp2 Inv y real part end - let t112 = circuit_mul(t106, t110); - let t113 = circuit_sub(in2, t112); // Fp2 Inv y imag part end - let t114 = circuit_mul(t103, t111); // Fp2 mul start - let t115 = circuit_mul(t104, t113); - let t116 = circuit_sub(t114, t115); // Fp2 mul real part end - let t117 = circuit_mul(t103, t113); - let t118 = circuit_mul(t104, t111); - let t119 = circuit_add(t117, t118); // Fp2 mul imag part end - let t120 = circuit_add(t116, t119); - let t121 = circuit_sub(t116, t119); - let t122 = circuit_mul(t120, t121); - let t123 = circuit_mul(t116, t119); - let t124 = circuit_add(t123, t123); - let t125 = circuit_add(in13, in13); // Fp2 add coeff 0/1 - let t126 = circuit_add(in14, in14); // Fp2 add coeff 1/1 - let t127 = circuit_sub(t122, t125); // Fp2 sub coeff 0/1 - let t128 = circuit_sub(t124, t126); // Fp2 sub coeff 1/1 - let t129 = circuit_sub(in13, t127); // Fp2 sub coeff 0/1 - let t130 = circuit_sub(in14, t128); // Fp2 sub coeff 1/1 - let t131 = circuit_mul(t116, t129); // Fp2 mul start - let t132 = circuit_mul(t119, t130); - let t133 = circuit_sub(t131, t132); // Fp2 mul real part end - let t134 = circuit_mul(t116, t130); - let t135 = circuit_mul(t119, t129); - let t136 = circuit_add(t134, t135); // Fp2 mul imag part end - let t137 = circuit_sub(t133, in15); // Fp2 sub coeff 0/1 - let t138 = circuit_sub(t136, in16); // Fp2 sub coeff 1/1 - let t139 = circuit_mul(t116, in13); // Fp2 mul start - let t140 = circuit_mul(t119, in14); - let t141 = circuit_sub(t139, t140); // Fp2 mul real part end - let t142 = circuit_mul(t116, in14); - let t143 = circuit_mul(t119, in13); - let t144 = circuit_add(t142, t143); // Fp2 mul imag part end - let t145 = circuit_sub(t141, in15); // Fp2 sub coeff 0/1 - let t146 = circuit_sub(t144, in16); // Fp2 sub coeff 1/1 - let t147 = circuit_mul(in3, t119); - let t148 = circuit_add(t116, t147); - let t149 = circuit_mul(t148, in12); - let t150 = circuit_mul(in3, t146); - let t151 = circuit_add(t145, t150); - let t152 = circuit_mul(t151, in11); - let t153 = circuit_mul(t119, in12); - let t154 = circuit_mul(t146, in11); - let t155 = circuit_mul(t149, in36); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t156 = circuit_add(in4, t155); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t157 = circuit_mul(t152, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t158 = circuit_add(t156, t157); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t159 = circuit_mul(t153, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t160 = circuit_add(t158, t159); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t161 = circuit_mul(t154, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t162 = circuit_add(t160, t161); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t163 = circuit_mul(t98, t162); - let t164 = circuit_add(in19, in20); // Doubling slope numerator start - let t165 = circuit_sub(in19, in20); - let t166 = circuit_mul(t164, t165); - let t167 = circuit_mul(in19, in20); - let t168 = circuit_mul(t166, in0); - let t169 = circuit_mul(t167, in1); // Doubling slope numerator end - let t170 = circuit_add(in21, in21); // Fp2 add coeff 0/1 - let t171 = circuit_add(in22, in22); // Fp2 add coeff 1/1 - let t172 = circuit_mul(t170, t170); // Fp2 Div x/y start : Fp2 Inv y start - let t173 = circuit_mul(t171, t171); - let t174 = circuit_add(t172, t173); - let t175 = circuit_inverse(t174); - let t176 = circuit_mul(t170, t175); // Fp2 Inv y real part end - let t177 = circuit_mul(t171, t175); - let t178 = circuit_sub(in2, t177); // Fp2 Inv y imag part end - let t179 = circuit_mul(t168, t176); // Fp2 mul start - let t180 = circuit_mul(t169, t178); - let t181 = circuit_sub(t179, t180); // Fp2 mul real part end - let t182 = circuit_mul(t168, t178); - let t183 = circuit_mul(t169, t176); - let t184 = circuit_add(t182, t183); // Fp2 mul imag part end - let t185 = circuit_add(t181, t184); - let t186 = circuit_sub(t181, t184); - let t187 = circuit_mul(t185, t186); - let t188 = circuit_mul(t181, t184); - let t189 = circuit_add(t188, t188); - let t190 = circuit_add(in19, in19); // Fp2 add coeff 0/1 - let t191 = circuit_add(in20, in20); // Fp2 add coeff 1/1 - let t192 = circuit_sub(t187, t190); // Fp2 sub coeff 0/1 - let t193 = circuit_sub(t189, t191); // Fp2 sub coeff 1/1 - let t194 = circuit_sub(in19, t192); // Fp2 sub coeff 0/1 - let t195 = circuit_sub(in20, t193); // Fp2 sub coeff 1/1 - let t196 = circuit_mul(t181, t194); // Fp2 mul start - let t197 = circuit_mul(t184, t195); - let t198 = circuit_sub(t196, t197); // Fp2 mul real part end - let t199 = circuit_mul(t181, t195); - let t200 = circuit_mul(t184, t194); - let t201 = circuit_add(t199, t200); // Fp2 mul imag part end - let t202 = circuit_sub(t198, in21); // Fp2 sub coeff 0/1 - let t203 = circuit_sub(t201, in22); // Fp2 sub coeff 1/1 - let t204 = circuit_mul(t181, in19); // Fp2 mul start - let t205 = circuit_mul(t184, in20); - let t206 = circuit_sub(t204, t205); // Fp2 mul real part end - let t207 = circuit_mul(t181, in20); - let t208 = circuit_mul(t184, in19); - let t209 = circuit_add(t207, t208); // Fp2 mul imag part end - let t210 = circuit_sub(t206, in21); // Fp2 sub coeff 0/1 - let t211 = circuit_sub(t209, in22); // Fp2 sub coeff 1/1 - let t212 = circuit_mul(in3, t184); - let t213 = circuit_add(t181, t212); - let t214 = circuit_mul(t213, in18); - let t215 = circuit_mul(in3, t211); - let t216 = circuit_add(t210, t215); - let t217 = circuit_mul(t216, in17); - let t218 = circuit_mul(t184, in18); - let t219 = circuit_mul(t211, in17); - let t220 = circuit_mul(t214, in36); // Eval sparse poly UnnamedPoly step coeff_1 * z^1 - let t221 = circuit_add(in4, t220); // Eval sparse poly UnnamedPoly step + coeff_1 * z^1 - let t222 = circuit_mul(t217, t1); // Eval sparse poly UnnamedPoly step coeff_3 * z^3 - let t223 = circuit_add(t221, t222); // Eval sparse poly UnnamedPoly step + coeff_3 * z^3 - let t224 = circuit_mul(t218, t5); // Eval sparse poly UnnamedPoly step coeff_7 * z^7 - let t225 = circuit_add(t223, t224); // Eval sparse poly UnnamedPoly step + coeff_7 * z^7 - let t226 = circuit_mul(t219, t7); // Eval sparse poly UnnamedPoly step coeff_9 * z^9 - let t227 = circuit_add(t225, t226); // Eval sparse poly UnnamedPoly step + coeff_9 * z^9 - let t228 = circuit_mul(t163, t227); - let t229 = circuit_sub(t228, t31); - let t230 = circuit_mul(t33, t229); // ci * ((Π(i,k) (Pk(z)) - Ri(z)) - let t231 = circuit_add(t230, in38); +#[cfg(test)] +mod tests { + use core::traits::TryInto; + + use core::circuit::{ + RangeCheck96, AddMod, MulMod, u96, CircuitElement, CircuitInput, circuit_add, circuit_sub, + circuit_mul, circuit_inverse, EvalCircuitResult, EvalCircuitTrait, u384, + CircuitOutputsTrait, CircuitModulus, AddInputResultTrait, CircuitInputs + }; + use garaga::definitions::{ + G1Point, G2Point, E12D, E12DMulQuotient, G1G2Pair, BNProcessedPair, BLSProcessedPair, + MillerLoopResultScalingFactor + }; + + use super::{ + run_BLS12_381_MP_CHECK_BIT00_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT00_LOOP_3_circuit, + run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit, + run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit, + run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit, + run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit, run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit, + run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit, + run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit, + run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit, + run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit, run_BN254_MP_CHECK_BIT00_LOOP_2_circuit, + run_BN254_MP_CHECK_BIT00_LOOP_3_circuit, run_BN254_MP_CHECK_BIT0_LOOP_2_circuit, + run_BN254_MP_CHECK_BIT0_LOOP_3_circuit, run_BN254_MP_CHECK_BIT1_LOOP_2_circuit, + run_BN254_MP_CHECK_BIT1_LOOP_3_circuit, run_BN254_MP_CHECK_FINALIZE_BN_2_circuit, + run_BN254_MP_CHECK_FINALIZE_BN_3_circuit, run_BN254_MP_CHECK_INIT_BIT_2_circuit, + run_BN254_MP_CHECK_INIT_BIT_3_circuit, run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit, + run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit, run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit + }; + + + #[test] + fn test_run_BLS12_381_MP_CHECK_BIT00_LOOP_2_circuit_BLS12_381() { + let yInv_0: u384 = u384 { + limb0: 7344375013155839704235761907, + limb1: 48273819813794874126598246896, + limb2: 8212944115960915612535652144, + limb3: 789118759631779438967974766 + }; + + let xNegOverY_0: u384 = u384 { + limb0: 11199451867686411030904116961, + limb1: 23560028193285502915579917362, + limb2: 10205980404403332575893249337, + limb3: 6555324516621652209185464006 + }; + + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 13322938056982841566354048681, + limb1: 67120715755219753377435418049, + limb2: 56741575974787021219112902926, + limb3: 7966334379181375395605664618 + }, + x1: u384 { + limb0: 70406565377771408063421978991, + limb1: 33696328349706465951703434627, + limb2: 48890225480852673905029901012, + limb3: 7537094107950334827451857815 + }, + y0: u384 { + limb0: 13998717374346555009553398208, + limb1: 6188020863925428834550824929, + limb2: 54189499951819063143212931861, + limb3: 764848010860223842672972002 + }, + y1: u384 { + limb0: 71286351052240350032884527152, + limb1: 67858259665079789987883550363, + limb2: 50484796833791973214974988181, + limb3: 7376486033534650187790959586 + } + }; + + let yInv_1: u384 = u384 { + limb0: 3847347028240307929246399105, + limb1: 60194970441408476461693590109, + limb2: 41355117943048391081747246607, + limb3: 1183267223458063459632782176 + }; + + let xNegOverY_1: u384 = u384 { + limb0: 53784328999925180959612869201, + limb1: 50926788905811066866496819592, + limb2: 3517343427745822223697238218, + limb3: 3914365279398980996613340968 + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 74150806274773668696412968848, + limb1: 7686098532583279797629449976, + limb2: 26913068544381136591393694309, + limb3: 5126599295521789751268176334 + }, + x1: u384 { + limb0: 10073462748672601989498419307, + limb1: 54654415088456144294999564343, + limb2: 37545080928110030572454027642, + limb3: 1679830964493808139838706960 + }, + y0: u384 { + limb0: 21208629679393236999076415741, + limb1: 36687453609278002520965083956, + limb2: 28142932631205916663818815322, + limb3: 5195821438935458098714276532 + }, + y1: u384 { + limb0: 22149704405714006878620096118, + limb1: 72945427846282826319270372708, + limb2: 78049924360066542745432526213, + limb3: 5792264195891124168177567243 + } + }; + + let lhs_i: u384 = u384 { + limb0: 49982668527670591791059261963, + limb1: 42967166419165953449936869781, + limb2: 41482657112546627783395518321, + limb3: 7622042126728444169206184623 + }; + + let f_i_of_z: u384 = u384 { + limb0: 58204414064505455420866124647, + limb1: 73153589601613689156375267321, + limb2: 21968407784898399973182034977, + limb3: 5915880208989073166479306160 + }; + + let f_i_plus_one = E12D { + w0: u384 { + limb0: 75834859930122649566331474716, + limb1: 22107946145179706521044956801, + limb2: 70293036018382830471602169984, + limb3: 7925488250449650257093015563 + }, + w1: u384 { + limb0: 66213185873935939886185491887, + limb1: 8512265680627107983630990646, + limb2: 1815684477943851375504057262, + limb3: 2477395319112873323618396314 + }, + w2: u384 { + limb0: 13733158054783705139029581344, + limb1: 41742718178206473532417000575, + limb2: 12712349049658973026798525814, + limb3: 7061162935542359164985792314 + }, + w3: u384 { + limb0: 73304916473177943818114629347, + limb1: 57996239034632217999064063088, + limb2: 47949313112734450911023209891, + limb3: 5731468658094848977391747886 + }, + w4: u384 { + limb0: 18222947585319780720874063305, + limb1: 60907350997149395137198381388, + limb2: 59817832410992920215861147744, + limb3: 2552587355456280819129893757 + }, + w5: u384 { + limb0: 50960506429047088541928462508, + limb1: 9003354723369032131910273213, + limb2: 7715315562854861341619218230, + limb3: 1628597145330323242427857260 + }, + w6: u384 { + limb0: 45613207976562493705236190269, + limb1: 33317040226367365341840503416, + limb2: 5870151008104524133305326782, + limb3: 7150434705568940705534372565 + }, + w7: u384 { + limb0: 49713437368568408465958301167, + limb1: 58220128375993941639637268691, + limb2: 68759225742249681882374654808, + limb3: 336485674369308822160667671 + }, + w8: u384 { + limb0: 63427004947453722986484747233, + limb1: 44389808160445879851412315862, + limb2: 53086363961042498922605184075, + limb3: 436515910710610609408240751 + }, + w9: u384 { + limb0: 35216425251085549583356748669, + limb1: 49853272411876124192218639439, + limb2: 10810551671647617275596190907, + limb3: 337329549855947204382395047 + }, + w10: u384 { + limb0: 73468994460072017165699042992, + limb1: 16322586100843699485616083467, + limb2: 40680255971072468006922858313, + limb3: 7234890367282600292153020257 + }, + w11: u384 { + limb0: 10411529522952050124971590161, + limb1: 49486387728646292700381512678, + limb2: 16401843298178622311075890899, + limb3: 31814016576296661412465916 + } + }; + + let ci: u384 = u384 { + limb0: 34570267907358593199727400635, + limb1: 74997625163783029950476202302, + limb2: 13192491231654348512964216956, + limb3: 3634849995762871431045387557 + }; + + let z: u384 = u384 { + limb0: 31165246239988695484247940304, + limb1: 29765569664200681455665327480, + limb2: 379778966766573485, + limb3: 0 + }; + + let ( + Q0_result, + Q1_result, + f_i_plus_one_of_z_result, + lhs_i_plus_one_result, + ci_plus_one_result + ) = + run_BLS12_381_MP_CHECK_BIT00_LOOP_2_circuit( + yInv_0, xNegOverY_0, Q0, yInv_1, xNegOverY_1, Q1, lhs_i, f_i_of_z, f_i_plus_one, ci, z + ); + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 30752609711344858566688608908, + limb1: 1497975434082701038946480452, + limb2: 68231779853369120207791776956, + limb3: 2059283811017879860402694228 + }, + x1: u384 { + limb0: 60650244343591815938978082756, + limb1: 4367010037230095190731012093, + limb2: 33343124607734669192425347422, + limb3: 408138305341003389338374875 + }, + y0: u384 { + limb0: 69170271881282864269813296967, + limb1: 65110107158013504109588457959, + limb2: 77717039879528855789429159518, + limb3: 2044681853999956645594306024 + }, + y1: u384 { + limb0: 9623653043006144297520629580, + limb1: 30155614312356065260320238730, + limb2: 41806424855044996098540199783, + limb3: 2112776272665180650615335897 + } + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 51870375837097121029649467439, + limb1: 47022597054077365936625220793, + limb2: 63246762465112715132597159149, + limb3: 1537749529073135118798172838 + }, + x1: u384 { + limb0: 21945061653282731409158570298, + limb1: 74234973062573181077419229694, + limb2: 16568955155192762634128399784, + limb3: 2718214480593142213642566165 + }, + y0: u384 { + limb0: 45166542188039648717209928436, + limb1: 47895595084239233698211838413, + limb2: 65076599825461227353318804840, + limb3: 6261310281352722439907550525 + }, + y1: u384 { + limb0: 62536539990496209727283312403, + limb1: 69308101679313346153872091697, + limb2: 71572493130718644058018641036, + limb3: 3781453053013851609434902419 + } + }; + + let f_i_plus_one_of_z: u384 = u384 { + limb0: 20705458396310602503526387243, + limb1: 7501278780569076553812933036, + limb2: 40710132772782076821810430112, + limb3: 5604544072070965760002411963 + }; + + let lhs_i_plus_one: u384 = u384 { + limb0: 69048522459521629722449911445, + limb1: 46693778539163203432996421943, + limb2: 60778440948463335071589305931, + limb3: 6722923875355948971867589068 + }; + + let ci_plus_one: u384 = u384 { + limb0: 52003763477875349748172991707, + limb1: 23100571288286447064210556237, + limb2: 39877300447391627451008994725, + limb3: 2193771993860780808816632928 + }; + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); + assert_eq!(ci_plus_one_result, ci_plus_one); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_BIT00_LOOP_3_circuit_BLS12_381() { + let yInv_0: u384 = u384 { + limb0: 815894725481902667074648193, + limb1: 47208528053011196752562709988, + limb2: 22529201445295185575091678869, + limb3: 5920799479445628175778622511 + }; + + let xNegOverY_0: u384 = u384 { + limb0: 56357068461107729834364795331, + limb1: 38200062578760278260722815804, + limb2: 40588293199267004468414571935, + limb3: 646896919949626320411763461 + }; + + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 7009561245346038720077110016, + limb1: 12139853903083794143438819714, + limb2: 62026473730160023474626861106, + limb3: 1945040853441885722860208949 + }, + x1: u384 { + limb0: 76077618560384805781229436729, + limb1: 12673348618602849456301767861, + limb2: 39494866985954198578206953940, + limb3: 2421847756502534492786033816 + }, + y0: u384 { + limb0: 6202439326225025374759874545, + limb1: 72698342699992008007264626028, + limb2: 27640858905596583660823197396, + limb3: 4429763421702546755274559606 + }, + y1: u384 { + limb0: 55830960468852471565214726216, + limb1: 72793356308879072269416385756, + limb2: 15895970899188913513220913018, + limb3: 705405775717659174878324614 + } + }; + + let yInv_1: u384 = u384 { + limb0: 61304318483650783638623483353, + limb1: 49645327949933366642776003497, + limb2: 34614668614368479314479830140, + limb3: 2953110887144864612804175418 + }; + + let xNegOverY_1: u384 = u384 { + limb0: 39929013079309805546928031946, + limb1: 53922727088364717644554259348, + limb2: 4123582075179158883899400302, + limb3: 4453607279068019466033928739 + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 26065947307662396045633472449, + limb1: 32230763426215821572634037426, + limb2: 67663876279607154702852180658, + limb3: 8045324249089060062782800315 + }, + x1: u384 { + limb0: 40480281207323463805453132979, + limb1: 37787831680841616498674625317, + limb2: 19754267738029484702899678136, + limb3: 1740478055090748958509967456 + }, + y0: u384 { + limb0: 3595222672689865053019927263, + limb1: 54148142728856632718914838279, + limb2: 64229925031110320165662797506, + limb3: 2133166620509929243596810276 + }, + y1: u384 { + limb0: 18116853768159412343120336822, + limb1: 63000865417180871922102420668, + limb2: 70399990666027203551356458458, + limb3: 702592287089056937487543479 + } + }; + + let yInv_2: u384 = u384 { + limb0: 20127374873337477882305704674, + limb1: 53908060923323052783783004855, + limb2: 13480786820631452314013400938, + limb3: 3818088391041955112433529920 + }; + + let xNegOverY_2: u384 = u384 { + limb0: 20173949663431652856998563101, + limb1: 55828910985722536456382284801, + limb2: 13951686912085555677801385263, + limb3: 1332500384342745427198887837 + }; + + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 42811470812399008562446030430, + limb1: 22891377305726857788548751366, + limb2: 19807375948712055145251381803, + limb3: 5232463849133383202790178207 + }, + x1: u384 { + limb0: 40244951330184841449789215089, + limb1: 27761122337575846586217636408, + limb2: 23385861739524948465105119328, + limb3: 2135114932673449758318973142 + }, + y0: u384 { + limb0: 58539199347015098104376316130, + limb1: 11581801070717944926704163831, + limb2: 7895104975914800764585117874, + limb3: 431638768359181972350771182 + }, + y1: u384 { + limb0: 14568757707348615206782700479, + limb1: 22891359365712138830725021758, + limb2: 59146509987076999660030006892, + limb3: 7196130621820947583976935483 + } + }; + + let lhs_i: u384 = u384 { + limb0: 3509646953493546455335968282, + limb1: 28377025265953310667455869879, + limb2: 67932517346257342899638093795, + limb3: 2863972352210674288491767607 + }; + + let f_i_of_z: u384 = u384 { + limb0: 61167003318164758015914710473, + limb1: 67952024586398202530696823107, + limb2: 34477046274830489121500992180, + limb3: 4905186559274787093392101982 + }; + + let f_i_plus_one = E12D { + w0: u384 { + limb0: 65087853520896742076133370523, + limb1: 57731661826547070798977776087, + limb2: 37457283337925852102721294449, + limb3: 1528405518152763465799825455 + }, + w1: u384 { + limb0: 6344455894065058999421513308, + limb1: 76408511067119718759827293380, + limb2: 36078869033374480975867845999, + limb3: 7063006732685810807796313783 + }, + w2: u384 { + limb0: 73642699226173251177232726966, + limb1: 153093432215530225840134318, + limb2: 39065217515938826988366952780, + limb3: 2883871503658441656059568580 + }, + w3: u384 { + limb0: 54199747261734630097113781797, + limb1: 74175391682687870333370896162, + limb2: 5538750469960644257132186369, + limb3: 2085254727890494248865792175 + }, + w4: u384 { + limb0: 77735393985802253590713426664, + limb1: 27867213086285639966374638160, + limb2: 11466720957048582816848528487, + limb3: 4770536589068349725772393272 + }, + w5: u384 { + limb0: 5099497905033299758211782831, + limb1: 44797628104370347625472444756, + limb2: 10731180887662674351963878969, + limb3: 5204813563846424413575540003 + }, + w6: u384 { + limb0: 6424415750015539551999299858, + limb1: 336314705731102706893713482, + limb2: 46300711495617005168594687082, + limb3: 6668929189443698681991140452 + }, + w7: u384 { + limb0: 71355009610885168679324013008, + limb1: 23909838630567568388570160712, + limb2: 55578836447830561028228089345, + limb3: 459213579616700199633725942 + }, + w8: u384 { + limb0: 61040362146433004083819844141, + limb1: 7257754017407416582674802251, + limb2: 29743740455198348944654581816, + limb3: 2078538771761084077370041928 + }, + w9: u384 { + limb0: 60375912085372234586006975480, + limb1: 12563630257594957592161588716, + limb2: 17195688857120241604535604023, + limb3: 2167950011965939442205082499 + }, + w10: u384 { + limb0: 52144287777238114509798836599, + limb1: 63510619300248595428902552392, + limb2: 26296018614694695603906408174, + limb3: 711809303195370418743417193 + }, + w11: u384 { + limb0: 52211325999951158962226509102, + limb1: 71072897838146636591452903567, + limb2: 18093036843645968723774375556, + limb3: 3977076293236353785977746202 + } + }; - let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] - ) - .unwrap(); + let ci: u384 = u384 { + limb0: 20926956347428121717371229307, + limb1: 39167973702580879200974338043, + limb2: 73931421140987771804125842665, + limb3: 1484058777916331965415752268 + }; - let mut circuit_inputs = ( - t62, t63, t72, t73, t127, t128, t137, t138, t192, t193, t202, t203, t231, t33, t31, - ) - .new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x3, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x6, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd3e, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(yInv_0); - circuit_inputs = circuit_inputs.next(xNegOverY_0); - circuit_inputs = circuit_inputs.next(Q0.x0); - circuit_inputs = circuit_inputs.next(Q0.x1); - circuit_inputs = circuit_inputs.next(Q0.y0); - circuit_inputs = circuit_inputs.next(Q0.y1); - circuit_inputs = circuit_inputs.next(yInv_1); - circuit_inputs = circuit_inputs.next(xNegOverY_1); - circuit_inputs = circuit_inputs.next(Q1.x0); - circuit_inputs = circuit_inputs.next(Q1.x1); - circuit_inputs = circuit_inputs.next(Q1.y0); - circuit_inputs = circuit_inputs.next(Q1.y1); - circuit_inputs = circuit_inputs.next(yInv_2); - circuit_inputs = circuit_inputs.next(xNegOverY_2); - circuit_inputs = circuit_inputs.next(Q2.x0); - circuit_inputs = circuit_inputs.next(Q2.x1); - circuit_inputs = circuit_inputs.next(Q2.y0); - circuit_inputs = circuit_inputs.next(Q2.y1); - circuit_inputs = circuit_inputs.next(R_i.w0); - circuit_inputs = circuit_inputs.next(R_i.w1); - circuit_inputs = circuit_inputs.next(R_i.w2); - circuit_inputs = circuit_inputs.next(R_i.w3); - circuit_inputs = circuit_inputs.next(R_i.w4); - circuit_inputs = circuit_inputs.next(R_i.w5); - circuit_inputs = circuit_inputs.next(R_i.w6); - circuit_inputs = circuit_inputs.next(R_i.w7); - circuit_inputs = circuit_inputs.next(R_i.w8); - circuit_inputs = circuit_inputs.next(R_i.w9); - circuit_inputs = circuit_inputs.next(R_i.w10); - circuit_inputs = circuit_inputs.next(R_i.w11); - circuit_inputs = circuit_inputs.next(c0); - circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(c_inv_of_z); - circuit_inputs = circuit_inputs.next(previous_lhs); + let z: u384 = u384 { + limb0: 14682042323034463933939933721, + limb1: 8017626049779495126315098747, + limb2: 477813781465355385, + limb3: 0 + }; + + let ( + Q0_result, + Q1_result, + Q2_result, + f_i_plus_one_of_z_result, + lhs_i_plus_one_result, + ci_plus_one_result + ) = + run_BLS12_381_MP_CHECK_BIT00_LOOP_3_circuit( + yInv_0, + xNegOverY_0, + Q0, + yInv_1, + xNegOverY_1, + Q1, + yInv_2, + xNegOverY_2, + Q2, + lhs_i, + f_i_of_z, + f_i_plus_one, + ci, + z + ); + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 20157873104478919362592126067, + limb1: 40222906608429735131003011883, + limb2: 61831473345411020446526725397, + limb3: 6209474790886677731333350352 + }, + x1: u384 { + limb0: 69488134415439078965197344194, + limb1: 33246570740653471632702555102, + limb2: 38122796205350373097991856795, + limb3: 2485533263398023687989615549 + }, + y0: u384 { + limb0: 9849405530040488725767348030, + limb1: 37572508343929501063546553394, + limb2: 23273733134349584891897383084, + limb3: 2860393110465070954076231834 + }, + y1: u384 { + limb0: 9718644715686464516660429254, + limb1: 75900241895427752656136797152, + limb2: 53083629913200443768497609020, + limb3: 2199545733061576514707447607 + } + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 64394607224370722075516996237, + limb1: 31812986195311185629445839862, + limb2: 35011433142430159656677773969, + limb3: 6212111330110698627671770900 + }, + x1: u384 { + limb0: 30977306158128988839012104357, + limb1: 61787078473560258478566248917, + limb2: 53041245935159140263314445269, + limb3: 7099034973341343769277016427 + }, + y0: u384 { + limb0: 48372011104432898258418252989, + limb1: 44210346247216841300823405738, + limb2: 61753696383511049614683104865, + limb3: 8019474214065066317277237777 + }, + y1: u384 { + limb0: 69174161601535480715464173249, + limb1: 78300883335888917480140439567, + limb2: 64442060147416162077459861451, + limb3: 1675066377058378593447556204 + } + }; + + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 15378772576144566712045835301, + limb1: 42364740821340384422373594349, + limb2: 35296286705503394493433332898, + limb3: 282415432652709402441671129 + }, + x1: u384 { + limb0: 19403367623587393013817318965, + limb1: 8838113635437916369496888980, + limb2: 32072848032889587311332418730, + limb3: 1321507933735618420826091390 + }, + y0: u384 { + limb0: 17841116971509830888506420499, + limb1: 35274004381213317731449664015, + limb2: 1497193487319152832979494184, + limb3: 3646634838457584100252603061 + }, + y1: u384 { + limb0: 2355080127165977773777447559, + limb1: 34149693696722420440167953800, + limb2: 53047278538895570043372294201, + limb3: 6115478174435058352290090559 + } + }; + + let f_i_plus_one_of_z: u384 = u384 { + limb0: 42256504819064755422111963351, + limb1: 29761453230117505477999157003, + limb2: 29705495727073375885868822942, + limb3: 853123419404265486335312980 + }; + + let lhs_i_plus_one: u384 = u384 { + limb0: 43163390103570940925990053742, + limb1: 74327897947957911765361556040, + limb2: 9732150839569370962730809898, + limb3: 726294655891014272519420196 + }; + + let ci_plus_one: u384 = u384 { + limb0: 38499560939830311465678390100, + limb1: 5889332938788778571709369510, + limb2: 1894609403691134727641282615, + limb3: 4228219148679601593897624500 + }; + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(Q2_result, Q2); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); + assert_eq!(ci_plus_one_result, ci_plus_one); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit_BLS12_381() { + let yInv_0: u384 = u384 { + limb0: 66898794098186850507101313338, + limb1: 42150618823834854549050963349, + limb2: 48910610037904207709279538446, + limb3: 1990908837832857854307248508 + }; + + let xNegOverY_0: u384 = u384 { + limb0: 17066942671172346121508901055, + limb1: 48566145015853239983191527876, + limb2: 14202938106184663934976623755, + limb3: 1867495393979071192735655245 + }; + + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 78385801750995130862342629040, + limb1: 54541118466024503173720233057, + limb2: 17336247689297051837021615235, + limb3: 6610171574772757147866166761 + }, + x1: u384 { + limb0: 54038715493742999405629905312, + limb1: 69879835061615375525083140168, + limb2: 15244102582009593761981124103, + limb3: 2493743846382671139934471351 + }, + y0: u384 { + limb0: 56816026858187455380109943976, + limb1: 54124196284688233403522512119, + limb2: 59824021255212481077255962264, + limb3: 6337234536823458345126497125 + }, + y1: u384 { + limb0: 27134614225674870008332420314, + limb1: 37600371060870141941295564950, + limb2: 14086571943643142145009035287, + limb3: 4197640599402875974071770728 + } + }; + + let yInv_1: u384 = u384 { + limb0: 1482940270920587211128055870, + limb1: 7784112316723220206908123854, + limb2: 22423046166058794157691651484, + limb3: 5247334755628967375116311373 + }; + + let xNegOverY_1: u384 = u384 { + limb0: 27847100426264234941653273808, + limb1: 34095441235993692661895767409, + limb2: 28712012792479195381198448868, + limb3: 4128526702116342476327779159 + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 70932496320398269913084690191, + limb1: 77830747173845609234294847872, + limb2: 41904059187762897941093520566, + limb3: 1971868805537018494695761861 + }, + x1: u384 { + limb0: 6788758202480235327772044529, + limb1: 70175107294689117924583843173, + limb2: 42099225665399811589318733987, + limb3: 2874156694463943431016942238 + }, + y0: u384 { + limb0: 749820297255324434935753619, + limb1: 76144570152273425725449122688, + limb2: 35512992890562466483485896272, + limb3: 477385270306841327069054167 + }, + y1: u384 { + limb0: 20722483254621476473557894747, + limb1: 37931353347301853064547504903, + limb2: 7008292954972454397002049669, + limb3: 4762925461951636069072986702 + } + }; + + let lhs_i: u384 = u384 { + limb0: 8299048747128474719710367195, + limb1: 74047261163399890154020794920, + limb2: 22707504058081626697253010161, + limb3: 604916666244038192203793074 + }; + + let f_i_of_z: u384 = u384 { + limb0: 74839978954702524468895316803, + limb1: 8544868477973609986080914647, + limb2: 26488815936766815911228582779, + limb3: 5556743036314115533458151697 + }; + + let f_i_plus_one = E12D { + w0: u384 { + limb0: 20651615686382921080344775143, + limb1: 76126035029926038123464197701, + limb2: 44160777236766933356527057343, + limb3: 293934313377157921598407884 + }, + w1: u384 { + limb0: 33604803162354153869279965744, + limb1: 62962812621177267229831413275, + limb2: 53036070427694343012725253423, + limb3: 2266874682967133333298701079 + }, + w2: u384 { + limb0: 33423094758638770509214116291, + limb1: 6624924498063016167804008197, + limb2: 69119881219132732519207941010, + limb3: 7609001187017846915225509842 + }, + w3: u384 { + limb0: 31613441737782608886556905679, + limb1: 72328577131602201408606086800, + limb2: 8321896922174809904273522162, + limb3: 1911906158907962703127067609 + }, + w4: u384 { + limb0: 50901242745105314366211994707, + limb1: 11433645682179747024546588417, + limb2: 71264764873526871362447162342, + limb3: 323610362803009169402127693 + }, + w5: u384 { + limb0: 16464491881773765808701327312, + limb1: 45168704666923177900355814073, + limb2: 9179317848163247398254316291, + limb3: 3351271410768461893086305626 + }, + w6: u384 { + limb0: 73999690185212585619617514242, + limb1: 62073519573212403014685496771, + limb2: 18669868221221592475689181099, + limb3: 7282233418740874790279960847 + }, + w7: u384 { + limb0: 33169592589145400145144526317, + limb1: 17049029622741054857978352103, + limb2: 8060876810601453530127441971, + limb3: 6100338537325009080565176083 + }, + w8: u384 { + limb0: 69844556005101128201521515968, + limb1: 26380752061867380165563672693, + limb2: 40353766627053614916986821349, + limb3: 5736394878934628709867764216 + }, + w9: u384 { + limb0: 4052955733568832946657852190, + limb1: 52372092363491647239088015859, + limb2: 34242689700757564951285045920, + limb3: 7744053161949629428315892408 + }, + w10: u384 { + limb0: 62505647863352096926662303463, + limb1: 7662952973292534722750046066, + limb2: 11819334322330838424606312378, + limb3: 2228144000998654854136880212 + }, + w11: u384 { + limb0: 10926904322282820847706390438, + limb1: 45182068785185827134676054734, + limb2: 37761923604613353371701557318, + limb3: 2328601210277656834509591410 + } + }; + + let ci: u384 = u384 { + limb0: 19609363213726272674414457324, + limb1: 64623442223733833178221935997, + limb2: 13839342760447473857713462593, + limb3: 1010285289685609669771462635 + }; + + let z: u384 = u384 { + limb0: 63770474546560321334267559769, + limb1: 12656197913646106927140463440, + limb2: 246716921369248729, + limb3: 0 + }; + + let ( + Q0_result, + Q1_result, + f_i_plus_one_of_z_result, + lhs_i_plus_one_result, + ci_plus_one_result + ) = + run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( + yInv_0, xNegOverY_0, Q0, yInv_1, xNegOverY_1, Q1, lhs_i, f_i_of_z, f_i_plus_one, ci, z + ); + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 1764917729389260788340678551, + limb1: 41906025388715132281055355848, + limb2: 32650311352979461835603744248, + limb3: 6330394484541481858795881700 + }, + x1: u384 { + limb0: 13773397247449577197368889606, + limb1: 75166658657935597480890240507, + limb2: 17413341146262408648340795068, + limb3: 7046591710508549804070652693 + }, + y0: u384 { + limb0: 65933837255322453651046702945, + limb1: 59604594459623028614207053029, + limb2: 46890305010565938272107777917, + limb3: 4321859431472121146636262190 + }, + y1: u384 { + limb0: 48778953845203987517786870688, + limb1: 2732793233678598502901556840, + limb2: 21287924273940918074763731958, + limb3: 7406241203646838325179036336 + } + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 63409754051482504592672183259, + limb1: 64227418276388045375701165714, + limb2: 348567066288940018710175488, + limb3: 1792707050592466988381905395 + }, + x1: u384 { + limb0: 4910279081287454414663006724, + limb1: 57188260139997937080663816538, + limb2: 4107145635414972607267673237, + limb3: 3692280047665402730316118199 + }, + y0: u384 { + limb0: 32517643402024035642007567604, + limb1: 31976860077219050483254439326, + limb2: 61307690815938127993784554155, + limb3: 6675416782498854933575530079 + }, + y1: u384 { + limb0: 75011743218022966131609257812, + limb1: 68836367586537803968946370062, + limb2: 32438299485705636624117276226, + limb3: 1381983680164244983389922020 + } + }; + + let f_i_plus_one_of_z: u384 = u384 { + limb0: 37854968589584359016992144089, + limb1: 27241795902383752751036470943, + limb2: 6481310379453313397313856249, + limb3: 1933055661384403217464789592 + }; + + let lhs_i_plus_one: u384 = u384 { + limb0: 46081879251564179479568446462, + limb1: 70420586679211265732301149541, + limb2: 42333970785813813479764849731, + limb3: 6092793536833080349635212101 + }; + + let ci_plus_one: u384 = u384 { + limb0: 12720219368279773367952062042, + limb1: 42811262843795972870244602866, + limb2: 49920895411621415019021126299, + limb3: 2957074206562805298047535680 + }; + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); + assert_eq!(ci_plus_one_result, ci_plus_one); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit_BLS12_381() { + let yInv_0: u384 = u384 { + limb0: 72738479218131622180615117992, + limb1: 59804115567261302874304661591, + limb2: 51072553878076750621938481284, + limb3: 5654862758190121472867223881 + }; - let outputs = match circuit_inputs.done().eval(modulus) { - Result::Ok(outputs) => { outputs }, - Result::Err(_) => { panic!("Expected success") } - }; - let Q0: G2Point = G2Point { - x0: outputs.get_output(t62), - x1: outputs.get_output(t63), - y0: outputs.get_output(t72), - y1: outputs.get_output(t73) - }; - let Q1: G2Point = G2Point { - x0: outputs.get_output(t127), - x1: outputs.get_output(t128), - y0: outputs.get_output(t137), - y1: outputs.get_output(t138) - }; - let Q2: G2Point = G2Point { - x0: outputs.get_output(t192), - x1: outputs.get_output(t193), - y0: outputs.get_output(t202), - y1: outputs.get_output(t203) - }; - let new_lhs: u384 = outputs.get_output(t231); - let c_i: u384 = outputs.get_output(t33); - let f_i_plus_one_of_z: u384 = outputs.get_output(t31); - return (Q0, Q1, Q2, new_lhs, c_i, f_i_plus_one_of_z); -} -fn run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( - lambda_root: E12D, - z: u384, - scaling_factor: MillerLoopResultScalingFactor, - c_inv: E12D, - c_0: u384 -) -> (u384, u384, u384, u384, u384, u384, u384) { - // CONSTANT stack - let in0 = CE::> {}; // 0x1 - let in1 = CE::> {}; // 0x12 - let in2 = CE::> {}; // 0x1d8c8daef3eee1e81b2522ec5eb28ded6895e1cdfde6a43f5daa971f3fa65955 - let in3 = CE::> {}; // 0x217e400dc9351e774e34e2ac06ead4000d14d1e242b29c567e9c385ce480a71a - let in4 = CE::> {}; // 0x242b719062f6737b8481d22c6934ce844d72f250fd28d102c0d147b2f4d521a7 - let in5 = CE::> {}; // 0x359809094bd5c8e1b9c22d81246ffc2e794e17643ac198484b8d9094aa82536 - let in6 = CE::> {}; // 0x21436d48fcb50cc60dd4ef1e69a0c1f0dd2949fa6df7b44cbb259ef7cb58d5ed - let in7 = CE::> {}; // 0x18857a58f3b5bb3038a4311a86919d9c7c6c15f88a4f4f0831364cf35f78f771 - let in8 = CE::> {}; // 0x2c84bbad27c3671562b7adefd44038ab3c0bbad96fc008e7d6998c82f7fc048b - let in9 = CE::> {}; // 0xc33b1c70e4fd11b6d1eab6fcd18b99ad4afd096a8697e0c9c36d8ca3339a7b5 - let in10 = CE::< - CI<10> - > {}; // 0x1b007294a55accce13fe08bea73305ff6bdac77c5371c546d428780a6e3dcfa8 - let in11 = CE::< - CI<11> - > {}; // 0x215d42e7ac7bd17cefe88dd8e6965b3adae92c974f501fe811493d72543a3977 - let in12 = CE::> {}; // -0x1 % p - let in13 = CE::< - CI<13> - > {}; // 0x246996f3b4fae7e6a6327cfe12150b8e747992778eeec7e5ca5cf05f80f362ac - let in14 = CE::< - CI<14> - > {}; // 0x12d7c0c3ed42be419d2b22ca22ceca702eeb88c36a8b264dde75f4f798d6a3f2 - let in15 = CE::< - CI<15> - > {}; // 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2 - let in16 = CE::> {}; // 0xc38dce27e3b2cae33ce738a184c89d94a0e78406b48f98a7b4f4463e3a7dba0 - let in17 = CE::> {}; // 0x7c03cbcac41049a0704b5a7ec796f2b21807dc98fa25bd282d37f632623b0e3 - let in18 = CE::> {}; // 0xf20e129e47c9363aa7b569817e0966cba582096fa7a164080faed1f0d24275a - let in19 = CE::< - CI<19> - > {}; // 0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126 - let in20 = CE::> {}; // 0x3df92c5b96e3914559897c6ad411fb25b75afb7f8b1c1a56586ff93e080f8bc - let in21 = CE::< - CI<21> - > {}; // 0x12acf2ca76fd0675a27fb246c7729f7db080cb99678e2ac024c6b8ee6e0c2c4b - let in22 = CE::< - CI<22> - > {}; // 0x1563dbde3bd6d35ba4523cf7da4e525e2ba6a3151500054667f8140c6a3f2d9f - let in23 = CE::< - CI<23> - > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd49 - let in24 = CE::< - CI<24> - > {}; // 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48 - let in25 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe - let in26 = CE::> {}; // 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177ffffff - let in27 = CE::< - CI<27> - > {}; // 0x13d0c369615f7bb0b2bdfa8fef85fa07122bde8d67dfc8fabd3581ad840ddd76 - let in28 = CE::< - CI<28> - > {}; // 0x18a0f4219f4fdff6fc2bf531eb331a053a35744cac285af5685d3f90eacf7a66 - let in29 = CE::> {}; // 0xc3a5e9c462a654779c3e050c9ca2a428908a81264e2b5a5bf22f67654883ae6 - let in30 = CE::< - CI<30> - > {}; // 0x2ce02aa5f9bf8cd65bdd2055c255cf9d9e08c1d9345582cc92fd973c74bd77f4 - let in31 = CE::< - CI<31> - > {}; // 0x17ded419ed7be4f97fac149bfaefbac11b155498de227b850aea3f23790405d6 - let in32 = CE::< - CI<32> - > {}; // 0x1bfe7b214c0294242fb81a8dccd8a9b4441d64f34150a79753fb0cd31cc99cc0 - let in33 = CE::> {}; // 0x697b9c523e0390ed15da0ec97a9b8346513297b9efaf0f0f1a228f0d5662fbd - let in34 = CE::> {}; // 0x7a0e052f2b1c443b5186d6ac4c723b85d3f78a3182d2db0c413901c32b0c6fe - let in35 = CE::< - CI<35> - > {}; // 0x1b76a37fba85f3cd5dc79824a3792597356c892c39c0d06b220500933945267f - let in36 = CE::> {}; // 0xabf8b60be77d7306cbeee33576139d7f03a5e397d439ec7694aa2bf4c0c101 - let in37 = CE::< - CI<37> - > {}; // 0x1c938b097fd2247905924b2691fb5e5685558c04009201927eeb0a69546f1fd1 - let in38 = CE::> {}; // 0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de - let in39 = CE::< - CI<39> - > {}; // 0x2429efd69b073ae23e8c6565b7b72e1b0e78c27f038f14e77cfd95a083f4c261 - let in40 = CE::< - CI<40> - > {}; // 0x28a411b634f09b8fb14b900e9507e9327600ecc7d8cf6ebab94d0cb3b2594c64 - let in41 = CE::< - CI<41> - > {}; // 0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f - let in42 = CE::< - CI<42> - > {}; // 0x1465d351952f0c0588982b28b4a8aea95364059e272122f5e8257f43bbb36087 - let in43 = CE::< - CI<43> - > {}; // 0x16db366a59b1dd0b9fb1b2282a48633d3e2ddaea200280211f25041384282499 - let in44 = CE::< - CI<44> - > {}; // 0x28c36e1fee7fdbe60337d84bbcba34a53a41f1ee50449cdc780cfbfaa5cc3649 + let xNegOverY_0: u384 = u384 { + limb0: 21592807249069649586656649767, + limb1: 1441881871070187369908768339, + limb2: 34341981141715134965176983548, + limb3: 2714315832938403848427028986 + }; - // INPUT stack - let (in45, in46) = (CE::> {}, CE::> {}); - let (in47, in48) = (CE::> {}, CE::> {}); - let (in49, in50) = (CE::> {}, CE::> {}); - let (in51, in52) = (CE::> {}, CE::> {}); - let (in53, in54) = (CE::> {}, CE::> {}); - let (in55, in56) = (CE::> {}, CE::> {}); - let (in57, in58) = (CE::> {}, CE::> {}); - let (in59, in60) = (CE::> {}, CE::> {}); - let (in61, in62) = (CE::> {}, CE::> {}); - let (in63, in64) = (CE::> {}, CE::> {}); - let (in65, in66) = (CE::> {}, CE::> {}); - let (in67, in68) = (CE::> {}, CE::> {}); - let (in69, in70) = (CE::> {}, CE::> {}); - let (in71, in72) = (CE::> {}, CE::> {}); - let (in73, in74) = (CE::> {}, CE::> {}); - let (in75, in76) = (CE::> {}, CE::> {}); - let t0 = circuit_mul(in57, in57); // Compute z^2 - let t1 = circuit_mul(t0, in57); // Compute z^3 - let t2 = circuit_mul(t1, in57); // Compute z^4 - let t3 = circuit_mul(t2, in57); // Compute z^5 - let t4 = circuit_mul(t3, in57); // Compute z^6 - let t5 = circuit_mul(t4, in57); // Compute z^7 - let t6 = circuit_mul(t5, in57); // Compute z^8 - let t7 = circuit_mul(t6, in57); // Compute z^9 - let t8 = circuit_mul(t7, in57); // Compute z^10 - let t9 = circuit_mul(t8, in57); // Compute z^11 - let t10 = circuit_mul(in46, in57); // Eval UnnamedPoly step coeff_1 * z^1 - let t11 = circuit_add(in45, t10); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t12 = circuit_mul(in47, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t13 = circuit_add(t11, t12); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t14 = circuit_mul(in48, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t15 = circuit_add(t13, t14); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t16 = circuit_mul(in49, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t17 = circuit_add(t15, t16); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t18 = circuit_mul(in50, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t19 = circuit_add(t17, t18); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t20 = circuit_mul(in51, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t21 = circuit_add(t19, t20); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t22 = circuit_mul(in52, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t23 = circuit_add(t21, t22); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t24 = circuit_mul(in53, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t25 = circuit_add(t23, t24); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t26 = circuit_mul(in54, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t27 = circuit_add(t25, t26); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t28 = circuit_mul(in55, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t29 = circuit_add(t27, t28); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t30 = circuit_mul(in56, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t31 = circuit_add(t29, t30); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t32 = circuit_mul(in59, t0); // Eval sparse poly UnnamedPoly step coeff_2 * z^2 - let t33 = circuit_add(in58, t32); // Eval sparse poly UnnamedPoly step + coeff_2 * z^2 - let t34 = circuit_mul(in60, t2); // Eval sparse poly UnnamedPoly step coeff_4 * z^4 - let t35 = circuit_add(t33, t34); // Eval sparse poly UnnamedPoly step + coeff_4 * z^4 - let t36 = circuit_mul(in61, t4); // Eval sparse poly UnnamedPoly step coeff_6 * z^6 - let t37 = circuit_add(t35, t36); // Eval sparse poly UnnamedPoly step + coeff_6 * z^6 - let t38 = circuit_mul(in62, t6); // Eval sparse poly UnnamedPoly step coeff_8 * z^8 - let t39 = circuit_add(t37, t38); // Eval sparse poly UnnamedPoly step + coeff_8 * z^8 - let t40 = circuit_mul(in63, t8); // Eval sparse poly UnnamedPoly step coeff_10 * z^10 - let t41 = circuit_add(t39, t40); // Eval sparse poly UnnamedPoly step + coeff_10 * z^10 - let t42 = circuit_mul(in65, in57); // Eval UnnamedPoly step coeff_1 * z^1 - let t43 = circuit_add(in64, t42); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t44 = circuit_mul(in66, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t45 = circuit_add(t43, t44); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t46 = circuit_mul(in67, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t47 = circuit_add(t45, t46); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t48 = circuit_mul(in68, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t49 = circuit_add(t47, t48); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t50 = circuit_mul(in69, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t51 = circuit_add(t49, t50); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t52 = circuit_mul(in70, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t53 = circuit_add(t51, t52); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t54 = circuit_mul(in71, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t55 = circuit_add(t53, t54); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t56 = circuit_mul(in72, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t57 = circuit_add(t55, t56); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t58 = circuit_mul(in73, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t59 = circuit_add(t57, t58); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t60 = circuit_mul(in74, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t61 = circuit_add(t59, t60); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t62 = circuit_mul(in75, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t63 = circuit_add(t61, t62); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t64 = circuit_mul(t31, t63); - let t65 = circuit_sub(t64, in0); // c_of_z * c_inv_of_z - 1 - let t66 = circuit_mul(t65, in76); // c_0 * (c_of_z * c_inv_of_z - 1) - let t67 = circuit_mul(in70, in1); - let t68 = circuit_add(in64, t67); - let t69 = circuit_mul(in65, in2); - let t70 = circuit_mul(in71, in3); - let t71 = circuit_add(t69, t70); - let t72 = circuit_mul(in66, in4); - let t73 = circuit_mul(in72, in5); - let t74 = circuit_add(t72, t73); - let t75 = circuit_mul(in67, in6); - let t76 = circuit_mul(in73, in7); - let t77 = circuit_add(t75, t76); - let t78 = circuit_mul(in68, in8); - let t79 = circuit_mul(in74, in9); - let t80 = circuit_add(t78, t79); - let t81 = circuit_mul(in69, in10); - let t82 = circuit_mul(in75, in11); - let t83 = circuit_add(t81, t82); - let t84 = circuit_mul(in70, in12); - let t85 = circuit_mul(in65, in13); - let t86 = circuit_mul(in71, in14); - let t87 = circuit_add(t85, t86); - let t88 = circuit_mul(in66, in15); - let t89 = circuit_mul(in72, in16); - let t90 = circuit_add(t88, t89); - let t91 = circuit_mul(in67, in17); - let t92 = circuit_mul(in73, in18); - let t93 = circuit_add(t91, t92); - let t94 = circuit_mul(in68, in19); - let t95 = circuit_mul(in74, in20); - let t96 = circuit_add(t94, t95); - let t97 = circuit_mul(in69, in21); - let t98 = circuit_mul(in75, in22); - let t99 = circuit_add(t97, t98); - let t100 = circuit_mul(in46, in23); - let t101 = circuit_mul(in47, in24); - let t102 = circuit_mul(in48, in12); - let t103 = circuit_mul(in49, in25); - let t104 = circuit_mul(in50, in26); - let t105 = circuit_mul(in52, in23); - let t106 = circuit_mul(in53, in24); - let t107 = circuit_mul(in54, in12); - let t108 = circuit_mul(in55, in25); - let t109 = circuit_mul(in56, in26); - let t110 = circuit_mul(in70, in1); - let t111 = circuit_add(in64, t110); - let t112 = circuit_mul(in65, in27); - let t113 = circuit_mul(in71, in28); - let t114 = circuit_add(t112, t113); - let t115 = circuit_mul(in66, in29); - let t116 = circuit_mul(in72, in30); - let t117 = circuit_add(t115, t116); - let t118 = circuit_mul(in67, in18); - let t119 = circuit_mul(in73, in31); - let t120 = circuit_add(t118, t119); - let t121 = circuit_mul(in68, in32); - let t122 = circuit_mul(in74, in33); - let t123 = circuit_add(t121, t122); - let t124 = circuit_mul(in69, in34); - let t125 = circuit_mul(in75, in35); - let t126 = circuit_add(t124, t125); - let t127 = circuit_mul(in70, in12); - let t128 = circuit_mul(in65, in36); - let t129 = circuit_mul(in71, in37); - let t130 = circuit_add(t128, t129); - let t131 = circuit_mul(in66, in38); - let t132 = circuit_mul(in72, in39); - let t133 = circuit_add(t131, t132); - let t134 = circuit_mul(in67, in40); - let t135 = circuit_mul(in73, in6); - let t136 = circuit_add(t134, t135); - let t137 = circuit_mul(in68, in41); - let t138 = circuit_mul(in74, in42); - let t139 = circuit_add(t137, t138); - let t140 = circuit_mul(in69, in43); - let t141 = circuit_mul(in75, in44); - let t142 = circuit_add(t140, t141); - let t143 = circuit_mul(t71, in57); // Eval UnnamedPoly step coeff_1 * z^1 - let t144 = circuit_add(t68, t143); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t145 = circuit_mul(t74, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t146 = circuit_add(t144, t145); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t147 = circuit_mul(t77, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t148 = circuit_add(t146, t147); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t149 = circuit_mul(t80, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t150 = circuit_add(t148, t149); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t151 = circuit_mul(t83, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t152 = circuit_add(t150, t151); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t153 = circuit_mul(t84, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t154 = circuit_add(t152, t153); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t155 = circuit_mul(t87, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t156 = circuit_add(t154, t155); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t157 = circuit_mul(t90, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t158 = circuit_add(t156, t157); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t159 = circuit_mul(t93, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t160 = circuit_add(t158, t159); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t161 = circuit_mul(t96, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t162 = circuit_add(t160, t161); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t163 = circuit_mul(t99, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t164 = circuit_add(t162, t163); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t165 = circuit_mul(t100, in57); // Eval UnnamedPoly step coeff_1 * z^1 - let t166 = circuit_add(in45, t165); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t167 = circuit_mul(t101, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t168 = circuit_add(t166, t167); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t169 = circuit_mul(t102, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t170 = circuit_add(t168, t169); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t171 = circuit_mul(t103, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t172 = circuit_add(t170, t171); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t173 = circuit_mul(t104, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t174 = circuit_add(t172, t173); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t175 = circuit_mul(in51, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t176 = circuit_add(t174, t175); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t177 = circuit_mul(t105, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t178 = circuit_add(t176, t177); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t179 = circuit_mul(t106, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t180 = circuit_add(t178, t179); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t181 = circuit_mul(t107, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t182 = circuit_add(t180, t181); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t183 = circuit_mul(t108, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t184 = circuit_add(t182, t183); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t185 = circuit_mul(t109, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t186 = circuit_add(t184, t185); // Eval UnnamedPoly step + (coeff_11 * z^11) - let t187 = circuit_mul(t114, in57); // Eval UnnamedPoly step coeff_1 * z^1 - let t188 = circuit_add(t111, t187); // Eval UnnamedPoly step + (coeff_1 * z^1) - let t189 = circuit_mul(t117, t0); // Eval UnnamedPoly step coeff_2 * z^2 - let t190 = circuit_add(t188, t189); // Eval UnnamedPoly step + (coeff_2 * z^2) - let t191 = circuit_mul(t120, t1); // Eval UnnamedPoly step coeff_3 * z^3 - let t192 = circuit_add(t190, t191); // Eval UnnamedPoly step + (coeff_3 * z^3) - let t193 = circuit_mul(t123, t2); // Eval UnnamedPoly step coeff_4 * z^4 - let t194 = circuit_add(t192, t193); // Eval UnnamedPoly step + (coeff_4 * z^4) - let t195 = circuit_mul(t126, t3); // Eval UnnamedPoly step coeff_5 * z^5 - let t196 = circuit_add(t194, t195); // Eval UnnamedPoly step + (coeff_5 * z^5) - let t197 = circuit_mul(t127, t4); // Eval UnnamedPoly step coeff_6 * z^6 - let t198 = circuit_add(t196, t197); // Eval UnnamedPoly step + (coeff_6 * z^6) - let t199 = circuit_mul(t130, t5); // Eval UnnamedPoly step coeff_7 * z^7 - let t200 = circuit_add(t198, t199); // Eval UnnamedPoly step + (coeff_7 * z^7) - let t201 = circuit_mul(t133, t6); // Eval UnnamedPoly step coeff_8 * z^8 - let t202 = circuit_add(t200, t201); // Eval UnnamedPoly step + (coeff_8 * z^8) - let t203 = circuit_mul(t136, t7); // Eval UnnamedPoly step coeff_9 * z^9 - let t204 = circuit_add(t202, t203); // Eval UnnamedPoly step + (coeff_9 * z^9) - let t205 = circuit_mul(t139, t8); // Eval UnnamedPoly step coeff_10 * z^10 - let t206 = circuit_add(t204, t205); // Eval UnnamedPoly step + (coeff_10 * z^10) - let t207 = circuit_mul(t142, t9); // Eval UnnamedPoly step coeff_11 * z^11 - let t208 = circuit_add(t206, t207); // Eval UnnamedPoly step + (coeff_11 * z^11) + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 72353752541323059791065179958, + limb1: 38883000815523402855197278331, + limb2: 19185412057095720247840317591, + limb3: 3591070408147414020454190266 + }, + x1: u384 { + limb0: 24206875542118945404160986225, + limb1: 12188743531917697326201063110, + limb2: 6991085446778445081432464165, + limb3: 71618796902660994442161820 + }, + y0: u384 { + limb0: 65337408065816357714603591009, + limb1: 26554733919250365769729609728, + limb2: 28105435973800385912814146113, + limb3: 644016408016751219591174983 + }, + y1: u384 { + limb0: 68494221541488119384076704258, + limb1: 59853947420563340344305821633, + limb2: 57224491765505274795723228877, + limb3: 692256262145389825724315930 + } + }; - let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] - ) - .unwrap(); + let yInv_1: u384 = u384 { + limb0: 68068444480316725466112032995, + limb1: 19081927832531501629206135166, + limb2: 11215887672711433802161913937, + limb3: 6084601513164224177033957371 + }; + + let xNegOverY_1: u384 = u384 { + limb0: 51645191413948245126085199785, + limb1: 32454210612353186690108173457, + limb2: 48752434189767786613468722437, + limb3: 1040013299572536302438718253 + }; - let mut circuit_inputs = (t31, t41, t63, t66, t164, t186, t208,).new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x1, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next([0x12, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0xfde6a43f5daa971f3fa65955, 0x1b2522ec5eb28ded6895e1cd, 0x1d8c8daef3eee1e8, 0x0]); - circuit_inputs = circuit_inputs - .next([0x42b29c567e9c385ce480a71a, 0x4e34e2ac06ead4000d14d1e2, 0x217e400dc9351e77, 0x0]); - circuit_inputs = circuit_inputs - .next([0xfd28d102c0d147b2f4d521a7, 0x8481d22c6934ce844d72f250, 0x242b719062f6737b, 0x0]); - circuit_inputs = circuit_inputs - .next([0x43ac198484b8d9094aa82536, 0x1b9c22d81246ffc2e794e176, 0x359809094bd5c8e, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6df7b44cbb259ef7cb58d5ed, 0xdd4ef1e69a0c1f0dd2949fa, 0x21436d48fcb50cc6, 0x0]); - circuit_inputs = circuit_inputs - .next([0x8a4f4f0831364cf35f78f771, 0x38a4311a86919d9c7c6c15f8, 0x18857a58f3b5bb30, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6fc008e7d6998c82f7fc048b, 0x62b7adefd44038ab3c0bbad9, 0x2c84bbad27c36715, 0x0]); - circuit_inputs = circuit_inputs - .next([0xa8697e0c9c36d8ca3339a7b5, 0x6d1eab6fcd18b99ad4afd096, 0xc33b1c70e4fd11b, 0x0]); - circuit_inputs = circuit_inputs - .next([0x5371c546d428780a6e3dcfa8, 0x13fe08bea73305ff6bdac77c, 0x1b007294a55accce, 0x0]); - circuit_inputs = circuit_inputs - .next([0x4f501fe811493d72543a3977, 0xefe88dd8e6965b3adae92c97, 0x215d42e7ac7bd17c, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6871ca8d3c208c16d87cfd46, 0xb85045b68181585d97816a91, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs - .next([0x8eeec7e5ca5cf05f80f362ac, 0xa6327cfe12150b8e74799277, 0x246996f3b4fae7e6, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6a8b264dde75f4f798d6a3f2, 0x9d2b22ca22ceca702eeb88c3, 0x12d7c0c3ed42be41, 0x0]); - circuit_inputs = circuit_inputs - .next([0xb7c9dce1665d51c640fcba2, 0x4ba4cc8bd75a079432ae2a1d, 0x16c9e55061ebae20, 0x0]); - circuit_inputs = circuit_inputs - .next([0x6b48f98a7b4f4463e3a7dba0, 0x33ce738a184c89d94a0e7840, 0xc38dce27e3b2cae, 0x0]); - circuit_inputs = circuit_inputs - .next([0x8fa25bd282d37f632623b0e3, 0x704b5a7ec796f2b21807dc9, 0x7c03cbcac41049a, 0x0]); - circuit_inputs = circuit_inputs - .next([0xfa7a164080faed1f0d24275a, 0xaa7b569817e0966cba582096, 0xf20e129e47c9363, 0x0]); - circuit_inputs = circuit_inputs - .next([0x1bdec763c13b4711cd2b8126, 0x9f3a80b03b0b1c923685d2ea, 0x2c145edbe7fd8aee, 0x0]); - circuit_inputs = circuit_inputs - .next([0xf8b1c1a56586ff93e080f8bc, 0x559897c6ad411fb25b75afb7, 0x3df92c5b96e3914, 0x0]); - circuit_inputs = circuit_inputs - .next([0x678e2ac024c6b8ee6e0c2c4b, 0xa27fb246c7729f7db080cb99, 0x12acf2ca76fd0675, 0x0]); - circuit_inputs = circuit_inputs - .next([0x1500054667f8140c6a3f2d9f, 0xa4523cf7da4e525e2ba6a315, 0x1563dbde3bd6d35b, 0x0]); - circuit_inputs = circuit_inputs - .next([0xbb966e3de4bd44e5607cfd49, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs - .next([0xbb966e3de4bd44e5607cfd48, 0x5e6dd9e7e0acccb0c28f069f, 0x30644e72e131a029, 0x0]); - circuit_inputs = circuit_inputs - .next([0xacdb5c4f5763473177fffffe, 0x59e26bcea0d48bacd4f263f1, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0xacdb5c4f5763473177ffffff, 0x59e26bcea0d48bacd4f263f1, 0x0, 0x0]); - circuit_inputs = circuit_inputs - .next([0x67dfc8fabd3581ad840ddd76, 0xb2bdfa8fef85fa07122bde8d, 0x13d0c369615f7bb0, 0x0]); - circuit_inputs = circuit_inputs - .next([0xac285af5685d3f90eacf7a66, 0xfc2bf531eb331a053a35744c, 0x18a0f4219f4fdff6, 0x0]); - circuit_inputs = circuit_inputs - .next([0x64e2b5a5bf22f67654883ae6, 0x79c3e050c9ca2a428908a812, 0xc3a5e9c462a6547, 0x0]); - circuit_inputs = circuit_inputs - .next([0x345582cc92fd973c74bd77f4, 0x5bdd2055c255cf9d9e08c1d9, 0x2ce02aa5f9bf8cd6, 0x0]); - circuit_inputs = circuit_inputs - .next([0xde227b850aea3f23790405d6, 0x7fac149bfaefbac11b155498, 0x17ded419ed7be4f9, 0x0]); - circuit_inputs = circuit_inputs - .next([0x4150a79753fb0cd31cc99cc0, 0x2fb81a8dccd8a9b4441d64f3, 0x1bfe7b214c029424, 0x0]); - circuit_inputs = circuit_inputs - .next([0x9efaf0f0f1a228f0d5662fbd, 0xd15da0ec97a9b8346513297b, 0x697b9c523e0390e, 0x0]); - circuit_inputs = circuit_inputs - .next([0x182d2db0c413901c32b0c6fe, 0xb5186d6ac4c723b85d3f78a3, 0x7a0e052f2b1c443, 0x0]); - circuit_inputs = circuit_inputs - .next([0x39c0d06b220500933945267f, 0x5dc79824a3792597356c892c, 0x1b76a37fba85f3cd, 0x0]); - circuit_inputs = circuit_inputs - .next([0x97d439ec7694aa2bf4c0c101, 0x6cbeee33576139d7f03a5e3, 0xabf8b60be77d73, 0x0]); - circuit_inputs = circuit_inputs - .next([0x9201927eeb0a69546f1fd1, 0x5924b2691fb5e5685558c04, 0x1c938b097fd22479, 0x0]); - circuit_inputs = circuit_inputs - .next([0x98ff2631380cab2baaa586de, 0xa9f30e6dec26094f0fdf31bf, 0x4f1de41b3d1766f, 0x0]); - circuit_inputs = circuit_inputs - .next([0x38f14e77cfd95a083f4c261, 0x3e8c6565b7b72e1b0e78c27f, 0x2429efd69b073ae2, 0x0]); - circuit_inputs = circuit_inputs - .next([0xd8cf6ebab94d0cb3b2594c64, 0xb14b900e9507e9327600ecc7, 0x28a411b634f09b8f, 0x0]); - circuit_inputs = circuit_inputs - .next([0x737f96e55fe3ed9d730c239f, 0xfeb0f6ef0cd21d04a44a9e08, 0x23d5e999e1910a12, 0x0]); - circuit_inputs = circuit_inputs - .next([0x272122f5e8257f43bbb36087, 0x88982b28b4a8aea95364059e, 0x1465d351952f0c05, 0x0]); - circuit_inputs = circuit_inputs - .next([0x200280211f25041384282499, 0x9fb1b2282a48633d3e2ddaea, 0x16db366a59b1dd0b, 0x0]); - circuit_inputs = circuit_inputs - .next([0x50449cdc780cfbfaa5cc3649, 0x337d84bbcba34a53a41f1ee, 0x28c36e1fee7fdbe6, 0x0]); - circuit_inputs = circuit_inputs.next(lambda_root.w0); - circuit_inputs = circuit_inputs.next(lambda_root.w1); - circuit_inputs = circuit_inputs.next(lambda_root.w2); - circuit_inputs = circuit_inputs.next(lambda_root.w3); - circuit_inputs = circuit_inputs.next(lambda_root.w4); - circuit_inputs = circuit_inputs.next(lambda_root.w5); - circuit_inputs = circuit_inputs.next(lambda_root.w6); - circuit_inputs = circuit_inputs.next(lambda_root.w7); - circuit_inputs = circuit_inputs.next(lambda_root.w8); - circuit_inputs = circuit_inputs.next(lambda_root.w9); - circuit_inputs = circuit_inputs.next(lambda_root.w10); - circuit_inputs = circuit_inputs.next(lambda_root.w11); - circuit_inputs = circuit_inputs.next(z); - circuit_inputs = circuit_inputs.next(scaling_factor.w0); - circuit_inputs = circuit_inputs.next(scaling_factor.w2); - circuit_inputs = circuit_inputs.next(scaling_factor.w4); - circuit_inputs = circuit_inputs.next(scaling_factor.w6); - circuit_inputs = circuit_inputs.next(scaling_factor.w8); - circuit_inputs = circuit_inputs.next(scaling_factor.w10); - circuit_inputs = circuit_inputs.next(c_inv.w0); - circuit_inputs = circuit_inputs.next(c_inv.w1); - circuit_inputs = circuit_inputs.next(c_inv.w2); - circuit_inputs = circuit_inputs.next(c_inv.w3); - circuit_inputs = circuit_inputs.next(c_inv.w4); - circuit_inputs = circuit_inputs.next(c_inv.w5); - circuit_inputs = circuit_inputs.next(c_inv.w6); - circuit_inputs = circuit_inputs.next(c_inv.w7); - circuit_inputs = circuit_inputs.next(c_inv.w8); - circuit_inputs = circuit_inputs.next(c_inv.w9); - circuit_inputs = circuit_inputs.next(c_inv.w10); - circuit_inputs = circuit_inputs.next(c_inv.w11); - circuit_inputs = circuit_inputs.next(c_0); + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 33931471133770716511927176878, + limb1: 32911962541499641767491347623, + limb2: 27210236838495186427523820444, + limb3: 6878872432706327047878836662 + }, + x1: u384 { + limb0: 71184498443171767594864601566, + limb1: 77982702133296176073848605995, + limb2: 10776346594549485907136045869, + limb3: 76172731124399930128256998 + }, + y0: u384 { + limb0: 385134097327127039987515418, + limb1: 9332006848538130751963997196, + limb2: 47344169504231735314127121174, + limb3: 2322535315488785530829732114 + }, + y1: u384 { + limb0: 36996411242937511652372135410, + limb1: 14955966714591600199652852907, + limb2: 21490117928037792305664863946, + limb3: 3645230735660073235081951638 + } + }; - let outputs = match circuit_inputs.done().eval(modulus) { - Result::Ok(outputs) => { outputs }, - Result::Err(_) => { panic!("Expected success") } - }; - let c_of_z: u384 = outputs.get_output(t31); - let scaling_factor_of_z: u384 = outputs.get_output(t41); - let c_inv_of_z: u384 = outputs.get_output(t63); - let lhs: u384 = outputs.get_output(t66); - let c_inv_frob_1_of_z: u384 = outputs.get_output(t164); - let c_frob_2_of_z: u384 = outputs.get_output(t186); - let c_inv_frob_3_of_z: u384 = outputs.get_output(t208); - return ( - c_of_z, - scaling_factor_of_z, - c_inv_of_z, - lhs, - c_inv_frob_1_of_z, - c_frob_2_of_z, - c_inv_frob_3_of_z - ); -} -fn run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit( - p_0: G1Point, Qy0_0: u384, Qy1_0: u384, p_1: G1Point, Qy0_1: u384, Qy1_1: u384 -) -> (BNProcessedPair, BNProcessedPair) { - // CONSTANT stack - let in0 = CE::> {}; // 0x0 + let yInv_2: u384 = u384 { + limb0: 62051836363987824979756719224, + limb1: 43601545830475804329064662689, + limb2: 78434798797464920687682375932, + limb3: 5945928230865598799817033798 + }; - // INPUT stack - let (in1, in2) = (CE::> {}, CE::> {}); - let (in3, in4) = (CE::> {}, CE::> {}); - let (in5, in6) = (CE::> {}, CE::> {}); - let (in7, in8) = (CE::> {}, CE::> {}); - let t0 = circuit_inverse(in2); - let t1 = circuit_mul(in1, t0); - let t2 = circuit_sub(in0, t1); - let t3 = circuit_sub(in0, in3); - let t4 = circuit_sub(in0, in4); - let t5 = circuit_inverse(in6); - let t6 = circuit_mul(in5, t5); - let t7 = circuit_sub(in0, t6); - let t8 = circuit_sub(in0, in7); - let t9 = circuit_sub(in0, in8); + let xNegOverY_2: u384 = u384 { + limb0: 69993942537227679645050668785, + limb1: 69170994114204920810334784812, + limb2: 28446910752735793915171366548, + limb3: 4070628250823961232958991871 + }; - let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] - ) - .unwrap(); + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 55627430382730384432603157095, + limb1: 54185643196832391186544285626, + limb2: 64533184270906835092236750393, + limb3: 879329241075302220709082491 + }, + x1: u384 { + limb0: 56644680091288238027122202266, + limb1: 4857935508345403038150336921, + limb2: 45653519279362264603765471812, + limb3: 2074187078508866712257295349 + }, + y0: u384 { + limb0: 16923343092092885459833887555, + limb1: 31624545119846362493180038324, + limb2: 28078886448776699946510508747, + limb3: 2873952964984428400078260638 + }, + y1: u384 { + limb0: 36222755428013198867474072336, + limb1: 70669302985929407532653435342, + limb2: 60502464000186282893495262928, + limb3: 4713967876358453341922177876 + } + }; - let mut circuit_inputs = (t0, t2, t3, t4, t5, t7, t8, t9,).new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(p_0.x); - circuit_inputs = circuit_inputs.next(p_0.y); - circuit_inputs = circuit_inputs.next(Qy0_0); - circuit_inputs = circuit_inputs.next(Qy1_0); - circuit_inputs = circuit_inputs.next(p_1.x); - circuit_inputs = circuit_inputs.next(p_1.y); - circuit_inputs = circuit_inputs.next(Qy0_1); - circuit_inputs = circuit_inputs.next(Qy1_1); + let lhs_i: u384 = u384 { + limb0: 1737522026450273883824319056, + limb1: 4228837939380050561566534820, + limb2: 49376034283701021117143702216, + limb3: 3284135560158534327039083510 + }; - let outputs = match circuit_inputs.done().eval(modulus) { - Result::Ok(outputs) => { outputs }, - Result::Err(_) => { panic!("Expected success") } - }; - let p_0: BNProcessedPair = BNProcessedPair { - yInv: outputs.get_output(t0), - xNegOverY: outputs.get_output(t2), - QyNeg0: outputs.get_output(t3), - QyNeg1: outputs.get_output(t4) - }; - let p_1: BNProcessedPair = BNProcessedPair { - yInv: outputs.get_output(t5), - xNegOverY: outputs.get_output(t7), - QyNeg0: outputs.get_output(t8), - QyNeg1: outputs.get_output(t9) - }; - return (p_0, p_1); -} -fn run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit( - p_0: G1Point, - Qy0_0: u384, - Qy1_0: u384, - p_1: G1Point, - Qy0_1: u384, - Qy1_1: u384, - p_2: G1Point, - Qy0_2: u384, - Qy1_2: u384 -) -> (BNProcessedPair, BNProcessedPair, BNProcessedPair) { - // CONSTANT stack - let in0 = CE::> {}; // 0x0 + let f_i_of_z: u384 = u384 { + limb0: 71336509724213167588964555417, + limb1: 8411161902335625284534478008, + limb2: 62997613580581643063651613133, + limb3: 7924217382056663923565272991 + }; + + let f_i_plus_one = E12D { + w0: u384 { + limb0: 4950545568991458625397084361, + limb1: 63728568865228369526582341412, + limb2: 52608189102351847999189841122, + limb3: 6832936993131641903680714017 + }, + w1: u384 { + limb0: 1102693434644604330872299695, + limb1: 41655008833887834191035194133, + limb2: 66097805686626316724979471872, + limb3: 5354446672781477516440592164 + }, + w2: u384 { + limb0: 18943978450077712086184385978, + limb1: 72742716046084932770404633325, + limb2: 20592718281585446914964335984, + limb3: 506011017137527028183953312 + }, + w3: u384 { + limb0: 38665846291835952367889889865, + limb1: 69065502598874679108716442762, + limb2: 31201428332365468218028963977, + limb3: 6529716060662997079135227004 + }, + w4: u384 { + limb0: 19509809312441657592726355037, + limb1: 60624118698077951119808591365, + limb2: 12314442214924876231767309263, + limb3: 6661081559070522569876230513 + }, + w5: u384 { + limb0: 20308537251802697933647364386, + limb1: 15208586696006599468533852384, + limb2: 43767544176704844033736144689, + limb3: 6577731676738635294157464814 + }, + w6: u384 { + limb0: 55502229833345927150109666143, + limb1: 45387725411046155329621704887, + limb2: 3820883086112976178131057083, + limb3: 3825924160089998892866206548 + }, + w7: u384 { + limb0: 24062837592966677945473288428, + limb1: 40504130531836849409969900593, + limb2: 23134407568974648475900777478, + limb3: 3191574316512631319852406797 + }, + w8: u384 { + limb0: 77948576871652827497046123986, + limb1: 16454376489312713159024393165, + limb2: 24028508338243165164240751916, + limb3: 1005946115567801197943179688 + }, + w9: u384 { + limb0: 41417455752323617189133954826, + limb1: 31093815141512925547680896813, + limb2: 46371300719742527964177788593, + limb3: 4357562408032308888462320901 + }, + w10: u384 { + limb0: 78031652960062609133206848159, + limb1: 9546959834111117922109271109, + limb2: 64289873253702344866950993507, + limb3: 85406935762468361493245000 + }, + w11: u384 { + limb0: 57167504851974543412527180570, + limb1: 21151950496685766033247288880, + limb2: 52384931935034000495736341784, + limb3: 5847442656305909253632203802 + } + }; - // INPUT stack - let (in1, in2) = (CE::> {}, CE::> {}); - let (in3, in4) = (CE::> {}, CE::> {}); - let (in5, in6) = (CE::> {}, CE::> {}); - let (in7, in8) = (CE::> {}, CE::> {}); - let (in9, in10) = (CE::> {}, CE::> {}); - let (in11, in12) = (CE::> {}, CE::> {}); - let t0 = circuit_inverse(in2); - let t1 = circuit_mul(in1, t0); - let t2 = circuit_sub(in0, t1); - let t3 = circuit_sub(in0, in3); - let t4 = circuit_sub(in0, in4); - let t5 = circuit_inverse(in6); - let t6 = circuit_mul(in5, t5); - let t7 = circuit_sub(in0, t6); - let t8 = circuit_sub(in0, in7); - let t9 = circuit_sub(in0, in8); - let t10 = circuit_inverse(in10); - let t11 = circuit_mul(in9, t10); - let t12 = circuit_sub(in0, t11); - let t13 = circuit_sub(in0, in11); - let t14 = circuit_sub(in0, in12); + let ci: u384 = u384 { + limb0: 26318966110430421029400701470, + limb1: 40061213549519556874937780967, + limb2: 59489073528430065712100818456, + limb3: 2443856189344276257038515752 + }; - let modulus = TryInto::< - _, CircuitModulus - >::try_into( - [32324006162389411176778628423, 57042285082623239461879769745, 3486998266802970665, 0] - ) - .unwrap(); + let z: u384 = u384 { + limb0: 21344131886807265697776452250, + limb1: 15338225853469552636414286735, + limb2: 155071994303750759, + limb3: 0 + }; - let mut circuit_inputs = (t0, t2, t3, t4, t5, t7, t8, t9, t10, t12, t13, t14,).new_inputs(); - // Prefill constants: - circuit_inputs = circuit_inputs.next([0x0, 0x0, 0x0, 0x0]); - circuit_inputs = circuit_inputs.next(p_0.x); - circuit_inputs = circuit_inputs.next(p_0.y); - circuit_inputs = circuit_inputs.next(Qy0_0); - circuit_inputs = circuit_inputs.next(Qy1_0); - circuit_inputs = circuit_inputs.next(p_1.x); - circuit_inputs = circuit_inputs.next(p_1.y); - circuit_inputs = circuit_inputs.next(Qy0_1); - circuit_inputs = circuit_inputs.next(Qy1_1); - circuit_inputs = circuit_inputs.next(p_2.x); - circuit_inputs = circuit_inputs.next(p_2.y); - circuit_inputs = circuit_inputs.next(Qy0_2); - circuit_inputs = circuit_inputs.next(Qy1_2); + let ( + Q0_result, + Q1_result, + Q2_result, + f_i_plus_one_of_z_result, + lhs_i_plus_one_result, + ci_plus_one_result + ) = + run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( + yInv_0, + xNegOverY_0, + Q0, + yInv_1, + xNegOverY_1, + Q1, + yInv_2, + xNegOverY_2, + Q2, + lhs_i, + f_i_of_z, + f_i_plus_one, + ci, + z + ); + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 27378767301922833686143517038, + limb1: 51337410913827188572679279390, + limb2: 42718443479486482657851872760, + limb3: 5091822877018088668895436787 + }, + x1: u384 { + limb0: 75231692528042422779959300519, + limb1: 41272936512319394731406143254, + limb2: 60590709168556354329508023765, + limb3: 4880923781167111932186984244 + }, + y0: u384 { + limb0: 37300092076274937425884627267, + limb1: 68743388896121737689982091635, + limb2: 7315511109914459276413974598, + limb3: 2860409150295296122096133404 + }, + y1: u384 { + limb0: 7140455586794352029841759021, + limb1: 11636064495696247320320646379, + limb2: 36407291327802861937884185893, + limb3: 4263118177163014765354559675 + } + }; - let outputs = match circuit_inputs.done().eval(modulus) { - Result::Ok(outputs) => { outputs }, - Result::Err(_) => { panic!("Expected success") } - }; - let p_0: BNProcessedPair = BNProcessedPair { - yInv: outputs.get_output(t0), - xNegOverY: outputs.get_output(t2), - QyNeg0: outputs.get_output(t3), - QyNeg1: outputs.get_output(t4) - }; - let p_1: BNProcessedPair = BNProcessedPair { - yInv: outputs.get_output(t5), - xNegOverY: outputs.get_output(t7), - QyNeg0: outputs.get_output(t8), - QyNeg1: outputs.get_output(t9) - }; - let p_2: BNProcessedPair = BNProcessedPair { - yInv: outputs.get_output(t10), - xNegOverY: outputs.get_output(t12), - QyNeg0: outputs.get_output(t13), - QyNeg1: outputs.get_output(t14) - }; - return (p_0, p_1, p_2); -} + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 26554842753665639454174537067, + limb1: 78513137270101280272270041354, + limb2: 44465592243921404048921786365, + limb3: 7858696388144940807694113260 + }, + x1: u384 { + limb0: 42593326799676778396511600702, + limb1: 11083608459754007959427123120, + limb2: 72227916289850602307382401737, + limb3: 2653053258585777000789824267 + }, + y0: u384 { + limb0: 45545286079687225971419611616, + limb1: 48596312292420610009055930095, + limb2: 19084757260430453316473238559, + limb3: 3150162585303398813752011213 + }, + y1: u384 { + limb0: 44442507082942709774539463279, + limb1: 70236386180319763579765207417, + limb2: 39153403449742544520660434471, + limb3: 939019391553685492975886133 + } + }; -#[cfg(test)] -mod tests { - use core::traits::TryInto; + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 58112456561750509143004019472, + limb1: 33430700041779329147013955397, + limb2: 35709487731604570412364660917, + limb3: 3954651794252796262230165270 + }, + x1: u384 { + limb0: 27387060481364623689571819043, + limb1: 57546915448566073426970305793, + limb2: 37071975457226735463725518688, + limb3: 5112528261442937060188699335 + }, + y0: u384 { + limb0: 69898133634053084054299812404, + limb1: 44906755089547555058528925737, + limb2: 63068677498652347068144764858, + limb3: 666268163075904248017874006 + }, + y1: u384 { + limb0: 2677644854233873298388363203, + limb1: 11252877525596586504181240979, + limb2: 77453045243938274025594263578, + limb3: 3435640740769824208448272853 + } + }; - use core::circuit::{ - RangeCheck96, AddMod, MulMod, u96, CircuitElement, CircuitInput, circuit_add, circuit_sub, - circuit_mul, circuit_inverse, EvalCircuitResult, EvalCircuitTrait, u384, - CircuitOutputsTrait, CircuitModulus, AddInputResultTrait, CircuitInputs - }; - use garaga::definitions::{ - G1Point, G2Point, E12D, E12DMulQuotient, G1G2Pair, BNProcessedPair, BLSProcessedPair, - MillerLoopResultScalingFactor - }; + let f_i_plus_one_of_z: u384 = u384 { + limb0: 56488832881111714771149788714, + limb1: 73639913562043507392820158706, + limb2: 54420394058539101815910554499, + limb3: 1972939589268313999203650363 + }; - use super::{ - run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit, - run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit, - run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit, - run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit, run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit, - run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit, - run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit, - run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit, - run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit, run_BN254_MP_CHECK_BIT0_LOOP_2_circuit, - run_BN254_MP_CHECK_BIT0_LOOP_3_circuit, run_BN254_MP_CHECK_BIT1_LOOP_2_circuit, - run_BN254_MP_CHECK_BIT1_LOOP_3_circuit, run_BN254_MP_CHECK_FINALIZE_BN_2_circuit, - run_BN254_MP_CHECK_FINALIZE_BN_3_circuit, run_BN254_MP_CHECK_INIT_BIT_2_circuit, - run_BN254_MP_CHECK_INIT_BIT_3_circuit, run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit, - run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit, run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit - }; + let lhs_i_plus_one: u384 = u384 { + limb0: 6623107519891967018121631633, + limb1: 6769104495990424866440127044, + limb2: 53653570388033223278127742810, + limb3: 5431900679186942831905567391 + }; + + let ci_plus_one: u384 = u384 { + limb0: 77401213388580003243282897707, + limb1: 77351999013419473514729153060, + limb2: 63782658127125164461847408545, + limb3: 3550726233448241184164868121 + }; + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(Q2_result, Q2); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); + assert_eq!(ci_plus_one_result, ci_plus_one); + } #[test] - fn test_run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit_BLS12_381() { + fn test_run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit_BLS12_381() { let yInv_0: u384 = u384 { - limb0: 73966720706824074988619236662, - limb1: 42448594940999343979073568840, - limb2: 46077737715233813594529879446, - limb3: 2347359106167037307984686096 + limb0: 10270525777075133315700224504, + limb1: 41273627772016857693293055395, + limb2: 48495343232210209936213616796, + limb3: 3918131980174143410700957376 }; let xNegOverY_0: u384 = u384 { - limb0: 7705988297302680206128137863, - limb1: 41125653623563882997086893471, - limb2: 57261452220586076769144182696, - limb3: 6526638415958020458124787407 + limb0: 10866878106957674985426320683, + limb1: 60814141268779366113937245594, + limb2: 65255122644499280021609414364, + limb3: 3382890008280704524057269670 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 25576924477982438069760885999, - limb1: 69014809299970710643520579795, - limb2: 65519603140533672223653736312, - limb3: 5684167619725138342305291668 + limb0: 61569562842833326569635693048, + limb1: 14002922645198855308228496136, + limb2: 851706915890244793295312008, + limb3: 4913318351856332449828594016 + }, + x1: u384 { + limb0: 4031195088403449262183790517, + limb1: 817514199874961996430670589, + limb2: 61388600382383045252818006789, + limb3: 6465775098127045948665810451 + }, + y0: u384 { + limb0: 416940567047984492916305837, + limb1: 5640261571132854236110928094, + limb2: 47640737247279044054281182842, + limb3: 334953285401241559908016812 + }, + y1: u384 { + limb0: 62573716580423026628703590306, + limb1: 17243495528221491441036605246, + limb2: 69241837181544296146904884380, + limb3: 2333617825806806478829776227 + } + }; + + let Q_or_Qneg_0: G2Point = G2Point { + x0: u384 { + limb0: 28832884305707186472331019383, + limb1: 75352872769653825324569060759, + limb2: 43500912818506717599093667527, + limb3: 3317422609559076190256630926 }, x1: u384 { - limb0: 11492494132931834620477878046, - limb1: 38059333402710455767753075899, - limb2: 24828275629250228679482053469, - limb3: 5006067880420078677238758545 + limb0: 76274573925369262914841737673, + limb1: 22335234546393731695807515797, + limb2: 74480753452933685520145134968, + limb3: 5503072229424092167492878486 }, y0: u384 { - limb0: 50667892757008143429265168368, - limb1: 72921272383399479451659361579, - limb2: 17757657870781321129275033682, - limb3: 7145339992469545219993838400 + limb0: 14703945616479682761682197552, + limb1: 66567259738529382701723786422, + limb2: 75359742298265893137713727942, + limb3: 4409585945595711469786654977 }, y1: u384 { - limb0: 35249472804683011986670698701, - limb1: 74924331137460388269391350335, - limb2: 30739545230180619663342001256, - limb3: 7955853719234306273110128105 + limb0: 1546631683566543300994822571, + limb1: 55291378241212975926458368183, + limb2: 9939375766051829449217316998, + limb3: 3470275672302539030956168312 } }; let yInv_1: u384 = u384 { - limb0: 6552301747374431499106032889, - limb1: 13550208009464935184283742147, - limb2: 68487436848685660449182206332, - limb3: 2522475858052970579396304770 + limb0: 37493528488191583576504021652, + limb1: 13254474555893715421976593190, + limb2: 43922617329982233428753994144, + limb3: 4215721233752249652214948583 }; let xNegOverY_1: u384 = u384 { - limb0: 55982199838669628782110946172, - limb1: 42801836005633744871927297494, - limb2: 53002018604580736772341030297, - limb3: 7348229895199666822081891099 + limb0: 53744403841485302647108495074, + limb1: 18887874813634934675164754286, + limb2: 6196361778141201612504976707, + limb3: 3274798192586703991185501871 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 73808626024657452385272751606, - limb1: 49252570097045874680029383354, - limb2: 21341235208478830945972945285, - limb3: 7542055373133413141260093143 + limb0: 30687536668176394375456703336, + limb1: 3781874451263404152497050236, + limb2: 54879464428999536222443454387, + limb3: 6333426372390470411591669477 + }, + x1: u384 { + limb0: 42031191961224779389788905563, + limb1: 63797656052403472538155455741, + limb2: 6015094480530939914449022363, + limb3: 7219068560908406587743567681 + }, + y0: u384 { + limb0: 59774008864869882053472844747, + limb1: 55494070418672716528146301373, + limb2: 13974037278681743855635724025, + limb3: 4659035877877816188070130982 + }, + y1: u384 { + limb0: 3630407599690021214451045400, + limb1: 32558899824297663866986102709, + limb2: 32195487297937452909102975555, + limb3: 6397873234008683741719128355 + } + }; + + let Q_or_Qneg_1: G2Point = G2Point { + x0: u384 { + limb0: 26636642406891112036142813971, + limb1: 22101491518070189307805344505, + limb2: 27329981067941661487103626184, + limb3: 7344947780444752110217509226 }, x1: u384 { - limb0: 27526563326521543409548092264, - limb1: 3612706777157626655459126014, - limb2: 63106674586712851266316821140, - limb3: 208130262573538742119855564 + limb0: 35841648475365911955602994303, + limb1: 14123437664839883907142289247, + limb2: 71086894883378454156557235352, + limb3: 6234177787685010310773380266 }, y0: u384 { - limb0: 53490648328201348213967783752, - limb1: 28914730537270299249087548925, - limb2: 14283139033441850899321182336, - limb3: 2362333969099325049821901516 + limb0: 4217314271872491872576185341, + limb1: 35635138836873756703547805217, + limb2: 6016189052409329336125450926, + limb3: 1184265810325184594266941338 }, y1: u384 { - limb0: 31200965383160327959743599258, - limb1: 3572873405884610738544768450, - limb2: 24793496656343873733210237356, - limb3: 822242150823796419952416537 + limb0: 13403200920350082548552488898, + limb1: 4352298733847178082484445858, + limb2: 47767829495283212306124049549, + limb3: 1727463755568118226180803285 } }; let lhs_i: u384 = u384 { - limb0: 66015176054347817673144700752, - limb1: 1419461796763841330947413132, - limb2: 49651253489627368952822717908, - limb3: 2240827021594023337730599960 + limb0: 77327534125681170775259418623, + limb1: 58799396636027713162390332626, + limb2: 10695659750691371741041111241, + limb3: 3667300216936875257472481775 }; let f_i_of_z: u384 = u384 { - limb0: 27282199693189762258060367485, - limb1: 8137383696947510148487006021, - limb2: 46639296962617728513459903783, - limb3: 646571295585350065799925522 + limb0: 22169091740652787885613017918, + limb1: 561305495775730961846808566, + limb2: 26577495029113835893127935971, + limb3: 749893059359583788881600801 }; - let f_i_plus_one: E12D = E12D { + let f_i_plus_one = E12D { w0: u384 { - limb0: 23626016319624040931666652651, - limb1: 36122203514898571836120792811, - limb2: 47249292660028011029598515490, - limb3: 4294812392860205892154200829 + limb0: 42300368557468181639453904579, + limb1: 12816291217720245058877262811, + limb2: 49001010808670926191958200438, + limb3: 5479236131009814999137589659 }, w1: u384 { - limb0: 78869450351409308192186975300, - limb1: 78922255588819786692888102459, - limb2: 28462787193147925439866541648, - limb3: 1632927150210253716523029302 + limb0: 75780736278525312131732800705, + limb1: 60341850856133427522636637635, + limb2: 4635370242855441537546401758, + limb3: 2131534916452135004432463825 }, w2: u384 { - limb0: 72747727407078594644041639914, - limb1: 1515217723924821708099274489, - limb2: 57612249587446338981379809018, - limb3: 2091526728290551790942883995 + limb0: 71312498493826879170995335379, + limb1: 1949919922263504932659085206, + limb2: 33593943677901085986550411528, + limb3: 6408742349028922710301753127 }, w3: u384 { - limb0: 46720279617513404542864880157, - limb1: 9757897624505213000954653240, - limb2: 51541119075713085635026284540, - limb3: 3715725851675629328737556606 + limb0: 30725170511976440801341992659, + limb1: 70158530836372615678944532181, + limb2: 64936192179739830216981969791, + limb3: 1875632686408204864460826024 }, w4: u384 { - limb0: 20265706166623812597481550405, - limb1: 49369823921294819368717295152, - limb2: 78806687608828628167010824683, - limb3: 1070703732845470587751440775 + limb0: 5416441650074344389735515789, + limb1: 66436954800048167066356196460, + limb2: 15318443593956385032213790664, + limb3: 8003705200892113318032210576 }, w5: u384 { - limb0: 1564104426054424627512358158, - limb1: 9173815498813690692700283384, - limb2: 30126807008702051699039260086, - limb3: 2502998850043283855437458719 + limb0: 29925452837584511339814435065, + limb1: 71781451021120638292092266438, + limb2: 62304929999554921948177070664, + limb3: 6122962266117534665966812562 }, w6: u384 { - limb0: 12131978802332850238679812544, - limb1: 54329922212631780695320776841, - limb2: 23856903607645104917943424410, - limb3: 1000055968111231568717953882 + limb0: 12108246340442429455971122644, + limb1: 36573992723376078553845399626, + limb2: 23772335124274775229954098498, + limb3: 2863569299286716314494810078 }, w7: u384 { - limb0: 21389793674035680744306146271, - limb1: 55517261152617217072538037441, - limb2: 65811088761058984078943790603, - limb3: 5066490274139094090334869048 + limb0: 33875646533936559234872809775, + limb1: 78504313903278613976349702955, + limb2: 10928763983555625777832409826, + limb3: 1382242378138602446805086908 }, w8: u384 { - limb0: 9327893569120451405535055910, - limb1: 62175098457646296800253933704, - limb2: 15738409941419775583988226359, - limb3: 7704531918475443943944719084 + limb0: 77820720629424806009019504358, + limb1: 25129522554439892503182453198, + limb2: 73755848318658190723354415348, + limb3: 1434823775076896096245150309 }, w9: u384 { - limb0: 41447904437980442498966983090, - limb1: 28357489022135787720846237645, - limb2: 23400133233485402194106936906, - limb3: 5428503382626088043945016969 + limb0: 25786100892102041398555537288, + limb1: 9688927942274723458760705785, + limb2: 22938303269890629181013757689, + limb3: 478926814095195537286572739 }, w10: u384 { - limb0: 16455212497229763843237943862, - limb1: 38082121256046928638314946986, - limb2: 216926907784119823257202769, - limb3: 881441411652806633672903524 + limb0: 34694988415059553205942033992, + limb1: 77263929789656935575577621941, + limb2: 50605482325959137133224655107, + limb3: 163430648919606487753511787 }, w11: u384 { - limb0: 66173909555754783924252396135, - limb1: 39146954682889547443561278710, - limb2: 7137084757217986966065141081, - limb3: 743241482708687989548976079 + limb0: 28212222609585886906853123633, + limb1: 23532623940105012734361898218, + limb2: 67365120472097392426905098257, + limb3: 3357851176268082037335105674 } }; - let ci: u384 = u384 { - limb0: 8025058476432680984296257292, - limb1: 51049619996825670574535581501, - limb2: 78330184687275624302614761995, - limb3: 2615767555066728731410152820 + let c_or_cinv_of_z: u384 = u384 { + limb0: 52293061812384466408305828874, + limb1: 78921144064263136073971338402, + limb2: 51090796273196843346160009363, + limb3: 3711054840487085193997117763 }; let z: u384 = u384 { - limb0: 63508986178613188473085140062, - limb1: 33750817435060414724410741316, - limb2: 133624819526727804, + limb0: 36880896032498523141231777761, + limb1: 548870523643093760961939326, + limb2: 285341065541849776, limb3: 0 }; + let ci: u384 = u384 { + limb0: 53402248372583665571828248070, + limb1: 30009280800305497440341765267, + limb2: 10096741978574011589218319912, + limb3: 5694580481589293809476822207 + }; + let ( Q0_result, Q1_result, @@ -7943,82 +11621,95 @@ mod tests { lhs_i_plus_one_result, ci_plus_one_result ) = - run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( - yInv_0, xNegOverY_0, Q0, yInv_1, xNegOverY_1, Q1, lhs_i, f_i_of_z, f_i_plus_one, ci, z + run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( + yInv_0, + xNegOverY_0, + Q0, + Q_or_Qneg_0, + yInv_1, + xNegOverY_1, + Q1, + Q_or_Qneg_1, + lhs_i, + f_i_of_z, + f_i_plus_one, + c_or_cinv_of_z, + z, + ci ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 78504346655283717611601019884, - limb1: 48585380626263748361173591022, - limb2: 74482470374860536882230970549, - limb3: 3112263331161207636597242321 + limb0: 14042667016545301194786461143, + limb1: 55733678628503947269730059507, + limb2: 33992596258161151053067127352, + limb3: 828572713875099410828936617 }, x1: u384 { - limb0: 70946979196980286937281548936, - limb1: 37630853958242741434623647112, - limb2: 10458704777536792799953428685, - limb3: 161029280155937377895135514 + limb0: 77769745135619439405823361826, + limb1: 76167825092037376660498035972, + limb2: 54824343745132782099741888812, + limb3: 494707088538115505710770122 }, y0: u384 { - limb0: 63609392294563737484894273467, - limb1: 45802876733359294963882025662, - limb2: 73261610627326638140960968253, - limb3: 1525661964099928275229755926 + limb0: 57685810173755762111794816687, + limb1: 5383700548004513568226942084, + limb2: 66573987758945269586431321693, + limb3: 5908267976700499209668293387 }, y1: u384 { - limb0: 58612777834031351057505602145, - limb1: 19852640537875362138338795461, - limb2: 36565691159195418747066782052, - limb3: 429660795955964063565853862 + limb0: 49685823189323440886005887987, + limb1: 57539076523796554175933906423, + limb2: 33479399920058647214363326918, + limb3: 7257794604610476285284851391 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 40587178928896243754116124186, - limb1: 36479352318648910133945685425, - limb2: 5837525431050467990712947417, - limb3: 1155655290051025541501409649 + limb0: 33552962787828955461684428973, + limb1: 289899194144243075040383678, + limb2: 39498490761827727571038013343, + limb3: 7176887415254611072938782604 }, x1: u384 { - limb0: 10035139388927854693508924090, - limb1: 15824279481437739002640797152, - limb2: 14105946480147889183014560216, - limb3: 6364735961285148535534675084 + limb0: 41238180883792243091342155047, + limb1: 39041080030316788776670332645, + limb2: 9628190053693352803227367454, + limb3: 3502107492795376094927331306 }, y0: u384 { - limb0: 33004654580449463882511715717, - limb1: 71272689196695583137566542732, - limb2: 75001311586222408849637610656, - limb3: 1598838902257261112987037618 + limb0: 58346786067511716965128573874, + limb1: 32709912215702209009185599799, + limb2: 73849051364840042609480101761, + limb3: 5916077668139205664455025178 }, y1: u384 { - limb0: 33821789002356008202642027124, - limb1: 70950527391302408639177409214, - limb2: 1493574860825848846576249882, - limb3: 7165707705884903811359281444 + limb0: 13586913276400053897929481047, + limb1: 77791958441834265347198497054, + limb2: 13878849068541634317271637819, + limb3: 7353540119403550382345759790 } }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 49835695876828206513927212659, - limb1: 23334923981852779392028550754, - limb2: 43484124272915207693546996815, - limb3: 6620860867595882529041419565 + limb0: 43754069954388239584719971286, + limb1: 63350849922442070516538313031, + limb2: 55253096624037056557217462851, + limb3: 5458750726474743904195467181 }; let lhs_i_plus_one: u384 = u384 { - limb0: 69870077628982748424790123904, - limb1: 10889999114054728202136382750, - limb2: 33139372936082612649391633495, - limb3: 194642949765947879787886684 + limb0: 47724643563232300292876266348, + limb1: 16031841888916154700440824015, + limb2: 39657889938248000409928637826, + limb3: 1038197336319072443931100890 }; let ci_plus_one: u384 = u384 { - limb0: 7869379583535287973587765450, - limb1: 72736016143797463885171530816, - limb2: 24008725460000075666173701707, - limb3: 37591700460008080787821834 + limb0: 60988524963784831516809138641, + limb1: 31862403368334053869129654035, + limb2: 61347443955292173728670355212, + limb3: 2494409620579144666359959227 }; assert_eq!(Q0_result, Q0); assert_eq!(Q1_result, Q1); @@ -8029,233 +11720,321 @@ mod tests { #[test] - fn test_run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit_BLS12_381() { + fn test_run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit_BLS12_381() { let yInv_0: u384 = u384 { - limb0: 67645190188774287996388183090, - limb1: 52657602848291146208502418266, - limb2: 63603927553689066789144763940, - limb3: 6338051547980557206832279155 + limb0: 14454689829351116072134801828, + limb1: 78759557729622088513820178464, + limb2: 24460579687512179227318865526, + limb3: 2285899098753378325199941760 }; let xNegOverY_0: u384 = u384 { - limb0: 4705385642774848942144548685, - limb1: 29471600637527950823516135835, - limb2: 7258755488100893876985677839, - limb3: 2271939953583864467709812427 + limb0: 1716528238342883776339619401, + limb1: 12356345320086183676586310510, + limb2: 37998904945074056288888344638, + limb3: 826165966821634221464184085 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 72136333375632148948251243396, - limb1: 55373592774912796215448316664, - limb2: 75107311719821888650804028508, - limb3: 4858383089285600791102332080 + limb0: 63812040960298775403466292699, + limb1: 13735601558832440022514320166, + limb2: 70998201499523483505092712280, + limb3: 2090759183394077640028735149 + }, + x1: u384 { + limb0: 17842324039176315991122397956, + limb1: 48652763046060764972600931104, + limb2: 33189400860005616984170125877, + limb3: 557581759227700426906009228 + }, + y0: u384 { + limb0: 42317664355513929731310372329, + limb1: 28534937478219201128841366738, + limb2: 16750897851707481478737388220, + limb3: 7303877582345229464448773559 + }, + y1: u384 { + limb0: 46909156434398527273290216972, + limb1: 423038672330560568741823094, + limb2: 39557733071457947917374316405, + limb3: 4963372096402665195418909440 + } + }; + + let Q_or_Qneg_0: G2Point = G2Point { + x0: u384 { + limb0: 48445588494706530723777876215, + limb1: 18019304796318080556279150925, + limb2: 63517167963993611907021877986, + limb3: 421162466524909900785915189 }, x1: u384 { - limb0: 70138607296977309774531820623, - limb1: 45336060716454350384616122138, - limb2: 49406454830217940861015452635, - limb3: 4193510996978566350819129800 + limb0: 57785888476184267814048913659, + limb1: 50382711582570768689470883112, + limb2: 78616245268791062365750572308, + limb3: 1845713742838411979879081830 }, y0: u384 { - limb0: 33466028378991911433433255815, - limb1: 78307292161293928127249032483, - limb2: 869888261216397239039779596, - limb3: 2934617676377146432287454136 + limb0: 27393912370547270113154843726, + limb1: 40547504210301365256082058313, + limb2: 5334319328153273372646397164, + limb3: 5933087639331459606572376355 }, y1: u384 { - limb0: 26182874427330299594581933379, - limb1: 54063479596963045795174164167, - limb2: 48492373114505132393729236674, - limb3: 5559170957761898760583348658 + limb0: 57578824581472105163490662369, + limb1: 1175543731062062093430564300, + limb2: 10261508349983793805928484901, + limb3: 4571338167451366303459940898 } }; let yInv_1: u384 = u384 { - limb0: 57250133847884356384884471856, - limb1: 51943117992509234426260248075, - limb2: 53647304781969674245973362823, - limb3: 4733047238140457919099386004 + limb0: 10553850492366303173615987087, + limb1: 76216902431453819572779389229, + limb2: 53128998782492959282133071233, + limb3: 884315398324497059481484883 }; let xNegOverY_1: u384 = u384 { - limb0: 64362148428388793202253511888, - limb1: 18618901000839345281757086299, - limb2: 43110191744225712341907154515, - limb3: 8017507280698249471939817957 + limb0: 16994457071576410906610043784, + limb1: 12671686908327368871024692691, + limb2: 22045787647512778747935420619, + limb3: 4604950007657616354628525290 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 63521879065894347275814207488, - limb1: 25425093580821921393294147326, - limb2: 21154873529816172906054973144, - limb3: 3939560150177862172465237811 + limb0: 53336505614356896682848246392, + limb1: 72366345031288823765163126302, + limb2: 21749609983445654032051779549, + limb3: 7261963587051738919308172329 + }, + x1: u384 { + limb0: 68630432347544568266431477362, + limb1: 4330734888040178645071264948, + limb2: 12875422857643560100825987829, + limb3: 3696210125269533410132764003 + }, + y0: u384 { + limb0: 64230442693667611472747013364, + limb1: 18949033884198649257010777613, + limb2: 77078372468164437681992834831, + limb3: 6210902167122460165026238456 + }, + y1: u384 { + limb0: 21067684933072738352748184032, + limb1: 55162310761075644381761812898, + limb2: 20552329839645978197147060454, + limb3: 2384699152832620986215339152 + } + }; + + let Q_or_Qneg_1: G2Point = G2Point { + x0: u384 { + limb0: 69744308489355343009011031680, + limb1: 78276809476379431828584364792, + limb2: 25421273179724382640807742666, + limb3: 629332363893194702724242147 }, x1: u384 { - limb0: 52454400847227534843331364876, - limb1: 56403350820294173574665211253, - limb2: 24805395293854825618097782338, - limb3: 4585680638028217332413404671 + limb0: 9077585745323353651113955592, + limb1: 28801061112021383577447956867, + limb2: 9105103064300810208305129179, + limb3: 1798386197310028193798726885 }, y0: u384 { - limb0: 16011903230190839297838950175, - limb1: 78013949064657796354569835600, - limb2: 4235139205568324472001721348, - limb3: 2479535867334512737060388860 + limb0: 53834910180802468499366280294, + limb1: 28754559101201230030764847602, + limb2: 17967099487866863327467040612, + limb3: 3158624751975132178053277673 }, y1: u384 { - limb0: 27826125445872256821300712256, - limb1: 14588477606122288214447395523, - limb2: 52303693192654731816017739314, - limb3: 1944723648630403238778433833 + limb0: 33198040167565188028146666337, + limb1: 73700832140940917994986570501, + limb2: 66081209531009233988334580996, + limb3: 5872002828490787399876989862 } }; let yInv_2: u384 = u384 { - limb0: 77107503623253901750428994373, - limb1: 26665084459409584569499694063, - limb2: 15373304979505168328081951462, - limb3: 5494060964470458262802014947 + limb0: 47468425175971097337373985443, + limb1: 28807615511803665251097717034, + limb2: 72125375599547252760680059759, + limb3: 6942269568488219344950079283 }; let xNegOverY_2: u384 = u384 { - limb0: 58075050555062230893512357942, - limb1: 39984014701464321737056386502, - limb2: 28044350399257281786571186487, - limb3: 189158860746913101731791216 + limb0: 34833879385875259710675708996, + limb1: 35850984696865657168450227647, + limb2: 51512210514675007787899416982, + limb3: 6711142208545727339012346595 }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 733914154557256708501082161, - limb1: 18927676773624466103183753834, - limb2: 37755989911654655285379951270, - limb3: 1496829910258336721387127014 + limb0: 52517770384567095716379708876, + limb1: 10426568963990827648286936293, + limb2: 73575184961942115375421479689, + limb3: 4564989597830912894329253944 + }, + x1: u384 { + limb0: 4835878655583572187039789486, + limb1: 45928657993977151826719713570, + limb2: 23169209875697424541700676410, + limb3: 7036934315505425410413129206 + }, + y0: u384 { + limb0: 70527640951350717131886313147, + limb1: 8967572263911713061376719077, + limb2: 32604422014688996097420735298, + limb3: 6632073968278743126005515285 + }, + y1: u384 { + limb0: 46044213591418091423620492848, + limb1: 76928589039152883416383957610, + limb2: 61228132501615218685111852851, + limb3: 4648575281754311653148124060 + } + }; + + let Q_or_Qneg_2: G2Point = G2Point { + x0: u384 { + limb0: 74785828218095172669530860093, + limb1: 58201448657620473559698463887, + limb2: 53785390717136751320806174439, + limb3: 354692878285165878960072151 }, x1: u384 { - limb0: 73427031768388013585298810087, - limb1: 48051034499266079144833947656, - limb2: 66516504806420318058601206341, - limb3: 2083651689615959383784084647 + limb0: 45290662914676220501737387734, + limb1: 8184883731102392918707676957, + limb2: 1562342200442521446348722055, + limb3: 4036278542917621461513753754 }, y0: u384 { - limb0: 28689247672908926748640205652, - limb1: 67617943497493846978974278145, - limb2: 74236474231465676797080184146, - limb3: 1979711704692059766495889699 + limb0: 17299920296087035216658881619, + limb1: 36523711200768638570639409888, + limb2: 55923584175263022156470505261, + limb3: 4414463732780112332972415754 }, y1: u384 { - limb0: 40032240807759237717895640070, - limb1: 13766297827823042203452183395, - limb2: 24937057537393301013125501786, - limb3: 2769815011639412537710771166 + limb0: 25651857055553133538474268028, + limb1: 40630456684683662441024087699, + limb2: 55600449248268813605320105452, + limb3: 1939677616245515303819298314 } }; let lhs_i: u384 = u384 { - limb0: 2283056993468865802459226988, - limb1: 69716840744201578088393458707, - limb2: 77124225367352814393960846210, - limb3: 4784189143176113769637646650 + limb0: 46557635626576675460769661604, + limb1: 49720811448954604970006067416, + limb2: 77208734762162560413889605600, + limb3: 3315452289985898780760730478 }; let f_i_of_z: u384 = u384 { - limb0: 8947828768432171273903092683, - limb1: 34914891178869867414564723482, - limb2: 20727106707183038815556392890, - limb3: 122409574203775513327851788 + limb0: 31431249854717413110463840676, + limb1: 63934418722419798225544745353, + limb2: 67644951910423101776283794827, + limb3: 5300389117457602808408857487 }; - let f_i_plus_one: E12D = E12D { + let f_i_plus_one = E12D { w0: u384 { - limb0: 26802938229540759452023188326, - limb1: 54528120650166359425634514804, - limb2: 7545859729841264336372840718, - limb3: 7196412543010820562300640978 + limb0: 8273905499682469385299419912, + limb1: 28315457049920191994324428062, + limb2: 29081222522156640314250691403, + limb3: 7609388752594630235315146712 }, w1: u384 { - limb0: 4323173215483431568250235233, - limb1: 74028530849435334128319539305, - limb2: 67252475027747847549158712432, - limb3: 4910511279305339733696270809 + limb0: 64802315518375623762432022214, + limb1: 32601161953173324598585345260, + limb2: 560422807335113413781922333, + limb3: 4531666863617654518816666192 }, w2: u384 { - limb0: 5931435599843401876953499114, - limb1: 25403228354258987098753054580, - limb2: 76862809613796514260264359444, - limb3: 5020384942163346914689764943 + limb0: 7326219856290449920067960699, + limb1: 29726985315263812606159607970, + limb2: 33156876503975941201673369847, + limb3: 4210121993451966383543885675 }, w3: u384 { - limb0: 50968848811957839573415054181, - limb1: 64737593512803948756340729018, - limb2: 36373220901384849739565561308, - limb3: 5675063076031134715803491489 + limb0: 74079489917311338989808302058, + limb1: 70769882259780109135845229440, + limb2: 50973871992181589814571987205, + limb3: 3151667129159933774211379093 }, w4: u384 { - limb0: 67865990208338337486645663434, - limb1: 25040974144796177829520396919, - limb2: 39405976213522692194317865569, - limb3: 175976933001405656331713297 + limb0: 16403612491907960754591093038, + limb1: 5911444533694328207857217781, + limb2: 73817454988641032735487198683, + limb3: 1583560287621109251792606760 }, w5: u384 { - limb0: 24132736565883038865261534869, - limb1: 44552576314647229356379623104, - limb2: 53199680720860277671126643716, - limb3: 3375656489063191435834690263 + limb0: 51421265295014291580234603089, + limb1: 552828692925557346971702087, + limb2: 38496386985597789721551924062, + limb3: 657414964215336384877306886 }, w6: u384 { - limb0: 4300125322400193412493214509, - limb1: 66893719349587472352352662748, - limb2: 44379722276642792553141730631, - limb3: 5941628430449660124206556863 + limb0: 66834946142963619185358796500, + limb1: 21208053827986969099740302041, + limb2: 74976186114757178244511873107, + limb3: 1390123685456129995741901119 }, w7: u384 { - limb0: 52066150231854372737326729718, - limb1: 35853315184938890278838787867, - limb2: 60159524392412879719060513424, - limb3: 21757551343827120882079673 + limb0: 66230644264750654148277112483, + limb1: 27002408003556345776298419661, + limb2: 14654693272098065698952258706, + limb3: 3995387849613544928493322811 }, w8: u384 { - limb0: 65750175360450004576429616670, - limb1: 63375615049514521327427886703, - limb2: 41355919226912717718662639452, - limb3: 1052964422147184395367696206 + limb0: 23439422147536678857946186008, + limb1: 38172293765231310010933295702, + limb2: 14060990187230503937887085765, + limb3: 2072870767198236141434892678 }, w9: u384 { - limb0: 13005728042041963228784237880, - limb1: 65112766949148342657773166770, - limb2: 57167801326905104843554415061, - limb3: 2518359316583766766567688525 + limb0: 33235040705264855724460704753, + limb1: 64386510939362339600476334130, + limb2: 4886837293144413864990088485, + limb3: 7840065915352450861335704803 }, w10: u384 { - limb0: 14858719261728665255295371291, - limb1: 67517794057531307655900508768, - limb2: 36210915031012528109150068060, - limb3: 1887400678175423132721347322 + limb0: 7407666857510714772564114008, + limb1: 68062314176884212330641092513, + limb2: 51468691690351352234484794813, + limb3: 6175993035101935971930202930 }, w11: u384 { - limb0: 8538081791089968876672215481, - limb1: 3684137949228109205779810832, - limb2: 66350910926279852355896173927, - limb3: 1220303745327452935660075947 + limb0: 27042747746641356892763719199, + limb1: 51238683893932060873599964775, + limb2: 8834301925303865925890568141, + limb3: 4425888819771461779548778747 } }; - let ci: u384 = u384 { - limb0: 35692651665805873767103811159, - limb1: 46690436505139854990525292345, - limb2: 10666963490371142212370621331, - limb3: 42957753782950998589779826 + let c_or_cinv_of_z: u384 = u384 { + limb0: 32673940628352978930730917159, + limb1: 31555748483907410857920868726, + limb2: 50515659991227946663030782166, + limb3: 7668856969752940484122730370 }; let z: u384 = u384 { - limb0: 69934371500382649984149709376, - limb1: 69830954992939235768547957337, - limb2: 482687581930733628, + limb0: 32079148735126304612101011070, + limb1: 4254465290740283508417425338, + limb2: 367478373635187865, limb3: 0 }; + let ci: u384 = u384 { + limb0: 35773541342483668874580110925, + limb1: 61221886949754362469845386098, + limb2: 46613988527903909403233710286, + limb3: 6451935985259656803892167468 + }; + let ( Q0_result, Q1_result, @@ -8264,122 +12043,126 @@ mod tests { lhs_i_plus_one_result, ci_plus_one_result ) = - run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( + run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( yInv_0, xNegOverY_0, Q0, + Q_or_Qneg_0, yInv_1, xNegOverY_1, Q1, + Q_or_Qneg_1, yInv_2, xNegOverY_2, Q2, + Q_or_Qneg_2, lhs_i, f_i_of_z, f_i_plus_one, - ci, - z + c_or_cinv_of_z, + z, + ci ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 67961184674174432372689634720, - limb1: 20587213131950098531630813830, - limb2: 15075585547145173939492439534, - limb3: 2532310210367679492262896089 + limb0: 40149905552397261085393337903, + limb1: 57704479453406200471917837627, + limb2: 28009283156426851578200703283, + limb3: 2569949162883398021693559475 }, x1: u384 { - limb0: 55485362068462078441046035270, - limb1: 46007572888767313183441604972, - limb2: 50964778393464418678771266676, - limb3: 624304738983415292841354997 + limb0: 13098617939632519364038605063, + limb1: 12743810375333441605409464956, + limb2: 23556475542780728037473473486, + limb3: 3140556539973953559655641866 }, y0: u384 { - limb0: 21816901825667580484655819798, - limb1: 60058105376738842204861911817, - limb2: 76918168039014370077333320500, - limb3: 998481880023913278337398412 + limb0: 16592722872332139815522989723, + limb1: 50274580246191855345848479859, + limb2: 35804123707871180631871336372, + limb3: 1902411200336832733398636917 }, y1: u384 { - limb0: 31155314234647652465870863207, - limb1: 900967003837906141443360240, - limb2: 39351626727152442413249047784, - limb3: 1042910930038278434792683116 + limb0: 72071785749158476841565818935, + limb1: 67411284337898348795291754195, + limb2: 79101405471150140879853182634, + limb3: 7481442105714627249358307304 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 59448724559369281514097617805, - limb1: 51219087157974249687337340986, - limb2: 68561634271470765031731107991, - limb3: 3293990250601846792939320413 + limb0: 66915298484147677244567444372, + limb1: 38410135504828009469280472848, + limb2: 28910674689930505107100333102, + limb3: 674608301620579523715569154 }, x1: u384 { - limb0: 70037005937487644766762075082, - limb1: 7866274820218829567132534617, - limb2: 67303211978686286165778749668, - limb3: 1927649236630335597663434908 + limb0: 76561883140538758992075473594, + limb1: 61928325450721596290458925143, + limb2: 70852348343696419622508245235, + limb3: 4195370574579735919926364759 }, y0: u384 { - limb0: 62885107833569744038124974595, - limb1: 64742053801638859752114628203, - limb2: 11750824240175715750728103089, - limb3: 6919028758564724379133011701 + limb0: 52441805693187725274002312614, + limb1: 76393119674310301633904029527, + limb2: 3529894638312655675573686915, + limb3: 7895888023852160265550630636 }, y1: u384 { - limb0: 62491795249911464360887098687, - limb1: 51056398470445987179640346310, - limb2: 62263264381067300746878465927, - limb3: 944951346131320906056129118 + limb0: 26330032431622342325558581185, + limb1: 19180333726099103287508727075, + limb2: 29146557696394040534073410021, + limb3: 5186519350655441532321440375 } }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 37231335707426507538748205177, - limb1: 15911474260262004705492585613, - limb2: 63409989173607161214863417673, - limb3: 1468648026693776914515111679 + limb0: 40318316499939300335991561367, + limb1: 10020067537950356636285991866, + limb2: 5353497619597619065559853984, + limb3: 2271638777901392576594338012 }, x1: u384 { - limb0: 72562782554582066270159055121, - limb1: 50928565250562419606176579999, - limb2: 4538792876187708347177824045, - limb3: 6055364146872099737401286836 + limb0: 23928362011646961310966145882, + limb1: 56968651474418057573634100472, + limb2: 62975485587303844287913291223, + limb3: 5913105156252172918539564065 }, y0: u384 { - limb0: 36596209547149152213451788663, - limb1: 29352078496979641673436282388, - limb2: 73722282685200864291643642912, - limb3: 771750757345766528490678626 + limb0: 22203984371268922859741758979, + limb1: 45119107169348338468415360474, + limb2: 57098190927341451378538317858, + limb3: 6563035793597197163731270809 }, y1: u384 { - limb0: 78932217192701075899256410324, - limb1: 688256810671761416153194623, - limb2: 55911584805068144952026078612, - limb3: 6452091451737338104887130173 + limb0: 38249422232001246599565892037, + limb1: 8617979378320315718307470700, + limb2: 65353868317278215061315610686, + limb3: 412498783174258861335736845 } }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 54006251063029110980762639332, - limb1: 17375387077508308745352810849, - limb2: 21677033842552565680924792334, - limb3: 4940778904141617115232181200 + limb0: 19736288436507508048503453697, + limb1: 71144083822294788427174029842, + limb2: 28482662591295371727235449900, + limb3: 4311473328299140253961535794 }; let lhs_i_plus_one: u384 = u384 { - limb0: 1855698137564660676307554099, - limb1: 3412263109861105522665938658, - limb2: 28614308373960287979272703421, - limb3: 1527439033642317426197264756 + limb0: 16766380736641168458122793836, + limb1: 75443533302623545270167820630, + limb2: 67020460225630026250980599791, + limb3: 7292800955520465047504485704 }; let ci_plus_one: u384 = u384 { - limb0: 66596851160405243245870511665, - limb1: 46603541310530417532137577993, - limb2: 58304222388573211961702036192, - limb3: 588893144023315916673730267 + limb0: 16606090038639555547711100892, + limb1: 76382847240035079955909184834, + limb2: 24627674983581790089912167861, + limb3: 4578221553500017261239202805 }; assert_eq!(Q0_result, Q0); assert_eq!(Q1_result, Q1); @@ -8391,1259 +12174,1386 @@ mod tests { #[test] - fn test_run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit_BLS12_381() { - let yInv_0: u384 = u384 { - limb0: 15138591577633076090381769337, - limb1: 30442861086635478222545517694, - limb2: 10990051659609970991113351946, - limb3: 3573309265039720144655551130 - }; - - let xNegOverY_0: u384 = u384 { - limb0: 52478004955476185185818971177, - limb1: 53143210075912349865282388747, - limb2: 43405015115967962103130888881, - limb3: 4288256425741239497433345285 - }; - - let Q0: G2Point = G2Point { - x0: u384 { - limb0: 43166082856005700688321955178, - limb1: 45243325037267884275235808785, - limb2: 63249085171807425043137248077, - limb3: 7545707008094128873407391214 + fn test_run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit_BLS12_381() { + let R_n_minus_1 = E12D { + w0: u384 { + limb0: 38588574116873990392796570194, + limb1: 69013258730967681718418100913, + limb2: 39875379816853053409463494903, + limb3: 2014569215500031603482632456 }, - x1: u384 { - limb0: 69891185089753309309306336109, - limb1: 11047528211280235532478896000, - limb2: 11420578191168390755892536720, - limb3: 6844334467524323667728661394 + w1: u384 { + limb0: 42634866079719415855442553587, + limb1: 14191802145205861488279928314, + limb2: 26359133103912083747617257624, + limb3: 1921151016903545744774132827 }, - y0: u384 { - limb0: 62695985821202505946448680552, - limb1: 22060240038257067645682764638, - limb2: 63917037375341469209505903675, - limb3: 7473960485746558204515799825 + w2: u384 { + limb0: 40723851430392775900375921650, + limb1: 4333493233285079384689943341, + limb2: 20331612504552931502475658858, + limb3: 2667864076601633044279115338 }, - y1: u384 { - limb0: 20415175427666494274903709121, - limb1: 70326939858458603134525029840, - limb2: 34214523716650665878474428796, - limb3: 1506158271456638925509169793 - } - }; - - let Q_or_Qneg_0: G2Point = G2Point { - x0: u384 { - limb0: 37761079370945636480915320591, - limb1: 71992923044522837321664137362, - limb2: 45847041420612021026817332419, - limb3: 6891958981188426673835700341 + w3: u384 { + limb0: 42731065345319909507990910459, + limb1: 46592987788193785647980576638, + limb2: 74507099065578186686200915367, + limb3: 6556981620997058046271398189 }, - x1: u384 { - limb0: 67386251085262656456474721030, - limb1: 9539056997075631427509056394, - limb2: 67138577187786111338987067701, - limb3: 1311047571089536844783536772 + w4: u384 { + limb0: 46276960512068032901654177702, + limb1: 2973477235711544995434689409, + limb2: 39365110877136828239157406319, + limb3: 3082232781419238908370309166 }, - y0: u384 { - limb0: 66121156054957376648806150007, - limb1: 66300817096525274803978021144, - limb2: 51220239291800899349491341853, - limb3: 7638063429802404473111470038 + w5: u384 { + limb0: 69591957077637491297256717036, + limb1: 56778357815360239857271569736, + limb2: 53944034924439362490565592452, + limb3: 7927098045462716761330234660 }, - y1: u384 { - limb0: 27774457204705044550716447217, - limb1: 60924820522581799752280460872, - limb2: 6129889848965742835551417836, - limb3: 5389170678577769082764661514 + w6: u384 { + limb0: 17479897529864896052527290987, + limb1: 22158678476011203087177515172, + limb2: 24248704288490970133784740316, + limb3: 1907949936272813117835570380 + }, + w7: u384 { + limb0: 10697416587478527682599914635, + limb1: 62299702070065394794010155223, + limb2: 40568078573791093930037148771, + limb3: 4263012427525334954359269862 + }, + w8: u384 { + limb0: 78541242829580449002907795874, + limb1: 51394441849552013319859728493, + limb2: 53756980799654681466117563020, + limb3: 4283182594389998470265367333 + }, + w9: u384 { + limb0: 32397626586980623613638821045, + limb1: 70769245802489391874760624902, + limb2: 20244909204248824236559733792, + limb3: 7371826116266658476584073504 + }, + w10: u384 { + limb0: 38156957810112486398796418665, + limb1: 3726517452033591794456039780, + limb2: 47329841181557617262757398594, + limb3: 275096076223046614456633333 + }, + w11: u384 { + limb0: 19967121300182212854770400504, + limb1: 5454934691710506410086988049, + limb2: 21610730429476256535972784024, + limb3: 221256962413239040130597286 } }; - let yInv_1: u384 = u384 { - limb0: 49302556074848581763221404188, - limb1: 10782810871956421728034131020, - limb2: 61516487129115933650916775289, - limb3: 2805433092698206152513846036 + let c_n_minus_2: u384 = u384 { + limb0: 67131678420389703515591524730, + limb1: 30040485463505841433446870034, + limb2: 26202072137171791964254339977, + limb3: 6869000167228138645172769687 }; - let xNegOverY_1: u384 = u384 { - limb0: 11120580650745088686759514323, - limb1: 9518920190649488693196336106, - limb2: 56273553252780181009021745007, - limb3: 7902783865657408724437063784 + let w_of_z: u384 = u384 { + limb0: 62065827301002633054856058158, + limb1: 68854153974020208167368828758, + limb2: 65235965047666334768245797602, + limb3: 3110405488271654730244603381 }; - let Q1: G2Point = G2Point { - x0: u384 { - limb0: 35246074356258299231841843529, - limb1: 69472201364237267652107897992, - limb2: 50718856013452700385765690375, - limb3: 3208696481394873994940700409 + let z: u384 = u384 { + limb0: 42379037134471671700458811037, + limb1: 11723926143404111478039766849, + limb2: 7727198675667668899874904562, + limb3: 2797422687880055628748334026 + }; + + let c_inv_frob_1_of_z: u384 = u384 { + limb0: 66902295561826737314231949558, + limb1: 62345041449024276244848427800, + limb2: 42365023392636228509475221793, + limb3: 4954559886876816457627409538 + }; + + let previous_lhs: u384 = u384 { + limb0: 53817987821968998031367389234, + limb1: 45365357224723959383132384831, + limb2: 5356862495539662669209108149, + limb3: 4879850051523771519059663203 + }; + + let R_n_minus_2_of_z: u384 = u384 { + limb0: 11664463771775002593510079402, + limb1: 20280626705334552412557966477, + limb2: 10068975284019657308803504537, + limb3: 2370677483840252492829215731 + }; + + let Q: Array = array![ + u384 { + limb0: 27029109764466074161914061883, + limb1: 17566124264780973019732239371, + limb2: 59841352180967583532573004016, + limb3: 449765352048913120923432427 }, - x1: u384 { - limb0: 26197902621734007239752672573, - limb1: 40617715802459779676401281474, - limb2: 61834477571811274376435987698, - limb3: 4230116039470551609387944738 + u384 { + limb0: 40762450305358762718807071076, + limb1: 43129633504330056088575537031, + limb2: 29545666416892304397782689102, + limb3: 4642585650196805146968782706 }, - y0: u384 { - limb0: 55800561186643927968781757955, - limb1: 8236647384829409113887318081, - limb2: 25523165807356739020910396479, - limb3: 1843213015777098612133895476 + u384 { + limb0: 65081967676105365077018718621, + limb1: 30447570396625313636698170966, + limb2: 74434119663341934199227922404, + limb3: 5110184431485773908071812062 }, - y1: u384 { - limb0: 48830493899608844484398410155, - limb1: 44963907355498985921721781566, - limb2: 54961452045289432336993557730, - limb3: 6985228897805703493993596262 - } - }; - - let Q_or_Qneg_1: G2Point = G2Point { - x0: u384 { - limb0: 35333494143680094403188216107, - limb1: 16965756778308636711811306309, - limb2: 71806874816470682407281294146, - limb3: 436202529735731380485066344 + u384 { + limb0: 62691861162234392713228166095, + limb1: 67835234441393408381612115584, + limb2: 25042155360383839391044215231, + limb3: 7583007256943671555272123447 }, - x1: u384 { - limb0: 68998654202830485450033629448, - limb1: 66261345407292194754539062911, - limb2: 73835320286988285470925805332, - limb3: 4118514468477497160315353555 + u384 { + limb0: 66138402258027421361551098108, + limb1: 42255363964890334130998164173, + limb2: 36421469798985398079655318701, + limb3: 7396646136708672202674898652 }, - y0: u384 { - limb0: 6027479470046047375839310354, - limb1: 15110311549892476555346255842, - limb2: 59769038845354544971295265635, - limb3: 2713522216518730198643835197 + u384 { + limb0: 2058866177580385129884288892, + limb1: 15607365427928564981346334308, + limb2: 26978794437919531919773272210, + limb3: 4764418414406476984936509996 }, - y1: u384 { - limb0: 13604782687158752182546622208, - limb1: 48766591408250510025030411997, - limb2: 44798154869944884347328281619, - limb3: 3590709828151202064874799269 + u384 { + limb0: 61832520036472145277232939969, + limb1: 48963354884880073607443666939, + limb2: 46669290645642779158822189198, + limb3: 4271008206054784543982677236 + }, + u384 { + limb0: 6270718960932422865326057891, + limb1: 52158524634223087884882693796, + limb2: 30428922765290345703120630445, + limb3: 3188697352227321344878727531 + }, + u384 { + limb0: 60507856344536609124780807638, + limb1: 21642134225689185538616812135, + limb2: 77330864065419510808307610615, + limb3: 7809272166338306590076492246 + }, + u384 { + limb0: 4450006418516313371845985500, + limb1: 77983522784988272354940295232, + limb2: 68127446301765899157753641606, + limb3: 1332773917366252550380811102 + }, + u384 { + limb0: 48845228857425658569182524468, + limb1: 29868519819868335757898398549, + limb2: 64718396587408239025482495342, + limb3: 799824631525537627385406408 + }, + u384 { + limb0: 74143435269660449989207540472, + limb1: 77308579932416032305772558040, + limb2: 66873740938275180216898374912, + limb3: 3260681451575239422436962376 + }, + u384 { + limb0: 69937191768296076260082540361, + limb1: 70204365992116897313084359340, + limb2: 51299849887506310155472760914, + limb3: 6230797498228847785320707155 + }, + u384 { + limb0: 41899909497951011879915032535, + limb1: 24640977437282958112713872404, + limb2: 35273834964979092657205784866, + limb3: 4369847501272970538195882100 + }, + u384 { + limb0: 21791338091729104327916654758, + limb1: 54808044953279052078786707640, + limb2: 78824316786292861693048202078, + limb3: 8040812271064816500307630799 + }, + u384 { + limb0: 49106292948060166586382849962, + limb1: 47174217664602113413047947096, + limb2: 75866338379947741989876418105, + limb3: 1734141475560888575848530268 + }, + u384 { + limb0: 52821950256408135340204194912, + limb1: 19124534391285995845552544038, + limb2: 74680365594472667242880106763, + limb3: 5803329304484466339567518872 + }, + u384 { + limb0: 46334601073158590730596874670, + limb1: 5037674667895983860971545698, + limb2: 15213048635583359874874614992, + limb3: 2151664128959861630901647146 + }, + u384 { + limb0: 41810622021000946800309451379, + limb1: 6495553437254272906654511976, + limb2: 6979789769686907418025602412, + limb3: 7866197051908250483507576455 + }, + u384 { + limb0: 40474602132415789707445736725, + limb1: 5928300112428972997197428812, + limb2: 23294437312437702037920905080, + limb3: 357297452493630667104991394 + }, + u384 { + limb0: 13449654637979585984947069858, + limb1: 75498308419559054405742110964, + limb2: 13593361773021016543080375734, + limb3: 4218854093094895181784156454 + }, + u384 { + limb0: 51526504946694515100502184095, + limb1: 19321544861610132247177626261, + limb2: 32893538444676154108545046550, + limb3: 5841796272589197987376686508 + }, + u384 { + limb0: 35951990984270662709300261723, + limb1: 55027382110860319229405491616, + limb2: 14129670892521484628913291022, + limb3: 7078108820246868506522303937 + }, + u384 { + limb0: 73794422543461544059073406675, + limb1: 38103754953415854187067193063, + limb2: 69774541597452851039558088205, + limb3: 504699239035672861113641941 + }, + u384 { + limb0: 334195598469803759631807896, + limb1: 79149564244987801647617347880, + limb2: 54504075603420241191644958647, + limb3: 6021768682997307898122534832 + }, + u384 { + limb0: 55833751754177992324530496239, + limb1: 4269450861634727464874790976, + limb2: 39101190862914588852208887250, + limb3: 1210996505886499131512153724 + }, + u384 { + limb0: 16647210878829647487578090095, + limb1: 9481415501109302107772184572, + limb2: 17682689941884105058559587113, + limb3: 1887519344802989915678012560 + }, + u384 { + limb0: 70690657698781592992908775275, + limb1: 16147726492873210962372200644, + limb2: 352772708258291043936239213, + limb3: 3626082721552694815092239660 + }, + u384 { + limb0: 24363381031386005418742714466, + limb1: 2650075804368082142913244639, + limb2: 70321674502752391421160998239, + limb3: 3359742955011736737740262875 + }, + u384 { + limb0: 23231591599599942513070121307, + limb1: 4685600888390620095451417955, + limb2: 3986063898718691899498444248, + limb3: 661060557955865235549157575 + }, + u384 { + limb0: 8801743645580361392840030631, + limb1: 9434328338864023636315939464, + limb2: 68198000579574092126836288840, + limb3: 6082257651394682041567364028 + }, + u384 { + limb0: 34948395329022275081928784312, + limb1: 48103902710553211506660024351, + limb2: 40341219490369543608284367831, + limb3: 7986122274959916484165252288 + }, + u384 { + limb0: 72209267985644234116530878173, + limb1: 47419784256979066200149023991, + limb2: 24989287317098139211558689958, + limb3: 1182053970985815152130059560 + }, + u384 { + limb0: 37541583992207732888548884121, + limb1: 47704284507780072057849917726, + limb2: 17212836793305178092780226487, + limb3: 2554456314034605818632202394 + }, + u384 { + limb0: 71485745866039696548602755730, + limb1: 17630770573583039507931956663, + limb2: 53759698713812657864614838151, + limb3: 4324276145263574886117213509 + }, + u384 { + limb0: 23967739973764583794639340361, + limb1: 17366210884561431973419457552, + limb2: 33234899749610099984051139692, + limb3: 3882845409460933834732912494 + }, + u384 { + limb0: 58766706504909912492887120763, + limb1: 49995136988160536144712934912, + limb2: 44589216679228492429941122195, + limb3: 6527479760885863980966095770 + }, + u384 { + limb0: 1569418617559133317336439657, + limb1: 5417874048450218105438708835, + limb2: 32253472794818883727150001667, + limb3: 7116995150755585725049110662 + }, + u384 { + limb0: 34517052941146905300776408661, + limb1: 68687250561574618959505138758, + limb2: 38932927316722506040174481449, + limb3: 3032088701609944337525443334 + }, + u384 { + limb0: 76645324346919946379882232909, + limb1: 22055863090958181729182360701, + limb2: 12226051070531629519682620863, + limb3: 164497698886253109310927712 + }, + u384 { + limb0: 31778058980521967208788306074, + limb1: 60902529493893002870060175048, + limb2: 30402882789381277882334829607, + limb3: 6507368507646601052117082126 + }, + u384 { + limb0: 45021271916485542195312926398, + limb1: 45180073505807603865959948049, + limb2: 74752494371793133670778993840, + limb3: 1091763936481394429688787696 + }, + u384 { + limb0: 22706188705599173291939387592, + limb1: 52097115174776407531349536510, + limb2: 46061075952944171288392013772, + limb3: 4008061541529944690114190184 + }, + u384 { + limb0: 51851007154789721740105408601, + limb1: 70569241736727500237095879367, + limb2: 24054673483004299230140275643, + limb3: 6112870179455909121710241056 + }, + u384 { + limb0: 16214891517560111787607808658, + limb1: 22513337084653553482389797820, + limb2: 1051603799545214942463231869, + limb3: 6689128408135135334485298626 + }, + u384 { + limb0: 7718610733794530277258396315, + limb1: 59537507960211503635542188042, + limb2: 30282162430441817130103689370, + limb3: 7165512544128988785099522931 + }, + u384 { + limb0: 66052842792560225080141561243, + limb1: 16656523068431807061404180345, + limb2: 71112728765418210011805676740, + limb3: 1011633852991179172080355983 + }, + u384 { + limb0: 55498676092974534850730672730, + limb1: 51470462774654767051178968356, + limb2: 32849644712072285407176208955, + limb3: 2175138117596334386120992702 + }, + u384 { + limb0: 76745288543308615856134894259, + limb1: 29271508425593837980937276134, + limb2: 26898213457177190176214663972, + limb3: 3392315195845687669399369592 + }, + u384 { + limb0: 70378180797324508947711707316, + limb1: 50603889576152012647487034230, + limb2: 22317063557687945132426570941, + limb3: 4086277407912697692298296804 + }, + u384 { + limb0: 22551345585202666179968053658, + limb1: 75000073497690600571224607586, + limb2: 745007214930584846243435225, + limb3: 3302183078113681408216957178 + }, + u384 { + limb0: 18056620306752645308847082046, + limb1: 8429368851827510059640702309, + limb2: 37095849566146804419915458570, + limb3: 7869950203892144445847219752 + }, + u384 { + limb0: 74518230896045036241223084160, + limb1: 14693233287242345706263479586, + limb2: 9301701888653202319081025546, + limb3: 2695274149255536619170932281 + }, + u384 { + limb0: 73634770802074893811193869568, + limb1: 77713009276802612465671458129, + limb2: 29623329449053393002312923258, + limb3: 2682867690344858108660820406 + }, + u384 { + limb0: 65812577107476878669494467837, + limb1: 13846698528716822695906288535, + limb2: 7793780494806622109201066609, + limb3: 3828792065664990523416116224 + }, + u384 { + limb0: 36835514759412486577604808167, + limb1: 53143883275770738517288833203, + limb2: 66678091589563078736267394632, + limb3: 2410672490335795250877694546 + }, + u384 { + limb0: 15006028600601359094874283449, + limb1: 59934673399736349523713984603, + limb2: 10813056289901539062646066901, + limb3: 6886315015432975345590668685 + }, + u384 { + limb0: 70765418064528293810571213373, + limb1: 55522169592611389828299884661, + limb2: 37461105099720676907951327633, + limb3: 349347724306531451342296888 + }, + u384 { + limb0: 56905186282749508834722065372, + limb1: 21835360161871130933396295952, + limb2: 78015485984433352144913808998, + limb3: 852872768930012543725314250 + }, + u384 { + limb0: 78616205224870426004212465152, + limb1: 75131014308175998536053054063, + limb2: 42802200156164313483135191673, + limb3: 4685456918318165658601493555 + }, + u384 { + limb0: 44976420767058062455995020797, + limb1: 6577628164896160848822250464, + limb2: 76290333999707849875207024230, + limb3: 2439001475170960665190912204 + }, + u384 { + limb0: 34958020589096318008271050066, + limb1: 46795257125796991952003861271, + limb2: 50932530185003050677229918513, + limb3: 5360199090159929700817596577 + }, + u384 { + limb0: 60661655521367959257762413781, + limb1: 52047300910044509339661185029, + limb2: 44451508934343266587075922473, + limb3: 1650710607336644929646190238 + }, + u384 { + limb0: 26583985279878157258398099897, + limb1: 38096908503859327190293841058, + limb2: 7671851315626509649846284923, + limb3: 4512142649531844734647222400 + }, + u384 { + limb0: 56368452406734526691513591694, + limb1: 61539716539844616957263174227, + limb2: 54738699131498751365443809615, + limb3: 3089035228827765683585813765 + }, + u384 { + limb0: 72722230324199226102259952663, + limb1: 52857515402619398551233225173, + limb2: 73135132330998690342716108319, + limb3: 4676392998025225450967870650 + }, + u384 { + limb0: 1576392498108886882916335461, + limb1: 61565390004368641719743162313, + limb2: 45125605841427349480217378417, + limb3: 3661607407444348557702999626 + }, + u384 { + limb0: 30259908201284130449396472718, + limb1: 6313552176542168019235871565, + limb2: 17857971774353915482396069109, + limb3: 205263054369531016158352299 + }, + u384 { + limb0: 1429228658153836640434211637, + limb1: 26565160771091779349168708665, + limb2: 23650132616940004394531254282, + limb3: 1019728911121494133762912718 + }, + u384 { + limb0: 7772001891971043368440029706, + limb1: 37128138282440209006899687717, + limb2: 58241952643744128713684835329, + limb3: 2519337055291034319341021262 + }, + u384 { + limb0: 20554537975279290885828870636, + limb1: 45807165645668505117852133706, + limb2: 24688482138873578291873220245, + limb3: 4778222888265080622554236835 + }, + u384 { + limb0: 55742020795085868609956354699, + limb1: 52839878776715240929204400799, + limb2: 10624843039491706463375939480, + limb3: 1802791730981445457612506555 + }, + u384 { + limb0: 74677457175180801370425070305, + limb1: 22297985848000005257008452200, + limb2: 25099424344204104476796750709, + limb3: 1949651249305132985574199876 + }, + u384 { + limb0: 45696520205018690375875202497, + limb1: 41985169760363983777313474100, + limb2: 21111741704433430882864702801, + limb3: 4815019288390536830353076503 + }, + u384 { + limb0: 2962844917739936582619614221, + limb1: 91117103022928286016046195, + limb2: 7505093961257095458185572803, + limb3: 491731825735194741140424813 + }, + u384 { + limb0: 39230375771187169433388037650, + limb1: 15570157314324109614568682780, + limb2: 56718481688844325076634607758, + limb3: 4225127535146388529324227091 + }, + u384 { + limb0: 30475779598681387648564839684, + limb1: 66609480899418056152776223760, + limb2: 60556844135524328760388922446, + limb3: 4231467275016315759494026863 + }, + u384 { + limb0: 54233424346723222393634020697, + limb1: 45501126649058183643984184976, + limb2: 13413742663214212629998809590, + limb3: 6154089032636424593347515676 + }, + u384 { + limb0: 32599616279335727879705545403, + limb1: 65006685252210800575794996850, + limb2: 48836251740235796358645355833, + limb3: 4130955763531180336491113174 + }, + u384 { + limb0: 32094711269912272232051236417, + limb1: 33032004750184724471059415938, + limb2: 74303645185840854257543904614, + limb3: 4561062078617460853125736327 + }, + u384 { + limb0: 54270658861820447790497951267, + limb1: 37715380424025548809607947951, + limb2: 25724229307507727405653781573, + limb3: 7732312061621310164131359193 } - }; + ]; - let lhs_i: u384 = u384 { - limb0: 27907154055827194519246025433, - limb1: 46174670112346345151543744646, - limb2: 52857641695621740134072145978, - limb3: 6677384063668578439370811795 + let (final_check_result) = run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( + R_n_minus_1, + c_n_minus_2, + w_of_z, + z, + c_inv_frob_1_of_z, + previous_lhs, + R_n_minus_2_of_z, + Q + ); + let final_check: u384 = u384 { + limb0: 870065953532868937378623247, + limb1: 67044379915717130443098639844, + limb2: 27585209399964940917848522235, + limb3: 1586310955951092471271290583 }; + assert_eq!(final_check_result, final_check); + } - let f_i_of_z: u384 = u384 { - limb0: 66661728533700774743673951004, - limb1: 69520908497097025009339980465, - limb2: 64040502934314154160617470332, - limb3: 1054432484518826560358510003 - }; - let f_i_plus_one: E12D = E12D { + #[test] + fn test_run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit_BLS12_381() { + let R_n_minus_1 = E12D { w0: u384 { - limb0: 19851488218591966679227409148, - limb1: 4914746743747996240528037052, - limb2: 23383444784626738357703725803, - limb3: 5359508772935582816411412265 + limb0: 25692355417549110901646582719, + limb1: 50220892146756988424597254345, + limb2: 60288772140751955183276540991, + limb3: 7547993089602133149678489071 }, w1: u384 { - limb0: 64493801342303179030378396463, - limb1: 48813170555381058002180979654, - limb2: 58588630520715725224201916667, - limb3: 2221432771874500812060733857 + limb0: 69342166696651803805221189828, + limb1: 4839114949749985830269133305, + limb2: 55580806855607249823389598839, + limb3: 1825970715411622267502422151 }, w2: u384 { - limb0: 44468434537827845999854273242, - limb1: 40479434978570550516481135496, - limb2: 63289179654225499533989141206, - limb3: 6862506490552387309053246012 + limb0: 58941150559554023411796177478, + limb1: 6941227221550502975393858743, + limb2: 45259946626321210044613443576, + limb3: 3005049393335152484739713001 }, w3: u384 { - limb0: 1027212054485100097747552695, - limb1: 16090227365099713049835677608, - limb2: 61871244330377744072753095042, - limb3: 4387891869369932369919089460 + limb0: 6691277041523964272119155495, + limb1: 74775735309872823162937061365, + limb2: 58356164381531708476570227440, + limb3: 2315823595494904483561125034 }, w4: u384 { - limb0: 72215390479267622831034846262, - limb1: 56215982609929204743377254013, - limb2: 59825795938646333142772431982, - limb3: 7313254863486553786236824562 + limb0: 10384140904909513508841763907, + limb1: 46954451123043549539934977045, + limb2: 71955500027572674873178915827, + limb3: 757987862301834967739659094 }, w5: u384 { - limb0: 61492680402114535390524707234, - limb1: 15330468247616447525323800419, - limb2: 14057127384311770951155923758, - limb3: 737505194091342497415665880 + limb0: 75640207036055575567643054603, + limb1: 61793007309582557746537919727, + limb2: 7198482069852998678801123195, + limb3: 5176535869935002548514002992 }, w6: u384 { - limb0: 13769468663787519938945462890, - limb1: 9456183182859292627943959385, - limb2: 33949886593964381152237064252, - limb3: 2616902237548233628893570666 + limb0: 75294419185698092276277554280, + limb1: 69348173207302386417940588876, + limb2: 47799031051884987180075008276, + limb3: 1379017532838957142432355886 }, w7: u384 { - limb0: 46268142267432377698422098509, - limb1: 447253692536579233173234408, - limb2: 56227378893341660723627934540, - limb3: 395552466117058727122019060 + limb0: 38511436340688454093993705705, + limb1: 52753647817327570873559709996, + limb2: 71336116753828341273243423972, + limb3: 4276311597603011713499788681 }, w8: u384 { - limb0: 25561384344987642490712038100, - limb1: 61295735304298724037107721813, - limb2: 48773544265531651452711244798, - limb3: 2982492873838100748667717012 + limb0: 35933803774757302866850842555, + limb1: 62084023488174143711694644973, + limb2: 30584888813107714435961665965, + limb3: 7782958976976439402655977665 }, w9: u384 { - limb0: 5401496343607837137015278494, - limb1: 12626631229412923166964594763, - limb2: 42548372030197500714996627521, - limb3: 3460319207107169237835601731 + limb0: 19594948515337091079728201544, + limb1: 28988864188983423083492397884, + limb2: 10421998075911325399179374529, + limb3: 1048678539249457069051772148 }, w10: u384 { - limb0: 16903630413923527257967587326, - limb1: 26229793195713123343024540124, - limb2: 17307018157743418700619136795, - limb3: 6123154521848988837836449590 + limb0: 55801034649624631107021477086, + limb1: 76262525049458382114373958025, + limb2: 29446891620385803413773052552, + limb3: 4051768362870543403354334512 }, w11: u384 { - limb0: 78961249222770517673069430429, - limb1: 59590175316068702357984354612, - limb2: 697501104662389926543461248, - limb3: 3426690249902115126807259886 - } - }; - - let c_or_cinv_of_z: u384 = u384 { - limb0: 72567642995272969908864478605, - limb1: 8982416219083861547134759372, - limb2: 42802009775305306776845992948, - limb3: 244673634114237713901582129 - }; - - let z: u384 = u384 { - limb0: 3474286627835046091373413466, - limb1: 51619381991889417948692158632, - limb2: 369295462328991224, - limb3: 0 - }; - - let ci: u384 = u384 { - limb0: 75125080661776565001566198369, - limb1: 76980361745644602108505266633, - limb2: 42622757293990029659342799991, - limb3: 6208844485816239646153125197 - }; - - let ( - Q0_result, - Q1_result, - f_i_plus_one_of_z_result, - lhs_i_plus_one_result, - ci_plus_one_result - ) = - run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( - yInv_0, - xNegOverY_0, - Q0, - Q_or_Qneg_0, - yInv_1, - xNegOverY_1, - Q1, - Q_or_Qneg_1, - lhs_i, - f_i_of_z, - f_i_plus_one, - c_or_cinv_of_z, - z, - ci - ); - let Q0: G2Point = G2Point { - x0: u384 { - limb0: 38808396594097986386226718226, - limb1: 73843737136498196904985758477, - limb2: 67208780564713420873732533275, - limb3: 7837680209918349118233540419 - }, - x1: u384 { - limb0: 30724456565290305283225751798, - limb1: 36958107391818719522731055032, - limb2: 47944246041506328735426666129, - limb3: 187342321565792988131942330 - }, - y0: u384 { - limb0: 66430081215720489661721135091, - limb1: 77884098090317217747267325571, - limb2: 4635219808934046705756145908, - limb3: 2441067004758271272042590625 - }, - y1: u384 { - limb0: 14243739477697752887291393275, - limb1: 7203457858238240129880023876, - limb2: 29479391223983553051221477899, - limb3: 1717635083709556871694639585 + limb0: 56441740993467173415479240741, + limb1: 56493167526553760281611937800, + limb2: 48641187730251296808444163197, + limb3: 3496141662668496370719592491 } }; - let Q1: G2Point = G2Point { - x0: u384 { - limb0: 54538172263776323911455826607, - limb1: 72149400395723826185613936713, - limb2: 49950785470704148885020054381, - limb3: 5151049882501030934263068130 - }, - x1: u384 { - limb0: 61911778814155674413495609319, - limb1: 53389198605825636559375953773, - limb2: 55830099372913201295034020593, - limb3: 5824172629874044787791523002 - }, - y0: u384 { - limb0: 33932168919722265164970822860, - limb1: 26815745069673410454539469323, - limb2: 63128253197965649815378938967, - limb3: 3658684748292112182712543074 - }, - y1: u384 { - limb0: 1104934073327508603782368949, - limb1: 19856363832467483008670219996, - limb2: 16206260272112294765292742409, - limb3: 5011004530591447578579138419 - } + let c_n_minus_2: u384 = u384 { + limb0: 55728262696943343216315435049, + limb1: 52066376254209998231914626426, + limb2: 10837862639025893175539842782, + limb3: 2791054229825006796429348377 }; - let f_i_plus_one_of_z: u384 = u384 { - limb0: 2286769791047821924140907838, - limb1: 42507113242918905402045036194, - limb2: 45316853924566261877974810904, - limb3: 4384332741569667026321812478 + let w_of_z: u384 = u384 { + limb0: 69228945225248362581995933934, + limb1: 2753376804997583257160069022, + limb2: 65328631007423396801395271330, + limb3: 6400019736901635555448295245 }; - let lhs_i_plus_one: u384 = u384 { - limb0: 14964239645602181025381128338, - limb1: 18666391283135037154202952611, - limb2: 78840432833106784164179229964, - limb3: 4278278536560038057658785414 + let z: u384 = u384 { + limb0: 55912232865146288356424089367, + limb1: 66647700590359170170279742701, + limb2: 36503647134980173775214092748, + limb3: 2257647854424618374477349123 }; - let ci_plus_one: u384 = u384 { - limb0: 4993721508526531884066723942, - limb1: 56088881672879984575947223780, - limb2: 3347721240624424355312627316, - limb3: 1947385284510427967989333333 + let c_inv_frob_1_of_z: u384 = u384 { + limb0: 60628688772931878616593748335, + limb1: 53458211842170579355180628732, + limb2: 48766563167164299710908089059, + limb3: 1425432152299636854680603026 }; - assert_eq!(Q0_result, Q0); - assert_eq!(Q1_result, Q1); - assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); - assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); - assert_eq!(ci_plus_one_result, ci_plus_one); - } - - #[test] - fn test_run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit_BLS12_381() { - let yInv_0: u384 = u384 { - limb0: 71227217342685105383838547549, - limb1: 62981911938657914632345724501, - limb2: 78403052728807393597081682623, - limb3: 22673707740791083028662400 + let previous_lhs: u384 = u384 { + limb0: 47406652472006612635416123928, + limb1: 10516918446960408045983478382, + limb2: 65900325686361460122411073552, + limb3: 6700783920580359627883005451 }; - let xNegOverY_0: u384 = u384 { - limb0: 3307366801472793328148471551, - limb1: 12369284622245236415417264180, - limb2: 46795286769470789010591758653, - limb3: 5104216386366275457083878189 + let R_n_minus_2_of_z: u384 = u384 { + limb0: 16717249003565328805429819175, + limb1: 61665272489545425716732891791, + limb2: 42844215119073943564700067264, + limb3: 4587273251639631555640776012 }; - let Q0: G2Point = G2Point { - x0: u384 { - limb0: 34470885501167253089817189663, - limb1: 77409596378261189796330748718, - limb2: 55621928970248556326962438579, - limb3: 180842138169675637510251915 + let Q: Array = array![ + u384 { + limb0: 61073202043818587133062758700, + limb1: 67691796947265535994800516392, + limb2: 10887191419878148382329775772, + limb3: 1345176343547479166242795730 }, - x1: u384 { - limb0: 66148806616095449594467673624, - limb1: 31295845385885243736971876808, - limb2: 69226877827980141010608020668, - limb3: 5700578145402173388665961159 + u384 { + limb0: 74313524284083269806698678734, + limb1: 27945659866898425491641461577, + limb2: 52207215575654309148536878743, + limb3: 1957899140533751425511356256 }, - y0: u384 { - limb0: 27471083652748014204102421124, - limb1: 19888459327345899191444734180, - limb2: 45938721111283366996787061867, - limb3: 3609704746729170017349303605 + u384 { + limb0: 58446651428588844339375925813, + limb1: 73794131743597715331202080, + limb2: 32788905649732793473622803941, + limb3: 2053179085897001048094006194 }, - y1: u384 { - limb0: 9143947813328137630130381560, - limb1: 61180184404809712074370090810, - limb2: 65792818287057306068196050338, - limb3: 2161870028847519674273059243 - } - }; - - let Q_or_Qneg_0: G2Point = G2Point { - x0: u384 { - limb0: 34994925886789130228082022121, - limb1: 66832737276056174336484384330, - limb2: 64910468669513663643537191700, - limb3: 4421098352827395543673902789 + u384 { + limb0: 18569164808621399343054347066, + limb1: 37879920035449590175964617412, + limb2: 43376772341296084165351755497, + limb3: 3877021049476416002980352039 }, - x1: u384 { - limb0: 25117903832690379774455877538, - limb1: 71367815296528310539664306164, - limb2: 71010029869882953791635710652, - limb3: 2865087831303631792724230868 + u384 { + limb0: 38391214514905195952683498004, + limb1: 1362160853547496751383211778, + limb2: 137725829862300119041954349, + limb3: 3058817763601297343920594166 }, - y0: u384 { - limb0: 50067424881832111344692971847, - limb1: 61837602910233019860316023623, - limb2: 46103787493636961648523857336, - limb3: 353603414913567665377733014 + u384 { + limb0: 64139627282000889732520600194, + limb1: 47328394917587960003216169981, + limb2: 16242976179498418235582158424, + limb3: 2716665010616496158703751657 }, - y1: u384 { - limb0: 60718322530546292949038965954, - limb1: 2144042940926615359001754242, - limb2: 14223585271412920951637187951, - limb3: 5799725319996024692091903395 - } - }; - - let yInv_1: u384 = u384 { - limb0: 2171475348828675247121157480, - limb1: 38123609233388061684886173423, - limb2: 26247995558031917437916559590, - limb3: 4332756896828943526883061502 - }; - - let xNegOverY_1: u384 = u384 { - limb0: 52052894253444569216646640952, - limb1: 17658690119642910777295026792, - limb2: 31458334084941012689583550317, - limb3: 2860207571990942390921076373 - }; - - let Q1: G2Point = G2Point { - x0: u384 { - limb0: 33167639617011430866966629304, - limb1: 69152544170871066929564740563, - limb2: 48307525640067381144118927373, - limb3: 2550823999445150201782417817 + u384 { + limb0: 48090665927620186588187899433, + limb1: 46346050658450664104904051699, + limb2: 37756275252366897842697210153, + limb3: 7351814313945754503952153747 }, - x1: u384 { - limb0: 5753534864342660154491607148, - limb1: 46162152350749856658886131847, - limb2: 40729506375509715495415387006, - limb3: 5914622490010548468340025652 + u384 { + limb0: 65526128631192641108081275829, + limb1: 51108238290555743453321064698, + limb2: 71111413046182086808013181613, + limb3: 2569101193583107002242067453 }, - y0: u384 { - limb0: 51238026199302069279605427214, - limb1: 43806315124848668482734179492, - limb2: 7301810606429924847837450785, - limb3: 4787107123813425957299248297 + u384 { + limb0: 4756007446086287998490880011, + limb1: 2669289834236186747570390207, + limb2: 431455349236542418123055506, + limb3: 3475258514452974513640326012 }, - y1: u384 { - limb0: 20688157614188857869340895091, - limb1: 23359941914214562836899954380, - limb2: 50420954332928270395182964728, - limb3: 5179848290766192998541997741 - } - }; - - let Q_or_Qneg_1: G2Point = G2Point { - x0: u384 { - limb0: 68983730842559781462563487978, - limb1: 79079802217513940092941770913, - limb2: 24007263968374872744356969877, - limb3: 1410620471557496116583855810 + u384 { + limb0: 77911333330463875867983217364, + limb1: 60819999035527075805684463926, + limb2: 14694674833498459708589710636, + limb3: 5903205231289840300648997367 }, - x1: u384 { - limb0: 35724738792663861820852438867, - limb1: 4998272335320639393798466780, - limb2: 42336799418220362040379388278, - limb3: 1127342593560504629411120572 + u384 { + limb0: 9803060742479928685143218763, + limb1: 11058469728902035449657038660, + limb2: 35596037330304329475155359999, + limb3: 6437511733539267866822190178 }, - y0: u384 { - limb0: 36922141654468683833166169671, - limb1: 49307674514095662588046443087, - limb2: 51878668062351287931837934321, - limb3: 3013404048414865508371361100 + u384 { + limb0: 15489773521093418678269338176, + limb1: 19543725673847685987562558854, + limb2: 1473544454024930587479741056, + limb3: 1856818468197765491335261425 }, - y1: u384 { - limb0: 39307983335575790797569174351, - limb1: 17454314141570295940215518893, - limb2: 35351436122357056314584246989, - limb3: 1073398729291334425160227757 - } - }; - - let yInv_2: u384 = u384 { - limb0: 11437032973939379863860054686, - limb1: 21391960940396038351648301835, - limb2: 75429818415672169280580055573, - limb3: 645422383119883201634595431 - }; - - let xNegOverY_2: u384 = u384 { - limb0: 73513645440663018386476345463, - limb1: 22478984282289735485437255036, - limb2: 68260660296921453078095510221, - limb3: 7013137311384157673917779612 - }; - - let Q2: G2Point = G2Point { - x0: u384 { - limb0: 61343080714515357343850354537, - limb1: 32039610766632434336981090738, - limb2: 1605867713481293145155247848, - limb3: 4360220307354946642880041154 + u384 { + limb0: 2927038546888080412452603167, + limb1: 77441367501336336589282862481, + limb2: 46029662847278853727721669016, + limb3: 6473100248873157149259481694 }, - x1: u384 { - limb0: 49939850275198913695638438973, - limb1: 35585751158496004297517641421, - limb2: 79161403850438913343030714723, - limb3: 3697051814882004581238511903 + u384 { + limb0: 21422976191115175006463854029, + limb1: 27016172731773224921821444378, + limb2: 66438874958081227897424455230, + limb3: 5211971186986717613506918742 }, - y0: u384 { - limb0: 78321037928552747557847560097, - limb1: 22143459857676622316535479953, - limb2: 65071684110329513736476568638, - limb3: 2433748612480409407575736607 + u384 { + limb0: 52454908235151948439532043131, + limb1: 67196250255399755363445647329, + limb2: 15585585738766555076797559261, + limb3: 2759541602856429448748284966 }, - y1: u384 { - limb0: 4288309432447665364354162959, - limb1: 47131625562827541250988554876, - limb2: 24966153397499998228604149549, - limb3: 3547529587073137118365717743 - } - }; - - let Q_or_Qneg_2: G2Point = G2Point { - x0: u384 { - limb0: 47379759294949148802402115278, - limb1: 4972823974216992385553828393, - limb2: 45749860387064818673222043745, - limb3: 5139986952275990394104815254 + u384 { + limb0: 30360873436344224240328291398, + limb1: 74560064412688465201271749352, + limb2: 62256431128292747557387326479, + limb3: 7603698800455486721227535958 }, - x1: u384 { - limb0: 74337342354015795233982082580, - limb1: 58586455485521609742145703419, - limb2: 48349787202775590792479098938, - limb3: 1689620779632660237265443274 + u384 { + limb0: 13729633608223388306850339979, + limb1: 32153918615608380241626957113, + limb2: 24100545915324230839289631139, + limb3: 2613579261550700578298863480 }, - y0: u384 { - limb0: 5558755807246943022354938766, - limb1: 73811381736328324214656742215, - limb2: 31755858299375819329434239789, - limb3: 4563445559770702183499502181 + u384 { + limb0: 73373288297471771528456598011, + limb1: 8646171336709831027550459020, + limb2: 54201945816636104026235961628, + limb3: 5137027943506767308295730035 }, - y1: u384 { - limb0: 55604315837808293653600706118, - limb1: 9791505860363971401183977246, - limb2: 23505444102001986273638735729, - limb3: 4170862044131145975231118316 - } - }; - - let lhs_i: u384 = u384 { - limb0: 62343999063237851445933617900, - limb1: 48057097456815535931352530553, - limb2: 60631271449061068368800724170, - limb3: 3777337117269314077374258451 - }; - - let f_i_of_z: u384 = u384 { - limb0: 52347882375416711861047272564, - limb1: 12385221529944208303047558042, - limb2: 10805252195299343761012774909, - limb3: 7890832194338029127349257140 - }; - - let f_i_plus_one: E12D = E12D { - w0: u384 { - limb0: 57783046213348532466150161898, - limb1: 75852380943796839105374941061, - limb2: 43854703806045641301161944357, - limb3: 1400099012549885068636633535 + u384 { + limb0: 25910072207736081531589651447, + limb1: 47613580703559495182812464931, + limb2: 59176688870992696980381194448, + limb3: 2352792380312370559678241916 }, - w1: u384 { - limb0: 398504846974229228559292128, - limb1: 31222368734356768385786556319, - limb2: 75027437257822017611221879800, - limb3: 2080263057325664696825208751 + u384 { + limb0: 40625377847554051211794687848, + limb1: 56309555150900228441026238802, + limb2: 16523459175396971657448338261, + limb3: 3406044480451966153574474789 }, - w2: u384 { - limb0: 71586319050533256412523421034, - limb1: 16775528908212184715768563625, - limb2: 51175965927936180407293426065, - limb3: 1410807143786187565034976514 + u384 { + limb0: 68262812469567572085739292997, + limb1: 27301883946581413247302425188, + limb2: 30008385554364830489037983982, + limb3: 3273273192464943539270875302 }, - w3: u384 { - limb0: 17492625310094939848845839893, - limb1: 20024267067206259844684983171, - limb2: 14368659570732166894369856758, - limb3: 5618194217439312477398840645 + u384 { + limb0: 32053033364658852529969493870, + limb1: 18495616947901179258335097484, + limb2: 55444711139904980435858224443, + limb3: 2760475910627651416222935145 }, - w4: u384 { - limb0: 67453884927596885341933216086, - limb1: 78441935495922885572857972415, - limb2: 36545194278797449627840498891, - limb3: 724388781838373124624180118 + u384 { + limb0: 27067254269038406269563405707, + limb1: 72212958391055975030976800708, + limb2: 70733622924906216909614281690, + limb3: 4830889001790608734657237811 }, - w5: u384 { - limb0: 5337027429274099069720475292, - limb1: 15641032874051701601769164891, - limb2: 38599200438487804571040102314, - limb3: 3536927045466041393289371294 + u384 { + limb0: 6598156910626475321502916138, + limb1: 12939195659509401526788123955, + limb2: 25773531279050407613580303518, + limb3: 3375262338692043008650107659 }, - w6: u384 { - limb0: 51931919915221064431684465960, - limb1: 22590891849857798510253594702, - limb2: 71314742198074617175796651549, - limb3: 4811736591890538323425959752 + u384 { + limb0: 47226467657298303411443117, + limb1: 38107736080695166325732004371, + limb2: 19265608464951493925441719374, + limb3: 2286365620906038456035503669 }, - w7: u384 { - limb0: 48831678325450656939167811827, - limb1: 54941413287852378557175031177, - limb2: 44807646060769548386576378166, - limb3: 7999071028799123431408655481 + u384 { + limb0: 2443698108737622430569120326, + limb1: 61047330553137252378087501185, + limb2: 141502420910561654226241765, + limb3: 3841438190446097504874729629 }, - w8: u384 { - limb0: 33934007893407971405859599792, - limb1: 24815431847381168616079357324, - limb2: 17551074567661055945216447868, - limb3: 6346557523512360707525095065 + u384 { + limb0: 54418748870383303394563882440, + limb1: 65847368572270400635655805659, + limb2: 69464280534676032419994195397, + limb3: 269467775594240023194660313 }, - w9: u384 { - limb0: 66560376133629659284492374960, - limb1: 53841888629370538609307240019, - limb2: 69553281113388908262858169056, - limb3: 4410611720408540136217658215 + u384 { + limb0: 33488973427637373112598307469, + limb1: 5110088020272894063456287220, + limb2: 53636484022663668209975487325, + limb3: 3345286048562445000643863077 }, - w10: u384 { - limb0: 24201968932917039040224984397, - limb1: 8622609867679845681239566363, - limb2: 48061995700905790187293853176, - limb3: 2779085666217058180842404445 + u384 { + limb0: 71402729831051960022958789216, + limb1: 48892116270658859643649380573, + limb2: 55191701100103344604313468724, + limb3: 2356491892774991612243135383 }, - w11: u384 { - limb0: 11092074985387155235246745709, - limb1: 15562941247471033246760569578, - limb2: 70222759100483919143996971164, - limb3: 7204071915502156628168939645 - } - }; - - let c_or_cinv_of_z: u384 = u384 { - limb0: 1476043729162975625326979418, - limb1: 50042606671560568339859148092, - limb2: 46102114499241260453929441358, - limb3: 7617790332561903674083956631 - }; - - let z: u384 = u384 { - limb0: 37403928215552190718554187333, - limb1: 11775918347622240499777570327, - limb2: 452519787397270074, - limb3: 0 - }; - - let ci: u384 = u384 { - limb0: 61175617298180174936644689860, - limb1: 67911541097422909572801106741, - limb2: 36817417761825518267712596930, - limb3: 896803617335713796194933695 - }; - - let ( - Q0_result, - Q1_result, - Q2_result, - f_i_plus_one_of_z_result, - lhs_i_plus_one_result, - ci_plus_one_result - ) = - run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( - yInv_0, - xNegOverY_0, - Q0, - Q_or_Qneg_0, - yInv_1, - xNegOverY_1, - Q1, - Q_or_Qneg_1, - yInv_2, - xNegOverY_2, - Q2, - Q_or_Qneg_2, - lhs_i, - f_i_of_z, - f_i_plus_one, - c_or_cinv_of_z, - z, - ci - ); - let Q0: G2Point = G2Point { - x0: u384 { - limb0: 15084118772175327171821031275, - limb1: 62888554332603600324741169709, - limb2: 16072491814775261407984248023, - limb3: 2469768056536795286522650059 + u384 { + limb0: 42321390774533748835929154129, + limb1: 62102222650638372857229717440, + limb2: 61848124502124622604733842660, + limb3: 6095177469505221731686594459 }, - x1: u384 { - limb0: 45740165721060067286942347396, - limb1: 51001691032336877440622413319, - limb2: 17472127020718751454881019416, - limb3: 7257386816077206261062623034 + u384 { + limb0: 79069949946701223435385718754, + limb1: 64995744170704478988881645184, + limb2: 31856562955736472173405715457, + limb3: 5898135204919462491298571572 }, - y0: u384 { - limb0: 78551898791398680882315357881, - limb1: 17153749476359796671419944547, - limb2: 25001735554484957525225796308, - limb3: 3494465550770952967030622469 + u384 { + limb0: 62776698776738970231944213748, + limb1: 12691054048174824881615050452, + limb2: 16482106156017854929287579066, + limb3: 4673535006513413340139987509 }, - y1: u384 { - limb0: 60688128673324186932121552376, - limb1: 44585627350841398033974426468, - limb2: 65889837116115232678126908238, - limb3: 5384491006521491657409089992 - } - }; - - let Q1: G2Point = G2Point { - x0: u384 { - limb0: 42508303975364401225937159644, - limb1: 40524916459287843255825737369, - limb2: 5925177054757494067379812049, - limb3: 472436373740118280495558695 + u384 { + limb0: 33052456600191982767242220293, + limb1: 58520095821299497652564221037, + limb2: 73926098170719915134122481913, + limb3: 6430236531651067115476418355 }, - x1: u384 { - limb0: 64095887622861479831453303560, - limb1: 59428653475030421250439690002, - limb2: 48954022105730032615486275553, - limb3: 4972901184108054408456956956 + u384 { + limb0: 38264982501671486661177071701, + limb1: 65261303476750415664012159567, + limb2: 69988148794680050502306625089, + limb3: 4818870567133329126088923702 }, - y0: u384 { - limb0: 28564217961697562084149501953, - limb1: 42695470893915552843081495428, - limb2: 856565180973317119165448256, - limb3: 6516613961208118884502561798 + u384 { + limb0: 15968475439207864323712152554, + limb1: 3908999041672246436619194480, + limb2: 70420732835052868175121470780, + limb3: 5222978472646080432657617917 }, - y1: u384 { - limb0: 14490171548350024334351642629, - limb1: 25070791091897407510582428848, - limb2: 33414749568336886460476878322, - limb3: 688311396636307779773809089 - } - }; - - let Q2: G2Point = G2Point { - x0: u384 { - limb0: 76934903187457786179568206900, - limb1: 74834100803402164550411130686, - limb2: 62620940055545207944055166297, - limb3: 1963439303868780644135306723 + u384 { + limb0: 77385356695647580477584212640, + limb1: 24853822489043390814719421839, + limb2: 66541368384682238303908761455, + limb3: 2802099651898278019378300681 }, - x1: u384 { - limb0: 35466893887148472080811264345, - limb1: 27865711592650709071295900892, - limb2: 34136205166606801798698742268, - limb3: 5946795888786284358509703001 + u384 { + limb0: 20064406501945637066680712135, + limb1: 12857810260663246545562282039, + limb2: 8788960143186989644943717477, + limb3: 917985865295109274393033464 }, - y0: u384 { - limb0: 68505489258388367435131920350, - limb1: 52165562005253543596896153125, - limb2: 62825906370249702392441432429, - limb3: 3005533828611332631347151118 + u384 { + limb0: 17543477664942652792541702646, + limb1: 35095884071609768363756153182, + limb2: 49541450673748510485568169315, + limb3: 5169351577872824417247783642 + }, + u384 { + limb0: 14824777165173269366173068001, + limb1: 10354783414876108801516345158, + limb2: 44213889333696942873394942892, + limb3: 3562934604448653337723011457 + }, + u384 { + limb0: 48306974624131187031637175867, + limb1: 60455777947561052682685252183, + limb2: 2623718293688685161295544975, + limb3: 648319825514383639307071563 }, - y1: u384 { - limb0: 47295415947992767619463795871, - limb1: 72202746056164561406178670248, - limb2: 57844702573459567962432867132, - limb3: 2475524642026140637914511800 - } - }; - - let f_i_plus_one_of_z: u384 = u384 { - limb0: 41342924563810037945929684424, - limb1: 40053487760576372405284431000, - limb2: 16400454906497301610956216375, - limb3: 6403941801210632197000428070 - }; - - let lhs_i_plus_one: u384 = u384 { - limb0: 29429711985866286756014404914, - limb1: 47877202212530420447648429640, - limb2: 33846832772054519759194661039, - limb3: 256602289929363142592057383 - }; - - let ci_plus_one: u384 = u384 { - limb0: 38032561439652176266292862272, - limb1: 22802766666041954911327960704, - limb2: 49460894359258770739592579949, - limb3: 7972368844221244547742306221 - }; - assert_eq!(Q0_result, Q0); - assert_eq!(Q1_result, Q1); - assert_eq!(Q2_result, Q2); - assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); - assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); - assert_eq!(ci_plus_one_result, ci_plus_one); - } - - - #[test] - fn test_run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit_BLS12_381() { - let R_n_minus_1: E12D = E12D { - w0: u384 { - limb0: 5054154438142243532781310358, - limb1: 37489640889017175514163557768, - limb2: 2088843260555989844194895718, - limb3: 5189274206158696702552041821 + u384 { + limb0: 12658823668845791039541006693, + limb1: 55626632673591172209565537475, + limb2: 13373413907126898891484404360, + limb3: 4571263001286497515245189512 }, - w1: u384 { - limb0: 6595840205269359177179254100, - limb1: 48971099572260734544545254722, - limb2: 51881189181474613257197064073, - limb3: 3860849834042729262588143490 + u384 { + limb0: 7913223376630174061951132585, + limb1: 27830852695631861792163241312, + limb2: 65405790609798025367625426566, + limb3: 2219180825791224297111981178 }, - w2: u384 { - limb0: 19600771446407744114551614036, - limb1: 35110786356769135019011795179, - limb2: 10400844186353998778345785819, - limb3: 1689619688338013901033084389 + u384 { + limb0: 48305100341870281630928151508, + limb1: 10837663163384491372774859629, + limb2: 62565417513332866180215685370, + limb3: 5216401638382249621207608432 }, - w3: u384 { - limb0: 21582894715155173455494887740, - limb1: 10704905637930800623173596814, - limb2: 55271378696458858577215613947, - limb3: 5851306079748286798990589976 + u384 { + limb0: 30588658949421083489607804922, + limb1: 67644156434400335333086916223, + limb2: 39415384996462602206246843377, + limb3: 1747657399072551826854393405 }, - w4: u384 { - limb0: 49996735576413539624696891175, - limb1: 69506368872106790443917290425, - limb2: 41472758429932696471852894607, - limb3: 5286342010965850099284511850 + u384 { + limb0: 58726470025715286157904307245, + limb1: 8902456146128354121109575342, + limb2: 65939087069638670779851731134, + limb3: 3448225254878114058688350240 }, - w5: u384 { - limb0: 27505506514355532720362616567, - limb1: 17994969412454492893277423174, - limb2: 35007780453694431289768236051, - limb3: 4082268805244292429872395021 + u384 { + limb0: 65765608689235214961392780966, + limb1: 14447510554609009663791093777, + limb2: 44123727001282359269590530906, + limb3: 2213071072291566186415149369 }, - w6: u384 { - limb0: 24051524673976791186618365668, - limb1: 41461384159514634436195109192, - limb2: 67181242653468026618521631445, - limb3: 2839955761958100248662677032 + u384 { + limb0: 37223805109745411702397405999, + limb1: 14250706159832082730849267816, + limb2: 77881943371611878175535773808, + limb3: 2640482562420738658519325095 }, - w7: u384 { - limb0: 658949086095406810674322284, - limb1: 38974840754625706435816829221, - limb2: 37797147538603871489395248831, - limb3: 7584801201173204536315299427 + u384 { + limb0: 7481227796669216354481512631, + limb1: 38946960421249620747408634594, + limb2: 3132219225080190058661193282, + limb3: 2486646847581141239391139519 }, - w8: u384 { - limb0: 31275481851329239208293334411, - limb1: 56643222751046890580329705780, - limb2: 30877058322226702963948372328, - limb3: 2184641580395679242108782672 + u384 { + limb0: 64952875624115477762709373115, + limb1: 74896459606347528135942084092, + limb2: 38174464860397110149758649699, + limb3: 3332441441544602665746027810 }, - w9: u384 { - limb0: 33453250364215737130895453418, - limb1: 40930065933237687466897779547, - limb2: 72094015082822779457760708623, - limb3: 6872295984309251676202319079 + u384 { + limb0: 37708664722571618530285097275, + limb1: 43151880070432930841333142593, + limb2: 3018668081926138621518928752, + limb3: 712622718388212867035261125 }, - w10: u384 { - limb0: 22554423765244983836210927109, - limb1: 42144966312055100607691835331, - limb2: 32713615694079088218382144871, - limb3: 678034185620919364339420934 + u384 { + limb0: 14898139456348135242540803173, + limb1: 50817061599472673599336516347, + limb2: 25049846571178189063310691936, + limb3: 5321003775423795934564843308 }, - w11: u384 { - limb0: 22944103539015061808423779491, - limb1: 36075990221520051557558669381, - limb2: 21560686763305557824410715088, - limb3: 4872492572436443043766348824 - } - }; - - let c_n_minus_2: u384 = u384 { - limb0: 1536661748789430005364095001, - limb1: 76828834137118756548786733512, - limb2: 14731493853980595191664596970, - limb3: 2793927054306810391712942646 - }; - - let w_of_z: u384 = u384 { - limb0: 56663660322376042743683741947, - limb1: 649994929383489660214055558, - limb2: 11938392442187246668913145877, - limb3: 2150926634398318338089746942 - }; - - let z: u384 = u384 { - limb0: 24685648053119625227072412121, - limb1: 39486979755670645578712566709, - limb2: 36736868250428139881539209293, - limb3: 314309216930710845739651493 - }; - - let c_inv_frob_1_of_z: u384 = u384 { - limb0: 66832623287861230092746960099, - limb1: 11574270387473012148289229802, - limb2: 61453554803885873572359997296, - limb3: 5379512538751782466117550318 - }; - - let previous_lhs: u384 = u384 { - limb0: 19724830568516106811137667533, - limb1: 77245257241489451331044384097, - limb2: 58440198805071447685532607339, - limb3: 1972581917786924191177105257 - }; - - let R_n_minus_2_of_z: u384 = u384 { - limb0: 25595702870716512214597396022, - limb1: 57696885986842674423639229009, - limb2: 74270137469191502826566365756, - limb3: 1209630956016240092700034430 - }; - - let Q: Array = array![ u384 { - limb0: 50144214671776250787072106799, - limb1: 1193786767206993737363568590, - limb2: 21874898923618322729192136906, - limb3: 3919895541852746986925502859 + limb0: 43044806575612740935088538015, + limb1: 19275620428477674688630790518, + limb2: 1814231046278153617147754907, + limb3: 130207641070578213440370650 }, u384 { - limb0: 707495672235467889558508450, - limb1: 46037664789411966802005954800, - limb2: 37654822495166007647621207389, - limb3: 1534965870903100341896309044 + limb0: 31863416310048905761271049771, + limb1: 11484293904943853874933024486, + limb2: 54612051903704948014878234243, + limb3: 7541166235990088482971596150 }, u384 { - limb0: 49528085829314403883453882647, - limb1: 28167012219857730790460724999, - limb2: 55564939853396036197462236235, - limb3: 1063555455884997123319427991 + limb0: 64596329400725793317447558510, + limb1: 35114528423773423117406487960, + limb2: 51635140587527647885191342237, + limb3: 3794431417386774424238307215 }, u384 { - limb0: 15288286442614916454934372776, - limb1: 29929938914800367632941277448, - limb2: 10674582645371629134314265974, - limb3: 391075602626068185051144442 + limb0: 69423590301545487080666560980, + limb1: 46756286680052692233281432927, + limb2: 75746556398335475105940686235, + limb3: 7777874349356550471973549000 }, u384 { - limb0: 34662321279046293003305796284, - limb1: 42999823288509043046654689184, - limb2: 15035590486256648224186110299, - limb3: 5383757136688983285926419838 + limb0: 71791049757054790804276670784, + limb1: 47056173543686334628581929065, + limb2: 43231595027426812176081306811, + limb3: 7391309657851645984714201709 }, u384 { - limb0: 58026897365689193231594589541, - limb1: 68743253239056723544065488738, - limb2: 72452094678885946428742652837, - limb3: 1587964251301502191640885090 + limb0: 30477709353769767716251641189, + limb1: 9251107245548913567377126789, + limb2: 35008087239940620110854835198, + limb3: 1125905817711225927638415947 }, u384 { - limb0: 12282383976500276474650158423, - limb1: 64921026015426583323610896350, - limb2: 29085664990450599925826378653, - limb3: 7684318728964532700056552753 + limb0: 38848823651518232198054799012, + limb1: 70495230194454720270778264185, + limb2: 71785763728432774502390452255, + limb3: 5290216536712999915069377885 }, u384 { - limb0: 30030925335149584305500826885, - limb1: 69953109492339350293936406124, - limb2: 67885010360813240021404013322, - limb3: 6142136738440602161239033907 + limb0: 14228899546148102209382433514, + limb1: 50871861778347238024992248768, + limb2: 32093659800135220783903810877, + limb3: 330490002836669217260731276 }, u384 { - limb0: 57123787590678272243583229359, - limb1: 76626559788853894453071915612, - limb2: 30700187493699207924626820585, - limb3: 6766324544124151456576784605 + limb0: 51707735450428401784990347545, + limb1: 61586664388599067930098772195, + limb2: 8018075165007886275572014095, + limb3: 1716566288234960805748179763 }, u384 { - limb0: 43691781032608121820343656874, - limb1: 22431797287867864458183649698, - limb2: 50777640559406037512033266326, - limb3: 953276214010815376314608425 + limb0: 55573766064869255421569559276, + limb1: 34199916285655595488482901434, + limb2: 15411625923123117115101596690, + limb3: 2444925803260051205227775030 }, u384 { - limb0: 5282921597590139168091043946, - limb1: 74300134330141170764665388164, - limb2: 69205228017172180086145213158, - limb3: 1060223059142550372082617987 + limb0: 41893902327887418483139402585, + limb1: 16310159019300800327391790607, + limb2: 78372308220937060574249855499, + limb3: 3049527828729588758093183682 }, u384 { - limb0: 7824065233503068935459781162, - limb1: 50844805249785890706592967481, - limb2: 52125892201648000888515049920, - limb3: 6179504377082404933368199106 + limb0: 33215762663560764961292996845, + limb1: 48721934890634383298308378924, + limb2: 48846754960882145059582153677, + limb3: 5732867800210371726568764854 }, u384 { - limb0: 38933154502306944381180959754, - limb1: 65923987067781818164276092331, - limb2: 63463338439566832568720952477, - limb3: 3574438494556528182826109888 + limb0: 23444709200185116936537904641, + limb1: 44424937837824931738016302888, + limb2: 27301608792660918188761243092, + limb3: 3094993237701789789047197376 }, u384 { - limb0: 74335336692887028433619149875, - limb1: 65127650506772182446325842600, - limb2: 56127907211603191434873358438, - limb3: 6109811753362285823349538835 + limb0: 47619719183607272729864545191, + limb1: 67991148538897583251799895312, + limb2: 46099703253061318629570366207, + limb3: 7690851914890271500289336454 }, u384 { - limb0: 3220874574134931503507603035, - limb1: 66112455407726182207053306737, - limb2: 74839198519170596792676692061, - limb3: 5144733003462332328911911410 + limb0: 26722969655302762321327915098, + limb1: 44111173449250496862765204587, + limb2: 77258953736430127362675360953, + limb3: 7064604101941242253001665068 }, u384 { - limb0: 57454039811802102943937515190, - limb1: 30529074199098007480980209389, - limb2: 41689226853552258433048148573, - limb3: 5645280576171407774036070204 + limb0: 37771504645627710790647889684, + limb1: 60359236335940203476190757373, + limb2: 11871823917457089549684331735, + limb3: 7654759486785791450750743495 }, u384 { - limb0: 14173751306660034785584696677, - limb1: 44220534095659994433778407243, - limb2: 8359694386282320485998496166, - limb3: 5710009931616564589091300971 + limb0: 10198778573733641398215263066, + limb1: 64890082426866849470613205324, + limb2: 45133584419357391920048022208, + limb3: 7031812004239965458206846433 }, u384 { - limb0: 36343589778240065419306302645, - limb1: 33836366707515820218403936264, - limb2: 13215995766945967215850078551, - limb3: 5446594144033484840869217145 + limb0: 13150469210758147344549173944, + limb1: 69028655788173242554096703468, + limb2: 20351813693770136194373195176, + limb3: 6240541772632785412281598376 }, u384 { - limb0: 48203473588933207026954303220, - limb1: 43228964819187836868693589593, - limb2: 60665654945808222375796539013, - limb3: 7373946816759240461752496525 + limb0: 30919939516595875757580122634, + limb1: 34236790641314697770876689279, + limb2: 75864305079495125570572872916, + limb3: 7368999539142500978061619252 }, u384 { - limb0: 76189903049013293298307824681, - limb1: 76045126233181674326402840263, - limb2: 57544466837745662410906647088, - limb3: 2817374948305565187552815864 + limb0: 1441055445764498759507990117, + limb1: 48218514104269595152243606958, + limb2: 78886972706278719063796662661, + limb3: 5862080000154623893684688895 }, u384 { - limb0: 41009238469239924961191389617, - limb1: 70538778763506618699416402442, - limb2: 23794907384283347085383007909, - limb3: 2127502068317957920496109025 + limb0: 30599120755981145797512290223, + limb1: 57592764127642147399218817257, + limb2: 64100178652818625741660721152, + limb3: 3049032100093753872061967126 }, u384 { - limb0: 1719359888409573037450493567, - limb1: 74739721163510390352829909305, - limb2: 21863576423301876455419506615, - limb3: 5063387558510596678751022566 + limb0: 11307344017871365547427185936, + limb1: 16229281386944205731637585732, + limb2: 36243853442590293197223724821, + limb3: 1154792673175425205809706028 }, u384 { - limb0: 73359134458362973087622443141, - limb1: 7470195899466877853918111551, - limb2: 28177952031926823650887013914, - limb3: 2624315810256509016173093548 + limb0: 76387176695850996822129638685, + limb1: 33224370037693251783381749744, + limb2: 21251734988871035973758764537, + limb3: 6256534390042353339002291287 }, u384 { - limb0: 46123126799454082253306012923, - limb1: 20301728259960822024417746753, - limb2: 7281473849022007709958049720, - limb3: 5635746121028602007527322203 + limb0: 77659120362567054280083512, + limb1: 25254308972670144270559917217, + limb2: 7829708998936298081184740981, + limb3: 890506833820674865696831714 }, u384 { - limb0: 45653838896655352449410354660, - limb1: 7555518782418446404262019218, - limb2: 23799605726385021881199694432, - limb3: 8005423190324616607025934150 + limb0: 3316563514538003483712121271, + limb1: 56467391674193857771677682565, + limb2: 19478925371765836454993715487, + limb3: 5523575666048095997964246529 }, u384 { - limb0: 6217619608875161300142347283, - limb1: 73038184861391415418098684365, - limb2: 27565870725173607630435372303, - limb3: 4301142457270976885422691530 + limb0: 49097067439572467528591930624, + limb1: 48137997052982465451158622278, + limb2: 6822270523533317607515048887, + limb3: 5061973159453636744438188412 }, u384 { - limb0: 61593448516697723135790505237, - limb1: 4288458246667000560162926826, - limb2: 3262794357235032361020049616, - limb3: 5594626375718401199275162254 + limb0: 71768767710110472271357215618, + limb1: 25023405562579157345852379657, + limb2: 50887823546351449353720001269, + limb3: 829666448880256771857278399 }, u384 { - limb0: 47151229791268738446749067212, - limb1: 7137107014234509328368527082, - limb2: 22958976877508070869600737936, - limb3: 1465843814205875297767616211 + limb0: 14218162419144340974446556792, + limb1: 18651579888991308674101678501, + limb2: 41590168488912219929363914879, + limb3: 927696879401630456086438747 }, u384 { - limb0: 6539897711575709952316482610, - limb1: 59049940939206865625589849166, - limb2: 31627193139037453978429269734, - limb3: 3946820630225947185213013989 + limb0: 40667417821363130702696651846, + limb1: 56765883496699719609970725706, + limb2: 21489247659908436332737180090, + limb3: 4396340210894110318081775147 }, u384 { - limb0: 61308743623254939693894564549, - limb1: 60374468105470122122893829237, - limb2: 44312008672220934529391977464, - limb3: 3915047799642711781264539008 + limb0: 12998434868010149874758864, + limb1: 32393027210574127900869090758, + limb2: 27304771704845742237014626890, + limb3: 5398304351734456798300523629 }, u384 { - limb0: 15536587270260081821694410977, - limb1: 78996718385071340434785611316, - limb2: 19509605447472720756474165441, - limb3: 2636882450510956536151956663 + limb0: 70193930497930535675182546586, + limb1: 29447437139650233797318141631, + limb2: 7829980842099156813375972583, + limb3: 5141941003860349791651038082 }, u384 { - limb0: 25623309668264604997198185969, - limb1: 45636866494237073561034095837, - limb2: 53221324386363070692027509983, - limb3: 3617435574289304259924099952 + limb0: 2753553142394464492548776390, + limb1: 43426524407986480222081438342, + limb2: 45353337737736079806758941047, + limb3: 886063015475913679914640252 }, u384 { - limb0: 25411510973686182192251319357, - limb1: 51926918817007123290138003678, - limb2: 24150237474038724330957990710, - limb3: 3463423460169503244996071437 + limb0: 59755812520636144212373636700, + limb1: 7831679770230030060982326452, + limb2: 72729168654875486375991149657, + limb3: 3865809418541023590256254708 }, u384 { - limb0: 78448492610421177070689233077, - limb1: 49373577131030790317241797191, - limb2: 3555565766827319665301412890, - limb3: 2312369021190978586713603200 + limb0: 32002019599576381893179825373, + limb1: 28445840812277435391730183709, + limb2: 61150569186684674646229754989, + limb3: 922252891889048285430144990 }, u384 { - limb0: 29617134690012347945862468082, - limb1: 57716666469778090561972931147, - limb2: 8903006345751758673818861644, - limb3: 2407033805427697258130127047 + limb0: 10817647929942335364994085225, + limb1: 2477018931521157702020011994, + limb2: 70683416398934628608343460538, + limb3: 1708497159688889553141950108 }, u384 { - limb0: 73423090925861761276439284400, - limb1: 65953068304086131166705232417, - limb2: 1088063366493091882861874317, - limb3: 7965211003108707351637565937 + limb0: 63752987351864231496058621442, + limb1: 28141031164735047743438875925, + limb2: 74822220035287157602214364141, + limb3: 6696493130626128878919983571 }, u384 { - limb0: 35657551264147865679850944237, - limb1: 26293982804979214743276350870, - limb2: 42625183888771571153532724786, - limb3: 5411523305312755317819143665 + limb0: 61244148157511642044241087190, + limb1: 6029466511665308901499214192, + limb2: 68788984702589722560385962269, + limb3: 1764174819686389434640193676 }, u384 { - limb0: 20492998205373140969247260834, - limb1: 49362472062724135070142966020, - limb2: 11198696209962053026191263129, - limb3: 6618132296788990381052145320 + limb0: 34943318913327440842082604526, + limb1: 61890609242976437228469401688, + limb2: 78417912972001965738113013319, + limb3: 6077613530621148070751188939 }, u384 { - limb0: 46190410237535001352781241362, - limb1: 41737324312431750812097724810, - limb2: 13494112902918695937256825608, - limb3: 1987597461403428592332005194 + limb0: 39074775069830346874069240688, + limb1: 4640966399459683089964454628, + limb2: 12336472271743672522858067198, + limb3: 7367024763095740274635317982 }, u384 { - limb0: 48960213676974752424039825886, - limb1: 36837991155746086208299774853, - limb2: 660301904083392823279105574, - limb3: 6540015734812322716919303570 + limb0: 56155826008165904602036535662, + limb1: 15379282338514445454457859937, + limb2: 63137041596227786527523502087, + limb3: 392300812103821855829437097 }, u384 { - limb0: 18315064599260385437053603602, - limb1: 40290715805771972685281342540, - limb2: 7891419083379642134920641900, - limb3: 4799861463456619419257809092 + limb0: 44360444706577609420588247243, + limb1: 1753409855242410959752245309, + limb2: 5325216943891375136824774812, + limb3: 5328178608828515734752312920 }, u384 { - limb0: 42114573693637016542807118228, - limb1: 15756516614023615060931806658, - limb2: 36285409730500982709164877547, - limb3: 7055953172450666281544792058 + limb0: 15779252517888446678774172709, + limb1: 50536614246027970202240213508, + limb2: 55980546834330134515084492611, + limb3: 6543320956341677268034058977 }, u384 { - limb0: 19600424109166011929778472083, - limb1: 24158847173808354910489142507, - limb2: 31168344361761975432443646419, - limb3: 181949702874942852972962811 + limb0: 58022553072531840003788656278, + limb1: 49473980789873217070006381900, + limb2: 36595973113815146379232680432, + limb3: 2684368378764168811974495954 }, u384 { - limb0: 27881427136773593036239573336, - limb1: 23952750503137207178460008371, - limb2: 77504495279955141127904422474, - limb3: 2732166089682534282257808223 + limb0: 60803895374345533325287255964, + limb1: 55819765782286329944801626128, + limb2: 13839166161362154724746295799, + limb3: 1961607540735620790967955859 }, u384 { - limb0: 22199243526514995046734922063, - limb1: 27079088742027668653376260534, - limb2: 52047496527785632906466904093, - limb3: 7228477124141421236454654998 + limb0: 14416280251615715231928225530, + limb1: 48287746074322277746956867686, + limb2: 58616742618413433257289406847, + limb3: 1751079747313332025037447844 }, u384 { - limb0: 76107023749316063346772431717, - limb1: 69142534016875185670582244037, - limb2: 18018700598011998082359779669, - limb3: 5673712468870246490176904076 + limb0: 32705553611816928863704986227, + limb1: 72155344667867789125036051284, + limb2: 65318819098222912365122621599, + limb3: 7795251174760525221109803984 }, u384 { - limb0: 76893877068526091774753149343, - limb1: 47962264564536230933295550737, - limb2: 42960184097589156873541255474, - limb3: 6461776098524477482606514563 + limb0: 58560881510890780490894084743, + limb1: 27721638145084639353650689478, + limb2: 729396447281202017801950809, + limb3: 4766391584498605590326070375 }, u384 { - limb0: 10715806823700665454416108978, - limb1: 72018565357521146109394203012, - limb2: 11500157564541037014126724077, - limb3: 5593946823364888891112738253 + limb0: 30909564512080619504747630078, + limb1: 50273777762201758036988594352, + limb2: 64037084179558428508784712461, + limb3: 5007869461362704429816925777 }, u384 { - limb0: 57605175573235144274926892749, - limb1: 25249020219681121418112415861, - limb2: 32803640448279426407758582515, - limb3: 3004214131722359249323488269 + limb0: 2139780756541383821565472794, + limb1: 18204444344549953061329052917, + limb2: 24390490183517180587275860816, + limb3: 2511305019183052730714143150 }, u384 { - limb0: 73980764483281449545105980908, - limb1: 50456248812408641184960533878, - limb2: 21692366969575718568275310942, - limb3: 1861204309299737093074233418 + limb0: 22008788650588278669120965841, + limb1: 1948863667824864332880454178, + limb2: 48495536770756850743816645470, + limb3: 5568687830839230844076852528 }, u384 { - limb0: 14637125589086652653003693933, - limb1: 78115449650034045941768842535, - limb2: 21143034125994993252221768572, - limb3: 6064539749323155690586957224 + limb0: 68675918385557188996870313558, + limb1: 71072900392044069740541182608, + limb2: 4335132458944119996113539951, + limb3: 5457182510157727171768228696 }, u384 { - limb0: 18395395764800374948572758401, - limb1: 2066626235041522897123087055, - limb2: 54520169338970596124585921821, - limb3: 1327929611348656042639798641 + limb0: 3515411695470863870360334077, + limb1: 57250170170434585613612275633, + limb2: 54444645528324281637101967036, + limb3: 5696509065652132550374696640 }, u384 { - limb0: 47910201524353844828532398093, - limb1: 51464122827134792641982554746, - limb2: 67512649320630432140392910245, - limb3: 4692752660848349400854993133 + limb0: 19132493567347082661042748343, + limb1: 45042475276108777581923457978, + limb2: 57376378660442759636974849191, + limb3: 7778968295876248380542762795 }, u384 { - limb0: 68701037517780443705428285388, - limb1: 54498098278426792826431314471, - limb2: 36250443962157776200025267201, - limb3: 4234306388089307635645998457 + limb0: 23256655639584726667252290051, + limb1: 54453301719182593785297007227, + limb2: 43349499232955693325687203784, + limb3: 2044220390424051170197772717 } ]; - let (final_check_result) = run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( + let (final_check_result) = run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( R_n_minus_1, c_n_minus_2, w_of_z, @@ -9654,1058 +13564,1445 @@ mod tests { Q ); let final_check: u384 = u384 { - limb0: 19875210744276112495080267674, - limb1: 25649179571014925054195085280, - limb2: 65873170560410511338811085036, - limb3: 235919030056186864261847654 + limb0: 11084033048630483515319647844, + limb1: 18658859407767613834768243985, + limb2: 63700007113285529425036776896, + limb3: 7936455745568186535822144696 }; assert_eq!(final_check_result, final_check); } #[test] - fn test_run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit_BLS12_381() { - let R_n_minus_1: E12D = E12D { + fn test_run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit_BLS12_381() { + let yInv_0: u384 = u384 { + limb0: 71229928116029751491267650142, + limb1: 857474623136561614114968050, + limb2: 7511493382068605140480809529, + limb3: 2961359566146049437330946264 + }; + + let xNegOverY_0: u384 = u384 { + limb0: 47636229997997478076745353769, + limb1: 46065232159682426941640914865, + limb2: 10367199767046453762965396210, + limb3: 4040676806223585621953627787 + }; + + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 33816562806368889200105415760, + limb1: 68835230102165628254994269218, + limb2: 39768608117153179695588535183, + limb3: 6991806490576155988831491875 + }, + x1: u384 { + limb0: 68335086197766500578924141776, + limb1: 7080754119519026799088112876, + limb2: 30690494996784481629090430717, + limb3: 2239828120052540390737024042 + }, + y0: u384 { + limb0: 62288588480645815265749668032, + limb1: 22070008432295042125533059769, + limb2: 17258770374775703929866469498, + limb3: 3893434246093546225728428761 + }, + y1: u384 { + limb0: 73749392390374487755538404285, + limb1: 14239437759177320815794920545, + limb2: 58989038600047800467479483963, + limb3: 2204262708921513677802847254 + } + }; + + let yInv_1: u384 = u384 { + limb0: 69478243588243592592734174290, + limb1: 62602810233549785910400617940, + limb2: 39705691397676023882470725725, + limb3: 2115029803169338742380356604 + }; + + let xNegOverY_1: u384 = u384 { + limb0: 70431686682176656374113453728, + limb1: 26594083728512286214816787800, + limb2: 31267534062425011200454505894, + limb3: 2518797584560127818209663539 + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 60876613424475892181789327408, + limb1: 67978190707414898874943920584, + limb2: 79140045045518589331046153688, + limb3: 6999986472633837468946007486 + }, + x1: u384 { + limb0: 43427586477787590506480339289, + limb1: 77045049673160212741542545110, + limb2: 66047139518816102344766313487, + limb3: 6961207303644275099651863671 + }, + y0: u384 { + limb0: 38204778490747344268478285881, + limb1: 14671959117177148061982855471, + limb2: 14303692641405491302934845041, + limb3: 6125899468594395265974727264 + }, + y1: u384 { + limb0: 10451689036205679352967491975, + limb1: 74666276505845846776071452645, + limb2: 50721080030314440837084095722, + limb3: 6712619056648700562911027915 + } + }; + + let R_i = E12D { w0: u384 { - limb0: 47046142486972972261709078415, - limb1: 50816454005252626321141513683, - limb2: 62346215115138956850411819022, - limb3: 1082616121052529102528703413 + limb0: 24495904893861828463468823627, + limb1: 23262811303295041992328967642, + limb2: 44729948640696642053041471874, + limb3: 3189906525024352687324242130 }, w1: u384 { - limb0: 44185621387348334223333530447, - limb1: 60622210873868440731036451198, - limb2: 3905587764636636541466324707, - limb3: 4353130703477435045036820538 + limb0: 10359756695097788655316592256, + limb1: 50506781285178107955266541901, + limb2: 26092548051688795450859527589, + limb3: 6606885966612123790400554491 }, w2: u384 { - limb0: 40958555296007559508041057575, - limb1: 36728508495381374859444963735, - limb2: 35787209966544118853013857927, - limb3: 4958274638141632097942970618 + limb0: 10045085410412559662783231972, + limb1: 72695268680127034338131283351, + limb2: 30040273849316403791828559880, + limb3: 1803555721808479167966733987 }, w3: u384 { - limb0: 61697437490137262306021134399, - limb1: 70855965398634124575202338507, - limb2: 10720099355900835050372237640, - limb3: 3203401889805400857259279679 + limb0: 6068067813431417781911139579, + limb1: 1560463100703269964713991804, + limb2: 29997394189351001937624071325, + limb3: 4686992871141212267741728681 }, w4: u384 { - limb0: 14172220892412643303792394620, - limb1: 71037357631596182949171850154, - limb2: 15998701697997020377002226951, - limb3: 893096134343532822446125553 + limb0: 57162605525600674160305430471, + limb1: 59646234204899874572322768566, + limb2: 30976837412110426378400910356, + limb3: 2059018724097794925257879430 }, w5: u384 { - limb0: 54803500633343273683105703096, - limb1: 56368440433982197747298147024, - limb2: 56915508979119761919006115185, - limb3: 903114296687111175046370452 + limb0: 78305329977431642524471905367, + limb1: 1397209639273066130960635327, + limb2: 8342012572699699456579891983, + limb3: 2169467670755113729804530512 }, w6: u384 { - limb0: 75247255947858933266234774164, - limb1: 43602893470687655538719665990, - limb2: 60867854220943682527271286282, - limb3: 3319592092307096882663857717 + limb0: 47368906824222376721057694458, + limb1: 42405312227631295266350639723, + limb2: 49763555058903664501628669623, + limb3: 1850184390869678786797367590 }, w7: u384 { - limb0: 52253376920976009507255881285, - limb1: 12844794316429012098730171019, - limb2: 14171285128187260011889222745, - limb3: 508154501275282942860948921 + limb0: 36327251105521596768028521391, + limb1: 72015052984559092758857031008, + limb2: 61122313313534575774785542921, + limb3: 1799213468183419614305220994 }, w8: u384 { - limb0: 16071568016934262467149603739, - limb1: 60640903312089822222359169060, - limb2: 36337415013592298157691888008, - limb3: 4938313529509003754865984990 + limb0: 63930484425784814898301785842, + limb1: 46279410768609044446400170855, + limb2: 55829645316694726819053022770, + limb3: 7428012633299857747731102024 }, w9: u384 { - limb0: 455605189405480173068018757, - limb1: 39096467442487792882327803302, - limb2: 46654480029658638242179029132, - limb3: 4493608307706445938258284814 + limb0: 64928436138704450384657494189, + limb1: 10671738562935222965183920755, + limb2: 60146909863436216691722101572, + limb3: 6127607124350827299473284288 }, w10: u384 { - limb0: 6291105904354476314872229399, - limb1: 520768511935066287456736307, - limb2: 43364869920763745455906850217, - limb3: 6225703695945661705404704969 + limb0: 17598653045701539587563491067, + limb1: 15640565772137493516349936191, + limb2: 65396348427266195199815797287, + limb3: 1017618501338552407747549586 }, w11: u384 { - limb0: 65383239598101981159147405832, - limb1: 14644532730071297524572339438, - limb2: 51757926579741786309869706710, - limb3: 1439718421847462759127145767 + limb0: 33614885610955586879958568111, + limb1: 108214728331713988730030954, + limb2: 63328594477441994584409003566, + limb3: 1265926085579448692973246113 } }; - let c_n_minus_2: u384 = u384 { - limb0: 52844910492387579712230428272, - limb1: 47797198799150290595638796872, - limb2: 72920388404478357552629197389, - limb3: 1078371000032522920418062075 - }; - - let w_of_z: u384 = u384 { - limb0: 14122292952774372229350535258, - limb1: 22530947763590105500316681197, - limb2: 54787353171451670210945245402, - limb3: 5667612229380157329593936165 + let c0: u384 = u384 { + limb0: 56194485731544036856226605702, + limb1: 30916152175834837567789641436, + limb2: 56957035407707225591803882406, + limb3: 1966158568013073323398747707 }; let z: u384 = u384 { - limb0: 14056602336726365855500008776, - limb1: 59368419822980326445104955096, - limb2: 73799434918835248398593368704, - limb3: 7610974033510204037573431344 + limb0: 32759116165647246550452428698, + limb1: 54028367751566454093616369646, + limb2: 3329312171552834721649780141, + limb3: 1993946554698577629925768946 }; - let c_inv_frob_1_of_z: u384 = u384 { - limb0: 29201077833921904662567358522, - limb1: 64988068808283840490408018687, - limb2: 33856082238812893422948620915, - limb3: 642994626556830966566036431 - }; - - let previous_lhs: u384 = u384 { - limb0: 10659815763808439508550489527, - limb1: 68089312147988139054510959133, - limb2: 41757419838770400519037930282, - limb3: 2078207854285635172780739029 - }; - - let R_n_minus_2_of_z: u384 = u384 { - limb0: 48491893853758107134453735877, - limb1: 45268363159309418635618234211, - limb2: 49832818629875373925160942844, - limb3: 868239101186979978549988266 + let c_inv_of_z: u384 = u384 { + limb0: 12926631538356143784401012319, + limb1: 65463661563962759478166353884, + limb2: 38872426551901586999500012373, + limb3: 5514806881225716323971980900 }; - let Q: Array = array![ - u384 { - limb0: 41625781252339807539492644089, - limb1: 49378488439264085478825823488, - limb2: 10276933694938779887963873781, - limb3: 4916077007145037834550909870 - }, - u384 { - limb0: 50060917338098541951588200563, - limb1: 64014799592903434996646934060, - limb2: 48282098529343382206710441587, - limb3: 2876854403474683137027712319 - }, - u384 { - limb0: 125253137576538546057027933, - limb1: 36832034701547913763889533624, - limb2: 9343038275520595944726737397, - limb3: 2053305161580608789125184056 - }, - u384 { - limb0: 79147905261602354367455838149, - limb1: 3604262698830801923480048686, - limb2: 44400690229788867132065540303, - limb3: 2102893049479250610983853600 - }, - u384 { - limb0: 15939687515285274032894927018, - limb1: 20157032387725382133127378263, - limb2: 24384253778748248040204288188, - limb3: 5446872825015251521287186815 - }, - u384 { - limb0: 13914770344036142278138674324, - limb1: 66062446621382239657482977624, - limb2: 53278796652861255549425223555, - limb3: 4699224837968473112577496810 - }, - u384 { - limb0: 62114010613781332508810002191, - limb1: 73507094775116389221294487875, - limb2: 66163893194080026360347756303, - limb3: 5594920891996254076022361611 - }, - u384 { - limb0: 28014725359095095564487222838, - limb1: 11829153773037413937886484086, - limb2: 2469792797662545025044331110, - limb3: 3716204691266880712607969613 - }, - u384 { - limb0: 66742261865051677229450462154, - limb1: 47987633590648648769824684521, - limb2: 47155958068725536093946682758, - limb3: 7747959071170542974748166050 - }, - u384 { - limb0: 35803707880829455290951147358, - limb1: 23976716334574667221748372229, - limb2: 23952123256651386191776903535, - limb3: 3706052694059093275808998063 - }, - u384 { - limb0: 15070122083987989312347279142, - limb1: 38304593693320589767404017149, - limb2: 41486081211554615451363394032, - limb3: 3241798093295792521854823196 - }, - u384 { - limb0: 69071031783411088426846321642, - limb1: 77823722307262642138326172583, - limb2: 53615067305263228630356612271, - limb3: 2032074679949785158236957601 + let (Q0_result, Q1_result, new_lhs_result, f_i_plus_one_of_z_result) = + run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit( + yInv_0, xNegOverY_0, Q0, yInv_1, xNegOverY_1, Q1, R_i, c0, z, c_inv_of_z + ); + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 75747436618588800605960212777, + limb1: 78691532185927417990232751732, + limb2: 75370796408684182904821015394, + limb3: 4966767594856391104991781876 }, - u384 { - limb0: 36394915046398890764826146327, - limb1: 68517323096644823583357991721, - limb2: 325617778008501268669555924, - limb3: 436051606097540582096009407 + x1: u384 { + limb0: 36697322920048800410262931921, + limb1: 234917666721443267876980557, + limb2: 57429202369022505780530651741, + limb3: 7639168584293572604181698448 }, - u384 { - limb0: 47084312642479042983373220160, - limb1: 26405934989144551701458662598, - limb2: 3655569669905551839088422363, - limb3: 7587881023658015968194785917 + y0: u384 { + limb0: 27018324606989475573661769067, + limb1: 22879507105415534757947661797, + limb2: 38515199588946914631738878736, + limb3: 4126853920732415331976021411 }, - u384 { - limb0: 24757280142112946517986980256, - limb1: 60094071663947246164894630946, - limb2: 70682263029501166523679021272, - limb3: 1986205581456163876726403692 + y1: u384 { + limb0: 75132292665023065429744647749, + limb1: 70852651799466582419860703888, + limb2: 53879885596590665235084661004, + limb3: 5443755110030470246511092815 + } + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 33297241360034632835894308193, + limb1: 2765451933478108646472225484, + limb2: 22543983443735751879904562894, + limb3: 6638131378253552378902224542 }, - u384 { - limb0: 21918434466196448847906647005, - limb1: 61226501893280894153373465144, - limb2: 9321259936469641995718816795, - limb3: 1559765019756058645699013267 + x1: u384 { + limb0: 7435007734194328142801567109, + limb1: 68625235334146705516536059254, + limb2: 45158303394860781964864314846, + limb3: 4671570450563215077547830748 }, - u384 { - limb0: 1208761147641704855957737789, - limb1: 44338120944967582021718312295, - limb2: 16366745919137836049203034821, - limb3: 5440653963534857284222134654 + y0: u384 { + limb0: 50123168685948663103099615835, + limb1: 65238109207497687389088358545, + limb2: 54472627378742677882772846976, + limb3: 3022039982330950801618248535 }, - u384 { - limb0: 11215287124490256517270354470, - limb1: 63699667614353942476953921449, - limb2: 19397040796616583048822274907, - limb3: 3083733980868367912617422157 + y1: u384 { + limb0: 28082677632119936871426650125, + limb1: 13617309653389842438524440143, + limb2: 58611873298695255459408276869, + limb3: 5576207667258120860482785513 + } + }; + + let new_lhs: u384 = u384 { + limb0: 12125323133328163438881825892, + limb1: 25959576875021342443193424308, + limb2: 28579255237627195307168245374, + limb3: 6350796506653110449441998838 + }; + + let f_i_plus_one_of_z: u384 = u384 { + limb0: 492702058117989287478981673, + limb1: 38492197875264634516870427448, + limb2: 43552836496998090179802674068, + limb3: 6865962617998115138398685106 + }; + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(new_lhs_result, new_lhs); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit_BLS12_381() { + let yInv_0: u384 = u384 { + limb0: 4770097775408202613726298614, + limb1: 65356711170806441918163670734, + limb2: 67121773567956627810137500258, + limb3: 1552850755817024718190429619 + }; + + let xNegOverY_0: u384 = u384 { + limb0: 55428474144189692934414138923, + limb1: 75369551036362006272844041515, + limb2: 40826843806891290759446151185, + limb3: 2890583372625455025315521346 + }; + + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 1205473017497294403877964596, + limb1: 8471924506523091864081378674, + limb2: 31555812589717190940508567852, + limb3: 7607684383263716789308039076 }, - u384 { - limb0: 26837660278008610180747414488, - limb1: 4018942259526979151571665610, - limb2: 37295514496047989893372872625, - limb3: 499692167437676087221300165 + x1: u384 { + limb0: 13426091741510175793680570178, + limb1: 45154354915374794085909946092, + limb2: 56308842284910408205763335448, + limb3: 6093088355228283856782144437 }, - u384 { - limb0: 4262465511462328005941921475, - limb1: 31050844891181413431323127508, - limb2: 47229599675772805737562100827, - limb3: 6233975750445648064188950582 + y0: u384 { + limb0: 58713445666322263156418815277, + limb1: 74746276214903446678538093507, + limb2: 39193419296139724681910635584, + limb3: 6475925637769884651866598982 }, - u384 { - limb0: 55409443476839822684907865728, - limb1: 28175460875803332675251622733, - limb2: 64764425887170447328713382996, - limb3: 7510855024012459081163457858 + y1: u384 { + limb0: 38090739592266857106608325986, + limb1: 42064710563281711818210331268, + limb2: 44688163859048601300420371467, + limb3: 1804086853141607731347060020 + } + }; + + let yInv_1: u384 = u384 { + limb0: 61817557845088233724216147194, + limb1: 5959520355003125518265366093, + limb2: 58806966673822152919454865679, + limb3: 4612466951508328374680816756 + }; + + let xNegOverY_1: u384 = u384 { + limb0: 76547966973071098123546106224, + limb1: 33589719896424734475127152794, + limb2: 38406653639946885891214008423, + limb3: 2779739172056096802878173167 + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 61955748035637406816728039868, + limb1: 27914106218615944098782334493, + limb2: 25862284730111757149932940050, + limb3: 7998312924187195507416301279 }, - u384 { - limb0: 42267031167380068126544504650, - limb1: 73110480047975937411085209752, - limb2: 36896187971642712109344120439, - limb3: 920197180889936306101724096 + x1: u384 { + limb0: 74941087918980128938908789388, + limb1: 19492783777118563395317579736, + limb2: 28324281772678400732116785525, + limb3: 5932572519296468558153399916 }, - u384 { - limb0: 72865272659378694735950971144, - limb1: 7705968648091064844965865770, - limb2: 54229932108897270514344602125, - limb3: 7590983880189885559313309219 + y0: u384 { + limb0: 38888189023354271975799388239, + limb1: 29267421321292700083319887688, + limb2: 35214838122493296228512760555, + limb3: 2429545151362327252104228055 }, - u384 { - limb0: 18356706742050923486474680995, - limb1: 11386804857782137839827023942, - limb2: 48879188275766481818919947810, - limb3: 3599427982431392894924340975 + y1: u384 { + limb0: 52870205482917261238043415882, + limb1: 19539161843884275755749785415, + limb2: 4864659887310997092380711653, + limb3: 3640840811443597346922040599 + } + }; + + let yInv_2: u384 = u384 { + limb0: 61940196839971027297595214844, + limb1: 27371169144827089206524570050, + limb2: 65826302164642265145632645521, + limb3: 22224929293812456813468458 + }; + + let xNegOverY_2: u384 = u384 { + limb0: 19237022755753283041609065088, + limb1: 17457553988590341737373418686, + limb2: 31887840469783434327429696015, + limb3: 1517172928172144944819557295 + }; + + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 25854899460898885650787233284, + limb1: 2081967893214385807440511003, + limb2: 58476815032406786116447008241, + limb3: 5054647114064818233154355084 }, - u384 { - limb0: 55429180598206686218124470076, - limb1: 26171277012159814586663556952, - limb2: 69911238660822029290452117158, - limb3: 4828032835486359820936907519 + x1: u384 { + limb0: 64870403525479367926719399904, + limb1: 14209183794877313872851283213, + limb2: 7785835516899133378960743476, + limb3: 6963688615925803288979330379 }, - u384 { - limb0: 37659868166195917736401396718, - limb1: 37922725014257917631255685791, - limb2: 13532292416718509718201691972, - limb3: 3452520083756681934365918421 + y0: u384 { + limb0: 6010777315382417414788238916, + limb1: 25661143893829999732637838715, + limb2: 33954297894368285498441199901, + limb3: 1844525304207748310542796346 }, - u384 { - limb0: 10093192496014733583654361177, - limb1: 32141754505223108767439715650, - limb2: 63125654468470919577601779052, - limb3: 5507841450665635737155870815 + y1: u384 { + limb0: 12853552346862605560387094699, + limb1: 56077795959562149168109901065, + limb2: 690620060427394016465365595, + limb3: 6246505564478604560991468667 + } + }; + + let R_i = E12D { + w0: u384 { + limb0: 24642273999402853913022755326, + limb1: 73169296312712883653397304083, + limb2: 6346219433095432629058086055, + limb3: 8006177228532556230595401643 }, - u384 { - limb0: 62782847358967593880516719266, - limb1: 36522190801258813330854223104, - limb2: 32756242491559423117178431638, - limb3: 2413399344532747098183124262 + w1: u384 { + limb0: 2735480897806558035658349245, + limb1: 49817440111728763919066711267, + limb2: 26434855669541682175005015143, + limb3: 7817274463830341059880885988 }, - u384 { - limb0: 77159652550224786219386430216, - limb1: 5233807302440353836367144908, - limb2: 64485045574006641363191925507, - limb3: 4269887894807089990492612650 + w2: u384 { + limb0: 67766670931272214015924170208, + limb1: 18905707736711567341237780402, + limb2: 65665678278245564230487965532, + limb3: 4155902485496629231742006441 }, - u384 { - limb0: 34492274511748489938477829369, - limb1: 27111943401072218801461051575, - limb2: 18710073092160195163679235359, - limb3: 6631448687074431878130783254 + w3: u384 { + limb0: 4176823034322921389391343080, + limb1: 21236610352661760528164199192, + limb2: 61033117013161881310008589809, + limb3: 2114963840757994053637495384 }, - u384 { - limb0: 73750585383425246052337378111, - limb1: 66294021848996742441696471049, - limb2: 46915996806828507928137551299, - limb3: 3222388534094990566235858776 + w4: u384 { + limb0: 12018918792705345872382327876, + limb1: 949621708783023509808561786, + limb2: 64865675547223113582631362774, + limb3: 2454691655019566704754000762 }, - u384 { - limb0: 65127376050242268170626415185, - limb1: 24405103951105803450953871586, - limb2: 5514884953982893298260690692, - limb3: 6788949099134278272314475419 + w5: u384 { + limb0: 64559829717101684322716556746, + limb1: 51851764728585534598699495735, + limb2: 55193556375977094693738356428, + limb3: 5079101205761067400329773063 }, - u384 { - limb0: 61112118342314023505275301153, - limb1: 25939953397348716960121272440, - limb2: 52303641029328368324789805176, - limb3: 2155122597157404110294436993 + w6: u384 { + limb0: 21233983632060680194830084201, + limb1: 66937868602768737894161529797, + limb2: 23593180737582240683692318342, + limb3: 7871280684051965789058155557 }, - u384 { - limb0: 70296100945875310470972906771, - limb1: 59816352433044208788534277210, - limb2: 14604615816704680542181818, - limb3: 6545052355564599604065327224 + w7: u384 { + limb0: 65499079079298573055700308823, + limb1: 68214940056737955495177147417, + limb2: 74886781592480052471070928895, + limb3: 4382223196981980333231907151 }, - u384 { - limb0: 45181952028093399314484464712, - limb1: 53840205562809393449142996343, - limb2: 74738563576760781880337825615, - limb3: 7108659901525501401056806830 + w8: u384 { + limb0: 2500186062373642764514692670, + limb1: 53822575846393829717996934825, + limb2: 62193806805794974587274868149, + limb3: 5486172329871254484253314367 }, - u384 { - limb0: 23307710534391095773209525624, - limb1: 71390571769417206745370600294, - limb2: 4209179574779910258581290088, - limb3: 5546271006155430672381461631 + w9: u384 { + limb0: 74542547048876159856876632093, + limb1: 7525434441202573167713527918, + limb2: 23417329012954814085252223332, + limb3: 4623221698974164547838321914 }, - u384 { - limb0: 28462292202229009631382659861, - limb1: 22358919703741012426272092247, - limb2: 18637725724437117556607495757, - limb3: 5844699959895311746343430194 + w10: u384 { + limb0: 4727877613205019106615922487, + limb1: 51943150936268307854952050994, + limb2: 68589446015026991944608198970, + limb3: 6148481562380381120806863687 }, - u384 { - limb0: 25204641962539179078906201281, - limb1: 32169221122015509846169144396, - limb2: 43188760359479768924606578465, - limb3: 1717370542600204431968584126 + w11: u384 { + limb0: 46964212793041241742350687968, + limb1: 2742133200807647006339769254, + limb2: 30588527328041235124315329773, + limb3: 4122437450084918606098810435 + } + }; + + let c0: u384 = u384 { + limb0: 46864733453142587178908769807, + limb1: 10208840961612396338446583225, + limb2: 18304675259657465319687797479, + limb3: 4568144127694510711256082136 + }; + + let z: u384 = u384 { + limb0: 35965895312459884808163407512, + limb1: 54186242963571708019116304747, + limb2: 20561464542614745090512265132, + limb3: 7249495031521092434465897488 + }; + + let c_inv_of_z: u384 = u384 { + limb0: 2863054239074127716361135772, + limb1: 41505837366794021320001793018, + limb2: 18842744539419025852740507269, + limb3: 1122240685411734784271613127 + }; + + let (Q0_result, Q1_result, Q2_result, new_lhs_result, f_i_plus_one_of_z_result) = + run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( + yInv_0, + xNegOverY_0, + Q0, + yInv_1, + xNegOverY_1, + Q1, + yInv_2, + xNegOverY_2, + Q2, + R_i, + c0, + z, + c_inv_of_z + ); + let Q0: G2Point = G2Point { + x0: u384 { + limb0: 48981656995978219835180931823, + limb1: 18715946391424083115978590878, + limb2: 50570241173087913492034799902, + limb3: 3477827845010386367476392261 }, - u384 { - limb0: 14912866320600872791881886801, - limb1: 66815301690110224018854386636, - limb2: 66548700250063757205798836987, - limb3: 2856877085926294763579896335 + x1: u384 { + limb0: 39287811074121278861302769227, + limb1: 6753907166111587961093439971, + limb2: 1246678269411717345576158904, + limb3: 7947149260568175551770441473 }, - u384 { - limb0: 62505349608841241979766328096, - limb1: 73706832083623234409576340716, - limb2: 14245015795401811287883838173, - limb3: 4200327416563246622573801540 + y0: u384 { + limb0: 47675699224485933314206180700, + limb1: 57540337740038727137907651228, + limb2: 7457267533616698067312048485, + limb3: 5633268506538923967284457750 }, - u384 { - limb0: 35656299016425635102126712465, - limb1: 17885038177568675130291038711, - limb2: 47899228341741552414453923928, - limb3: 4933507594157014969072676506 + y1: u384 { + limb0: 76500628088939916734940412098, + limb1: 75068103830201232121111841379, + limb2: 4910144763366012958280236759, + limb3: 5569030770652860932027099876 + } + }; + + let Q1: G2Point = G2Point { + x0: u384 { + limb0: 60684323820669795207724667256, + limb1: 60592549784693318108724639291, + limb2: 38641979319127349744149712140, + limb3: 7728923584815330377328388007 }, - u384 { - limb0: 18757264512758726069372593072, - limb1: 21332218065024951499992475343, - limb2: 43271749115738409552812223150, - limb3: 331390303817348477606417400 + x1: u384 { + limb0: 31477952066487426930340004491, + limb1: 557300042180144868010394113, + limb2: 9380593830978909556149201579, + limb3: 991529356891870050861453253 }, - u384 { - limb0: 45013446845320535503727854062, - limb1: 29201805509683156071833105876, - limb2: 38150967505240260454236313355, - limb3: 792906632753900934103593464 + y0: u384 { + limb0: 64037300101838167009318762122, + limb1: 9301217767015404696736602732, + limb2: 25321922169915245322452890197, + limb3: 7572498493356377691083220924 }, - u384 { - limb0: 57939015147512599307834349633, - limb1: 68084773571746840620984085903, - limb2: 61708424565904605480500703424, - limb3: 5119620390147242919536891884 + y1: u384 { + limb0: 62877012789163609932793846329, + limb1: 56644565888574229479048604144, + limb2: 29577509647022619906855781533, + limb3: 605093812701583950477309447 + } + }; + + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 60330254540161823465660039741, + limb1: 4938002210231142589983544232, + limb2: 21550872822076020760085294893, + limb3: 166348493508137760365571927 }, - u384 { - limb0: 70506368305113468603384409819, - limb1: 19429225615253565281904989810, - limb2: 58762427736663709401299981852, - limb3: 6622653838395827455483619839 + x1: u384 { + limb0: 3112374056649100024924515773, + limb1: 49842449929659212350110683676, + limb2: 9950338510290954984922145125, + limb3: 2591350256800530965312024570 }, - u384 { - limb0: 50205909317534819288029670694, - limb1: 45922896189942511061661438990, - limb2: 4181208419706788004442930009, - limb3: 5298712761016655617692097867 + y0: u384 { + limb0: 46306501163349575090739509393, + limb1: 69075343680805512111341741367, + limb2: 18996920266080813585107470467, + limb3: 6087197626894465230428778179 }, - u384 { - limb0: 37147614164879515275127262704, - limb1: 71785079485527250677423382385, - limb2: 58138778441086420558196743487, - limb3: 3495096269483803850563262925 + y1: u384 { + limb0: 25382900557023210020081253480, + limb1: 77219048453067882418119751730, + limb2: 48315876427510196530964911964, + limb3: 1168568259982368229690519972 + } + }; + + let new_lhs: u384 = u384 { + limb0: 69211418492923693371419451447, + limb1: 16077318197917107890597111707, + limb2: 13627777219868853101677425420, + limb3: 1105143355567709418700576017 + }; + + let f_i_plus_one_of_z: u384 = u384 { + limb0: 67331528729557336834428153353, + limb1: 18084209543064189404561951271, + limb2: 13105424298559814169617984648, + limb3: 4217872182463525013773208277 + }; + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(Q2_result, Q2); + assert_eq!(new_lhs_result, new_lhs); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit_BLS12_381() { + let lambda_root_inverse = E12D { + w0: u384 { + limb0: 11536302762810502427313224118, + limb1: 48320162972374134993842993753, + limb2: 69738122843262858663806104944, + limb3: 3470481083717413188813756844 }, - u384 { - limb0: 63241758999954351563947419617, - limb1: 13271364447461061343002236132, - limb2: 73116859996847952643012371437, - limb3: 3011371751362319950452536563 + w1: u384 { + limb0: 42298985031730439996205438743, + limb1: 10830249276031119602537530368, + limb2: 6029321491013039000734605087, + limb3: 2549885336912641069985037572 }, - u384 { - limb0: 44661412515614400814557876576, - limb1: 49858286925680440187009394396, - limb2: 13395837363309657177888722044, - limb3: 6499877255251134464056030182 + w2: u384 { + limb0: 71153308406477045153586694590, + limb1: 51878787768382641628607360768, + limb2: 28199709643086205753066390523, + limb3: 5537298946772857081613235442 }, - u384 { - limb0: 64087326394620414988701437117, - limb1: 2162777267924807436762149083, - limb2: 6537129300753142709360574522, - limb3: 761206914223330782120205540 + w3: u384 { + limb0: 68711041823715703148720532281, + limb1: 55383413099474566141304212843, + limb2: 39862146371408228393983061179, + limb3: 7195590333331871190551078797 }, - u384 { - limb0: 22013449706488532075751690473, - limb1: 48788525134004001921678338491, - limb2: 67966543838012421749311653597, - limb3: 7342758815944447463160011187 + w4: u384 { + limb0: 61341443882219355373380515850, + limb1: 63701397344123368503479409399, + limb2: 32657344081172243680961116742, + limb3: 5834795824105331661235137496 }, - u384 { - limb0: 13834333828801627238163185771, - limb1: 58547016195620171196760219797, - limb2: 35387509956032738651517539017, - limb3: 1737071188336872402436295151 + w5: u384 { + limb0: 19337606991797667010226019884, + limb1: 6363527204274183594088852664, + limb2: 26699241723004147548401560905, + limb3: 3035329548449027583377443970 }, - u384 { - limb0: 11493649556871294349148378507, - limb1: 65103664565496479454885942211, - limb2: 39293070644831104710007481552, - limb3: 4089637682340092425205511894 + w6: u384 { + limb0: 39085436129629553082189305468, + limb1: 49987434169411331162854349079, + limb2: 52849000022343374857955118016, + limb3: 2840891791129937236632082242 }, - u384 { - limb0: 50885166771628217654958285308, - limb1: 64929936299358295842083531846, - limb2: 13278671659591187443875958406, - limb3: 4716372700353782504909024946 + w7: u384 { + limb0: 37153843843047683690959164122, + limb1: 28856793514660098958424155333, + limb2: 70141629713176087207146091348, + limb3: 3372539506773595380901708576 }, - u384 { - limb0: 59116136156222511726949983604, - limb1: 73084751189343297355695300815, - limb2: 30090919104028461165798705419, - limb3: 3863070984732004448651084347 + w8: u384 { + limb0: 36392020979348358273630045962, + limb1: 21696197450626985389688639247, + limb2: 75681754624367611168956156104, + limb3: 7885445169344097270787659190 }, - u384 { - limb0: 11499954585655657769725768676, - limb1: 34443202352008595038238608938, - limb2: 73462137013787176858618000576, - limb3: 3783185270301837469140414980 + w9: u384 { + limb0: 78904308145554809014500261569, + limb1: 23882544487417562577148370014, + limb2: 12062009210166820548277902151, + limb3: 697131873584918561086393833 }, - u384 { - limb0: 76198693382915459595455544954, - limb1: 75731883201659331388307845153, - limb2: 72708646378405259385541501287, - limb3: 3504143663574219243108095818 + w10: u384 { + limb0: 73612525053195922996659719185, + limb1: 56255307249476817479211738726, + limb2: 3010772798693915901605209558, + limb3: 5120410064687726337103480186 }, - u384 { - limb0: 34209601786589920540347626407, - limb1: 51661985061286814558282369072, - limb2: 26538852232226556936384754320, - limb3: 7945756431747912253387839413 + w11: u384 { + limb0: 26605707115402350729306011567, + limb1: 17951236956457951410202562241, + limb2: 66253977058150157564728764986, + limb3: 7354124459590958309073997955 + } + }; + + let z: u384 = u384 { + limb0: 77987664459792371478765992625, + limb1: 40671550611707621956293669978, + limb2: 76656657633559001049701618473, + limb3: 7055264512611433113107806038 + }; + + let scaling_factor: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { + limb0: 76307625596885500826626523053, + limb1: 27029295388169301006672040136, + limb2: 9386462606189984758521015227, + limb3: 6653784229040877364212130981 }, - u384 { - limb0: 51842415788793637990667168485, - limb1: 36532786479315635908125695229, - limb2: 59349096622812864881764415874, - limb3: 6654074800595111012351764473 + w2: u384 { + limb0: 44429062179056289297209863354, + limb1: 68686979454448049800506489783, + limb2: 8137425622411721505758184466, + limb3: 3679003526285285589048805510 }, - u384 { - limb0: 15443603619631936878878827143, - limb1: 53694364560523385390356994144, - limb2: 14254465681833821989886104716, - limb3: 104759346397426443390972828 + w4: u384 { + limb0: 61510258391475858182806797429, + limb1: 14385186002269794640108182149, + limb2: 52516534177092114541698966228, + limb3: 3368180894963295132057263630 }, - u384 { - limb0: 65893230905811234197623062068, - limb1: 32582484426548711654062116019, - limb2: 8232382849818185959624329531, - limb3: 3481250014714674212509640201 + w6: u384 { + limb0: 73134304836962941892283687680, + limb1: 69801675528701499816552070692, + limb2: 36224143209424896681889207395, + limb3: 7335261128548467988219036498 }, - u384 { - limb0: 22445102354589100069020740369, - limb1: 2697066818412675914660594544, - limb2: 7284339409026165841996102654, - limb3: 5884063508326351563641573387 + w8: u384 { + limb0: 25062387053895218355543897618, + limb1: 37870294831124718358625658017, + limb2: 38046871985718008878434002503, + limb3: 1901092404946245708354588534 }, - u384 { - limb0: 66191892249541520025980456069, - limb1: 47488170108511885542176183046, - limb2: 56099489067615750776266778215, - limb3: 855529167842488935024563026 + w10: u384 { + limb0: 67150586502705501009510853602, + limb1: 8272722717966857946443052743, + limb2: 16783383682650061563407698202, + limb3: 1110216014467981803816377473 + } + }; + + let (c_inv_of_z_result, scaling_factor_of_z_result, c_inv_frob_1_of_z_result) = + run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( + lambda_root_inverse, z, scaling_factor + ); + let c_inv_of_z: u384 = u384 { + limb0: 69376228184893836008281016943, + limb1: 78506958399698086848361385031, + limb2: 71663108430625964706712659552, + limb3: 3184028700479444101090097870 + }; + + let scaling_factor_of_z: u384 = u384 { + limb0: 9799742483551255027262094330, + limb1: 39784236017751831534029310808, + limb2: 45336602058993678362026113283, + limb3: 6404181341696823446186891483 + }; + + let c_inv_frob_1_of_z: u384 = u384 { + limb0: 33185800275277187166647996793, + limb1: 8787072236294328676580626335, + limb2: 5889423345407502232514931849, + limb3: 3776231080374153571940096173 + }; + assert_eq!(c_inv_of_z_result, c_inv_of_z); + assert_eq!(scaling_factor_of_z_result, scaling_factor_of_z); + assert_eq!(c_inv_frob_1_of_z_result, c_inv_frob_1_of_z); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit_BLS12_381() { + let p_0: G1Point = G1Point { + x: u384 { + limb0: 8087637096430009750579545463, + limb1: 45197734022250574432615113582, + limb2: 15611418450859980409090215578, + limb3: 1037527552402250104456396619 }, - u384 { - limb0: 10292313126907065514476942498, - limb1: 60519046999055105114939248623, - limb2: 44848591127138903145276484090, - limb3: 1829859752812693255677183212 + y: u384 { + limb0: 9086465249991103896119590057, + limb1: 79000873895776060558494974526, + limb2: 61437936818824971160838876969, + limb3: 4267855361484029164369513171 + } + }; + + let p_1: G1Point = G1Point { + x: u384 { + limb0: 16288857537882314089900813638, + limb1: 72919424215987966909135372078, + limb2: 62723230650102085967203404828, + limb3: 1531645040016278448329077181 }, - u384 { - limb0: 55115359513832582829536468219, - limb1: 23338130200440097602001427475, - limb2: 74171984408456552602783082143, - limb3: 4490689482399746122273915161 + y: u384 { + limb0: 65576248179265677288329348858, + limb1: 63800264213160434124983079436, + limb2: 59173293347792565228232838750, + limb3: 7640962863098529654389257726 + } + }; + + let (p_0_result, p_1_result) = run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit(p_0, p_1); + let p_0: BLSProcessedPair = BLSProcessedPair { + yInv: u384 { + limb0: 15712969672302209249038429066, + limb1: 21077666251455712397110176284, + limb2: 69622472216653370048754621668, + limb3: 2136822977547319581530771368 }, - u384 { - limb0: 21897361435348315720476115934, - limb1: 54843436452655378302279923780, - limb2: 60996218022460897416635001392, - limb3: 2548538212327761301685571343 + xNegOverY: u384 { + limb0: 32899640503283700241232414402, + limb1: 60084159730001356709737705959, + limb2: 77645921319446209067500240089, + limb3: 4166856178057764592821166818 + } + }; + let p_1: BLSProcessedPair = BLSProcessedPair { + yInv: u384 { + limb0: 67331560161516219353350767533, + limb1: 57975260107680490727064578264, + limb2: 76106914842922433133081304177, + limb3: 7360383716942981100190240616 }, - u384 { - limb0: 5862651484125861641115310863, - limb1: 4942837444474654290735812594, - limb2: 26355623068218716649653476762, - limb3: 2557471227755029244004475920 + xNegOverY: u384 { + limb0: 21061631494865254842081635589, + limb1: 57596234211169052595120390134, + limb2: 33091513251644990392479743257, + limb3: 1599361290098363532564097538 + } + }; + assert_eq!(p_0_result, p_0); + assert_eq!(p_1_result, p_1); + } + + + #[test] + fn test_run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit_BLS12_381() { + let p_0: G1Point = G1Point { + x: u384 { + limb0: 50980418261052459146624285516, + limb1: 55808416738793037191887341251, + limb2: 20640529662733711640101821102, + limb3: 7451975005605946185586173403 }, - u384 { - limb0: 20968910073420807018427618098, - limb1: 5498314059955637953483295091, - limb2: 73570186118267422118386956933, - limb3: 3888463202892542858758130964 + y: u384 { + limb0: 2314876068235204858166483326, + limb1: 54724087726953231705261851537, + limb2: 50652324825585633096730387319, + limb3: 2597561318121124349494326431 + } + }; + + let p_1: G1Point = G1Point { + x: u384 { + limb0: 63709429559201513400099818143, + limb1: 31347528908406808059142218043, + limb2: 24884827198074396480662991947, + limb3: 4655932696183746975619882126 }, - u384 { - limb0: 38984795553409362188999484096, - limb1: 42833292056974129290111228286, - limb2: 17302360929253606621511811287, - limb3: 1052246123295806507979695387 + y: u384 { + limb0: 17084426157381046224579031913, + limb1: 41632942925916312581014688531, + limb2: 18682174753995463300228286084, + limb3: 4432695421521804959686781164 + } + }; + + let p_2: G1Point = G1Point { + x: u384 { + limb0: 45764008709412411035054438648, + limb1: 70836761834472662738053129666, + limb2: 28801002752160646375133870191, + limb3: 5661984930358099762503593049 }, - u384 { - limb0: 56679852917056611661618659853, - limb1: 2761964731357129445003334704, - limb2: 45266579229312890208986520139, - limb3: 7697384045892515424144221743 + y: u384 { + limb0: 29200112268207250075360935873, + limb1: 34934882304820993342545616103, + limb2: 22636587275466817001726191192, + limb3: 6796590164675138002463095427 } - ]; + }; - let (final_check_result) = run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit( - R_n_minus_1, - c_n_minus_2, - w_of_z, - z, - c_inv_frob_1_of_z, - previous_lhs, - R_n_minus_2_of_z, - Q + let (p_0_result, p_1_result, p_2_result) = run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit( + p_0, p_1, p_2 ); - let final_check: u384 = u384 { - limb0: 78717607179258458972887966236, - limb1: 57236149130185677116133520300, - limb2: 73764605267871304409839067147, - limb3: 7864078458845373285591249716 + let p_0: BLSProcessedPair = BLSProcessedPair { + yInv: u384 { + limb0: 76234307838338241034438367515, + limb1: 64004036279697404396945703743, + limb2: 64932633198626462093899452489, + limb3: 1351888395597913912503237979 + }, + xNegOverY: u384 { + limb0: 9342510917395523767287046017, + limb1: 28068931381947087974100500492, + limb2: 52719512230001100335223790426, + limb3: 4048906654236620368410829814 + } }; - assert_eq!(final_check_result, final_check); + let p_1: BLSProcessedPair = BLSProcessedPair { + yInv: u384 { + limb0: 47581349017043883670887386513, + limb1: 10321625339574891315035054280, + limb2: 25437083755827626362712292270, + limb3: 646126154486995184830848109 + }, + xNegOverY: u384 { + limb0: 23114642051059951239782137368, + limb1: 66598160350505091503707044046, + limb2: 10031711899141404645108903373, + limb3: 1545314600759718868739131775 + } + }; + let p_2: BLSProcessedPair = BLSProcessedPair { + yInv: u384 { + limb0: 23716656240240593794923534314, + limb1: 63757535315436379129213048022, + limb2: 38604720139111032509166290915, + limb3: 4371282200765666751733316383 + }, + xNegOverY: u384 { + limb0: 65955942946379161616337507683, + limb1: 66436116132122643491527613683, + limb2: 75011493362587683502963570390, + limb3: 2924282853997035098546587890 + } + }; + assert_eq!(p_0_result, p_0); + assert_eq!(p_1_result, p_1); + assert_eq!(p_2_result, p_2); } #[test] - fn test_run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit_BLS12_381() { + fn test_run_BN254_MP_CHECK_BIT00_LOOP_2_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 51336162621550734210035417468, - limb1: 415250006649270599173986746, - limb2: 26447631210891709283945988616, - limb3: 6568456756269630467207533536 + limb0: 31856760263208984726179120585, + limb1: 18302410504278765944347728499, + limb2: 1777036268156364049, + limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 13032341109029743902683319123, - limb1: 10723169215078783342162775617, - limb2: 40464312170043011027976354467, - limb3: 6011421598045701294843628209 + limb0: 53746623716480339218657872339, + limb1: 2665962725876116898241309138, + limb2: 3050908754056501448, + limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 35856694556580458772597834777, - limb1: 5227748236259293558895161969, - limb2: 40371665883936326384079209715, - limb3: 7546120403599398191414383622 + limb0: 75689444356124290441600953649, + limb1: 17989763129835920932315549497, + limb2: 2117764773547207938, + limb3: 0 }, x1: u384 { - limb0: 23936110202241319314607177628, - limb1: 6525211420537118205390022661, - limb2: 14847338785688929289141089698, - limb3: 4420938905311944424949504318 + limb0: 79017139234678908622765506368, + limb1: 17839293860469538404433834586, + limb2: 2294780044923640868, + limb3: 0 }, y0: u384 { - limb0: 28884325157281233147803835785, - limb1: 70657110080690277600027289714, - limb2: 60912717192387279519498791453, - limb3: 512136465463816539161171987 + limb0: 59192617695529499479513058410, + limb1: 65429976047832691594997412420, + limb2: 3471624693652610525, + limb3: 0 }, y1: u384 { - limb0: 50293544524810663939148401830, - limb1: 29636141903684128710066468966, - limb2: 44794755821910018669271527790, - limb3: 1626702908604226054677363589 + limb0: 67112131037228465290621407724, + limb1: 23368063716759917089478805467, + limb2: 939117765463076055, + limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 31833852669033812343121332037, - limb1: 46259262133624975372469588883, - limb2: 71577571181590998682585121544, - limb3: 4167500126036868818220947502 + limb0: 30359963284888885323693517481, + limb1: 5596377337847237719405435551, + limb2: 1676742891710502510, + limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 34502703974235714101804777959, - limb1: 6100368243607073093469633045, - limb2: 62909054123967778603720311351, - limb3: 3077233512658781708805196690 + limb0: 55720900661326384605212211652, + limb1: 35848531682099468796603784267, + limb2: 331426720018576208, + limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 56131618349590797133812577950, - limb1: 60190139614768165901902591780, - limb2: 76270544567366434724739910360, - limb3: 4837722625586568549708161960 + limb0: 71868105488994878880843524196, + limb1: 18768421114113590216121451833, + limb2: 819631917425408436, + limb3: 0 }, x1: u384 { - limb0: 4381684805713368923546957945, - limb1: 34192187068398935948806702241, - limb2: 78026040558534254530218713598, - limb3: 181486465969759433705366906 + limb0: 73181792711662501860836266434, + limb1: 76582933774955723164253869875, + limb2: 409901020141353803, + limb3: 0 }, y0: u384 { - limb0: 57294565870005653636098980424, - limb1: 49387658135456037512348561677, - limb2: 14710741208908940160960229557, - limb3: 6269587628905762387147318190 + limb0: 22859859154136284308393795100, + limb1: 28000855034728171306036414699, + limb2: 614425251668742614, + limb3: 0 }, y1: u384 { - limb0: 20923641918028442305843513575, - limb1: 72307868276534307494619134746, - limb2: 76528471893256148132234596012, - limb3: 1262718971162436140946830724 + limb0: 23972813845063086774859544213, + limb1: 8406961366874232703726535902, + limb2: 652348407379311210, + limb3: 0 } }; - let R_i: E12D = E12D { + let lhs_i: u384 = u384 { + limb0: 58280446892782192859377038916, + limb1: 40953080295398762391344997717, + limb2: 1773985397188630470, + limb3: 0 + }; + + let f_i_of_z: u384 = u384 { + limb0: 27249764037930567846218172537, + limb1: 19011748802343590489610636458, + limb2: 1410321390223264461, + limb3: 0 + }; + + let f_i_plus_one = E12D { w0: u384 { - limb0: 47336653367531199957301972145, - limb1: 61291575930505501027622839719, - limb2: 50729104072368725663288033958, - limb3: 106070686536074596723911954 + limb0: 5731185999004768069004731831, + limb1: 39241751224020400654597717087, + limb2: 2020834351272407995, + limb3: 0 }, w1: u384 { - limb0: 52043729932450173259081782771, - limb1: 41052332494448377428781182925, - limb2: 2662806971947410378838227215, - limb3: 5056220980837032032660984033 + limb0: 64095796044230917814179259865, + limb1: 39105593325256618226441303393, + limb2: 2029642705291974621, + limb3: 0 }, w2: u384 { - limb0: 78975990562204539201247923412, - limb1: 31646397476714325609439022193, - limb2: 31306463162290929562303238934, - limb3: 1983777957934648323839074938 + limb0: 6455272549092671826509519312, + limb1: 65463462261161940834466898863, + limb2: 709257394876839757, + limb3: 0 }, w3: u384 { - limb0: 58385256243483184668244363556, - limb1: 72824738489839153320371982595, - limb2: 22539919648905316993363942403, - limb3: 5537195487104192141890697711 + limb0: 38822865599411371039404195807, + limb1: 66588022967208120556755172040, + limb2: 1286642042344041850, + limb3: 0 }, w4: u384 { - limb0: 27578946778082037872073770794, - limb1: 64611745555418850739679928472, - limb2: 48041058380393802940384098272, - limb3: 4503715070683265771833584055 + limb0: 47906885162578058538164730737, + limb1: 50258883807440287578679063824, + limb2: 1256897600197499811, + limb3: 0 }, w5: u384 { - limb0: 45548803333300261466274904544, - limb1: 13867684631874476444975421035, - limb2: 8435023007894805192885533071, - limb3: 4983146094479858598232091692 + limb0: 9406778144477039479288656734, + limb1: 56403056411038013192065792670, + limb2: 795867129819795335, + limb3: 0 }, w6: u384 { - limb0: 75030295576987440955713132144, - limb1: 40666760678943698193355132222, - limb2: 69412827049246708586945111913, - limb3: 7857346657711888775190415690 + limb0: 58781081570818241434142697606, + limb1: 33931014974790147367144790947, + limb2: 229525276486120494, + limb3: 0 }, w7: u384 { - limb0: 54999545599785338320913710793, - limb1: 29875377749027863683097250068, - limb2: 61003086110821155118076645716, - limb3: 3363837213855265999152424957 + limb0: 51117769816528266524923650677, + limb1: 76942385322032925123146780840, + limb2: 2604066695098047042, + limb3: 0 }, w8: u384 { - limb0: 36353717835811608132253367712, - limb1: 71029935305026358362756676884, - limb2: 2166945719961538536899494707, - limb3: 2553323312366244058980574622 + limb0: 53469669196190738206678920457, + limb1: 43309084602205469172728579506, + limb2: 1301266048600613581, + limb3: 0 }, w9: u384 { - limb0: 50203859435986509537739488377, - limb1: 17460486651198866068701797447, - limb2: 18216942149032252515329649468, - limb3: 4084468929039911627481637007 + limb0: 65901976594455383272796456465, + limb1: 5132969593710279245653947797, + limb2: 1418178523824501187, + limb3: 0 }, w10: u384 { - limb0: 40921680211496816837995796141, - limb1: 55524566070724529729063386052, - limb2: 19668994461041911560720190983, - limb3: 3950817615537897316803137383 + limb0: 18507950302796935819867559327, + limb1: 38050883552460141895373935949, + limb2: 2684279815916077691, + limb3: 0 }, w11: u384 { - limb0: 65052239079440445965178730338, - limb1: 43936096265438404689156429941, - limb2: 37756613242828581777727028202, - limb3: 2164574104929802902203660155 + limb0: 64154912163004101211174450983, + limb1: 39998314734646276193108081157, + limb2: 1692429991791313049, + limb3: 0 } }; - let c0: u384 = u384 { - limb0: 21318380038371740515795331304, - limb1: 59116589050921949316839568937, - limb2: 72091880870723968041394118345, - limb3: 7300006134313298018652049709 + let ci: u384 = u384 { + limb0: 2003394466289312727448866158, + limb1: 69470466942458991315857109763, + limb2: 715932567035234685, + limb3: 0 }; let z: u384 = u384 { - limb0: 12359242221772712509777403341, - limb1: 9497752341269599538706416441, - limb2: 53543352683464478738680476442, - limb3: 4879116448495409293645707810 - }; - - let c_inv_of_z: u384 = u384 { - limb0: 60549664597734584543904777167, - limb1: 75900032797554362866008208618, - limb2: 38211115498861540698093633932, - limb3: 3123737747775662138392493174 + limb0: 40443957756524008307692351208, + limb1: 10741815352417431977484953904, + limb2: 238083174513095600, + limb3: 0 }; - let (Q0_result, Q1_result, new_lhs_result, f_i_plus_one_of_z_result) = - run_BLS12_381_MP_CHECK_INIT_BIT_2_circuit( - yInv_0, xNegOverY_0, Q0, yInv_1, xNegOverY_1, Q1, R_i, c0, z, c_inv_of_z + let ( + Q0_result, + Q1_result, + f_i_plus_one_of_z_result, + lhs_i_plus_one_result, + ci_plus_one_result + ) = + run_BN254_MP_CHECK_BIT00_LOOP_2_circuit( + yInv_0, xNegOverY_0, Q0, yInv_1, xNegOverY_1, Q1, lhs_i, f_i_of_z, f_i_plus_one, ci, z ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 45760513716931023192877946202, - limb1: 64256162522778110737977991000, - limb2: 19018734045312550693327142385, - limb3: 5850535663316248658973165417 + limb0: 71034154725970103158033658879, + limb1: 66533763720010285851903725587, + limb2: 817741010207865259, + limb3: 0 }, x1: u384 { - limb0: 17918285447936073650860466639, - limb1: 15034762631005276315717301587, - limb2: 67609192406073666855090319447, - limb3: 1774147650594488101384512135 + limb0: 29086806810220199064176865772, + limb1: 12593869671565630560351683057, + limb2: 1724790640703392089, + limb3: 0 }, y0: u384 { - limb0: 71781190824042458959232056759, - limb1: 41077081086386697139391005029, - limb2: 65376799912843668672209880045, - limb3: 7654039458132994330646440006 + limb0: 78456663779451002677827448083, + limb1: 9803143166366264036871908211, + limb2: 420408949608590925, + limb3: 0 }, y1: u384 { - limb0: 29919417558763630263594752624, - limb1: 28420496556233702115724611791, - limb2: 19438907000411757044026636058, - limb3: 3907125794454736675087801757 + limb0: 48621073084733039921528748197, + limb1: 30849634937796682946216154295, + limb2: 911115538249094063, + limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 15157761987186585303459405402, - limb1: 52896573218026959093679913854, - limb2: 14677459565358288774398085085, - limb3: 7259850653521147546379296758 + limb0: 28442918889029692431086967998, + limb1: 70095872218915404824263899151, + limb2: 2673306572450996271, + limb3: 0 }, x1: u384 { - limb0: 76506359461212436139541435358, - limb1: 31067872185687821364782321218, - limb2: 57610829390156939145283472120, - limb3: 1610589913749850201424137830 + limb0: 25578590123297097495122036260, + limb1: 76002385167315687617466940760, + limb2: 1253264132395416942, + limb3: 0 }, y0: u384 { - limb0: 45750694608830920565914416732, - limb1: 25088223760827148160314207021, - limb2: 10407917333023478119802986111, - limb3: 6918046786145633527456934225 + limb0: 45204869157749191864796933347, + limb1: 35645757272299088030998554173, + limb2: 469686366781629484, + limb3: 0 }, y1: u384 { - limb0: 34494604027283567569281725432, - limb1: 42117146839009126395858382484, - limb2: 78699496826558508143271098587, - limb3: 4654813243373496998563549910 + limb0: 21302086685230589193323122043, + limb1: 34612128738847257300217968711, + limb2: 3039084027333559272, + limb3: 0 } }; - let new_lhs: u384 = u384 { - limb0: 8675349664660619677157633795, - limb1: 37033730380488255832739315861, - limb2: 7349163128459769356149809544, - limb3: 3304924832799462856765761345 + let f_i_plus_one_of_z: u384 = u384 { + limb0: 44755191292294301752649064992, + limb1: 63003080502086392813532824096, + limb2: 1145062312887754007, + limb3: 0 }; - let f_i_plus_one_of_z: u384 = u384 { - limb0: 31050897202384744126874156129, - limb1: 23227214375446908267829007237, - limb2: 69582406723348697010063671175, - limb3: 588789066521800480223094180 + let lhs_i_plus_one: u384 = u384 { + limb0: 25271696589591755592169916191, + limb1: 20597482761298984311897189260, + limb2: 1993797012992703379, + limb3: 0 + }; + + let ci_plus_one: u384 = u384 { + limb0: 28904383365603707664947650164, + limb1: 12293696527536246418798651088, + limb2: 2365789450372725716, + limb3: 0 }; assert_eq!(Q0_result, Q0); assert_eq!(Q1_result, Q1); - assert_eq!(new_lhs_result, new_lhs); assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); + assert_eq!(ci_plus_one_result, ci_plus_one); } #[test] - fn test_run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit_BLS12_381() { + fn test_run_BN254_MP_CHECK_BIT00_LOOP_3_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 6588581750763890338432528863, - limb1: 10852851215134462975232470789, - limb2: 67590751421330085220181371009, - limb3: 7813985598479276526616658515 + limb0: 74160332027730249552331498205, + limb1: 13265876604046909396720145324, + limb2: 808686839099775279, + limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 33961264036539294436390028988, - limb1: 27136693015833957173281303294, - limb2: 18756133531082795442502568818, - limb3: 7840430256137596890637269568 + limb0: 73547558571290950307166932759, + limb1: 34697483692938930982243482162, + limb2: 3206164740514950212, + limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 19319252615784412641606822664, - limb1: 23284805224868683376492259444, - limb2: 47509719868853946287947598536, - limb3: 1385952268841306759379489001 + limb0: 52054916125950481705494674659, + limb1: 7646539685459627440313037034, + limb2: 1783172606133649053, + limb3: 0 }, x1: u384 { - limb0: 8046741601328979843133836410, - limb1: 31267813302639238660009189319, - limb2: 61741452030070728218634060848, - limb3: 1680875449088700569387092724 + limb0: 57772803722979836854515485428, + limb1: 35313749160173861356287648727, + limb2: 47627007644183742, + limb3: 0 }, y0: u384 { - limb0: 46961843804391069336342813528, - limb1: 62275679222578331558081622102, - limb2: 29773980387348351793310076484, - limb3: 7709370866268377404144266730 + limb0: 5319259062566720319530951007, + limb1: 11946586216935660733770171435, + limb2: 2301707641636753250, + limb3: 0 }, y1: u384 { - limb0: 10697155972171311518768735767, - limb1: 70257754131226994877202534817, - limb2: 2846743634615809631599818881, - limb3: 1230750268011742024251710910 + limb0: 9568560568169705841472450700, + limb1: 12240066254828772365871655429, + limb2: 3348941402152504503, + limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 66510711061965790780174368642, - limb1: 68965220870156961799517279339, - limb2: 17916951915920026636606577661, - limb3: 1822443206515963250258675229 + limb0: 40482201862602040348902191594, + limb1: 68588115436759865194083685528, + limb2: 1073712581941085376, + limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 48384751802951962119972133634, - limb1: 46848231829192755538299745714, - limb2: 62407868921130755929696674696, - limb3: 1047785842546316340659441573 + limb0: 60139650230564788144581671932, + limb1: 39386967185949941576360216989, + limb2: 754001824102373042, + limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 28623823273743964797316716517, - limb1: 16873185131862317592709482877, - limb2: 5768764366126072667190233248, - limb3: 1115600207736792868519221073 + limb0: 45752929727891445416990617196, + limb1: 68545198764012822230925534153, + limb2: 631245218471276900, + limb3: 0 }, x1: u384 { - limb0: 16812442664324886487477008175, - limb1: 28104319278739396730958637013, - limb2: 4496532861172340042785307140, - limb3: 3589995113616697679157554300 + limb0: 14868897864212288818298250796, + limb1: 50199507224233381231534885317, + limb2: 236680559295432950, + limb3: 0 }, y0: u384 { - limb0: 37720553498033187509300777970, - limb1: 70537345492751585861243337321, - limb2: 66670402262726434448285231699, - limb3: 2662479263731234503899912221 + limb0: 34665292409337531459791541032, + limb1: 64563139376014138978768830989, + limb2: 1820912104107005151, + limb3: 0 }, y1: u384 { - limb0: 50069235125743455280419991826, - limb1: 35553260988900216901618262734, - limb2: 15499621990756062308278490770, - limb3: 4614100057278152596396573720 + limb0: 39772624240223228374228699308, + limb1: 35425873239589042380580383631, + limb2: 1030798415582678032, + limb3: 0 } }; let yInv_2: u384 = u384 { - limb0: 19352010466471441945943617921, - limb1: 4563043385432648796108789209, - limb2: 32028305877247802310472255600, - limb3: 1461657312648996179796773536 + limb0: 73170181951580788973107646644, + limb1: 1805588033284865383594167483, + limb2: 2955304611475230372, + limb3: 0 }; let xNegOverY_2: u384 = u384 { - limb0: 22368294696324762496329782233, - limb1: 14899342090724915675553047015, - limb2: 66076423648838917384187706476, - limb3: 2671233790946828177072033658 + limb0: 54699685952450831386499895084, + limb1: 30265345897492465278486595892, + limb2: 2685342250454219911, + limb3: 0 }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 56134082668386451980916913067, - limb1: 29567419115276912466665304199, - limb2: 31207287604163041599147282174, - limb3: 5437937172134477325131643029 + limb0: 69097556126300130973500202894, + limb1: 10880612585363764114185675950, + limb2: 544006891991707591, + limb3: 0 }, x1: u384 { - limb0: 67091664295942810028750057429, - limb1: 51619366765989972484123878750, - limb2: 38477651136590699050911178193, - limb3: 7101956512340010857467575538 + limb0: 18345271066608876239647148246, + limb1: 48227043196369103558558151913, + limb2: 1247129245341953258, + limb3: 0 }, y0: u384 { - limb0: 68671496606652248848010915843, - limb1: 43686265123960025438904554572, - limb2: 39668589988332851767189928105, - limb3: 3041921826188413612107073997 + limb0: 71549398640022017272735627484, + limb1: 23345607396624122712665341321, + limb2: 3436805003868096423, + limb3: 0 }, y1: u384 { - limb0: 69190686047563662364617221315, - limb1: 34653111544826191401415705457, - limb2: 66515212948831927345414204097, - limb3: 3945034108093706113492293848 + limb0: 17049052477671369488309807940, + limb1: 58591882325771351198815536941, + limb2: 3480992168836397176, + limb3: 0 } }; - let R_i: E12D = E12D { + let lhs_i: u384 = u384 { + limb0: 34955077031784815180794933133, + limb1: 52272325340017410098912454548, + limb2: 1041859099176182000, + limb3: 0 + }; + + let f_i_of_z: u384 = u384 { + limb0: 53208433418495774549853231219, + limb1: 1345018542764029817729751673, + limb2: 2645231309294290325, + limb3: 0 + }; + + let f_i_plus_one = E12D { w0: u384 { - limb0: 25783712163137826680504906874, - limb1: 68282159961494958519792826437, - limb2: 43461670322721153085920231419, - limb3: 2668089898871198389463814926 + limb0: 58019878522245527445513800514, + limb1: 28000782892205661399214743384, + limb2: 2264831719513322529, + limb3: 0 }, w1: u384 { - limb0: 48573522573230812337032271594, - limb1: 14571142604429433589825088376, - limb2: 16680101467626089928994022488, - limb3: 7449386045315488002106567878 + limb0: 5272245778136717271364827529, + limb1: 27328051532422336103693564514, + limb2: 3062047154892380749, + limb3: 0 }, w2: u384 { - limb0: 67686686237739222530979245840, - limb1: 35710430109943571067358231691, - limb2: 10389914978314436205641283680, - limb3: 6793932919938265869949442410 + limb0: 70705504294441847629938883327, + limb1: 35570818490355040117043174641, + limb2: 655112883946529174, + limb3: 0 }, w3: u384 { - limb0: 7912496224405517422611880374, - limb1: 63706381575547379852220259503, - limb2: 34243897027058563377541265986, - limb3: 1941716075694188883036540071 + limb0: 30318104872283026060993340579, + limb1: 70586260764210815576518906622, + limb2: 2461282562598012428, + limb3: 0 }, w4: u384 { - limb0: 75991527048062882655912723412, - limb1: 37473892927044625049028990702, - limb2: 13992269989108209246630070331, - limb3: 1331743014941487746710554454 + limb0: 73009370503131768456612709502, + limb1: 75579971750401791876434913943, + limb2: 790053841296597119, + limb3: 0 }, w5: u384 { - limb0: 67295601899230557049670410969, - limb1: 42306459066750666931401025667, - limb2: 62220485623696226310673572949, - limb3: 2485526403090391124596171838 + limb0: 62406549176842617668616412238, + limb1: 44479386518032399959118950711, + limb2: 3310235053570043140, + limb3: 0 }, w6: u384 { - limb0: 44988485611821787016694615584, - limb1: 7841591378181550778785115470, - limb2: 4756571896037025225940365314, - limb3: 2518363055865271807996648898 + limb0: 73495959859468839901193557241, + limb1: 8212669369168428990323141831, + limb2: 2898590971658354980, + limb3: 0 }, w7: u384 { - limb0: 49902825921060219883083431116, - limb1: 58992752802155291454453792148, - limb2: 28598357863565276864167283974, - limb3: 5521128220472213228807327071 + limb0: 11889847854344251023632072276, + limb1: 3172993339565912645574624431, + limb2: 1569127600727658517, + limb3: 0 }, w8: u384 { - limb0: 20418272069544568405078400426, - limb1: 32623060143212908357235610572, - limb2: 68720019178911897349249395613, - limb3: 5997334541726594718265595531 + limb0: 7100373994159122329872630320, + limb1: 53213234625413967443012735476, + limb2: 2112690938921577531, + limb3: 0 }, w9: u384 { - limb0: 45627059442364717416240311096, - limb1: 42659473709550228909733025166, - limb2: 61822456070095740475827721122, - limb3: 3219538251892637543719247398 + limb0: 28190132141205787746107654425, + limb1: 59657078058082158449791827549, + limb2: 1557116252891851240, + limb3: 0 }, w10: u384 { - limb0: 38623233703923200918744882598, - limb1: 35409451677006119765588419991, - limb2: 30191554944523775318574429142, - limb3: 4592778147930750843553911205 + limb0: 39005066498916168870263011286, + limb1: 1171302806874650212070428484, + limb2: 2445770906158382593, + limb3: 0 }, w11: u384 { - limb0: 11476067448387483119442715608, - limb1: 50752027877980654101674205742, - limb2: 26730655936735645385103936766, - limb3: 6064025861111590431586265671 + limb0: 43611019554931504927786788328, + limb1: 2767306979904307391571360447, + limb2: 2452462995471439483, + limb3: 0 } }; - let c0: u384 = u384 { - limb0: 67256848232399553109719176967, - limb1: 6267892773031441494497947776, - limb2: 18081287922465040407729851507, - limb3: 6467128515582558047312043075 + let ci: u384 = u384 { + limb0: 20793160632910756694259940841, + limb1: 3034506088651893135189771078, + limb2: 1821916955598587420, + limb3: 0 }; let z: u384 = u384 { - limb0: 46500575145851741116472778475, - limb1: 35675542754760213149593111191, - limb2: 14568965405349755067549036518, - limb3: 1238335298096787603795583153 - }; - - let c_inv_of_z: u384 = u384 { - limb0: 52450830119926593620181732099, - limb1: 58935876444817818859925663789, - limb2: 6343382082723824996091748266, - limb3: 3932149050729934859157373796 + limb0: 31990653221887022298253024641, + limb1: 4052712456614125767270992883, + limb2: 314804863614289942, + limb3: 0 }; - let (Q0_result, Q1_result, Q2_result, new_lhs_result, f_i_plus_one_of_z_result) = - run_BLS12_381_MP_CHECK_INIT_BIT_3_circuit( + let ( + Q0_result, + Q1_result, + Q2_result, + f_i_plus_one_of_z_result, + lhs_i_plus_one_result, + ci_plus_one_result + ) = + run_BN254_MP_CHECK_BIT00_LOOP_3_circuit( yInv_0, xNegOverY_0, Q0, @@ -10715,614 +15012,306 @@ mod tests { yInv_2, xNegOverY_2, Q2, - R_i, - c0, - z, - c_inv_of_z + lhs_i, + f_i_of_z, + f_i_plus_one, + ci, + z ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 25064553951934183637782950539, - limb1: 12949903928746133338051987330, - limb2: 36643849027823942320337763060, - limb3: 1847625544161780679495444926 + limb0: 32144485396930042132898267997, + limb1: 72727899580541417943311256594, + limb2: 1423181837421547847, + limb3: 0 }, x1: u384 { - limb0: 46640670464853188625217802238, - limb1: 1139225069024842272969678475, - limb2: 624981577759958370640972536, - limb3: 819059214307238683322322130 + limb0: 18898873508157628243204267899, + limb1: 44542515337482147073238148587, + limb2: 2428995807672266664, + limb3: 0 }, y0: u384 { - limb0: 24030021248356463055225968700, - limb1: 19427677782546028003325835821, - limb2: 76078225596323172757341553010, - limb3: 6660965574776223949918453825 + limb0: 11337945864172411941028225973, + limb1: 21351594593613529417400166457, + limb2: 354006858740788016, + limb3: 0 }, y1: u384 { - limb0: 33012180414191810441881558208, - limb1: 70863369616948601944250534282, - limb2: 27657382445905179922572599985, - limb3: 6613028574126188649471054619 + limb0: 30835625558724003819770922571, + limb1: 13761412698471203285059046517, + limb2: 1880602962793053965, + limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 28431449859764006889415192912, - limb1: 74584442900024162485644804364, - limb2: 69114515989055324755287748368, - limb3: 2969833091484648910386531603 - }, - x1: u384 { - limb0: 52168846676644394967072013585, - limb1: 27137674113409994304834146171, - limb2: 12578975736772022651303750734, - limb3: 5574217121943859512408166399 - }, - y0: u384 { - limb0: 68621207055948673668031593473, - limb1: 74424108014120131714667650059, - limb2: 19828579672565719318339093154, - limb3: 5140627046328838159656218794 - }, - y1: u384 { - limb0: 64942642012839124234047099056, - limb1: 45381411319893304156433602394, - limb2: 54124459807344378640170839178, - limb3: 3861669014808707402616756826 - } - }; - - let Q2: G2Point = G2Point { - x0: u384 { - limb0: 19292718024175845265272397153, - limb1: 26501039634160599259387513337, - limb2: 32226769511184386634841825210, - limb3: 2241819266071912034354862034 + limb0: 32856610774651996491638223368, + limb1: 56211241927607984959699607820, + limb2: 1288755044572108818, + limb3: 0 }, x1: u384 { - limb0: 52377581047703393585474417753, - limb1: 58885164085301358328236486158, - limb2: 25238801305582783847799170432, - limb3: 193656456741965690967413584 + limb0: 13937704637051096007616104105, + limb1: 41029498862082474999413087349, + limb2: 1970060877295792235, + limb3: 0 }, y0: u384 { - limb0: 64295088293676175109223569392, - limb1: 30668920932961857373972860853, - limb2: 36801852028559856301197585843, - limb3: 3149336448467546120628204733 + limb0: 16664852369036965263409202991, + limb1: 37278637590038564375246641432, + limb2: 791115989446411845, + limb3: 0 }, y1: u384 { - limb0: 73372060922473590751201571359, - limb1: 25293444163212365070417165547, - limb2: 11220919126549970320424363578, - limb3: 6812300167437153660306784030 - } - }; - - let new_lhs: u384 = u384 { - limb0: 555668661877701241734149117, - limb1: 580449877565253931963582668, - limb2: 45543240931277200603599928304, - limb3: 6490558197604346354347758240 - }; - - let f_i_plus_one_of_z: u384 = u384 { - limb0: 44775623469565365601991884159, - limb1: 57585909542031470238860903826, - limb2: 24887495228895446286044883386, - limb3: 7015433627172203126290712324 - }; - assert_eq!(Q0_result, Q0); - assert_eq!(Q1_result, Q1); - assert_eq!(Q2_result, Q2); - assert_eq!(new_lhs_result, new_lhs); - assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); - } - - - #[test] - fn test_run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit_BLS12_381() { - let lambda_root_inverse: E12D = E12D { - w0: u384 { - limb0: 13120645161765865415767190853, - limb1: 40766159322681760278328159451, - limb2: 16758111417507889616179095743, - limb3: 1558391715693323117779101642 - }, - w1: u384 { - limb0: 56830575639585519172310443158, - limb1: 52378502592537334576572528577, - limb2: 64267716922716155636446919201, - limb3: 1122452108369469029751561271 - }, - w2: u384 { - limb0: 37935604555389771274713869520, - limb1: 46807277768014781448657641882, - limb2: 66025977598658859467882852180, - limb3: 2413193836764703080284467396 - }, - w3: u384 { - limb0: 45436282635023337270090105310, - limb1: 10673938400891100959737125048, - limb2: 3105019889911598047111516066, - limb3: 1454481508582726538374107364 - }, - w4: u384 { - limb0: 20461436848507539246170521560, - limb1: 40932492472195346451541621365, - limb2: 47485994803056403885117610898, - limb3: 6314709493319733476497316519 - }, - w5: u384 { - limb0: 57008410263443323572858406995, - limb1: 65070352009627736398913898077, - limb2: 6793696660890573843947617133, - limb3: 6006741486280445790147226263 - }, - w6: u384 { - limb0: 68714775454320839475153243767, - limb1: 17379791575416037645854088909, - limb2: 47603347768522733301609444634, - limb3: 5770247832607035600287615053 - }, - w7: u384 { - limb0: 46791835433818909294082825858, - limb1: 29964990726884597897629773886, - limb2: 8601810842404442902048383319, - limb3: 5176682399722833932749468379 - }, - w8: u384 { - limb0: 3092795234221971523443368645, - limb1: 42104218432828946535255664026, - limb2: 9310609193768817775771004631, - limb3: 6530308137470070525047557167 - }, - w9: u384 { - limb0: 47812187942035100286502910751, - limb1: 95090066379491595198047610, - limb2: 61391559681314512562248729026, - limb3: 4273337566150817880567320820 - }, - w10: u384 { - limb0: 29344324883133402018235068619, - limb1: 55272957702609638042010680401, - limb2: 18181773961389733749687717410, - limb3: 4774719335028095185959282251 - }, - w11: u384 { - limb0: 30204667327219607860223692941, - limb1: 63748646171159590106610501888, - limb2: 60335353459210830579717898236, - limb3: 5705624274624720203645328904 - } - }; - - let z: u384 = u384 { - limb0: 10607312547755983145242196403, - limb1: 60677592592097836512588601323, - limb2: 68061210695635543822155773665, - limb3: 5925200399606488058352177581 - }; - - let scaling_factor: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { - w0: u384 { - limb0: 32376327479959863007414305232, - limb1: 433334405430461214620615121, - limb2: 62544492730002836629251344184, - limb3: 5174991781004531502190574198 - }, - w2: u384 { - limb0: 569971658494808173899809777, - limb1: 16274945855014726981994542413, - limb2: 25028312214019791300223662858, - limb3: 1055549081424384041431994934 - }, - w4: u384 { - limb0: 51623164229796577623381348779, - limb1: 20702547730204580244287574550, - limb2: 33558003197239064792865424537, - limb3: 6059772719557727795182189205 - }, - w6: u384 { - limb0: 53923139303262759264858088111, - limb1: 16138274778575369006489767428, - limb2: 62098115849276483801444864527, - limb3: 1769953204622463214473211262 - }, - w8: u384 { - limb0: 43964607266841801509740889835, - limb1: 78317693618355862602054612159, - limb2: 27282717321753477245594292491, - limb3: 3942886098733625764954086422 - }, - w10: u384 { - limb0: 16991124284296588034113759167, - limb1: 62279762872282935355890650495, - limb2: 43621141458881726900322163916, - limb3: 6779597920460191862413640750 - } - }; - - let (c_inv_of_z_result, scaling_factor_of_z_result, c_inv_frob_1_of_z_result) = - run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( - lambda_root_inverse, z, scaling_factor - ); - let c_inv_of_z: u384 = u384 { - limb0: 40015400218090672060309220267, - limb1: 57804240421701520783265970444, - limb2: 55157895183643144829010476252, - limb3: 6049583740085141255630948188 - }; - - let scaling_factor_of_z: u384 = u384 { - limb0: 78189758206203802687043941461, - limb1: 34486660913791391215665557303, - limb2: 67465832834709956266886670786, - limb3: 6415427947297138952634134496 - }; - - let c_inv_frob_1_of_z: u384 = u384 { - limb0: 78776459443821174743327083261, - limb1: 47658468003661216149116949876, - limb2: 54719564022017901936093684608, - limb3: 2821777038909730152580375456 - }; - assert_eq!(c_inv_of_z_result, c_inv_of_z); - assert_eq!(scaling_factor_of_z_result, scaling_factor_of_z); - assert_eq!(c_inv_frob_1_of_z_result, c_inv_frob_1_of_z); - } - - - #[test] - fn test_run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit_BLS12_381() { - let p_0: G1Point = G1Point { - x: u384 { - limb0: 47355647857501980919651343671, - limb1: 43691656119609808443857940325, - limb2: 78003530666174369372021017657, - limb3: 6791474983025536583132272629 - }, - y: u384 { - limb0: 48509503108813785395171320531, - limb1: 17478963471488707806395027342, - limb2: 43362971311464944267671991180, - limb3: 4598824938039031890199762791 - } - }; - - let p_1: G1Point = G1Point { - x: u384 { - limb0: 74686807676832800963320058295, - limb1: 3550465846114562321773778894, - limb2: 66127335161285868894881450653, - limb3: 4075455139655354513251324180 - }, - y: u384 { - limb0: 70287214926915493517795186652, - limb1: 19329039838720819857773495059, - limb2: 21483335126139147659804415786, - limb3: 5508847689494683090745972780 - } - }; - - let (p_0_result, p_1_result) = run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit(p_0, p_1); - let p_0: BLSProcessedPair = BLSProcessedPair { - yInv: u384 { - limb0: 28918067512192784173511065013, - limb1: 4883953481567583067122711378, - limb2: 63967037907142041597658367989, - limb3: 3625488830592547716873001876 - }, - xNegOverY: u384 { - limb0: 53857847109656066635710212940, - limb1: 46985565409993207201595296635, - limb2: 64890648736737169594785173755, - limb3: 891496301641163409835878284 - } - }; - let p_1: BLSProcessedPair = BLSProcessedPair { - yInv: u384 { - limb0: 56399845219292146413917967880, - limb1: 51640262309815692526576087087, - limb2: 35502609062530299272926911598, - limb3: 2869580965910347815841098494 - }, - xNegOverY: u384 { - limb0: 41944575614990207323486889948, - limb1: 67820252121850345069021729620, - limb2: 17541971342048559520823852961, - limb3: 6021559184070528888387668251 - } - }; - assert_eq!(p_0_result, p_0); - assert_eq!(p_1_result, p_1); - } - - - #[test] - fn test_run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit_BLS12_381() { - let p_0: G1Point = G1Point { - x: u384 { - limb0: 9049298284467066708074923911, - limb1: 75537045914399608548793837319, - limb2: 25415579067709923707604377698, - limb3: 2402759366985981874586641565 - }, - y: u384 { - limb0: 61964460468729757147507452601, - limb1: 73702514194375832845357685670, - limb2: 31371146934048810783191664750, - limb3: 7512931816214438876009417015 - } - }; - - let p_1: G1Point = G1Point { - x: u384 { - limb0: 45669946471918214305569173533, - limb1: 77353377068918444033582884233, - limb2: 27330175476705375759905814478, - limb3: 4483498802259961401606470960 - }, - y: u384 { - limb0: 2128936876065432234813244827, - limb1: 73901259430039098090366071268, - limb2: 16049203479690357641015556929, - limb3: 2217195155752562919067496716 + limb0: 35084237116359586833840674499, + limb1: 21132164837201184748367669426, + limb2: 564103344240933256, + limb3: 0 } }; - let p_2: G1Point = G1Point { - x: u384 { - limb0: 23016435387927453058451152306, - limb1: 11173102281041574147366529922, - limb2: 39406658630671849263824619282, - limb3: 2780619473091855644856593334 + let Q2: G2Point = G2Point { + x0: u384 { + limb0: 50155142340011267367267153519, + limb1: 53209908216678272545989252762, + limb2: 2537691848673132310, + limb3: 0 }, - y: u384 { - limb0: 25704364641608073098463886247, - limb1: 61820325401928077500472329714, - limb2: 58583730687784708337874422031, - limb3: 1816756814677715052158529456 + x1: u384 { + limb0: 1841458253689882337414660168, + limb1: 15600864600562807810374454007, + limb2: 2278868154783361851, + limb3: 0 + }, + y0: u384 { + limb0: 10698008053447083657185955777, + limb1: 63393929389421821781523852543, + limb2: 24546302042241769, + limb3: 0 + }, + y1: u384 { + limb0: 7545130933106657646432536857, + limb1: 54149611507664544890406187443, + limb2: 2137555887711662090, + limb3: 0 } }; - let (p_0_result, p_1_result, p_2_result) = run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit( - p_0, p_1, p_2 - ); - let p_0: BLSProcessedPair = BLSProcessedPair { - yInv: u384 { - limb0: 71370867427604975395300314435, - limb1: 7001477108280766506012390082, - limb2: 35358334008207490093045702375, - limb3: 2471641853994331621146244308 - }, - xNegOverY: u384 { - limb0: 24120048830171483622580943618, - limb1: 44255229793942820750484177578, - limb2: 35255298917295126513779928608, - limb3: 2241667822588812945845875185 - } + let f_i_plus_one_of_z: u384 = u384 { + limb0: 5509124376322798741865649443, + limb1: 66293147935880291184808941491, + limb2: 2822483702193861842, + limb3: 0 }; - let p_1: BLSProcessedPair = BLSProcessedPair { - yInv: u384 { - limb0: 36315965190230532409091991567, - limb1: 59787962201466890740410122765, - limb2: 68955208335980181049103820556, - limb3: 1054412092926450084764274370 - }, - xNegOverY: u384 { - limb0: 29788907572484980300382849720, - limb1: 55761253990600631299403220854, - limb2: 37333609180841782120669108360, - limb3: 5058830185281903546774532829 - } + + let lhs_i_plus_one: u384 = u384 { + limb0: 30406765761230442328423034284, + limb1: 19805095822338403207120303987, + limb2: 1986458578212634800, + limb3: 0 }; - let p_2: BLSProcessedPair = BLSProcessedPair { - yInv: u384 { - limb0: 17326331726049392008710287610, - limb1: 14960700921780786509097832736, - limb2: 27152315477017715281302052116, - limb3: 7442982744983606664882989375 - }, - xNegOverY: u384 { - limb0: 25629095258782912832041972253, - limb1: 61955064785142152953824138262, - limb2: 48484335943098489510903797855, - limb3: 2099131969984970119041121822 - } + + let ci_plus_one: u384 = u384 { + limb0: 1957698102011889513664562605, + limb1: 3384814666953273918960744714, + limb2: 2950728647126562680, + limb3: 0 }; - assert_eq!(p_0_result, p_0); - assert_eq!(p_1_result, p_1); - assert_eq!(p_2_result, p_2); + assert_eq!(Q0_result, Q0); + assert_eq!(Q1_result, Q1); + assert_eq!(Q2_result, Q2); + assert_eq!(f_i_plus_one_of_z_result, f_i_plus_one_of_z); + assert_eq!(lhs_i_plus_one_result, lhs_i_plus_one); + assert_eq!(ci_plus_one_result, ci_plus_one); } #[test] fn test_run_BN254_MP_CHECK_BIT0_LOOP_2_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 45904455082422184508017933152, - limb1: 42809392610448672033298684481, - limb2: 1121760338594296470, + limb0: 19197797497302128332894999030, + limb1: 15327885207922208124960461606, + limb2: 1555287479192216068, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 58851415194971721183842825561, - limb1: 43093784379383056281586394604, - limb2: 546625929037997222, + limb0: 58470569522961604987784669596, + limb1: 78906831350455391591919079453, + limb2: 1670146967802492098, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 23098056393827424829033455064, - limb1: 14854793436744012663336315643, - limb2: 1983068093398607066, + limb0: 62094859891355104790810864365, + limb1: 40892798923035179562363900082, + limb2: 1744741476320600506, limb3: 0 }, x1: u384 { - limb0: 27886832245657499061429464201, - limb1: 68868358318031521496501673344, - limb2: 2802639614945818070, + limb0: 77154281736092072524772446107, + limb1: 24099806402659087089981744508, + limb2: 941537619733448870, limb3: 0 }, y0: u384 { - limb0: 43644006453602514338627208793, - limb1: 51539482679065915292567052102, - limb2: 2272880056679833804, + limb0: 66473844383418063387689140841, + limb1: 29853108471218392389416173195, + limb2: 1262721605363404347, limb3: 0 }, y1: u384 { - limb0: 53295256888468577060810182053, - limb1: 68710112356588354799132405563, - limb2: 1339794488316981648, + limb0: 37704305767765975979454038997, + limb1: 10291899242573404782822723346, + limb2: 488170164449867393, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 65492976240758050166952298642, - limb1: 26160799584377947809225279495, - limb2: 23810020326205781, + limb0: 40382799679709352521933065146, + limb1: 60430586650321992048067014400, + limb2: 794995169498020168, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 34385313053596660350669374455, - limb1: 7669904517352189407016966841, - limb2: 915334262870569598, + limb0: 78293164734794170574535566138, + limb1: 22973583966530356479499540367, + limb2: 1254432115361256441, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 14519482463764326621371899876, - limb1: 43381151498497205069989285874, - limb2: 2810366459018523650, + limb0: 20039775871891094214545707147, + limb1: 60709169157920386164200004677, + limb2: 1687162325855902343, limb3: 0 }, x1: u384 { - limb0: 75098438053138995883609305181, - limb1: 74710938015896287688120542548, - limb2: 302837407364805961, + limb0: 34523202245319399689048302709, + limb1: 35505446026402422457036359847, + limb2: 3396026398678676939, limb3: 0 }, y0: u384 { - limb0: 47202571068388031465205951915, - limb1: 8984984719415448163791899049, - limb2: 581133712774113491, + limb0: 36548016655870789580713560061, + limb1: 38087127490399565119607803526, + limb2: 886332126051101050, limb3: 0 }, y1: u384 { - limb0: 6036490884008780429341814006, - limb1: 49072065657556672693846407787, - limb2: 1400224662202354960, + limb0: 22170998325549671815167644634, + limb1: 13726388575816895253555910058, + limb2: 226727116816523658, limb3: 0 } }; let lhs_i: u384 = u384 { - limb0: 25895392816573013226001751644, - limb1: 69692259979524089064548888479, - limb2: 1283232145435683428, + limb0: 74924361437787663200903105702, + limb1: 17653415259453100103746680659, + limb2: 2344269640586117778, limb3: 0 }; let f_i_of_z: u384 = u384 { - limb0: 65911832564585192002479699770, - limb1: 66148457903043253596297342001, - limb2: 2168907464915275405, + limb0: 59806045210262725526458903870, + limb1: 29509473950301411060749892432, + limb2: 3058449503229513201, limb3: 0 }; - let f_i_plus_one: E12D = E12D { + let f_i_plus_one = E12D { w0: u384 { - limb0: 42737180528569716363769564550, - limb1: 75418848398490361211580152673, - limb2: 1034042210130526275, + limb0: 10476641705282468463695587695, + limb1: 31200143367046477848573954088, + limb2: 3238185370473636732, limb3: 0 }, w1: u384 { - limb0: 61895659024119489132885956599, - limb1: 3189578125551420491655326547, - limb2: 143100608370797933, + limb0: 33449238538863374300517019804, + limb1: 28091463497917425999984431614, + limb2: 1143967936971895084, limb3: 0 }, w2: u384 { - limb0: 15794980437723318835459244325, - limb1: 49227282526148210316988101560, - limb2: 1100094369593198475, + limb0: 29255477601507623507580626137, + limb1: 41928122072257155865494509888, + limb2: 1735985052116826459, limb3: 0 }, w3: u384 { - limb0: 53039994392964625739614782612, - limb1: 75089047723124581503093743729, - limb2: 2144590722174322235, + limb0: 33056007753616374312162015845, + limb1: 71405358686088291453851846899, + limb2: 2035124994221506231, limb3: 0 }, w4: u384 { - limb0: 9074228703870892464689122879, - limb1: 12974863833870524236003368544, - limb2: 1434413841423790284, + limb0: 23238543001322742099746534628, + limb1: 7214238052564246677276106122, + limb2: 855274996560611601, limb3: 0 }, w5: u384 { - limb0: 31426202061001385571049459874, - limb1: 15713303945190229094581942149, - limb2: 2730569426338611526, + limb0: 21943843819857678654134323775, + limb1: 47976285835987914057491836775, + limb2: 709640853520246060, limb3: 0 }, w6: u384 { - limb0: 49695262510951843324402342715, - limb1: 55237320346578370543133352081, - limb2: 1390804632460152500, + limb0: 35348783784662968277035659241, + limb1: 14687371388926487293352672332, + limb2: 1944767865010002573, limb3: 0 }, w7: u384 { - limb0: 47569508826431287883610247512, - limb1: 63083619142384197715382178991, - limb2: 2609903230294767923, + limb0: 19645230072419461733827279082, + limb1: 26968307988203981880869251219, + limb2: 2413519660120413979, limb3: 0 }, w8: u384 { - limb0: 27508316177276550613275691590, - limb1: 52411120131127840049092230680, - limb2: 318006810480851903, + limb0: 36637903275957912864540282263, + limb1: 6853188419381636462799427520, + limb2: 3481984702531289841, limb3: 0 }, w9: u384 { - limb0: 27035119202680581644972631414, - limb1: 33280482250162556250286271438, - limb2: 2260656361904031596, + limb0: 146030076227949400334384815, + limb1: 35580446869557986432712590466, + limb2: 2130648967995028332, limb3: 0 }, w10: u384 { - limb0: 76121433735435437184720869475, - limb1: 70637849836752321870577556205, - limb2: 2120173522187069826, + limb0: 23654370222835508320059369112, + limb1: 77548724462177553720355393920, + limb2: 1388850589227609364, limb3: 0 }, w11: u384 { - limb0: 34502846380857958732890516984, - limb1: 41337035833393065575612633033, - limb2: 2999705382439962961, + limb0: 12377111439852444926837178951, + limb1: 59528278038927077385096984381, + limb2: 426825584089232782, limb3: 0 } }; let ci: u384 = u384 { - limb0: 64032138815186176976330432166, - limb1: 61373418500185767315409473558, - limb2: 2143851885860650527, + limb0: 60220520864918782001528250178, + limb1: 43079585957269161858761144926, + limb2: 1869139898994399990, limb3: 0 }; let z: u384 = u384 { - limb0: 57917863429990723593993047887, - limb1: 25535599381708547340892924584, - limb2: 283036656247365536, + limb0: 72000520137764837462644246783, + limb1: 6754932813977657815572878489, + limb2: 81229849038114951, limb3: 0 }; @@ -11338,76 +15327,76 @@ mod tests { ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 32757608495295396676201852511, - limb1: 64401564281755265448765888463, - limb2: 1779248865150682941, + limb0: 15878049727729343699393496094, + limb1: 11095662824265925549159453878, + limb2: 1383585382359577949, limb3: 0 }, x1: u384 { - limb0: 12915503143701275565175611593, - limb1: 3111945262546913922832120764, - limb2: 816688557407178980, + limb0: 33115204274989928150979664687, + limb1: 18857113187971016489976443851, + limb2: 29600772664601191, limb3: 0 }, y0: u384 { - limb0: 33530281963663782671614071698, - limb1: 21243678143375671115756954932, - limb2: 198950282318148690, + limb0: 41313344521780701421051910405, + limb1: 40158518039993505230171242376, + limb2: 1459030594151211511, limb3: 0 }, y1: u384 { - limb0: 37765861125452910121897448909, - limb1: 2214052014753649311346382986, - limb2: 3416705928861327567, + limb0: 61419412511135182483853381043, + limb1: 59341849503175007624010097877, + limb2: 1926869650371453771, limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 37016942874750348033985522175, - limb1: 4150310253406508778371638787, - limb2: 2247025100002639692, + limb0: 32955569765320481928061979657, + limb1: 32869831330106862022615682749, + limb2: 2704747737979042995, limb3: 0 }, x1: u384 { - limb0: 49793870395055583274684817025, - limb1: 11410933103668900140066318289, - limb2: 1823665977429927994, + limb0: 52626760378691586054913570887, + limb1: 78723118601060714170524296253, + limb2: 1255505273966922925, limb3: 0 }, y0: u384 { - limb0: 28358207096999160442136923558, - limb1: 7594305981082800228422992340, - limb2: 2154203530564254342, + limb0: 77243559172188976051503625449, + limb1: 25260353835106060531091276952, + limb2: 2129488192592418099, limb3: 0 }, y1: u384 { - limb0: 71443678344352528094654160990, - limb1: 9961870105297976429990925077, - limb2: 2562122223951723531, + limb0: 11759697268389231105650505681, + limb1: 10819050577814677168822968595, + limb2: 2849272508051377086, limb3: 0 } }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 44087691998523345152093192160, - limb1: 56434647292693206236797825791, - limb2: 2506343774310786524, + limb0: 44614068279084466511702162684, + limb1: 59102637743795131556808157527, + limb2: 3118585482562618402, limb3: 0 }; let lhs_i_plus_one: u384 = u384 { - limb0: 45754734298098863445331957442, - limb1: 66597425393998949408232431596, - limb2: 1511605272628684654, + limb0: 373502052670811314692930580, + limb1: 29131628586845569721492266492, + limb2: 250586911575267412, limb3: 0 }; let ci_plus_one: u384 = u384 { - limb0: 26734857497673858111646414827, - limb1: 29836835632387595123930504835, - limb2: 2544699736218514636, + limb0: 22794669060936949532179410188, + limb1: 60015877790213429785644314556, + limb2: 1499774710495053534, limb3: 0 }; assert_eq!(Q0_result, Q0); @@ -11421,228 +15410,228 @@ mod tests { #[test] fn test_run_BN254_MP_CHECK_BIT0_LOOP_3_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 27970996744179409761802775677, - limb1: 60391875030601110530636255676, - limb2: 3385329738130157467, + limb0: 73269019098533449395697897347, + limb1: 56031909652869435031728211629, + limb2: 142909527645175094, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 60409105868185344593543756716, - limb1: 20927645068145934077182878783, - limb2: 2697492089942254414, + limb0: 69912873840447728122375624761, + limb1: 30536912740072055627829442363, + limb2: 1710249014292274880, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 31976348081031216527030187003, - limb1: 7576138688039094553106887256, - limb2: 1620581743194137482, + limb0: 4970363281007758240700020482, + limb1: 5915429634235340995490783403, + limb2: 521729671418855295, limb3: 0 }, x1: u384 { - limb0: 45569213871171717702115045755, - limb1: 16750506120877708283097489485, - limb2: 175461254344384553, + limb0: 28010072736004427913614754344, + limb1: 49984240987142221110726048413, + limb2: 1730682607634966172, limb3: 0 }, y0: u384 { - limb0: 46218804560692775341166662790, - limb1: 20717158003279951749759733061, - limb2: 84445347632019427, + limb0: 446852293678898830326163527, + limb1: 17234413268181379633664811956, + limb2: 777334738397763583, limb3: 0 }, y1: u384 { - limb0: 77776330340642982109414052850, - limb1: 2156219200230598278594557879, - limb2: 89340742080580359, + limb0: 46942043628942551324275758229, + limb1: 52320963072790628466408315981, + limb2: 2191301501537624128, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 46618783255966593664360156366, - limb1: 38182178610031156106144182914, - limb2: 1378771870523936328, + limb0: 7390127179861838736333414437, + limb1: 64437618819627948603071597875, + limb2: 2661944575651324895, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 67755076603079460979755476203, - limb1: 14436509892296385586869326680, - limb2: 2761272299975390862, + limb0: 14530345556919554724197164974, + limb1: 46286450218341982125939654682, + limb2: 1217736341329628222, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 59114515782464464297363426551, - limb1: 28316078793022984461955734929, - limb2: 2666984567499667990, + limb0: 70370851650106659432397868105, + limb1: 45574585679632417503166562439, + limb2: 1551746106997261488, limb3: 0 }, x1: u384 { - limb0: 22517115852356078569441224123, - limb1: 48292817598587977881469416429, - limb2: 1801048175972666361, + limb0: 29367511985422476642147408605, + limb1: 14428662095801583920984476828, + limb2: 840367569595991292, limb3: 0 }, y0: u384 { - limb0: 33736304433212520050847181847, - limb1: 3252940177451315963957603331, - limb2: 1531797568941280884, + limb0: 78296723330092176572745454991, + limb1: 77801284953443621777315953475, + limb2: 6945934100532022, limb3: 0 }, y1: u384 { - limb0: 2563134058070886383172399223, - limb1: 22383276006436252285363455751, - limb2: 2094043810363566490, + limb0: 56756008299694398929655605345, + limb1: 24519564426086640327069604026, + limb2: 1847354196675412498, limb3: 0 } }; let yInv_2: u384 = u384 { - limb0: 61815749168188416087116462397, - limb1: 64766864812841874031248133276, - limb2: 453921824505602704, + limb0: 27050005244377286082488042696, + limb1: 2612822264612189770085284721, + limb2: 3434147554852412005, limb3: 0 }; let xNegOverY_2: u384 = u384 { - limb0: 70157786711520347953380254473, - limb1: 46613296059350113744439847650, - limb2: 2706850710888284548, + limb0: 39446158475831431219341424156, + limb1: 52957968360546894462452267684, + limb2: 2327918911557552098, limb3: 0 }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 34425721296362579801955252523, - limb1: 57118951466117256377085718147, - limb2: 1735139521808801803, + limb0: 72273874964820305268689939544, + limb1: 41039209367832228356047567900, + limb2: 1357799962712253211, limb3: 0 }, x1: u384 { - limb0: 62265174043989469448421800329, - limb1: 38218139749223759903001291941, - limb2: 1936208430469564508, + limb0: 71780441104493553769643697239, + limb1: 37185487410308168264178541764, + limb2: 633932235637503233, limb3: 0 }, y0: u384 { - limb0: 6785006414083716126560653219, - limb1: 7068635531045670043895127785, - limb2: 1994919135584891932, + limb0: 20992538070866390435829540443, + limb1: 67524340189870561831040419796, + limb2: 1301543626503019711, limb3: 0 }, y1: u384 { - limb0: 16482713906979531172953097242, - limb1: 52499476354585351015995121388, - limb2: 2653874266693372458, + limb0: 32804852571574833414059215751, + limb1: 11315870564976642014388039108, + limb2: 1771215331936702126, limb3: 0 } }; let lhs_i: u384 = u384 { - limb0: 62822614487865859990729684869, - limb1: 23311744417482232966219959797, - limb2: 1864971012437347004, + limb0: 51661077824120714546854244402, + limb1: 35175858496736535724116618844, + limb2: 658601457667862308, limb3: 0 }; let f_i_of_z: u384 = u384 { - limb0: 24260141228611832289301165709, - limb1: 29236812391698943878714968242, - limb2: 2552443476283726195, + limb0: 4152021204302326432509857790, + limb1: 17090619335270315747726354131, + limb2: 1638999484934011960, limb3: 0 }; - let f_i_plus_one: E12D = E12D { + let f_i_plus_one = E12D { w0: u384 { - limb0: 33711885176437257773169410037, - limb1: 43606267423846917454843559263, - limb2: 1622439677194583323, + limb0: 508918245973802653761934510, + limb1: 9202518011885788722949307490, + limb2: 17249403076200518, limb3: 0 }, w1: u384 { - limb0: 21464210568519259449451236667, - limb1: 18265105538047459110483318823, - limb2: 3326336890053021124, + limb0: 59548990623035107422698481953, + limb1: 15148768562330170180113945047, + limb2: 2001558943410647470, limb3: 0 }, w2: u384 { - limb0: 9472102553316238055030207553, - limb1: 75336281648900054400484865034, - limb2: 3182817618559949756, + limb0: 26160804169303701108574467383, + limb1: 26200398398246981547555445397, + limb2: 2988395391184350717, limb3: 0 }, w3: u384 { - limb0: 17143757461046157361134566138, - limb1: 21906557515223499209448960456, - limb2: 2718989681898186499, + limb0: 34485664336970624705514895001, + limb1: 73938261058057061540403910557, + limb2: 680227002010418286, limb3: 0 }, w4: u384 { - limb0: 18023073391495333781932454041, - limb1: 23948106176605149970129138594, - limb2: 3265158945934621221, + limb0: 10238103933028082051602938081, + limb1: 14801756928247077350447529830, + limb2: 1610249538293080548, limb3: 0 }, w5: u384 { - limb0: 21733182851417588356383314897, - limb1: 4319996194758150100124887737, - limb2: 1347242470452817636, + limb0: 30809862244687846771967265197, + limb1: 38976969894147591396940506124, + limb2: 3365530714051750039, limb3: 0 }, w6: u384 { - limb0: 10004891868104810382079160868, - limb1: 59642340606206240899990252790, - limb2: 473101997066303984, + limb0: 15544142913195453928731074524, + limb1: 16183834845650327124827185620, + limb2: 3274283301470656708, limb3: 0 }, w7: u384 { - limb0: 45482053616623421869246812051, - limb1: 37927647050474547485157783121, - limb2: 1571228811205447743, + limb0: 4515251077250220512798260103, + limb1: 53676494393428771485733874429, + limb2: 1074818787794107075, limb3: 0 }, w8: u384 { - limb0: 4070483228411864245693740318, - limb1: 68272727040501225110915673184, - limb2: 526134058452547028, + limb0: 48527784689210241541249700331, + limb1: 68836875509116639126726990962, + limb2: 3465645697873360170, limb3: 0 }, w9: u384 { - limb0: 31747314121681548232927620060, - limb1: 45716325699526605075711728209, - limb2: 3165696589857774220, + limb0: 69519341455143905783924654782, + limb1: 32597027569167625847189348169, + limb2: 248754431759402728, limb3: 0 }, w10: u384 { - limb0: 11820650196313720465735111425, - limb1: 75197480949842702751341412813, - limb2: 392827575737002526, + limb0: 40891579853875313629521435071, + limb1: 51380432001370256856125453412, + limb2: 2523429827510821026, limb3: 0 }, w11: u384 { - limb0: 9384699591256219912009509652, - limb1: 32972702935408319256957149133, - limb2: 2749149839390908971, + limb0: 74005152646713663672151227870, + limb1: 36017309965444930923992455369, + limb2: 1174837212995248629, limb3: 0 } }; let ci: u384 = u384 { - limb0: 68149424508679378297203075566, - limb1: 33975399915824387332413953359, - limb2: 2622340559316805189, + limb0: 17067298552900150679423746016, + limb1: 3346210529167654900940823776, + limb2: 242359391179174861, limb3: 0 }; let z: u384 = u384 { - limb0: 16719138692514152845858150029, - limb1: 6432333996546943036795377969, - limb2: 276545720729003200, + limb0: 306973362941213357609388067, + limb1: 564901591820726767813982157, + limb2: 73429742202762878, limb3: 0 }; @@ -11672,103 +15661,103 @@ mod tests { ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 39556469844535361517107191740, - limb1: 45064393730012698696819560765, - limb2: 326317962953023378, + limb0: 40894247018247153674929663591, + limb1: 71445197397543477221064688334, + limb2: 1225057854208875542, limb3: 0 }, x1: u384 { - limb0: 79051040921777148970083629759, - limb1: 69155527681569742667574675066, - limb2: 680830824824498479, + limb0: 57219055994846718072501623628, + limb1: 11603444397010892276995855610, + limb2: 494660662778433425, limb3: 0 }, y0: u384 { - limb0: 27453701599296264186424666515, - limb1: 63127837281453698768326663003, - limb2: 2515041077062565700, + limb0: 2102126742179284482151203990, + limb1: 40070598602516356595073616595, + limb2: 2716467777686365068, limb3: 0 }, y1: u384 { - limb0: 64754620420513270250822738653, - limb1: 14794537498542601670244013340, - limb2: 224534356809250423, + limb0: 5733089872469051704047500564, + limb1: 46471100644429600434676200549, + limb2: 690251189265168324, limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 73523306483791272572663298292, - limb1: 18586159510551113763417812347, - limb2: 1078766478111863729, + limb0: 42029077105376240626437779586, + limb1: 10749243371118684958345987696, + limb2: 1922014830180962728, limb3: 0 }, x1: u384 { - limb0: 63264587900160522123712385753, - limb1: 73939318147096112909455278861, - limb2: 581541744246166115, + limb0: 50899054157557072250178385430, + limb1: 14185488124109460498889556686, + limb2: 3180441599582512345, limb3: 0 }, y0: u384 { - limb0: 61729936385874552033885891951, - limb1: 33648755753828228816501818225, - limb2: 3398117448922959956, + limb0: 75553786816359508022901411459, + limb1: 10567674190940405188130074111, + limb2: 600330428308173596, limb3: 0 }, y1: u384 { - limb0: 43833536568566448149686138764, - limb1: 3680020374147124529865402128, - limb2: 306351755723156397, + limb0: 77523607243530468504081766823, + limb1: 64607110594996775279535943725, + limb2: 2312302862908315766, limb3: 0 } }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 28394444375360966817817863146, - limb1: 74090535875515716654165121901, - limb2: 3287997988828602322, + limb0: 74107932085730817227641817484, + limb1: 30974520959005062316446729466, + limb2: 2912085107357485509, limb3: 0 }, x1: u384 { - limb0: 56085016645206952720731718056, - limb1: 15146864674966301258962566820, - limb2: 3246499400898421450, + limb0: 44156627208724553605908959691, + limb1: 12177503629519146914998474100, + limb2: 3397463326089914008, limb3: 0 }, y0: u384 { - limb0: 77194202683909373781831301182, - limb1: 31708416673078653640837365216, - limb2: 1163590442022301658, + limb0: 61105902926456185899198478482, + limb1: 59945626809729878104443879643, + limb2: 2033902159146430891, limb3: 0 }, y1: u384 { - limb0: 12792793425077482357477998977, - limb1: 68489899974856607517131277905, - limb2: 1968424968102856222, + limb0: 75821408203057146250378769581, + limb1: 53028744384088651912560848728, + limb2: 1011294972015586752, limb3: 0 } }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 72816042890474265729085295964, - limb1: 56032632830151968809990392295, - limb2: 2605320961456402474, + limb0: 47488814754068626038948848276, + limb1: 2159000341597291313554508407, + limb2: 735553569172915836, limb3: 0 }; let lhs_i_plus_one: u384 = u384 { - limb0: 31377936469979804494537060466, - limb1: 49344139964436320962223069071, - limb2: 134871052054797260, + limb0: 34329180710074808411775696317, + limb1: 26366757824463291441053823180, + limb2: 3077629331597871310, limb3: 0 }; let ci_plus_one: u384 = u384 { - limb0: 43220568138813430141174787405, - limb1: 39622552266897535812196256003, - limb2: 2742001143606202525, + limb0: 31741995075830715461673614044, + limb1: 25102301615190045502529758243, + limb2: 2934018428644187511, limb3: 0 }; assert_eq!(Q0_result, Q0); @@ -11783,248 +15772,248 @@ mod tests { #[test] fn test_run_BN254_MP_CHECK_BIT1_LOOP_2_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 70605388969122605840619758679, - limb1: 27768852731033222128842541514, - limb2: 934514221956956122, + limb0: 10336788403926004387203284642, + limb1: 61909585120263167920386195542, + limb2: 120951067736084592, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 3921418245944927687425380494, - limb1: 67813620286850788959095407463, - limb2: 1050854625238337676, + limb0: 15749870715841178288886163500, + limb1: 51625189898135425123144693508, + limb2: 674348626250325195, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 63868387724619755703515271669, - limb1: 36963399776968974385652736186, - limb2: 1619072113244973133, + limb0: 7646953017989955615756989519, + limb1: 15919761147728249444354948124, + limb2: 2023701065330938003, limb3: 0 }, x1: u384 { - limb0: 41592685316287303120432407352, - limb1: 79022700892169318958813892085, - limb2: 997871910287800917, + limb0: 44561566849991446545713351955, + limb1: 74788057203024371938705936198, + limb2: 1881224457033426696, limb3: 0 }, y0: u384 { - limb0: 7248427579396195347018030372, - limb1: 2578312788889673012368964579, - limb2: 2452649542515399083, + limb0: 29864130002179232237161915898, + limb1: 72505591659904954681008070808, + limb2: 2108222270337085611, limb3: 0 }, y1: u384 { - limb0: 776883269950175885749604235, - limb1: 46680844342760007404838628981, - limb2: 3208135102384237753, + limb0: 51634483700677284758468797321, + limb1: 64320993950831404609304645742, + limb2: 2164440020515378079, limb3: 0 } }; let Q_or_Qneg_0: G2Point = G2Point { x0: u384 { - limb0: 46805779946470278621871504266, - limb1: 4636459820747816876236708785, - limb2: 3461359370149890782, + limb0: 61632048642984016832499234434, + limb1: 71626349267372681298354312184, + limb2: 1637440734709691145, limb3: 0 }, x1: u384 { - limb0: 31733474372447895682008541594, - limb1: 19569395620567191814185447564, - limb2: 2692764438242369387, + limb0: 23165924960427992418424883234, + limb1: 43670619615576987550395292968, + limb2: 876182643989924760, limb3: 0 }, y0: u384 { - limb0: 55732259384334677541757861323, - limb1: 5091369897007753876767911655, - limb2: 2236132146100676432, + limb0: 31711079965203709156035949551, + limb1: 60902100687846733972944848508, + limb2: 1701625215950095631, limb3: 0 }, y1: u384 { - limb0: 18423353126888241046835447528, - limb1: 74441576000842278553458648656, - limb2: 170195908775308606, + limb0: 24576305244826198836719740984, + limb1: 36488745483947513531105155747, + limb2: 2604243905015219842, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 44203324425676449641115951942, - limb1: 78346503358733359498560404026, - limb2: 1492391341598434616, + limb0: 28120877726823401087810050131, + limb1: 32732532550282283979784821930, + limb2: 392521011729807682, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 61111993890478178020162669234, - limb1: 30610047914171526747464470225, - limb2: 384926425466365118, + limb0: 522928358916483709887294951, + limb1: 209750390894933643892086967, + limb2: 2019143562535353843, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 30182649701511067443016793201, - limb1: 62711654181112712072186909825, - limb2: 1530878634499503014, + limb0: 53599540410731708683922892263, + limb1: 12438030894538944423465099813, + limb2: 2453176180603066763, limb3: 0 }, x1: u384 { - limb0: 23674031265310497877636997085, - limb1: 56134012141972736817466401171, - limb2: 2326057075648155135, + limb0: 32783732587050539545039901541, + limb1: 72654544706673280494660023601, + limb2: 1939883284479720902, limb3: 0 }, y0: u384 { - limb0: 65077180668563977895628838046, - limb1: 49650148811710536137981160803, - limb2: 1155542716921212610, + limb0: 51673821268896693364346958334, + limb1: 34138937816373818623014010228, + limb2: 562062543756109757, limb3: 0 }, y1: u384 { - limb0: 59936320106703523622791254073, - limb1: 59311836659569795093875097832, - limb2: 868047839020857479, + limb0: 63663109444558440967244709236, + limb1: 36966046034983973804950385180, + limb2: 162583768232576679, limb3: 0 } }; let Q_or_Qneg_1: G2Point = G2Point { x0: u384 { - limb0: 11451248979732632699752290649, - limb1: 61659055120337762904261362754, - limb2: 1703529750160001659, + limb0: 2228163094117947211021223332, + limb1: 10529642001620646220147450049, + limb2: 2848488276803166018, limb3: 0 }, x1: u384 { - limb0: 61044642718857298668260179481, - limb1: 30063753854647798378902914123, - limb2: 2066362397636924019, + limb0: 23980121951876638307800184072, + limb1: 58362257594818707782165762975, + limb2: 3042307382754445811, limb3: 0 }, y0: u384 { - limb0: 56843349801335264961926007822, - limb1: 51167235506672695975468297627, - limb2: 3158438629726577545, + limb0: 44560291305011316306118044092, + limb1: 64413273889369720346356595291, + limb2: 1620432877693563571, limb3: 0 }, y1: u384 { - limb0: 51219961517627530589010904606, - limb1: 6744601431884665774308493558, - limb2: 1940092667072109619, + limb0: 64298627375747741846350224027, + limb1: 19012434639071835959255919507, + limb2: 24444013393417516, limb3: 0 } }; let lhs_i: u384 = u384 { - limb0: 45097228337400805048123634047, - limb1: 34793321137969367722019210774, - limb2: 2161487853259170851, + limb0: 75249961544109463509781404021, + limb1: 41953659324626388125284063199, + limb2: 291859607066500761, limb3: 0 }; let f_i_of_z: u384 = u384 { - limb0: 55438613896418324894463112054, - limb1: 21569565448519877295145143388, - limb2: 2490225437689442778, + limb0: 12470654473779493550900849137, + limb1: 74605501607480428090093886789, + limb2: 2915181205756386395, limb3: 0 }; - let f_i_plus_one: E12D = E12D { + let f_i_plus_one = E12D { w0: u384 { - limb0: 6373260213004748791134903565, - limb1: 70467341478988486054740815430, - limb2: 3387439844922322494, + limb0: 47936656584741649271334500668, + limb1: 34435534296620533705544015335, + limb2: 1436068762335363148, limb3: 0 }, w1: u384 { - limb0: 19836189114776755072265333447, - limb1: 18137260799566833205186073841, - limb2: 3109652349019213377, + limb0: 33965401854758827358743122716, + limb1: 64947362518551314185623294556, + limb2: 1293304807272578472, limb3: 0 }, w2: u384 { - limb0: 21352863297954650371999311188, - limb1: 60459723974295053734527691819, - limb2: 807924643441333644, + limb0: 42614487941160749076441838342, + limb1: 25189018362215397697942903566, + limb2: 1578413340369522531, limb3: 0 }, w3: u384 { - limb0: 50292826515662347692536244608, - limb1: 76776465720416580670921530204, - limb2: 2167540376865057165, + limb0: 62003202151866399579328156241, + limb1: 11227204044357346327875790770, + limb2: 27336061717904587, limb3: 0 }, w4: u384 { - limb0: 26407411952081983439205824979, - limb1: 8287256160725686738134032317, - limb2: 741673738249201008, + limb0: 41919216047182465214441612480, + limb1: 12558979242415415767683493177, + limb2: 897016373801476810, limb3: 0 }, w5: u384 { - limb0: 54958490492260617804107875162, - limb1: 52495276038127754898283368151, - limb2: 1846760040677520446, + limb0: 49740640219765361424413700059, + limb1: 1516543327127282185838070382, + limb2: 3390779977847637623, limb3: 0 }, w6: u384 { - limb0: 43583143821676632764211125532, - limb1: 6976815487978236021815180223, - limb2: 1163984242200556098, + limb0: 6173816635189533500278498159, + limb1: 18755965635399492264324060977, + limb2: 3291894557846350181, limb3: 0 }, w7: u384 { - limb0: 52105223650783927953043841416, - limb1: 36601537239017506102041304587, - limb2: 249972222298068946, + limb0: 40319134702582145609807726458, + limb1: 64199497162571021157368859867, + limb2: 463113059401620942, limb3: 0 }, w8: u384 { - limb0: 28663114038156270142503610578, - limb1: 39494692246340579116733230829, - limb2: 2038554080239602066, + limb0: 13031923161871817281242121181, + limb1: 5168039338665039897238459817, + limb2: 1968023344079995329, limb3: 0 }, w9: u384 { - limb0: 16127545401377632367714155888, - limb1: 10379937263162840528394767416, - limb2: 1328299999837812310, + limb0: 48304539205139311118174567712, + limb1: 24324560982343155430342538851, + limb2: 2271338732440707727, limb3: 0 }, w10: u384 { - limb0: 55321066881941561895893360710, - limb1: 2287272600407630227816452749, - limb2: 2905464909416375884, + limb0: 19851254444464131326071465345, + limb1: 31524763925617403688578049374, + limb2: 2008905481883081650, limb3: 0 }, w11: u384 { - limb0: 18959098346817874123974181751, - limb1: 24620162586442748086646494154, - limb2: 63062337158105374, + limb0: 36865893138752381863691925071, + limb1: 45064079077235270960965612784, + limb2: 2602906089233504562, limb3: 0 } }; let c_or_cinv_of_z: u384 = u384 { - limb0: 7384794193692561174490536246, - limb1: 66663026042600427526121978722, - limb2: 523247069204694479, + limb0: 3294802236484690023520511962, + limb1: 68528299589172556746033201596, + limb2: 1664917225946049681, limb3: 0 }; let z: u384 = u384 { - limb0: 40316994666805695645985493194, - limb1: 32918536128413513857291901774, - limb2: 556284137698260960, + limb0: 15114624557355386634521442185, + limb1: 53193498561254066597432142589, + limb2: 543143911626257241, limb3: 0 }; let ci: u384 = u384 { - limb0: 19310351630681970556500266992, - limb1: 11459717187747487754581177669, - limb2: 879035174114996602, + limb0: 73534238087275706114904812609, + limb1: 75623937230210125944179634521, + limb2: 117088341626652380, limb3: 0 }; @@ -12053,76 +16042,76 @@ mod tests { ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 434535361952981813157407672, - limb1: 4398914301581471370413180387, - limb2: 676825804443986708, + limb0: 47317046935598785155382042486, + limb1: 21457560903209923575986446503, + limb2: 3254004408293177918, limb3: 0 }, x1: u384 { - limb0: 59216903316812928827639015890, - limb1: 25716305395340741676590556615, - limb2: 1546998764757255232, + limb0: 15494514456732570178586821065, + limb1: 24032173842097443660430575984, + limb2: 1521071909225387325, limb3: 0 }, y0: u384 { - limb0: 28843043011292448381091230607, - limb1: 63798362630788596715533258756, - limb2: 719108417036619467, + limb0: 30955628307359579963205060662, + limb1: 76370242806002882010492894713, + limb2: 1949872664570836045, limb3: 0 }, y1: u384 { - limb0: 38786227324423008523590701068, - limb1: 30689950683419745999094123473, - limb2: 2386731841231196683, + limb0: 50921087499680672886779236633, + limb1: 61645581959497803442030421052, + limb2: 3276918362672705707, limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 12252166854995374918701673300, - limb1: 62984774073583978635534533548, - limb2: 2024497782609757466, + limb0: 59855354678317664646273147559, + limb1: 30324258555574355109079703061, + limb2: 3401225822801329314, limb3: 0 }, x1: u384 { - limb0: 31720232061887200998730558721, - limb1: 57803230314095347105848063009, - limb2: 295311185717068902, + limb0: 56971039989240026597919915863, + limb1: 14678545251838305476753929227, + limb2: 3247193731397665832, limb3: 0 }, y0: u384 { - limb0: 71791548612347608626361847052, - limb1: 3419812860597192042038532097, - limb2: 2328151312607669096, + limb0: 31822555683671328140687659202, + limb1: 50038914254252094617121589172, + limb2: 229229434153486958, limb3: 0 }, y1: u384 { - limb0: 59077132091652124577461966202, - limb1: 45315998175449505506859084804, - limb2: 490614156236574286, + limb0: 40288354252014522986798076346, + limb1: 74905453615050093797697134979, + limb2: 2640444300134590918, limb3: 0 } }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 7895276005445729390211267761, - limb1: 49399281334362276056945648025, - limb2: 1974758364568777414, + limb0: 30737188073999387712805979544, + limb1: 18024685824196982956438870886, + limb2: 1730493714114819900, limb3: 0 }; let lhs_i_plus_one: u384 = u384 { - limb0: 26938381804622932533750014044, - limb1: 27420998492630630378718947633, - limb2: 1737060042722876991, + limb0: 6049348177878962666242297809, + limb1: 76148208586943479806754854660, + limb2: 2184699643749933480, limb3: 0 }; let ci_plus_one: u384 = u384 { - limb0: 62174436240316316220224635308, - limb1: 73980005624635691627710344245, - limb2: 2780204461257729168, + limb0: 66369627012805072908661097825, + limb1: 6420137317826612210709799355, + limb2: 2359846115911555775, limb3: 0 }; assert_eq!(Q0_result, Q0); @@ -12136,316 +16125,316 @@ mod tests { #[test] fn test_run_BN254_MP_CHECK_BIT1_LOOP_3_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 32734122786475188413203532118, - limb1: 38615841936836244773735164788, - limb2: 616247898672574751, + limb0: 17064849834975020934055456399, + limb1: 74671939736202130735107756211, + limb2: 2794853688606092197, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 1430756383231761687013212156, - limb1: 21481849534581113525205835676, - limb2: 2475942381213378214, + limb0: 11311009233185433147091736067, + limb1: 10464344270139619298991590136, + limb2: 846930522370490180, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 31622808637467355704958261183, - limb1: 59617236371791664413135580960, - limb2: 1125510048356549912, + limb0: 37261635734833333731436183099, + limb1: 24619106318614291008075679573, + limb2: 3414104269821247500, limb3: 0 }, x1: u384 { - limb0: 60180397924009528471632905418, - limb1: 55615595319413435119665037829, - limb2: 916681520452193297, + limb0: 74803845761443148259350222309, + limb1: 40675518158069903288693888951, + limb2: 460310159371546915, limb3: 0 }, y0: u384 { - limb0: 77656812766230337500851655720, - limb1: 25897006534925091990056673094, - limb2: 2560517235482880331, + limb0: 55811786824353126530055717282, + limb1: 196826358874971942354012689, + limb2: 2075931799570338039, limb3: 0 }, y1: u384 { - limb0: 39278057470738206836884927807, - limb1: 23018232917886381522201805277, - limb2: 175397408503885243, + limb0: 66243592746987396565246576839, + limb1: 77693982139173374312763494759, + limb2: 42812792277292769, limb3: 0 } }; let Q_or_Qneg_0: G2Point = G2Point { x0: u384 { - limb0: 68425242061890834384785558114, - limb1: 56938962257310803883933576478, - limb2: 2259695859569536029, + limb0: 1128380390195550658705804179, + limb1: 37715590176798341574107257306, + limb2: 2198519251530354921, limb3: 0 }, x1: u384 { - limb0: 47677395548806103652039374109, - limb1: 16403476982864539748258294422, - limb2: 137735885208914139, + limb0: 39511615404294817352020566757, + limb1: 37339246098087732194155046325, + limb2: 1549673539973446698, limb3: 0 }, y0: u384 { - limb0: 68710127787605728430423782311, - limb1: 68298077698674160843107640089, - limb2: 1579460166023915376, + limb0: 25960248522053357970904533052, + limb1: 73364095794521682165617424302, + limb2: 885339701623416837, limb3: 0 }, y1: u384 { - limb0: 43298098796604622861222201192, - limb1: 23458746827119122964674987602, - limb2: 2474518932741553320, + limb0: 26803692523849804808771274231, + limb1: 36563139327826239651052455508, + limb2: 1562693907001836004, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 22003543526465619375991967592, - limb1: 37256932064579886360324775336, - limb2: 1608024775420958157, + limb0: 47852925632430981335868156398, + limb1: 7336778831737786009813454472, + limb2: 1878706517781884143, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 76117744402158888339663490320, - limb1: 26618665346182137877076851086, - limb2: 3018284997682024610, + limb0: 50428998048312243530087256558, + limb1: 53868846857515727083335827196, + limb2: 93960238037386949, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 33054037566404995332106300825, - limb1: 70897931852419226150083391904, - limb2: 2814279009413368977, + limb0: 8997938067019260183959665735, + limb1: 65193546670819046363689233590, + limb2: 3331302639862789034, limb3: 0 }, x1: u384 { - limb0: 72847641972775785169894968531, - limb1: 13457841357932660955346612623, - limb2: 215485824496267180, + limb0: 28933586855985380443110378036, + limb1: 52571844939583636487355491504, + limb2: 1396898723881618371, limb3: 0 }, y0: u384 { - limb0: 30610357392289436564556872048, - limb1: 40952045359921762768739599195, - limb2: 2246522681838346870, + limb0: 31157381147106051456022437321, + limb1: 50613782681330316871145458030, + limb2: 2712657782630447657, limb3: 0 }, y1: u384 { - limb0: 42399474693173784311993398450, - limb1: 42904415170238737560102892575, - limb2: 515848440370850567, + limb0: 48906091048196394979343331785, + limb1: 54093829342229577887790577645, + limb2: 727201185009830285, limb3: 0 } }; let Q_or_Qneg_1: G2Point = G2Point { x0: u384 { - limb0: 78573458558600722552152791763, - limb1: 69689291848719744622298253250, - limb2: 1778374476317321768, + limb0: 43087280092373723374816553179, + limb1: 44777627041255597126951042916, + limb2: 2943025921523931550, limb3: 0 }, x1: u384 { - limb0: 4677975528529937520363444164, - limb1: 59736220456804337149828364598, - limb2: 2859644294090689898, + limb0: 39210768809721153056940698797, + limb1: 57034093615939789097216428890, + limb2: 234572016126974310, limb3: 0 }, y0: u384 { - limb0: 58474250441674462491782805750, - limb1: 27618447739596395273615247326, - limb2: 1373133510831398745, + limb0: 62775087487814073419797482511, + limb1: 9482206200572575901731058250, + limb2: 136596601538159168, limb3: 0 }, y1: u384 { - limb0: 67951621537723899758313973028, - limb1: 61235314565569553996188762791, - limb2: 1153158231018609708, + limb0: 65916488635152686467226199068, + limb1: 47128670903384391576305086622, + limb2: 815684293922028493, limb3: 0 } }; let yInv_2: u384 = u384 { - limb0: 2904901898241016921778479024, - limb1: 2349461055556003990159775675, - limb2: 2910529618087537879, + limb0: 37457973439965313407008148022, + limb1: 25756010242404504726332568790, + limb2: 3307315709457540458, limb3: 0 }; let xNegOverY_2: u384 = u384 { - limb0: 69195446257546160358736024695, - limb1: 49148187411726485195590959055, - limb2: 2610703503955171718, + limb0: 21798494000903328263097969344, + limb1: 43602328721278327976062312224, + limb2: 3442809358158807439, limb3: 0 }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 17777257301609871750245126793, - limb1: 20280858736985170990688115103, - limb2: 532976621028913834, + limb0: 17970719942900312387987638207, + limb1: 69449903913962383477860666959, + limb2: 327530652326727604, limb3: 0 }, x1: u384 { - limb0: 21875837649435494681885929285, - limb1: 40644163816731986038086968744, - limb2: 199658044052087953, + limb0: 53853312605152600770195621913, + limb1: 13806540068445910801601237577, + limb2: 1028993035535055926, limb3: 0 }, y0: u384 { - limb0: 71616042212525791663649027525, - limb1: 1572789795226311243431610156, - limb2: 69998775728438781, + limb0: 37244904249338756022336863437, + limb1: 38385522438554043667755278591, + limb2: 1994309600768240233, limb3: 0 }, y1: u384 { - limb0: 5921036507309880762113949838, - limb1: 2919748913893524874951790089, - limb2: 910063050551793057, + limb0: 64899441710512421812466681051, + limb1: 18178724079409428298571943135, + limb2: 979889805754421300, limb3: 0 } }; let Q_or_Qneg_2: G2Point = G2Point { x0: u384 { - limb0: 55198809892449412822981461760, - limb1: 55013033611951868980885936822, - limb2: 1010464752554597045, + limb0: 75259678967804835116635317015, + limb1: 73665661859362530328134777283, + limb2: 1028642302768472716, limb3: 0 }, x1: u384 { - limb0: 41193455868341478598291910205, - limb1: 12849815974522955861883143647, - limb2: 3203712735207993582, + limb0: 36592732534258840494573780496, + limb1: 25794206162336303855306003902, + limb2: 3386136291420992374, limb3: 0 }, y0: u384 { - limb0: 67513099481243038217819550263, - limb1: 21173112575791399927188434169, - limb2: 1813557808139014818, + limb0: 44222381230531728666010929754, + limb1: 47004385085330828225505385072, + limb2: 2622321986746213427, limb3: 0 }, y1: u384 { - limb0: 6541706882361741289975239764, - limb1: 42913102459123369372956569751, - limb2: 2748008194930246652, + limb0: 77159306081172756049595328501, + limb1: 48598460237926250135397570655, + limb2: 2584866744407620726, limb3: 0 } }; let lhs_i: u384 = u384 { - limb0: 67483799385750190652978344434, - limb1: 53428104874804885393353007053, - limb2: 2460898569310034302, + limb0: 6337230112485467030508423307, + limb1: 48134346612603190950584288583, + limb2: 2629925514712819366, limb3: 0 }; let f_i_of_z: u384 = u384 { - limb0: 25088481345435104812294753203, - limb1: 70310135811311089830803663143, - limb2: 2250260573682411582, + limb0: 9416009238690081890042949788, + limb1: 73327110131206408904159789424, + limb2: 842090525309884086, limb3: 0 }; - let f_i_plus_one: E12D = E12D { + let f_i_plus_one = E12D { w0: u384 { - limb0: 2844219767380653250385837648, - limb1: 18600415137646330917285909197, - limb2: 3156235923668321458, + limb0: 1521244786588960082248549299, + limb1: 48129361997212224422393408606, + limb2: 203557544872831773, limb3: 0 }, w1: u384 { - limb0: 50210675846930408150502969740, - limb1: 7963003982605479441203343472, - limb2: 767222138977708770, + limb0: 6133987080371847192281820612, + limb1: 34916380138120651780984504744, + limb2: 2786112421350079748, limb3: 0 }, w2: u384 { - limb0: 71576628857038068011443556202, - limb1: 25699608917996656873823606367, - limb2: 258804252956167922, + limb0: 32659963674391348732124959762, + limb1: 35948119188199523611310040372, + limb2: 1218174091482783244, limb3: 0 }, w3: u384 { - limb0: 29697970714589908059807164059, - limb1: 19347314103626596586600103239, - limb2: 1900253272455414810, + limb0: 30713498703518704024315768161, + limb1: 7630086101181271511421968851, + limb2: 120764701252838344, limb3: 0 }, w4: u384 { - limb0: 62789861689330070018699864411, - limb1: 13870423455179649741246444884, - limb2: 2810784739537405193, + limb0: 36165742904356990050587531045, + limb1: 59105121330069844772275550158, + limb2: 3204418568634846813, limb3: 0 }, w5: u384 { - limb0: 49098513578529650800428275727, - limb1: 39429261635599743586870093931, - limb2: 2689337602157259165, + limb0: 6373940289833763056316573815, + limb1: 42435688055817474272143891294, + limb2: 1853589523652619850, limb3: 0 }, w6: u384 { - limb0: 36536060404521445189421849842, - limb1: 36410926067949143315534690245, - limb2: 3075260021699581770, + limb0: 68013252073298320616311307782, + limb1: 2202275134508436563373561093, + limb2: 2379007547955947439, limb3: 0 }, w7: u384 { - limb0: 63749599928884349400640904883, - limb1: 22788528140820084088792340053, - limb2: 2520739003539908655, + limb0: 65487869088070178398374263371, + limb1: 28407228105866978034509213751, + limb2: 454186095505344397, limb3: 0 }, w8: u384 { - limb0: 34997438876635847821899142963, - limb1: 78249828860258613756052567653, - limb2: 1379605457197013348, + limb0: 11637323752077453075261692207, + limb1: 61744531492706732635850430639, + limb2: 733143838981233217, limb3: 0 }, w9: u384 { - limb0: 33617217604060724219239038105, - limb1: 36194261569353773651697623791, - limb2: 1393290280670975642, + limb0: 19219279450277374605033138207, + limb1: 74010234137075339363594961935, + limb2: 1513880424385699936, limb3: 0 }, w10: u384 { - limb0: 30478538780486786939799724692, - limb1: 8449942826310512614676115794, - limb2: 1758732389392679760, + limb0: 38260610145596781040189492335, + limb1: 49583975832216628770168470784, + limb2: 1835932031841631813, limb3: 0 }, w11: u384 { - limb0: 45541293386256639299791980184, - limb1: 55402596844231035557102111487, - limb2: 101178534429736496, + limb0: 17908745951439458958132761086, + limb1: 33335073120829856816071644845, + limb2: 1675362999222700315, limb3: 0 } }; let c_or_cinv_of_z: u384 = u384 { - limb0: 58998743960201253442804551228, - limb1: 72146507898670244884339624149, - limb2: 3436500011552961725, + limb0: 10933318906872140736760058960, + limb1: 61065852099815409490735551121, + limb2: 747742686621113907, limb3: 0 }; let z: u384 = u384 { - limb0: 71634561918104957049161483509, - limb1: 61460532045387308280572198435, - limb2: 265308444066715866, + limb0: 446618355839444511325961143, + limb1: 56922828061039770272509152779, + limb2: 198259022425799895, limb3: 0 }; let ci: u384 = u384 { - limb0: 27913742052977914165884132488, - limb1: 15063808288901686344782229094, - limb2: 1155812101868140862, + limb0: 1545721402804127367186365676, + limb1: 25616324502294827115035576632, + limb2: 17048479735291872, limb3: 0 }; @@ -12479,103 +16468,103 @@ mod tests { ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 6073025180148763243793262281, - limb1: 9727226695970267712621138796, - limb2: 2336213765451990715, + limb0: 5527369776462270313918181369, + limb1: 52759645159023130738349589076, + limb2: 1533022110805331631, limb3: 0 }, x1: u384 { - limb0: 46465389592559959644103469133, - limb1: 64167060851053673899227518522, - limb2: 363655683735310684, + limb0: 14970854066223182146219423629, + limb1: 1871349909338781515056825243, + limb2: 3426400066148451022, limb3: 0 }, y0: u384 { - limb0: 47840751959632034334917919276, - limb1: 12595237434158322769920164492, - limb2: 1494381350874671989, + limb0: 57388090821918174480672839910, + limb1: 44373990303629647439604014238, + limb2: 765332963069475756, limb3: 0 }, y1: u384 { - limb0: 61123863757024934164596632366, - limb1: 43854725990372306033429682037, - limb2: 433352695676985370, + limb0: 69418729147708225635057012313, + limb1: 16697064017087369656726462482, + limb2: 2784263596142978926, limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 70608862283064507763053501569, - limb1: 75690225005961181708189879820, - limb2: 661301477197679927, + limb0: 77870978002017607619186568754, + limb1: 52946380247174100352707741067, + limb2: 881326810185846071, limb3: 0 }, x1: u384 { - limb0: 41201618776606216173090221155, - limb1: 2398262440770820032940902589, - limb2: 2698769990853209487, + limb0: 66931526907912895161590204494, + limb1: 56794942002535403705159344229, + limb2: 402495863276593386, limb3: 0 }, y0: u384 { - limb0: 20575823006133249993773177261, - limb1: 20079931225351315715002361958, - limb2: 986894171489966008, + limb0: 32045384712591139565512293602, + limb1: 53961806061562921228094149007, + limb2: 36868033834789877, limb3: 0 }, y1: u384 { - limb0: 62748162050260725528941385849, - limb1: 19490217669069703474336562416, - limb2: 1678268662925419793, + limb0: 47243768842146278527140596688, + limb1: 37912596054498049918342333201, + limb2: 1812060015954855626, limb3: 0 } }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 37697179342458507998419792433, - limb1: 36215581944950889583748910700, - limb2: 2310999562478007389, + limb0: 45689954170980040926599683350, + limb1: 53818095964963617288487863088, + limb2: 2523560506615880823, limb3: 0 }, x1: u384 { - limb0: 31991735721052118101157157851, - limb1: 78877064133560669711927483087, - limb2: 2721031058808379958, + limb0: 55838384598203553610852110886, + limb1: 78611343214727914953559675197, + limb2: 2389674649773939228, limb3: 0 }, y0: u384 { - limb0: 47709095263314423184683068557, - limb1: 68341702252561653401430837839, - limb2: 2868960398995480427, + limb0: 65193074109090581885164450608, + limb1: 4191099266672678661411470176, + limb2: 1690580698500394703, limb3: 0 }, y1: u384 { - limb0: 17788871091325524522357998028, - limb1: 53937747051277144671216627679, - limb2: 760093254749411510, + limb0: 51352744600619480827097392328, + limb1: 59431879025229818845404710966, + limb2: 2324269386554995768, limb3: 0 } }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 52044844061076388150336336435, - limb1: 44940368751525978447477378955, - limb2: 1465788209324436967, + limb0: 4022468600126103138392951172, + limb1: 12395935566449550066211283114, + limb2: 725544544845234187, limb3: 0 }; let lhs_i_plus_one: u384 = u384 { - limb0: 11892256289116549058563406054, - limb1: 44778607830060895565092861858, - limb2: 75851898468949924, + limb0: 40817829819540344734358226746, + limb1: 33390099999561614500047099607, + limb2: 3075345342171920264, limb3: 0 }; let ci_plus_one: u384 = u384 { - limb0: 62152610675019321107142650575, - limb1: 6977606151505008672285529208, - limb2: 2135307383536667599, + limb0: 71313319560191444433145313285, + limb1: 38534303956520299179372200486, + limb2: 1433299495311634354, limb3: 0 }; assert_eq!(Q0_result, Q0); @@ -12591,698 +16580,872 @@ mod tests { fn test_run_BN254_MP_CHECK_FINALIZE_BN_2_circuit_BN254() { let original_Q0: G2Point = G2Point { x0: u384 { - limb0: 76515695102675204048755966784, - limb1: 8789427822349953205127318085, - limb2: 3132301610469730844, + limb0: 26295278385926780820205785130, + limb1: 32157431086021116356518408281, + limb2: 3146901090620274159, limb3: 0 }, x1: u384 { - limb0: 71602378690251733111109565401, - limb1: 67946286478213044965024488935, - limb2: 1698416111388999269, + limb0: 3889744729817033167243127128, + limb1: 20269385341929606930174376024, + limb2: 1993150351625727644, limb3: 0 }, y0: u384 { - limb0: 13623113014983576143702230338, - limb1: 29943728693761816743688707340, - limb2: 310802234888461257, + limb0: 25253349648566933768760410044, + limb1: 73566897778428010582391649787, + limb2: 3358578544633816503, limb3: 0 }, y1: u384 { - limb0: 18313535473256873131490064943, - limb1: 2818288805952498874200333750, - limb2: 1824649992344979256, + limb0: 47482930688677355290677700142, + limb1: 44643252631879750949249804836, + limb2: 2625662491115220455, limb3: 0 } }; let yInv_0: u384 = u384 { - limb0: 23166703453848831439327410090, - limb1: 2247015053382923582978384446, - limb2: 1890457356230139538, + limb0: 55341698905249139947617528614, + limb1: 33817208697124411931548235000, + limb2: 3180483584241258512, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 11186522069442555795508182452, - limb1: 78287792939907214424904096934, - limb2: 178636239482845279, + limb0: 11456353399606942720795767777, + limb1: 77341522679900248887205048022, + limb2: 1658911255606188426, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 57876267232304136644333376937, - limb1: 1596532614826004406910637192, - limb2: 1481484438429462378, + limb0: 44312378323769457053601779929, + limb1: 19260194377426229466981125954, + limb2: 67746524320822193, limb3: 0 }, x1: u384 { - limb0: 49853802570553720603796662632, - limb1: 46041660571639725563896212494, - limb2: 1729886993466479809, + limb0: 10525341065742022836541164583, + limb1: 51655441614570801932087329092, + limb2: 1920667238812590348, limb3: 0 }, y0: u384 { - limb0: 38061835052847029002018967109, - limb1: 28955487877030942932447938484, - limb2: 1947472383023093225, + limb0: 2199488233999391734532875638, + limb1: 28447338386320891337412774184, + limb2: 442793278190378819, limb3: 0 }, y1: u384 { - limb0: 65827023944973226188992738544, - limb1: 64516570764484257677150127758, - limb2: 3079030277447749789, + limb0: 27929089759784879351335196989, + limb1: 42101673423621812993830128019, + limb2: 943541656831396621, limb3: 0 } }; let original_Q1: G2Point = G2Point { x0: u384 { - limb0: 58258925447716308170673377289, - limb1: 72266249388956975361603910610, - limb2: 1668190572248431663, + limb0: 60278719333146281187324878389, + limb1: 6168813685886024067315661975, + limb2: 3250161496402840136, limb3: 0 }, x1: u384 { - limb0: 41640787474881381368052564306, - limb1: 41249169869768113938957975355, - limb2: 2170858555725253233, + limb0: 76233533622490975609520696183, + limb1: 54595969310315861231707446322, + limb2: 514335680443544927, limb3: 0 }, y0: u384 { - limb0: 43489193977551903923239976994, - limb1: 72678855800613320571605968578, - limb2: 787465114555987084, + limb0: 12732060931036905438578012372, + limb1: 5852429782961836985443828050, + limb2: 1595249460472644675, limb3: 0 }, y1: u384 { - limb0: 46983787548009396064142112928, - limb1: 28317980872447856193879703243, - limb2: 92433532075689705, + limb0: 26169738079278623136382325211, + limb1: 68095117536337962493067508479, + limb2: 1966916318905771957, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 1854093962894720796269145841, - limb1: 75630402618114943898172738030, - limb2: 2797472107140641943, + limb0: 51164915768214758466973573956, + limb1: 58723314951310779488600032487, + limb2: 102918274785741234, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 69590518734594701914759819750, - limb1: 62557667051737795121819434436, - limb2: 3312278418727692055, + limb0: 24178191609559982124836364373, + limb1: 15587998901532707390211025856, + limb2: 972387668456940627, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 35621952727394351358771056199, - limb1: 45026736226066222398856662534, - limb2: 2757497682680950786, + limb0: 74854548306776478299664295144, + limb1: 35180380127250380834428268278, + limb2: 2975693483073566559, limb3: 0 }, x1: u384 { - limb0: 73350662928589602370991797058, - limb1: 77910890398186895065089068656, - limb2: 1068294048461530392, + limb0: 52396239479101070366921196469, + limb1: 8391926318390336785036810968, + limb2: 3187978583917900403, limb3: 0 }, y0: u384 { - limb0: 50614652045130802783218276002, - limb1: 16234024592451629525026828266, - limb2: 1344934162676563834, + limb0: 42015862590169423994704037690, + limb1: 35077548731033309914383234277, + limb2: 1076122992080341589, limb3: 0 }, y1: u384 { - limb0: 73354982752945501140949182406, - limb1: 44124543853285614294968809791, - limb2: 2543535777368888997, + limb0: 5248882447573951397919702923, + limb1: 60597278410189017099896470559, + limb2: 1237330800050105316, limb3: 0 } }; - let R_n_minus_2: E12D = E12D { + let R_n_minus_2 = E12D { w0: u384 { - limb0: 39773101200371937909888138844, - limb1: 30595231670372858115443650737, - limb2: 376338658088269475, + limb0: 42935412151147242112014230752, + limb1: 40833559044880818193943384058, + limb2: 64350350611534528, limb3: 0 }, w1: u384 { - limb0: 2233247364686633141202994927, - limb1: 7850173846363797919620224227, - limb2: 3295991699357319628, + limb0: 39253969211844336127678024211, + limb1: 50480678243771746284395487635, + limb2: 1189160028585324374, limb3: 0 }, w2: u384 { - limb0: 55148504353553587254564962653, - limb1: 60121590047493979086002563122, - limb2: 2163388632186881228, + limb0: 27257890154383066821310971558, + limb1: 7869154016122493797638259005, + limb2: 2588264217099071326, limb3: 0 }, w3: u384 { - limb0: 416042324719650857876425693, - limb1: 1505643101454254541111707335, - limb2: 994531955167214339, + limb0: 62642279219389931510834092594, + limb1: 19927730832546508280428586723, + limb2: 480494452168495182, limb3: 0 }, w4: u384 { - limb0: 43480751431182610473496355917, - limb1: 48240451478383261019039507921, - limb2: 1951918069699577988, + limb0: 68233524963251930463610906774, + limb1: 10161934970547487908787256647, + limb2: 159836857817550903, limb3: 0 }, w5: u384 { - limb0: 22825758685568696302895021558, - limb1: 9653820561923806317388365183, - limb2: 1099608123011321543, + limb0: 78876029687611291161836619617, + limb1: 52556973173410171301394146325, + limb2: 1061396992610873468, limb3: 0 }, w6: u384 { - limb0: 47278537740323439124848030918, - limb1: 50068628728056233518528385586, - limb2: 2651938343791602163, + limb0: 48232599021772632667808268598, + limb1: 34779922187815069867601112082, + limb2: 728469249952172468, limb3: 0 }, w7: u384 { - limb0: 11375329534802032929293707337, - limb1: 123939641512362347806641420, - limb2: 1627076795690133810, + limb0: 77075779384248039252423124484, + limb1: 77155539649215278280190693461, + limb2: 2523872089077292852, limb3: 0 }, w8: u384 { - limb0: 33003885603163818009279438399, - limb1: 52941439142942542086389616100, - limb2: 2414146390976023503, + limb0: 17118679868965121397560864364, + limb1: 24856663213266800450142344187, + limb2: 592437291839847632, limb3: 0 }, w9: u384 { - limb0: 43904441402315001835563469530, - limb1: 69192444888604997060425720065, - limb2: 200767105809434064, + limb0: 52643501940580234278115061932, + limb1: 36173156987756276738169180, + limb2: 3045036490717526041, limb3: 0 }, w10: u384 { - limb0: 77725950829400600531907072555, - limb1: 59208520729957554322383355606, - limb2: 1646804810565448568, + limb0: 24430854188235605795646978746, + limb1: 61959490654890542406562369930, + limb2: 1490811263083364915, limb3: 0 }, w11: u384 { - limb0: 27318068339092155805585928888, - limb1: 52061173983133184103546514856, - limb2: 478065214618956488, + limb0: 48464887891924887920183142319, + limb1: 63647833454946064423924359354, + limb2: 767765390797981516, limb3: 0 } }; - let R_n_minus_1: E12D = E12D { + let R_n_minus_1 = E12D { w0: u384 { - limb0: 58247514047000673326953733421, - limb1: 10569797218150830971634955722, - limb2: 1624692575289578850, + limb0: 32849413149699568885642529056, + limb1: 65876951073525875808285154060, + limb2: 565891492380393342, limb3: 0 }, w1: u384 { - limb0: 64452812713493456098087636609, - limb1: 65789771145708935948654231793, - limb2: 3157541014541296533, + limb0: 77598259980424677085607578149, + limb1: 25680272431206916503934104472, + limb2: 1367673525171918109, limb3: 0 }, w2: u384 { - limb0: 55094412901496937758124508843, - limb1: 14441550450632449228311430366, - limb2: 621897777453879273, + limb0: 34619243684524445982078061441, + limb1: 22717274452153856440117958812, + limb2: 105631989180545225, limb3: 0 }, w3: u384 { - limb0: 61496138862618191686202252115, - limb1: 2930157926054207264281074558, - limb2: 929674371450998139, + limb0: 25109328460256562969970016727, + limb1: 51774954741392963969030491078, + limb2: 1325557186699415564, limb3: 0 }, w4: u384 { - limb0: 15803628281376891259659412310, - limb1: 25004076609337883524182780074, - limb2: 1429972621766780564, + limb0: 56130143694652296098205801033, + limb1: 70379995828691691700214706354, + limb2: 2382420479483555150, limb3: 0 }, w5: u384 { - limb0: 78366374191249322583174163911, - limb1: 37506593588203027909687800814, - limb2: 168883475285879758, + limb0: 47311066207882218405560336162, + limb1: 30789179050612363042368504908, + limb2: 1295312153442064915, limb3: 0 }, w6: u384 { - limb0: 15140773916091266809263008883, - limb1: 68305651497972452750161514573, - limb2: 220457174259022779, + limb0: 20081800292463345456551429400, + limb1: 72139378624331867418033380322, + limb2: 2457082555073983468, limb3: 0 }, w7: u384 { - limb0: 26297783011955575666134807719, - limb1: 63330430785875879189319616025, - limb2: 2015082568192786727, + limb0: 35558528876036842478088732671, + limb1: 33565357648224252815203168801, + limb2: 781845608970146601, limb3: 0 }, w8: u384 { - limb0: 58890903660178833014066078560, - limb1: 75780051214563697589738443901, - limb2: 1563530464348284631, + limb0: 18302682824859394250099259830, + limb1: 37817175889035485831047545154, + limb2: 141151215612999086, limb3: 0 }, w9: u384 { - limb0: 63473490859708176821457470244, - limb1: 33632328342368402773362738968, - limb2: 1985824979147853666, + limb0: 24425844140222924336248236752, + limb1: 14468513654171819090067465788, + limb2: 593432066053763710, limb3: 0 }, w10: u384 { - limb0: 65152588707662257476314226947, - limb1: 23274573922924754222521148775, - limb2: 473149356941961619, + limb0: 1203799016341512417965380726, + limb1: 28694363048321436275835764055, + limb2: 1908798161406009129, limb3: 0 }, w11: u384 { - limb0: 52363415686955225535270053232, - limb1: 35329086454714729214377922398, - limb2: 3309636006281832765, + limb0: 19532402468811548792549747542, + limb1: 21276812047655471859824398365, + limb2: 1989963035505770167, limb3: 0 } }; let c_n_minus_3: u384 = u384 { - limb0: 54648798265643634481983517039, - limb1: 35425261544146600534303046354, - limb2: 3351839778455144866, + limb0: 11511693070273995284882377693, + limb1: 77875361638018122631716278388, + limb2: 2509538534450933386, limb3: 0 }; let w_of_z: u384 = u384 { - limb0: 27932626337397459746134081926, - limb1: 34459536854010982405788592149, - limb2: 2949031675982070422, + limb0: 74760932869453648057179532930, + limb1: 60075446736607414489312587559, + limb2: 594078452858641118, limb3: 0 }; let z: u384 = u384 { - limb0: 75100722321157481286745657675, - limb1: 53176666183328136800674710709, - limb2: 1873314039735780746, + limb0: 46064864601932086963308698062, + limb1: 59023955925725274619236298042, + limb2: 2416593706988199217, limb3: 0 }; let c_inv_frob_1_of_z: u384 = u384 { - limb0: 63469362261568189860109481311, - limb1: 12675454082593576445804105853, - limb2: 143610774028943748, + limb0: 23719870747466911958995106585, + limb1: 67779148596325614483389103014, + limb2: 3269216409187904934, limb3: 0 }; let c_frob_2_of_z: u384 = u384 { - limb0: 48136884541864499493955514860, - limb1: 34715627796004496673821113191, - limb2: 582133236019795415, + limb0: 57198158640702977667010573729, + limb1: 71687878799965043967393536784, + limb2: 921345792293189065, limb3: 0 }; let c_inv_frob_3_of_z: u384 = u384 { - limb0: 47940551549985601805073445368, - limb1: 35646538251239261247168297276, - limb2: 1710771849864288607, + limb0: 13295263885328123897987940133, + limb1: 30732878069893442254500677475, + limb2: 1774612657201329829, limb3: 0 }; let previous_lhs: u384 = u384 { - limb0: 60457780691040955719155991772, - limb1: 10909330115400199985293083510, - limb2: 1692257949152095961, + limb0: 39073930735080714804698085885, + limb1: 67803843054481874289422274317, + limb2: 2457147552005459142, limb3: 0 }; let R_n_minus_3_of_z: u384 = u384 { - limb0: 51463503968429560985001758516, - limb1: 76100239050291470512271406715, - limb2: 119504179848476663, + limb0: 65366096302421835663172939132, + limb1: 835650531448226490533056190, + limb2: 3444362320080872757, limb3: 0 }; let Q: Array = array![ u384 { - limb0: 39538336125492398871180292107, - limb1: 72378294177222663564906132544, - limb2: 543076755608029291, + limb0: 27356951067035585084921379676, + limb1: 20461005198938112919197330420, + limb2: 353417296945346432, + limb3: 0 + }, + u384 { + limb0: 67676742380086990432758385534, + limb1: 64104115241619972125628345637, + limb2: 3196463074566025458, + limb3: 0 + }, + u384 { + limb0: 35701064642071881562327992565, + limb1: 71067092790380178675270923920, + limb2: 3050644578457284978, + limb3: 0 + }, + u384 { + limb0: 49666202815800374209268276944, + limb1: 22909189928344113849700488112, + limb2: 2759474543087333987, + limb3: 0 + }, + u384 { + limb0: 52833175583578586446520517603, + limb1: 65735074376355193258500197024, + limb2: 1371300422286054923, + limb3: 0 + }, + u384 { + limb0: 66035221433447195884366291583, + limb1: 48215449102220885623882731917, + limb2: 1565100970723749323, + limb3: 0 + }, + u384 { + limb0: 72341488040200614128084603528, + limb1: 67594641799115042014008569335, + limb2: 2781266380900191294, + limb3: 0 + }, + u384 { + limb0: 45853456734871012773356499306, + limb1: 70935123748738866917077004827, + limb2: 1373840975061016306, + limb3: 0 + }, + u384 { + limb0: 59987266053155913619999910172, + limb1: 18637706370336642005189317188, + limb2: 1989130532479686734, + limb3: 0 + }, + u384 { + limb0: 40752697390388119035665776685, + limb1: 11112962707473480058991766119, + limb2: 2754856009251363083, + limb3: 0 + }, + u384 { + limb0: 37701193218643795012106197979, + limb1: 20518050444260407527409517567, + limb2: 1391120633222715060, + limb3: 0 + }, + u384 { + limb0: 51540450938244412325080206422, + limb1: 62547279651341779702117789844, + limb2: 896162233866851509, + limb3: 0 + }, + u384 { + limb0: 36351273042359421665518951009, + limb1: 1448178449759044487788488905, + limb2: 2754051159840098759, + limb3: 0 + }, + u384 { + limb0: 28552257520623663022396423630, + limb1: 21207341065849910545468194397, + limb2: 3110580203891361289, + limb3: 0 + }, + u384 { + limb0: 1306489111607322672789488725, + limb1: 72610531697863705015207158230, + limb2: 772356383620131897, + limb3: 0 + }, + u384 { + limb0: 28781848225990331404683268137, + limb1: 6957143952038344788196827074, + limb2: 1991954342021882325, + limb3: 0 + }, + u384 { + limb0: 55419396868170503288878635921, + limb1: 13642347608890548228178900069, + limb2: 2738763875781929386, + limb3: 0 + }, + u384 { + limb0: 27950792771406312151346646753, + limb1: 68976406838155591938931538988, + limb2: 1770666083514905078, + limb3: 0 + }, + u384 { + limb0: 14615612206400765347540108072, + limb1: 39321458825195509075292327571, + limb2: 697039904675784822, + limb3: 0 + }, + u384 { + limb0: 71775527903744597711262335923, + limb1: 34554122535282079308077868458, + limb2: 2787674958551898093, + limb3: 0 + }, + u384 { + limb0: 51311560707716095739496405146, + limb1: 10739191613981306907532700259, + limb2: 392999336627237238, + limb3: 0 + }, + u384 { + limb0: 56602895881581335582663967345, + limb1: 76971549978976164606346265368, + limb2: 1457858668478295009, + limb3: 0 + }, + u384 { + limb0: 52054654779208637269686603470, + limb1: 38508569974338392631231184470, + limb2: 2219369752485307863, + limb3: 0 + }, + u384 { + limb0: 26191649065926652268141442049, + limb1: 51178397079496831350855620600, + limb2: 2115188032594331722, + limb3: 0 + }, + u384 { + limb0: 12643151824413271624945304507, + limb1: 40598893563591335499031517451, + limb2: 2577592140968896664, + limb3: 0 + }, + u384 { + limb0: 48171380480045546351584267930, + limb1: 53157520627635632175268918810, + limb2: 2801495210951393371, + limb3: 0 + }, + u384 { + limb0: 8907227139761396193519005693, + limb1: 8828975589970112692376272638, + limb2: 857890644049704400, + limb3: 0 + }, + u384 { + limb0: 38209942657006366348783871042, + limb1: 57754630494956049208435613403, + limb2: 3157049263638845769, + limb3: 0 + }, + u384 { + limb0: 20775824454286947232363848492, + limb1: 8765718624152260703094314544, + limb2: 1640360378005322309, + limb3: 0 + }, + u384 { + limb0: 42467654156190031614017992483, + limb1: 639923216445955130295308267, + limb2: 2803111423817304351, limb3: 0 }, u384 { - limb0: 20622279998058407577092606913, - limb1: 17000019956307445195151757951, - limb2: 2821785460392708282, + limb0: 61444804603880188457232600862, + limb1: 70382727944395577052724485524, + limb2: 1882038005161799280, limb3: 0 }, u384 { - limb0: 72610939649202879177407828201, - limb1: 15859762142335958207391212496, - limb2: 625936839049816711, + limb0: 77461609861143541299237058944, + limb1: 2142947650060670887597219977, + limb2: 2914208085607429540, limb3: 0 }, u384 { - limb0: 54028002011768179470718563375, - limb1: 78164497736277560271584761799, - limb2: 3079867418077593865, + limb0: 6740555394807156857764728744, + limb1: 51015226100351963069986993616, + limb2: 3456480448405230739, limb3: 0 }, u384 { - limb0: 5145003797034348287477472547, - limb1: 23004869611785338708424432874, - limb2: 1383306010913820727, + limb0: 47464196112954551825536745080, + limb1: 10496658885951485180021716428, + limb2: 3371800911770665239, limb3: 0 }, u384 { - limb0: 56395327029256240576481910029, - limb1: 55477085090742760778378901734, - limb2: 802853081124458248, + limb0: 4339999891477638360047867335, + limb1: 35311033650643641856455435382, + limb2: 2501377558119777601, limb3: 0 }, u384 { - limb0: 62619805224234996782561324868, - limb1: 28593168513449141547709249737, - limb2: 2639163715354909019, + limb0: 74587729044872893159576258424, + limb1: 51042064023610099024529763461, + limb2: 2714220543696079110, limb3: 0 }, u384 { - limb0: 24504535570528170370877503433, - limb1: 56801331562370825563239469027, - limb2: 2207453188519876490, + limb0: 65821423212764509398120707494, + limb1: 37205773641880746675182188260, + limb2: 1235339939683356309, limb3: 0 }, u384 { - limb0: 60939494298144154337380924829, - limb1: 45548310905203463306664256168, - limb2: 577967753565131686, + limb0: 61310882930700014088094901063, + limb1: 69420016221568265953358518901, + limb2: 2949076321031948284, limb3: 0 }, u384 { - limb0: 50891306258730312298377633994, - limb1: 36907108364546723236705761927, - limb2: 2385901941266554729, + limb0: 61218971062315893066299295758, + limb1: 60348615836708746137793640129, + limb2: 620652557754079240, limb3: 0 }, u384 { - limb0: 69559169642389728474220863204, - limb1: 43678758572344040341995576685, - limb2: 2710684430259292388, + limb0: 11516664929868624248881616905, + limb1: 59505181108120106257510842052, + limb2: 397234752312367477, limb3: 0 }, u384 { - limb0: 9837057596165635728288483672, - limb1: 24095229013581028692158732140, - limb2: 746940769631663984, + limb0: 20113553687270141460253378515, + limb1: 54057024911024917150202128074, + limb2: 2169896756529391339, limb3: 0 }, u384 { - limb0: 56199081873274326210458543365, - limb1: 75067347430544468194587339698, - limb2: 2392993685011633796, + limb0: 51045598493867986602332366817, + limb1: 69283926801557474195943517096, + limb2: 1445261260419351979, limb3: 0 }, u384 { - limb0: 9917012175727560973789426042, - limb1: 48680023639006438682731312928, - limb2: 430862462771921967, + limb0: 5582971433925081757616423849, + limb1: 2729142422150463344892904419, + limb2: 2972399257775041017, limb3: 0 }, u384 { - limb0: 13360712457909615285158584893, - limb1: 46003555835430672216589648405, - limb2: 789523510605727365, + limb0: 52627880362488810314465893949, + limb1: 21202400339955532776927652839, + limb2: 1395993918431486868, limb3: 0 }, u384 { - limb0: 45696525051081139037123530701, - limb1: 16701960642183369175995546947, - limb2: 2638517147597761731, + limb0: 52734019973134373870986065918, + limb1: 37788783526058627853666103848, + limb2: 2727696476870389920, limb3: 0 }, u384 { - limb0: 50626098383967241516060339821, - limb1: 70433589350681490042378047766, - limb2: 2516032049879306779, + limb0: 58940367422329565759856843451, + limb1: 49306726747782465586006575591, + limb2: 2363078759017140520, limb3: 0 }, u384 { - limb0: 23565139193136454016255627079, - limb1: 54557587950461613316358502389, - limb2: 729017398209181176, + limb0: 27116938255086176221444789661, + limb1: 546281316600448382683657850, + limb2: 2648786536735237497, limb3: 0 }, u384 { - limb0: 38366327317858770061531675757, - limb1: 26952831995428561848025591416, - limb2: 662554890480784971, + limb0: 8790503055031737040661302293, + limb1: 60735128853087214729835093553, + limb2: 1124764852724101013, limb3: 0 }, u384 { - limb0: 56914571454665398548473145359, - limb1: 78279275921501344736986707982, - limb2: 1592740564734568401, + limb0: 41094238944703350089480284927, + limb1: 77211132984842121525550103489, + limb2: 2628222902437047991, limb3: 0 }, u384 { - limb0: 10360361760042969780406328942, - limb1: 40800929632893017027277156576, - limb2: 489686979224035264, + limb0: 74671345672734644143886926738, + limb1: 27009742045123851315683933190, + limb2: 2241487675673432177, limb3: 0 }, u384 { - limb0: 36957764448097415134643852348, - limb1: 35620666002553850463914924175, - limb2: 649683443184540846, + limb0: 18710373775480682078334123131, + limb1: 37824729717222481282134673463, + limb2: 3344710127162438258, limb3: 0 }, u384 { - limb0: 22992963391562842382394762774, - limb1: 68466113969786803418602716809, - limb2: 1928306143768698951, + limb0: 54145911045635798131118149923, + limb1: 65437667657775098069556409419, + limb2: 3346431687672442094, limb3: 0 }, u384 { - limb0: 39515814869766926725758124491, - limb1: 39405733073037185795314358855, - limb2: 415278124502016468, + limb0: 3461697397115788198561493337, + limb1: 38048292875309751594278345040, + limb2: 3036792792520236795, limb3: 0 }, u384 { - limb0: 40045436017096087305216247527, - limb1: 19072488161436698459058802990, - limb2: 2690199886859842662, + limb0: 13063974522476725659969527068, + limb1: 55090774676070823517988707894, + limb2: 3158774724606832438, limb3: 0 }, u384 { - limb0: 37283731539461438294040876529, - limb1: 647880615405432083589811807, - limb2: 495742789848418782, + limb0: 38322326523617833010307681971, + limb1: 2162541339405348724315590137, + limb2: 2094804837769832300, limb3: 0 }, u384 { - limb0: 69915346460617944663644522573, - limb1: 28979890201216361489201659621, - limb2: 1859681187015695852, + limb0: 47519389390589294628725441225, + limb1: 53152526587741788478716608630, + limb2: 2820372687495650178, limb3: 0 }, u384 { - limb0: 31737346164896103598597739009, - limb1: 44511718308746384119772523413, - limb2: 1671845819287137801, + limb0: 49795340709874095007501255021, + limb1: 34031123296555948256184688954, + limb2: 1094021948288368800, limb3: 0 }, u384 { - limb0: 5825785306528226935687873685, - limb1: 35680749671807472152129028518, - limb2: 2535768271302425854, + limb0: 23389582968169796381567798538, + limb1: 20196641382878395938052318756, + limb2: 1115095280793645737, limb3: 0 }, u384 { - limb0: 78363838989302665816523392567, - limb1: 48411825622227047920593322655, - limb2: 593355135521547816, + limb0: 68601251998263727150071121342, + limb1: 29478018407241824505432268456, + limb2: 2100784640141463625, limb3: 0 }, u384 { - limb0: 31208267720369294151931332356, - limb1: 78181373462458384548182486290, - limb2: 2572545266977491778, + limb0: 26757639256044174904766529520, + limb1: 11604044828485164110511426463, + limb2: 1123291179449983558, limb3: 0 }, u384 { - limb0: 59814503413734095368147103486, - limb1: 47732032767784423939988436134, - limb2: 1851071198127315553, + limb0: 60202249500430906012554786977, + limb1: 13704532298570443083201586248, + limb2: 3249640612862464664, limb3: 0 }, u384 { - limb0: 36206364077278664510748969978, - limb1: 70761182774839840794482899369, - limb2: 644626034443431702, + limb0: 9090659308802206601949834777, + limb1: 35406434272710716703654808105, + limb2: 944540465243729793, limb3: 0 }, u384 { - limb0: 48572261018349377195691315676, - limb1: 31133069532473504054221942561, - limb2: 2843106687342673459, + limb0: 39355259797163742965775683504, + limb1: 23272712308223252131313687522, + limb2: 1260982445361222205, limb3: 0 }, u384 { - limb0: 23707786858539703201169672349, - limb1: 40193634114222454687519364805, - limb2: 2350641389979223529, + limb0: 28042700001550849198008681913, + limb1: 24982595235019596923961321231, + limb2: 95632608240224482, limb3: 0 }, u384 { - limb0: 56152152499593787993515060310, - limb1: 37624867797930191950221921775, - limb2: 76724431695964775, + limb0: 6412376275938174193000375174, + limb1: 22799158752248267430776274938, + limb2: 2243313154539529760, limb3: 0 }, u384 { - limb0: 53384442823922334036260598407, - limb1: 33001720239659766290880334812, - limb2: 1418913556219134180, + limb0: 24892008244559442082623033631, + limb1: 58845357491964699885838999338, + limb2: 3228301310083127681, limb3: 0 }, u384 { - limb0: 57466104163159058530556190598, - limb1: 49855152079105017314422154037, - limb2: 2752759722553792787, + limb0: 77896097028732007700706644014, + limb1: 21084753540801275091853963777, + limb2: 3321347213920035253, limb3: 0 }, u384 { - limb0: 76619233989241289600562806407, - limb1: 77014279065904053305176543056, - limb2: 2667742003494817263, + limb0: 17460523883752519092187278502, + limb1: 7104296291779367761314070538, + limb2: 369752805623695814, limb3: 0 }, u384 { - limb0: 57155205437830241562675632391, - limb1: 38065074594952668164735212714, - limb2: 2417594923661831603, + limb0: 62620209405991610067701039006, + limb1: 40099823487861722434077875039, + limb2: 80841987526017892, limb3: 0 }, u384 { - limb0: 2501273557335717884662652449, - limb1: 55500984637409607831466014469, - limb2: 879837438470659306, + limb0: 7587331061174797911962954874, + limb1: 18612757199156096520193860668, + limb2: 190229835407925329, limb3: 0 }, u384 { - limb0: 24853278948010071179419784286, - limb1: 32718070765074852457160716165, - limb2: 940284415551250460, + limb0: 31009551309357584157808348993, + limb1: 61177417538752129964281456790, + limb2: 2655261365901462018, limb3: 0 }, u384 { - limb0: 4934432018599897586808640733, - limb1: 41094317769739882213229309833, - limb2: 2586633682560506000, + limb0: 58186884940731683530576328238, + limb1: 16197121838603405620708112703, + limb2: 628810244995447976, limb3: 0 }, u384 { - limb0: 72265921096225073271030525687, - limb1: 43280223428508128796238087141, - limb2: 3116893656975576394, + limb0: 52594768710104835041029866389, + limb1: 75445704071926598129635180546, + limb2: 917148657199307890, limb3: 0 }, u384 { - limb0: 57117528196228585689477881692, - limb1: 63671913379964328046684888262, - limb2: 1219155366487325473, + limb0: 1362371658405356094629197826, + limb1: 52170996504356009094468373097, + limb2: 3127198546777892456, limb3: 0 }, u384 { - limb0: 15232736669234454278731332247, - limb1: 22105163975080311519217717336, - limb2: 1376584424319009869, + limb0: 64580357531098132081498023959, + limb1: 6462104193496910347775616392, + limb2: 3321490422231975892, limb3: 0 }, u384 { - limb0: 77081921102631858949365752521, - limb1: 61098720374347849544704026915, - limb2: 3250781797494828248, + limb0: 67530960341566620951506633330, + limb1: 22125949685505124253046287262, + limb2: 2762983886898219530, limb3: 0 }, u384 { - limb0: 55854924635483007179675412562, - limb1: 38013943406751334947150057048, - limb2: 2584792778580634170, + limb0: 322499708343051417505398840, + limb1: 65277051917929843363544909195, + limb2: 3414191155133717237, limb3: 0 }, u384 { - limb0: 63018504641119593953180974283, - limb1: 22801023474060290608118824765, - limb2: 2644694935591396397, + limb0: 267364815221167323178459963, + limb1: 11525642836424219912752266497, + limb2: 2483628041438676770, limb3: 0 }, u384 { - limb0: 30082472345626922296731442590, - limb1: 31258081103002322554055593634, - limb2: 1591652752415600503, + limb0: 25253690358596365164667416632, + limb1: 53067786640290111076947170062, + limb2: 2105814468748767435, limb3: 0 }, u384 { - limb0: 27441744682519875975323449019, - limb1: 51971460525366986326995100983, - limb2: 3446490494822404077, + limb0: 69817185405331131517142634842, + limb1: 74523698158065733126488688061, + limb2: 2939204410165642690, limb3: 0 }, u384 { - limb0: 16009476576207287279669276754, - limb1: 21481346931245835267859588251, - limb2: 2591850645012785154, + limb0: 53501239858733417655337176603, + limb1: 7953171541805036367312206459, + limb2: 2260388091922254428, limb3: 0 }, u384 { - limb0: 10875884225909980400960686153, - limb1: 58699430500508817336957289974, - limb2: 1103493782239348247, + limb0: 42675959190324458143924098404, + limb1: 22399684814969690759336336937, + limb2: 1317736666458652486, limb3: 0 }, u384 { - limb0: 53069714211243737439559334654, - limb1: 17879549960853822273689888428, - limb2: 1073769112667182564, + limb0: 5187593910603894523924327009, + limb1: 9015783822958565701157778714, + limb2: 2720879751962340782, limb3: 0 }, u384 { - limb0: 32745107861770695754086616740, - limb1: 37427693583495099272966053739, - limb2: 3141443547215777683, + limb0: 36509562462470225025547700235, + limb1: 20725905240474450258718950166, + limb2: 3382939687557154791, limb3: 0 }, u384 { - limb0: 410515929634231926253481128, - limb1: 77478068392387527374826812320, - limb2: 728374660086463002, + limb0: 60321747459675039209086884630, + limb1: 58554748933969348161092874762, + limb2: 1222376060994509051, limb3: 0 }, u384 { - limb0: 74080874961659145828912797242, - limb1: 37688808466314259399665917059, - limb2: 3000080189254930657, + limb0: 42869213965599544397258055603, + limb1: 51978686755299197824435564427, + limb2: 1408372256713189188, limb3: 0 }, u384 { - limb0: 76369138410138386831978236897, - limb1: 22612933222794424303577785368, - limb2: 272839273426292967, + limb0: 40901376011092936982905491514, + limb1: 78325065791771849285482298076, + limb2: 969074623833825657, limb3: 0 } ]; - let (final_check_result) = run_BN254_MP_CHECK_FINALIZE_BN_2_circuit( + let (final_check_result, _final_lhs_result) = run_BN254_MP_CHECK_FINALIZE_BN_2_circuit( original_Q0, yInv_0, xNegOverY_0, @@ -13304,12 +17467,20 @@ mod tests { Q ); let final_check: u384 = u384 { - limb0: 4332281523367735651598531760, - limb1: 12099461003142266974284075941, - limb2: 168544470423153801, + limb0: 59724178876430620254281684935, + limb1: 2971525965040502559172056253, + limb2: 1011441304069634726, + limb3: 0 + }; + + let _final_lhs: u384 = u384 { + limb0: 40884153398236895213846077428, + limb1: 67427723782749599453325231623, + limb2: 3232659974392293691, limb3: 0 }; assert_eq!(final_check_result, final_check); + assert_eq!(_final_lhs_result, _final_lhs); } @@ -13317,874 +17488,1102 @@ mod tests { fn test_run_BN254_MP_CHECK_FINALIZE_BN_3_circuit_BN254() { let original_Q0: G2Point = G2Point { x0: u384 { - limb0: 66065923952928074454213327759, - limb1: 15882759161495554578483803677, - limb2: 2915620199412678418, + limb0: 31929096813449206370305068365, + limb1: 54785622682546144097089037839, + limb2: 2668515653967507911, limb3: 0 }, x1: u384 { - limb0: 19163106606486024800345091780, - limb1: 70385247219624604525014569247, - limb2: 2139282154871526834, + limb0: 67122667308314899450406384126, + limb1: 75862282366552548948707479055, + limb2: 3690122030873112, limb3: 0 }, y0: u384 { - limb0: 531068804258251873187384469, - limb1: 65496079605978218808101858954, - limb2: 871196268974053031, + limb0: 67439911035932614148305743914, + limb1: 36100094869982443221751151032, + limb2: 3327230255729175051, limb3: 0 }, y1: u384 { - limb0: 23367799990104276871110395519, - limb1: 22771840660275421621730762126, - limb2: 2557490494911733231, + limb0: 35190718873570430099501771512, + limb1: 56966110383132731270552202569, + limb2: 104245794371856868, limb3: 0 } }; let yInv_0: u384 = u384 { - limb0: 50817155581722961150019346974, - limb1: 32191975163827509482693838072, - limb2: 3091908999453694873, + limb0: 37420491393722979366613420524, + limb1: 60540143985500829748111079477, + limb2: 3198666630119054832, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 23945853069618677906900880069, - limb1: 76259844478779650715252869683, - limb2: 979143479077535174, + limb0: 75249532875794182585248044844, + limb1: 15083678361629862037768953253, + limb2: 939813328389222397, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 16933036523089150240942325029, - limb1: 69348242801574463196943114845, - limb2: 1641788245341145598, + limb0: 22074689588541089661588854764, + limb1: 5911746202327111176647582919, + limb2: 2279060493320119042, limb3: 0 }, x1: u384 { - limb0: 75953528367983810561843998971, - limb1: 47314954544989719774667292416, - limb2: 2927888466642967453, + limb0: 3700258132620708577193736204, + limb1: 58097125885905331504323694264, + limb2: 2091088751295830302, limb3: 0 }, y0: u384 { - limb0: 76259861803775751354921944229, - limb1: 66047824445675783605203515753, - limb2: 1231780166552540361, + limb0: 11197687105267344278320426064, + limb1: 36703310962535190712568939717, + limb2: 2017461864137699130, limb3: 0 }, y1: u384 { - limb0: 35726011316286944960001875518, - limb1: 37081686721132647069894564016, - limb2: 543948203541280545, + limb0: 12256769557021499061184749632, + limb1: 42409108383762289806377246663, + limb2: 3088031728240528873, limb3: 0 } }; let original_Q1: G2Point = G2Point { x0: u384 { - limb0: 29813919396156585488454179737, - limb1: 39640686381219987304642822951, - limb2: 2413260078643946973, + limb0: 48897386752358818127122781152, + limb1: 59068416927686681925773724385, + limb2: 191864074014702781, limb3: 0 }, x1: u384 { - limb0: 36782230673479557189505077480, - limb1: 57147052976565598575695803016, - limb2: 2123414761002259671, + limb0: 54683670688519566691615792941, + limb1: 20713746278382159900411297021, + limb2: 2217526574167606735, limb3: 0 }, y0: u384 { - limb0: 32291895685966117975376011306, - limb1: 10181713977736530080329769109, - limb2: 35264973256236401, + limb0: 62732799703088563058592140666, + limb1: 75063100652356451568020612426, + limb2: 1965088584895884148, limb3: 0 }, y1: u384 { - limb0: 40350860803533913420481106003, - limb1: 16612874977457357355366777417, - limb2: 3288487236312305282, + limb0: 6386362768748905711725725474, + limb1: 61431711785590890916707704012, + limb2: 1479248642712134365, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 26788873401984976600947403669, - limb1: 71964375465991070413344792649, - limb2: 1619150423479615016, + limb0: 10549879517878995656235909244, + limb1: 54379339571712200960234651580, + limb2: 473359745308805752, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 6451351954643020206948375212, - limb1: 51588477067420202387686404438, - limb2: 741019332098317702, + limb0: 38836787771916138402466972777, + limb1: 73640661363729188498090545507, + limb2: 1957991927492307333, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 15572891405710596451261182837, - limb1: 46452731471039194522059766414, - limb2: 1504367690205188086, + limb0: 32591445933854261969059408437, + limb1: 5582380112442234006362456441, + limb2: 1486628533498629373, limb3: 0 }, x1: u384 { - limb0: 54732438941839576034431344767, - limb1: 68449192843426580912130060568, - limb2: 1331078739169779316, + limb0: 46261533625755130938973128956, + limb1: 27989990300064996289565592024, + limb2: 1454553534862477373, limb3: 0 }, y0: u384 { - limb0: 71022334349699154152199211609, - limb1: 76176830754833327664276467878, - limb2: 2338160552459356364, + limb0: 60305243931028638155814083384, + limb1: 14261481657700868901053534, + limb2: 2598264423191497483, limb3: 0 }, y1: u384 { - limb0: 29460752125103056885189892373, - limb1: 75470467194626026752603719438, - limb2: 2397971521163258439, + limb0: 76214920434671259435557242956, + limb1: 73375977262811977687713785554, + limb2: 914726560373933870, limb3: 0 } }; let original_Q2: G2Point = G2Point { x0: u384 { - limb0: 50519307244078081469217968815, - limb1: 63618997072871021870514562524, - limb2: 2690845589937212142, + limb0: 27546225357481458594237984158, + limb1: 8894165015892236228501643581, + limb2: 1249082867940918523, limb3: 0 }, x1: u384 { - limb0: 24520140365711840621551322713, - limb1: 56955547569811554239981794154, - limb2: 2002709549439821561, + limb0: 76846345478068611969532435407, + limb1: 61541125220050198184939639723, + limb2: 2723530810249470305, limb3: 0 }, y0: u384 { - limb0: 64497338090795550820450128811, - limb1: 35503390707645593984528120438, - limb2: 2817071957566872376, + limb0: 59521332321718852406745241680, + limb1: 17122967215563888003689262272, + limb2: 2257941555485107441, limb3: 0 }, y1: u384 { - limb0: 40249071045301337661011499444, - limb1: 3802263201606410321712739066, - limb2: 3039477216753688301, + limb0: 55096630417534955700825409824, + limb1: 5419938436407173465933196480, + limb2: 1954849332599381664, limb3: 0 } }; let yInv_2: u384 = u384 { - limb0: 73685147707999158636375081206, - limb1: 60403070413635685203053451863, - limb2: 3417877362076067551, + limb0: 74706152284443301989180207395, + limb1: 61021045913500718111461423805, + limb2: 1455293556098639187, limb3: 0 }; let xNegOverY_2: u384 = u384 { - limb0: 68562371453852990094109718482, - limb1: 67300430160631988803607158284, - limb2: 3067884093432158137, + limb0: 20070398376915029013146209591, + limb1: 14029877122675162126192468707, + limb2: 3235361613833154774, limb3: 0 }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 19739916001986077184418558618, - limb1: 60074904283843105417343758194, - limb2: 446754332220173342, + limb0: 9674472617641963990586543652, + limb1: 31814501873488309031790630193, + limb2: 1397642105064027733, limb3: 0 }, x1: u384 { - limb0: 30453736951766028243485700073, - limb1: 76810116248127118197438390380, - limb2: 3442437098654368499, + limb0: 53836556613951864628792134394, + limb1: 39002918830805359559078806183, + limb2: 1430389255309894750, limb3: 0 }, y0: u384 { - limb0: 77388031758512175083317452732, - limb1: 39367790629768356998603345911, - limb2: 2469707418060019505, + limb0: 46145971605070437476865846041, + limb1: 55530888455457371064962342363, + limb2: 1393519731502708716, limb3: 0 }, y1: u384 { - limb0: 21213153245418479092724608863, - limb1: 22974159139985900553794009461, - limb2: 1718314276922763851, + limb0: 77131117375723520214261385121, + limb1: 12924056764415171557540226936, + limb2: 1704101022747020397, limb3: 0 } }; - let R_n_minus_2: E12D = E12D { + let R_n_minus_2 = E12D { w0: u384 { - limb0: 53023911856056787776895742555, - limb1: 77777114069399309639574300800, - limb2: 2201868401406583763, + limb0: 37383013646024319685933261912, + limb1: 21872122076385597906942856842, + limb2: 2992784132280383636, limb3: 0 }, w1: u384 { - limb0: 19652314761434753749812219664, - limb1: 30389894377062064275522035315, - limb2: 2060203960732163820, + limb0: 73003670198092490535771516843, + limb1: 67888363344692981944101150358, + limb2: 2236299994050094127, limb3: 0 }, w2: u384 { - limb0: 75586426115960909028459426345, - limb1: 46147295048615896284167033575, - limb2: 2641930473882702923, + limb0: 40976799466313116179810284758, + limb1: 29326934606462606937691699763, + limb2: 3122877196612193633, limb3: 0 }, w3: u384 { - limb0: 51790132126839830984914727886, - limb1: 18721819130210934134810581776, - limb2: 3079619906596462921, + limb0: 40238094969228054774224866857, + limb1: 54150418673126965892568824411, + limb2: 348572062727855075, limb3: 0 }, w4: u384 { - limb0: 55741530953779778851879418411, - limb1: 54690438712446250668742954392, - limb2: 2945536074439390534, + limb0: 64265398139114145781165576262, + limb1: 15863804999027842727236700904, + limb2: 1361339409712335466, limb3: 0 }, w5: u384 { - limb0: 12136610886323938858483421264, - limb1: 78343814715138227301839895393, - limb2: 1723040456831513904, + limb0: 33580471057793518331970261323, + limb1: 58442146033755799485011303083, + limb2: 1820515129481757154, limb3: 0 }, w6: u384 { - limb0: 17304351137299447384400598992, - limb1: 53902239774132764012656016238, - limb2: 2747709243572788325, + limb0: 34929829070565526664400675774, + limb1: 49870137782332084818578047406, + limb2: 715098846304479894, limb3: 0 }, w7: u384 { - limb0: 6486433945825208539202045815, - limb1: 41846185776335495842834651817, - limb2: 1668438220190909526, + limb0: 65767148926012623806793172004, + limb1: 27723768806769711747251338458, + limb2: 2699706968511397773, limb3: 0 }, w8: u384 { - limb0: 9209483177797550297687857769, - limb1: 56800093033323431422815884338, - limb2: 2254321125201357442, + limb0: 45367880701402297637685358322, + limb1: 58712989791715767560474237510, + limb2: 538526176124821226, limb3: 0 }, w9: u384 { - limb0: 40436101356884092827290039175, - limb1: 4407922744904605902700226379, - limb2: 608485851476009909, + limb0: 11036186669618128695965821968, + limb1: 67259027706196896920459442947, + limb2: 1954509730311714093, limb3: 0 }, w10: u384 { - limb0: 36191303803011983827250984419, - limb1: 44272475022915055199882869725, - limb2: 3102593439273741493, + limb0: 66475049407404751274051712830, + limb1: 59425420904917962646960926954, + limb2: 2642025687927410364, limb3: 0 }, w11: u384 { - limb0: 57304152272388153107807338806, - limb1: 20160177799506491383844356005, - limb2: 13906403236451364, + limb0: 29050697197408790698343603017, + limb1: 7805810127767194991131829129, + limb2: 2279439663835585915, limb3: 0 } }; - let R_n_minus_1: E12D = E12D { + let R_n_minus_1 = E12D { w0: u384 { - limb0: 45818538908177839709135637241, - limb1: 33568765442952840335747846189, - limb2: 3229955166307552048, + limb0: 36892817997244993874903913503, + limb1: 58401080270891477426231888312, + limb2: 1184538445016061826, limb3: 0 }, w1: u384 { - limb0: 2514295874534295129234860623, - limb1: 14259589604709115780350789329, - limb2: 624555404249750114, + limb0: 62827905292876128559644879637, + limb1: 18823781801195703833607129257, + limb2: 562498258691417438, limb3: 0 }, w2: u384 { - limb0: 77511548219992220818677254260, - limb1: 76358722103579329556317910909, - limb2: 1726896189910865692, + limb0: 46045328632761851470334625511, + limb1: 61770480685372803311988178197, + limb2: 737217158463715299, limb3: 0 }, w3: u384 { - limb0: 30303157447570908267697396103, - limb1: 72661341838849407925441746008, - limb2: 1740894650058794774, + limb0: 51512992011349297672313064065, + limb1: 19267605454683082571600302906, + limb2: 1044427138957987513, limb3: 0 }, w4: u384 { - limb0: 54091470917421618006732721751, - limb1: 69289284083444536757743397499, - limb2: 613307218922542344, + limb0: 12228579240931951690388025984, + limb1: 64226491315387103387012414378, + limb2: 2730303644078080381, limb3: 0 }, w5: u384 { - limb0: 27553169542837390388031783593, - limb1: 78661425855711162931454328404, - limb2: 1812662989347210667, + limb0: 5380693409027682082213629679, + limb1: 7563114697317580210415664577, + limb2: 2872893789976920225, limb3: 0 }, w6: u384 { - limb0: 23638751655344493221777636195, - limb1: 56972494209142387254703385698, - limb2: 1955945305985828113, + limb0: 61803127785597368088073072719, + limb1: 33263761286226839428548686954, + limb2: 191402597581641221, limb3: 0 }, w7: u384 { - limb0: 65233334909713182185390656798, - limb1: 36494494264149105586626839459, - limb2: 715371090043333808, + limb0: 11199618788494150873362968432, + limb1: 35772264033257249520481696213, + limb2: 1600429016605605710, limb3: 0 }, w8: u384 { - limb0: 74269299958302919334432930581, - limb1: 60648361019014293894296609949, - limb2: 148576113392837368, + limb0: 19162653073669152565786733051, + limb1: 7062896007640458320999428927, + limb2: 3324275385087139151, limb3: 0 }, w9: u384 { - limb0: 16327468376337349357410016493, - limb1: 47057103939440827472105044498, - limb2: 2058846015759873122, + limb0: 60626686099997136385754390398, + limb1: 45812951411588050919291322676, + limb2: 2525897804043189794, limb3: 0 }, w10: u384 { - limb0: 55720078161204908314853928519, - limb1: 19389837001322364617894744119, - limb2: 204005916038928810, + limb0: 56315881753501772626589831724, + limb1: 45119043916109298368001777264, + limb2: 2459297481937213224, limb3: 0 }, w11: u384 { - limb0: 23908241693810703177879067635, - limb1: 78094848038129380868026955577, - limb2: 2403846224349474407, + limb0: 73207529981061687121347949126, + limb1: 7521658278243136467419240356, + limb2: 2993196962858524462, limb3: 0 } }; let c_n_minus_3: u384 = u384 { - limb0: 23808138318977881007021507037, - limb1: 44107753216901545714716277974, - limb2: 2728582986236836159, + limb0: 4117425054325549108766492475, + limb1: 61107708467002276126521089353, + limb2: 2353769128861118759, limb3: 0 }; let w_of_z: u384 = u384 { - limb0: 72222623364786838198572871164, - limb1: 53776125276394775079854376793, - limb2: 2563408750930887799, + limb0: 33582306178164472062595025527, + limb1: 66785709076960808621204858370, + limb2: 3429216567196819252, limb3: 0 }; let z: u384 = u384 { - limb0: 77032769072462189177839091994, - limb1: 50968749557242331669954531822, - limb2: 1757765482449803919, + limb0: 20369361355853926579481108364, + limb1: 69737560141908704570217176631, + limb2: 1220894088552277906, limb3: 0 }; let c_inv_frob_1_of_z: u384 = u384 { - limb0: 25252745424521194644427144572, - limb1: 32345624587646139253376763010, - limb2: 1382991577465692184, + limb0: 1231472605168128212498603308, + limb1: 20735118299237990720825393985, + limb2: 3260283692884440815, limb3: 0 }; let c_frob_2_of_z: u384 = u384 { - limb0: 59771001339276502909923078635, - limb1: 19091466605364248184515570352, - limb2: 1039218304997025871, + limb0: 8657098532431853044595567235, + limb1: 34549579673642344537038075635, + limb2: 1487726279815143201, limb3: 0 }; let c_inv_frob_3_of_z: u384 = u384 { - limb0: 56060009986710708580612116417, - limb1: 36684632631694240386976595042, - limb2: 265743507571636817, + limb0: 50783078282365790575598563086, + limb1: 28323292670223673189107078761, + limb2: 3325120837238690902, limb3: 0 }; let previous_lhs: u384 = u384 { - limb0: 76675921611257434175297848989, - limb1: 41990277612872434944128860781, - limb2: 1791266718972372742, + limb0: 34971836057591475902785590436, + limb1: 66380465544313959026815398297, + limb2: 1972361035245565291, limb3: 0 }; let R_n_minus_3_of_z: u384 = u384 { - limb0: 16109995707773253347583982025, - limb1: 6264604965108503460820295044, - limb2: 2074275590803227288, + limb0: 32494142866328035675340591534, + limb1: 8363929977093637692030742647, + limb2: 404892356551657426, limb3: 0 }; let Q: Array = array![ u384 { - limb0: 7325752289550721091379248064, - limb1: 65712335985421788708392102162, - limb2: 237670756400719702, + limb0: 55522408518305697986150126542, + limb1: 38029945981908562619358360628, + limb2: 1813806961188739497, + limb3: 0 + }, + u384 { + limb0: 7655721714141303631592755286, + limb1: 53503763018812190572454793217, + limb2: 1366583306422196338, + limb3: 0 + }, + u384 { + limb0: 23877195268905884122818075193, + limb1: 9857799902794131526778864119, + limb2: 3084232394364072555, + limb3: 0 + }, + u384 { + limb0: 10638594018957385066012775, + limb1: 120542114935408716834494855, + limb2: 1564760326973028966, + limb3: 0 + }, + u384 { + limb0: 36541935864788789533360611392, + limb1: 13564443444346451244335986930, + limb2: 2073992621243641390, + limb3: 0 + }, + u384 { + limb0: 8180619192049872198614881481, + limb1: 26115978459286231397418028997, + limb2: 957960267705553854, + limb3: 0 + }, + u384 { + limb0: 9114253818770666200821006742, + limb1: 23866567963282311723392098351, + limb2: 426689718886444527, + limb3: 0 + }, + u384 { + limb0: 54193046973451653436385783436, + limb1: 13118128767705961005657882433, + limb2: 2145545776647657163, + limb3: 0 + }, + u384 { + limb0: 44424656307529235825196354315, + limb1: 76120849242653632623674801422, + limb2: 463217952886970881, + limb3: 0 + }, + u384 { + limb0: 49939827345606239704436398630, + limb1: 16531765737509021365449939583, + limb2: 3335587863644959527, + limb3: 0 + }, + u384 { + limb0: 33708593831673103603035696581, + limb1: 663015841848809631003560151, + limb2: 1941185646769583438, + limb3: 0 + }, + u384 { + limb0: 47732885851260472586430164808, + limb1: 27477346847009857113400026508, + limb2: 1447335330198555387, + limb3: 0 + }, + u384 { + limb0: 67575766874380849956533573669, + limb1: 37043669468654343552057885026, + limb2: 3433679881369432886, + limb3: 0 + }, + u384 { + limb0: 20066575967284410650236004891, + limb1: 61433650139957473136275281762, + limb2: 860104202870806791, + limb3: 0 + }, + u384 { + limb0: 71311906696514685795167692249, + limb1: 50918262836453942542430869060, + limb2: 1716995674407566346, + limb3: 0 + }, + u384 { + limb0: 62461854985208865503582984563, + limb1: 22684326907109156264289426382, + limb2: 1139985748912790914, + limb3: 0 + }, + u384 { + limb0: 64680300301549414011038453496, + limb1: 55460859076843018214709401333, + limb2: 1530026980173724528, + limb3: 0 + }, + u384 { + limb0: 34928622021414282344290160915, + limb1: 15639450639880471258121636090, + limb2: 940922385168431389, + limb3: 0 + }, + u384 { + limb0: 78595889763305535732163043043, + limb1: 6952538211497294257883684413, + limb2: 2393520380193423130, + limb3: 0 + }, + u384 { + limb0: 74553393661011555450054271048, + limb1: 48601612047409408764416078232, + limb2: 958595530108741065, + limb3: 0 + }, + u384 { + limb0: 1808068530306947561579521500, + limb1: 56841564934576314717829587155, + limb2: 1580563094996991133, + limb3: 0 + }, + u384 { + limb0: 60975962542295206456716192413, + limb1: 35563720832604337215447380210, + limb2: 2369610937141727570, + limb3: 0 + }, + u384 { + limb0: 5086720305151157128499016528, + limb1: 6819479104923690187601557891, + limb2: 1747438429758301585, + limb3: 0 + }, + u384 { + limb0: 30183259947939074713217857068, + limb1: 55108112812510175734651077802, + limb2: 2953214529543241665, + limb3: 0 + }, + u384 { + limb0: 22436094781916109185054474396, + limb1: 31734224734635226835761606678, + limb2: 3038932258618329, + limb3: 0 + }, + u384 { + limb0: 50326405419029871820185422364, + limb1: 38434638548950200992833288974, + limb2: 1840456691736186972, + limb3: 0 + }, + u384 { + limb0: 78519875147198602289262062276, + limb1: 76840570062401205412297501866, + limb2: 3328615114504978503, + limb3: 0 + }, + u384 { + limb0: 51205544538289018412065269997, + limb1: 27465238143854271582407788615, + limb2: 1957487544959101410, + limb3: 0 + }, + u384 { + limb0: 29847854861269829562534373933, + limb1: 26847061195025633529729338107, + limb2: 844169805449595239, + limb3: 0 + }, + u384 { + limb0: 39385214438305494481900708621, + limb1: 61460483729360366875599654456, + limb2: 817052202039149984, + limb3: 0 + }, + u384 { + limb0: 2534130000662423669077955326, + limb1: 78405473933060390265726234955, + limb2: 45709142971783403, + limb3: 0 + }, + u384 { + limb0: 78245230293096471525112544818, + limb1: 53801649691071770015542247633, + limb2: 3113701375644535329, + limb3: 0 + }, + u384 { + limb0: 22931787995400550217619538862, + limb1: 24680618954548386822132077247, + limb2: 2450327714620144876, + limb3: 0 + }, + u384 { + limb0: 37937246896392664887193578441, + limb1: 71001701482888079052504614763, + limb2: 3048139750717971918, + limb3: 0 + }, + u384 { + limb0: 64552797998020726950836922433, + limb1: 58130843513412314166957878588, + limb2: 1407771853627689397, + limb3: 0 + }, + u384 { + limb0: 4741938959198140559678512936, + limb1: 56340110177959767040481191212, + limb2: 1354499901214835058, + limb3: 0 + }, + u384 { + limb0: 29223108314932218610734584065, + limb1: 24468251788387263153972412307, + limb2: 5408205888363058, + limb3: 0 + }, + u384 { + limb0: 3415038750574092369339676379, + limb1: 47058467315680790180847205350, + limb2: 780485343407072441, + limb3: 0 + }, + u384 { + limb0: 6437088331033215242292189887, + limb1: 1601922267692449364892185385, + limb2: 3424327100743604273, limb3: 0 }, u384 { - limb0: 53373788132966541171493561858, - limb1: 3133280119030438170955040521, - limb2: 335658496867800866, + limb0: 63033268699351199164828140749, + limb1: 56172528710138599401100413159, + limb2: 2801720567482859616, limb3: 0 }, u384 { - limb0: 60347807592100898461356619825, - limb1: 53197791314384436735068856949, - limb2: 1000812061943452478, + limb0: 9175319073946783073562641325, + limb1: 7931711293936743828190334013, + limb2: 2246952015097238071, limb3: 0 }, u384 { - limb0: 74249446207702044789227448575, - limb1: 58745718128592943307792147598, - limb2: 3444372478347472672, + limb0: 67317117569761349660466538359, + limb1: 10299778614747442920478013823, + limb2: 2889349372245169362, limb3: 0 }, u384 { - limb0: 37944020883832562943516734310, - limb1: 55113192097621221645657625388, - limb2: 3245559745682738965, + limb0: 2780520271651546327239415081, + limb1: 43816582887562220386515734980, + limb2: 434695767102616700, limb3: 0 }, u384 { - limb0: 72503787746268904017303894324, - limb1: 25480966126187085250357938988, - limb2: 1305380151022326782, + limb0: 55360493710905517997077254100, + limb1: 31088401173059695524075379522, + limb2: 1414473613698351888, limb3: 0 }, u384 { - limb0: 42280119052185244992070159432, - limb1: 24435730954541507293564017180, - limb2: 1658568052732965877, + limb0: 28866776670982651674429166265, + limb1: 74662975485556655194899826885, + limb2: 2330771615095705061, limb3: 0 }, u384 { - limb0: 39398366155023859807039255002, - limb1: 63605685389727592511768890106, - limb2: 3331544575955677102, + limb0: 632013528296514755416804096, + limb1: 20425327733936575879849259107, + limb2: 3142824068417742723, limb3: 0 }, u384 { - limb0: 66530358825855400605528393265, - limb1: 16093417741717256403875974906, - limb2: 1443098103831233685, + limb0: 38338839738165935079253297209, + limb1: 21828737317746345794440077012, + limb2: 1202495322660547490, limb3: 0 }, u384 { - limb0: 44567800385550642679563899889, - limb1: 58728064045893413324436318744, - limb2: 74801090924327138, + limb0: 69104145854106128965634455740, + limb1: 72691689579230710681415428521, + limb2: 1620074044966749392, limb3: 0 }, u384 { - limb0: 74059178692652694320799946647, - limb1: 57045222820202162282668694872, - limb2: 1361334150193636738, + limb0: 25631485344871526365393839379, + limb1: 50135257887461643479661813105, + limb2: 2313572786818699625, limb3: 0 }, u384 { - limb0: 26134620592915913797724827429, - limb1: 45143376198364124050589122595, - limb2: 1133229667249504833, + limb0: 11457280740752097577477934840, + limb1: 25424371841862185224559773091, + limb2: 2927462573194627183, limb3: 0 }, u384 { - limb0: 76574674185946085727384361318, - limb1: 58596680605418433660042549243, - limb2: 2125198653946047503, + limb0: 53153589666988183069730610554, + limb1: 27937593424499576057431419869, + limb2: 1841873406649948046, limb3: 0 }, u384 { - limb0: 62984449383741148955023596598, - limb1: 11088656828480991330872866738, - limb2: 2520500048922834858, + limb0: 75854751898832276157500118391, + limb1: 73571166577385078711998200023, + limb2: 1788691490322688264, limb3: 0 }, u384 { - limb0: 60557162425210043757344337051, - limb1: 10893201091059193213645643473, - limb2: 2908597967238791849, + limb0: 2534549364385340546528110418, + limb1: 18346754628833872673916672260, + limb2: 155634188977073263, limb3: 0 }, u384 { - limb0: 56027745528402833630111414272, - limb1: 17328757677280912690264006912, - limb2: 2102973375075300961, + limb0: 33365344225620418300483762107, + limb1: 61669251328028818598214401415, + limb2: 734382232151272636, limb3: 0 }, u384 { - limb0: 38651806883135503573949039739, - limb1: 42166217039879128525060898628, - limb2: 1896964049149133607, + limb0: 3697961715062195101967506413, + limb1: 21208906385886138405320451794, + limb2: 366917525897845849, limb3: 0 }, u384 { - limb0: 41944786954337648045869017694, - limb1: 42445545483455565553421360982, - limb2: 1322117540658026024, + limb0: 51384015934023935640218475337, + limb1: 61287679020071410716488263415, + limb2: 1229786024660873765, limb3: 0 }, u384 { - limb0: 8478714668604153397229578304, - limb1: 41546091886777243953262837700, - limb2: 1111272610376590677, + limb0: 20075911297692410695836682242, + limb1: 75320735976135140363410755867, + limb2: 2415528789495178864, limb3: 0 }, u384 { - limb0: 29556191118966623068407660805, - limb1: 36365547947329617981884107348, - limb2: 1121598439392803775, + limb0: 13544265944979405951229043199, + limb1: 69058729971310762189577984920, + limb2: 2814089903651004249, limb3: 0 }, u384 { - limb0: 17894255523827696133929429363, - limb1: 65605836511669437962813907797, - limb2: 371779927630795163, + limb0: 32325984775637033452329663866, + limb1: 54966759658533286051101803750, + limb2: 196602272621928906, limb3: 0 }, u384 { - limb0: 67995126656895830833898404186, - limb1: 2510305332586026846090394506, - limb2: 1869016256899687969, + limb0: 2380341882351557165844524472, + limb1: 12572265171621387226593626884, + limb2: 793134402033118394, limb3: 0 }, u384 { - limb0: 43789519530941675261788648048, - limb1: 50448380061564188167017035874, - limb2: 3241301162794374019, + limb0: 50938918480510485813628996742, + limb1: 67951499623144928274471750182, + limb2: 873790222361372928, limb3: 0 }, u384 { - limb0: 39602861579976946897175694145, - limb1: 51094815759021956141144311947, - limb2: 1527716086689882818, + limb0: 28814089384047499620563443367, + limb1: 68883500388481643085983416890, + limb2: 1051681892290220441, limb3: 0 }, u384 { - limb0: 16750184629276910442523175953, - limb1: 54848683286656484238025151258, - limb2: 2613830513616929347, + limb0: 58137963613476351273975217795, + limb1: 63812476850260035592453914132, + limb2: 3450400438247453672, limb3: 0 }, u384 { - limb0: 3689019213319622367894987530, - limb1: 54226031392934695683365385132, - limb2: 1292992289164173395, + limb0: 50030575269394277072712783575, + limb1: 30505552541548071380706634862, + limb2: 2766449105048849461, limb3: 0 }, u384 { - limb0: 31556261649969598876976693517, - limb1: 23711158079128878060915048340, - limb2: 2600798158092392162, + limb0: 68819117473531699502032432810, + limb1: 48696902204805108335293828631, + limb2: 2279702102002729671, limb3: 0 }, u384 { - limb0: 66127829984856886641276458484, - limb1: 53640236317236006751288233728, - limb2: 2492904227672864376, + limb0: 31081599290562405746053704439, + limb1: 53774368270652558711364016654, + limb2: 1758318411203088138, limb3: 0 }, u384 { - limb0: 59865533398518170805240348467, - limb1: 62629710681295342018427351187, - limb2: 3178883794560934963, + limb0: 65544707852764210527666409203, + limb1: 57098843080913037403190639527, + limb2: 3453719093945273117, limb3: 0 }, u384 { - limb0: 39676897033835903782039505063, - limb1: 27401812644757148737331412384, - limb2: 450496169265532079, + limb0: 5004721907736741480475458642, + limb1: 12540106802669398813604111453, + limb2: 2621892678422792863, limb3: 0 }, u384 { - limb0: 66446652103167651470498923531, - limb1: 47946407234769551424935554704, - limb2: 2830953711354613237, + limb0: 13973445976662057785291907245, + limb1: 41326209541174119695269154586, + limb2: 2973927465201661556, limb3: 0 }, u384 { - limb0: 31430053136485270871744813446, - limb1: 25858222245764710351959174378, - limb2: 2924375947015982111, + limb0: 42662557740841501963406439067, + limb1: 38860703102907847382416873781, + limb2: 553248268538025122, limb3: 0 }, u384 { - limb0: 78640755201780325721893814925, - limb1: 18074985447489569851914535397, - limb2: 2550436321597747544, + limb0: 24966454190043522741558369444, + limb1: 57178172095830049764621899738, + limb2: 1731298625296730532, limb3: 0 }, u384 { - limb0: 34214519237190053437742431438, - limb1: 46417809344748153632398803941, - limb2: 1752776048960981836, + limb0: 33424607147745241576594153718, + limb1: 51984097601846168312677030386, + limb2: 1875460909735140404, limb3: 0 }, u384 { - limb0: 49011800606914760516360473780, - limb1: 19525763287699131176029388120, - limb2: 338989750122596346, + limb0: 56447912740539441840606134247, + limb1: 2322705178440946695859182086, + limb2: 3130071248594892821, limb3: 0 }, u384 { - limb0: 12218643498001805356461748592, - limb1: 62106186745474177113940012523, - limb2: 711476565259015197, + limb0: 75129641846285220828599377172, + limb1: 43519802011487355017993993763, + limb2: 2416178625130043797, limb3: 0 }, u384 { - limb0: 28515601770119186098034482616, - limb1: 8099607534694123031583234712, - limb2: 402587428619811497, + limb0: 58952956480976101579132584455, + limb1: 71293750442196727725220758666, + limb2: 2666310639925015996, limb3: 0 }, u384 { - limb0: 35561059779314423023665735806, - limb1: 40599746659964672147205820967, - limb2: 476354553968956741, + limb0: 46518098871267527078920936546, + limb1: 48104610675088002114718810509, + limb2: 969597673282878098, limb3: 0 }, u384 { - limb0: 71395352876893255750875274767, - limb1: 78652189418338635060705347967, - limb2: 1119452301844122834, + limb0: 5283327071257305812768393240, + limb1: 13097284696814904934284512801, + limb2: 2796253884674152378, limb3: 0 }, u384 { - limb0: 13435743572647055742768775077, - limb1: 13429312260310293751025163888, - limb2: 1240169840221291959, + limb0: 61421455605293778540467791599, + limb1: 73077698493797017249069924062, + limb2: 1216575404618065704, limb3: 0 }, u384 { - limb0: 39069303825744241023876788297, - limb1: 13247535031532482552802311196, - limb2: 1272649500875747761, + limb0: 42395421483881524831781561112, + limb1: 47153797802041227143409572710, + limb2: 1414485597461953171, limb3: 0 }, u384 { - limb0: 49520270496539531187641681602, - limb1: 48857535315983094992182503565, - limb2: 2111514118074626752, + limb0: 39923695507235711151696979108, + limb1: 5058746645318451340765082729, + limb2: 1567813266352340119, limb3: 0 }, u384 { - limb0: 63705500099909868401665043016, - limb1: 34878053047893529695159387998, - limb2: 1985866791753172452, + limb0: 2137382159614158857332258116, + limb1: 6177677041600800985613646594, + limb2: 2414416421961072073, limb3: 0 }, u384 { - limb0: 68097276310759111007450365976, - limb1: 47092659150862513455619529189, - limb2: 1385513195658612147, + limb0: 49824485057935950079272697937, + limb1: 10725992906473255777847575680, + limb2: 1191151569273001162, limb3: 0 }, u384 { - limb0: 75051168515484721103142067336, - limb1: 37951061700687702575594515731, - limb2: 819207305880817863, + limb0: 26132179255741140992801178489, + limb1: 7976585730141206524078235383, + limb2: 3122829839809020727, limb3: 0 }, u384 { - limb0: 76750319395875708731978046683, - limb1: 58222745579928207268097753474, - limb2: 2918747433886859421, + limb0: 52082085019880137836913796196, + limb1: 45961779402901139126530077491, + limb2: 832377664399722071, limb3: 0 }, u384 { - limb0: 45625857385944902514458666922, - limb1: 25819367988051833855222446333, - limb2: 1292656261447624969, + limb0: 52064657877169960843575624052, + limb1: 32084046972305912667870267667, + limb2: 2918592749392623273, limb3: 0 }, u384 { - limb0: 31131528466079143364376512726, - limb1: 73845967527194007307430242456, - limb2: 921415077487739359, + limb0: 33098453676365747490883198523, + limb1: 74763943203978409231560968702, + limb2: 1991968510707665874, limb3: 0 }, u384 { - limb0: 43229190320195498489467908303, - limb1: 60816956345395838877652989363, - limb2: 124128620256119906, + limb0: 70264840325132753303945097506, + limb1: 34005823488055627573001192138, + limb2: 948563201749786503, limb3: 0 }, u384 { - limb0: 39558876473320275797421686999, - limb1: 23992874219235629822201904672, - limb2: 1165288601982146919, + limb0: 25499615653711756568023315718, + limb1: 63374542395824340316329455095, + limb2: 2074674098863484664, limb3: 0 }, u384 { - limb0: 56666864946633634305269441266, - limb1: 29868290045521462088191581459, - limb2: 2070954709856772353, + limb0: 12856310011781670507331819985, + limb1: 10105734038880010053631278946, + limb2: 1567321693476873492, limb3: 0 }, u384 { - limb0: 60922816388352606084196819023, - limb1: 52662475654572076896719999127, - limb2: 767100883080174509, + limb0: 39393884284946784862117142688, + limb1: 42520573848558986352652412459, + limb2: 2787962037124535989, limb3: 0 }, u384 { - limb0: 3509545312504371447920183333, - limb1: 51104636963280900272195318885, - limb2: 2982578464670796887, + limb0: 25198495269523818673495256643, + limb1: 52364853919815118454552785257, + limb2: 752514048694466495, limb3: 0 }, u384 { - limb0: 59633673608231629403131304226, - limb1: 63083924045751506426866664825, - limb2: 488583026036594088, + limb0: 28225998430298122039481213553, + limb1: 79143269043222570900785552167, + limb2: 518591200976679001, limb3: 0 }, u384 { - limb0: 20499366064744978234855342676, - limb1: 59171793322588323215960248351, - limb2: 2573290431690305081, + limb0: 14991744263681027761081879184, + limb1: 23960595073737576734779894404, + limb2: 860322354892426246, limb3: 0 }, u384 { - limb0: 45574844072187026823781865684, - limb1: 29640805990310106465903675705, - limb2: 2135502129738112614, + limb0: 44191623917446460999141233624, + limb1: 75947025286564563898487697848, + limb2: 365979846567855292, limb3: 0 }, u384 { - limb0: 8283253674974066890469129462, - limb1: 72933289929721772305702548019, - limb2: 395935378243308589, + limb0: 70939278690203749051504463392, + limb1: 55867915408313319460531701208, + limb2: 235137975167722501, limb3: 0 }, u384 { - limb0: 74528043391931758026046224452, - limb1: 27597439022133617788294211691, - limb2: 1582115818309159867, + limb0: 7071157160023900497565742312, + limb1: 38396955480951895579875419505, + limb2: 649383003415786466, limb3: 0 }, u384 { - limb0: 16389717846579004346238807531, - limb1: 27595192399467847342948337669, - limb2: 450206780478572970, + limb0: 4571884385224650727515125818, + limb1: 11978795682070529378480963089, + limb2: 552185552616912804, limb3: 0 }, u384 { - limb0: 55203273552968352400025560223, - limb1: 5322099874740231045765108823, - limb2: 206064199915150187, + limb0: 48132109796873595115563520034, + limb1: 22287813431033615285812669976, + limb2: 2659614505049479053, limb3: 0 }, u384 { - limb0: 9117994323468993366797604984, - limb1: 27181435552212574529368105803, - limb2: 504346330041244501, + limb0: 71471679428953770605312785913, + limb1: 35859283367319609553879740981, + limb2: 1230535088536672785, limb3: 0 }, u384 { - limb0: 13021472815938077376296583389, - limb1: 58667621587456678701554427304, - limb2: 2379601879499871283, + limb0: 49650008820171436099699858166, + limb1: 64057164701783933632965075072, + limb2: 1203157986455302004, limb3: 0 }, u384 { - limb0: 12687257985753680919877187459, - limb1: 33780462685511401705291103480, - limb2: 2130848698318311021, + limb0: 14039413519172135499580004740, + limb1: 65364328906271703786284465914, + limb2: 395094512821687712, limb3: 0 }, u384 { - limb0: 32091163750569126729927549576, - limb1: 14767093435152743958889101540, - limb2: 3031297691594681441, + limb0: 41208239631472574275803659016, + limb1: 60713821728584809477448130419, + limb2: 3116280163861165615, limb3: 0 }, u384 { - limb0: 2312850012247299494028270867, - limb1: 69966182707770158190134918112, - limb2: 2073298800457538212, + limb0: 68854579066170353488405534183, + limb1: 66136692226681327451189880080, + limb2: 1531143231389980764, limb3: 0 }, u384 { - limb0: 30806744808508136482032754769, - limb1: 17017900832827741341074301768, - limb2: 1283638946813594301, + limb0: 27661903936280391625256413308, + limb1: 17919858125214860153903656513, + limb2: 1066024845502665955, limb3: 0 }, u384 { - limb0: 14812484367118804660795345290, - limb1: 15613833006542909884818824377, - limb2: 525524538082068038, + limb0: 72557895196031617462042601825, + limb1: 34401467950663197490006731574, + limb2: 1663523074202070935, limb3: 0 }, u384 { - limb0: 68345108554377785570321078144, - limb1: 76527781179726066042274763374, - limb2: 1445321360445054662, + limb0: 9592904154259912499028161677, + limb1: 15792655389563450083777066654, + limb2: 2845117716642339018, limb3: 0 }, u384 { - limb0: 48432843099172859022968820875, - limb1: 9050397555693225591432922002, - limb2: 1623243939959117532, + limb0: 15505763585487123748696970039, + limb1: 56183104384789528883520052319, + limb2: 507966090619345079, limb3: 0 }, u384 { - limb0: 48684479055569648058473207843, - limb1: 53250046722689931684741465651, - limb2: 1444314330178414246, + limb0: 48540240876461674821799432186, + limb1: 58416267517466254748215921669, + limb2: 1733014745510915274, limb3: 0 }, u384 { - limb0: 24194696792237031274610175613, - limb1: 29576353781092996693196037400, - limb2: 651901228770725560, + limb0: 58503170339620450020486765201, + limb1: 11076514713664381324942221760, + limb2: 387600839756981473, limb3: 0 }, u384 { - limb0: 33136315734738665630524074785, - limb1: 45540826605766173148438289610, - limb2: 1950922040395092220, + limb0: 1483718809849803193492351804, + limb1: 60610549812973151166531956730, + limb2: 504471679620498600, limb3: 0 }, u384 { - limb0: 43964703994449881320715283151, - limb1: 22883848879323800598260200175, - limb2: 862839895073913174, + limb0: 71891649421561027159645091733, + limb1: 15353940008428061854178489411, + limb2: 289202304770619624, limb3: 0 }, u384 { - limb0: 10817394603448816425422294899, - limb1: 30419191303313185485939273920, - limb2: 2589840218198474951, + limb0: 30329619063319524090989957621, + limb1: 75387524492422383148103950704, + limb2: 2857412130506332030, limb3: 0 }, u384 { - limb0: 39215551870359166704186319563, - limb1: 38958538237257276364966135643, - limb2: 3274953646347305348, + limb0: 29168583205465213865341200551, + limb1: 16622214791416542588135470921, + limb2: 3319132663400567679, limb3: 0 }, u384 { - limb0: 23141746808062260117243206486, - limb1: 17813930939854560561551291529, - limb2: 1331256829742725099, + limb0: 58378913562611383325969187305, + limb1: 582539555267025502297423118, + limb2: 2056459920274719024, limb3: 0 } ]; - let (final_check_result) = run_BN254_MP_CHECK_FINALIZE_BN_3_circuit( + let (final_check_result, _final_lhs_result) = run_BN254_MP_CHECK_FINALIZE_BN_3_circuit( original_Q0, yInv_0, xNegOverY_0, @@ -14210,199 +18609,207 @@ mod tests { Q ); let final_check: u384 = u384 { - limb0: 50801170460009427382248693841, - limb1: 72924171155181406255929528425, - limb2: 1543434376278168115, + limb0: 24526927939551269587992109034, + limb1: 4016562779802078940005132838, + limb2: 3069135618690925336, + limb3: 0 + }; + + let _final_lhs: u384 = u384 { + limb0: 68609226732907581092056295978, + limb1: 63757759850510372103937559682, + limb2: 1598911649338111283, limb3: 0 }; assert_eq!(final_check_result, final_check); + assert_eq!(_final_lhs_result, _final_lhs); } #[test] fn test_run_BN254_MP_CHECK_INIT_BIT_2_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 30234473638225319530009760858, - limb1: 74384307462784120735046718239, - limb2: 1441228053028963263, + limb0: 8436736687330539318791550220, + limb1: 14893282171954378934371235271, + limb2: 217312682037417590, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 17456219967606268679977829277, - limb1: 65984530803955978122561797588, - limb2: 2849126111207940923, + limb0: 20169690185504152538593895356, + limb1: 24627590954014138784258986803, + limb2: 177416878818280418, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 29721785300803886058609294390, - limb1: 26284554431805019373869874564, - limb2: 1552534505033406359, + limb0: 44399814541956825741234811494, + limb1: 51338162914211177306418257884, + limb2: 1263142333440202247, limb3: 0 }, x1: u384 { - limb0: 24125107179209079637070854668, - limb1: 9358385910142293562064784335, - limb2: 3094691180473231713, + limb0: 33241493633556792548263266205, + limb1: 58213394946693329387754946189, + limb2: 1825074075170186156, limb3: 0 }, y0: u384 { - limb0: 68127081121255448055037323873, - limb1: 36963613409827791021689803501, - limb2: 607454655022777410, + limb0: 37950966781329938835011766782, + limb1: 42428840709666089535363157638, + limb2: 2019548025316975755, limb3: 0 }, y1: u384 { - limb0: 74364493706330226543095633120, - limb1: 74312728767276618227889214295, - limb2: 1983952458965918667, + limb0: 2662162581436215061160468738, + limb1: 41319727535882258318374758051, + limb2: 2349358027132720653, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 38285654519563132659296532849, - limb1: 39047142119306285724421940831, - limb2: 1429829815471556041, + limb0: 24504361670110187154243459873, + limb1: 41330714160711574837501003389, + limb2: 1602171186428807617, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 5312586153868579156724620225, - limb1: 54053822640165900558489616579, - limb2: 1840781639280580166, + limb0: 31068674151227685874282217044, + limb1: 77159390331424787984504208935, + limb2: 847440450561048653, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 18015871188612021816098643153, - limb1: 29643480479606962864145632224, - limb2: 906129076030139846, + limb0: 32302619734423098930542685956, + limb1: 25065779761686729548796304009, + limb2: 3459744820240614426, limb3: 0 }, x1: u384 { - limb0: 41810818834458729986647897421, - limb1: 19724314208447480539003709764, - limb2: 479194239669756553, + limb0: 17464532406627659303395661671, + limb1: 50838038698646719537214482093, + limb2: 879110948454948392, limb3: 0 }, y0: u384 { - limb0: 39411273298498505703578336863, - limb1: 17548362112213934842435961756, - limb2: 1394571152065672527, + limb0: 7766050973058504395126359892, + limb1: 13496660373176857920382759414, + limb2: 2971419355571939611, limb3: 0 }, y1: u384 { - limb0: 1056152636602344559905930138, - limb1: 77160140300154809871818229867, - limb2: 3048042988790456656, + limb0: 70488807004167945851580558525, + limb1: 60266322006558371884650139803, + limb2: 1447031213145768050, limb3: 0 } }; - let R_i: E12D = E12D { + let R_i = E12D { w0: u384 { - limb0: 48950184091056392163319088082, - limb1: 6463554465505433407553616899, - limb2: 2043497895317506089, + limb0: 68652363622391896691548157163, + limb1: 71590476185503395459284349466, + limb2: 556296320186746532, limb3: 0 }, w1: u384 { - limb0: 38478084703374874537639596153, - limb1: 32815016693131147500705109325, - limb2: 994136384458343213, + limb0: 48970255773288294031132880826, + limb1: 31634871561716177005379903234, + limb2: 1435182316460810781, limb3: 0 }, w2: u384 { - limb0: 9017551945901160541165188134, - limb1: 8785592936750571612133998470, - limb2: 3127727965077690172, + limb0: 24919153742992842556802789114, + limb1: 130034321325176858648922344, + limb2: 2175637043055850216, limb3: 0 }, w3: u384 { - limb0: 38555018789562111634395186800, - limb1: 24435501704085413701917943635, - limb2: 1016961802491164904, + limb0: 70590593608968827887267376732, + limb1: 65027798886365151293818140789, + limb2: 1989256348301490822, limb3: 0 }, w4: u384 { - limb0: 10872861035061796836021071381, - limb1: 22932364180853739960192207983, - limb2: 553330142915580834, + limb0: 45586510869709030398016785436, + limb1: 32206473263892644171114627753, + limb2: 1215007074043178982, limb3: 0 }, w5: u384 { - limb0: 59184556126505658868915934798, - limb1: 10235146068813342402762729530, - limb2: 2456102566251284071, + limb0: 25892680486105489857545959366, + limb1: 14326292638442238490394943009, + limb2: 3221947841678541130, limb3: 0 }, w6: u384 { - limb0: 39634866370069687440400174302, - limb1: 52928229229714358210403009006, - limb2: 1633307806216168118, + limb0: 18518290914818918512858840057, + limb1: 641147932105966346159805219, + limb2: 2465301084834809975, limb3: 0 }, w7: u384 { - limb0: 68276007046030082301855238691, - limb1: 34560877345361549460034186149, - limb2: 2120242238185029342, + limb0: 58712917790692182310368421174, + limb1: 67166948205804054822679327738, + limb2: 2399094484452375856, limb3: 0 }, w8: u384 { - limb0: 68303392430757510286924664108, - limb1: 34011405204049429992602648006, - limb2: 1865071348679332442, + limb0: 73549195812559701950068368734, + limb1: 37608413100817446569655225095, + limb2: 1705616585298464, limb3: 0 }, w9: u384 { - limb0: 63487281348680149131386421756, - limb1: 36452631875620878995636541936, - limb2: 3180264978061960806, + limb0: 46175012992090631706023952691, + limb1: 29113664974231617401603587914, + limb2: 1555639245517579223, limb3: 0 }, w10: u384 { - limb0: 6982368638758900147038848969, - limb1: 8387341851605878842233477085, - limb2: 2009203337249553673, + limb0: 50765213597479777785721101234, + limb1: 40963402582106368657991311623, + limb2: 1160845638058944183, limb3: 0 }, w11: u384 { - limb0: 41512589782797861685987132624, - limb1: 68970049872239205242722465599, - limb2: 3439417701824341835, + limb0: 56635611217506672887878641935, + limb1: 1911913716890414130495628653, + limb2: 654385467914839345, limb3: 0 } }; let c0: u384 = u384 { - limb0: 26388415011974121649596946355, - limb1: 6051397654297148830189372619, - limb2: 2920233345750075484, + limb0: 15976839731542164805609032545, + limb1: 39643406941001030750618906694, + limb2: 2580691199795836389, limb3: 0 }; let z: u384 = u384 { - limb0: 40402564892663277268394629520, - limb1: 61499136351352329933995355213, - limb2: 1619161723874355289, + limb0: 72181655488159272013108874211, + limb1: 40326887468098580618380581546, + limb2: 2064607997252674786, limb3: 0 }; let c_inv_of_z: u384 = u384 { - limb0: 64883792658241509173914600526, - limb1: 11701194222123139740097822756, - limb2: 474102207956655493, + limb0: 36041098325779233182029497004, + limb1: 10211065230958409234146588318, + limb2: 1173371722591452804, limb3: 0 }; let previous_lhs: u384 = u384 { - limb0: 14034961843530626418932150364, - limb1: 49751227477989704891583947197, - limb2: 2139605885532402713, + limb0: 19685831582634456606235603946, + limb1: 61419260299906231527930745625, + limb2: 1892091242894949548, limb3: 0 }; @@ -14412,76 +18819,76 @@ mod tests { ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 13384320744069878297178470556, - limb1: 73725473303924488444894495485, - limb2: 209932012237007324, + limb0: 35979061174568858872210709706, + limb1: 54015644715047811118239555437, + limb2: 2753357348605503653, limb3: 0 }, x1: u384 { - limb0: 21837512857870961091434585321, - limb1: 74979485709268761197271916385, - limb2: 1438766481009641954, + limb0: 32476673015836046054056895124, + limb1: 60679169268160490704027697232, + limb2: 3179553710389041463, limb3: 0 }, y0: u384 { - limb0: 18895807297020507736203134822, - limb1: 23620911739681991459322296854, - limb2: 700991498023044194, + limb0: 69713342386186006343860126318, + limb1: 9003465679953651529173572572, + limb2: 877983206971440110, limb3: 0 }, y1: u384 { - limb0: 25058423168264072372226814488, - limb1: 43455565414997427803476057503, - limb2: 1056188691689858179, + limb0: 19983554935071813661935280609, + limb1: 64370498564390543558403126061, + limb2: 3426339749143287146, limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 41817627688033328906377267077, - limb1: 36028913795806482477582445063, - limb2: 715042158596260247, + limb0: 7479639266809992592536168147, + limb1: 64158502386793107345192535523, + limb2: 600290742046710915, limb3: 0 }, x1: u384 { - limb0: 18213018763222400127246677474, - limb1: 39382991030014039102829726280, - limb2: 447598492905333076, + limb0: 15333813775210744759683541796, + limb1: 9555468603043992771932484476, + limb2: 1311560053879586174, limb3: 0 }, y0: u384 { - limb0: 18063261753490915712164433878, - limb1: 32972263657361875193867917809, - limb2: 2899891784415139031, + limb0: 18068682888026273093622921, + limb1: 23876276017950312850804430188, + limb2: 531853916401029333, limb3: 0 }, y1: u384 { - limb0: 29164477435322808786585687932, - limb1: 46944242117116129152997860192, - limb2: 516552567574282560, + limb0: 75697871580026675203923863627, + limb1: 41682847266337500596742395046, + limb2: 3481347153331003037, limb3: 0 } }; let new_lhs: u384 = u384 { - limb0: 35763281436540021312789977847, - limb1: 19084184022949587469963896490, - limb2: 3236754758811252634, + limb0: 812077316939372236513945037, + limb1: 6512209281933347541097811827, + limb2: 2519514860943327781, limb3: 0 }; let c_i: u384 = u384 { - limb0: 15164296025777040492108371447, - limb1: 64578417636670072652808614158, - limb2: 1288045277525238356, + limb0: 41348179085229001866877532914, + limb1: 19948580139174606941964807942, + limb2: 2065289114160507314, limb3: 0 }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 46902973165296857149869746010, - limb1: 14123577316418206824965696524, - limb2: 1570582732106774750, + limb0: 57184833788492784102073450595, + limb1: 52455064633207685933157811245, + limb2: 1507667772388064498, limb3: 0 }; assert_eq!(Q0_result, Q0); @@ -14495,228 +18902,228 @@ mod tests { #[test] fn test_run_BN254_MP_CHECK_INIT_BIT_3_circuit_BN254() { let yInv_0: u384 = u384 { - limb0: 62092235637613735025731567135, - limb1: 48079506013028707828201197151, - limb2: 1139297591294160618, + limb0: 42614890725717984271195967867, + limb1: 49265756029185915352823390771, + limb2: 742778130523002825, limb3: 0 }; let xNegOverY_0: u384 = u384 { - limb0: 31643018694490749755878403266, - limb1: 23819096624488279136937392331, - limb2: 2037837161857900072, + limb0: 35959512528527022700017035821, + limb1: 8596087296127202567195763781, + limb2: 235393588143160956, limb3: 0 }; let Q0: G2Point = G2Point { x0: u384 { - limb0: 33769858552255441168088865944, - limb1: 41001261958718026281252691595, - limb2: 1619238742028650343, + limb0: 1017394922389336619339981030, + limb1: 13986297608783013371255600202, + limb2: 1602222107939530159, limb3: 0 }, x1: u384 { - limb0: 25432568039855132509412031761, - limb1: 65023853641104396217016830974, - limb2: 3404534744047011985, + limb0: 48887651714098511785154784367, + limb1: 50128172093191680185877512378, + limb2: 130174662815993653, limb3: 0 }, y0: u384 { - limb0: 15729129222775416500413086798, - limb1: 2468812004693193398373681292, - limb2: 176279352179769721, + limb0: 40020842434311883389608690183, + limb1: 72688122522306899294200607525, + limb2: 1582558109738677194, limb3: 0 }, y1: u384 { - limb0: 60062404240411510169675291848, - limb1: 21139123540183846552951271878, - limb2: 2458486727270046083, + limb0: 35947752151104408197265010565, + limb1: 48218600834213103759420586293, + limb2: 1479223054529976912, limb3: 0 } }; let yInv_1: u384 = u384 { - limb0: 78034755754520431113076531816, - limb1: 21390443745400751298634584764, - limb2: 2196063173665496630, + limb0: 75781454632302476965322751821, + limb1: 2683333440586778895183679049, + limb2: 56073559126439557, limb3: 0 }; let xNegOverY_1: u384 = u384 { - limb0: 36642615358539555374235545670, - limb1: 59671002186911373967155114512, - limb2: 1020871898604328868, + limb0: 62666600962572378431255034614, + limb1: 60931300856343389865144345777, + limb2: 2215229874800095982, limb3: 0 }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 69540819765736613075064950449, - limb1: 55038729236782904695420455624, - limb2: 48305127733908771, + limb0: 31512483911210207970476733575, + limb1: 12755456016173942442305645318, + limb2: 1670073148330615779, limb3: 0 }, x1: u384 { - limb0: 71288605114793263249088807254, - limb1: 15279050933681144216954598933, - limb2: 1444500076149710163, + limb0: 39677605067094766095519514752, + limb1: 38029896677842630225141759135, + limb2: 1988961841116757001, limb3: 0 }, y0: u384 { - limb0: 34958080940162507156959219285, - limb1: 52793688793529330162134312526, - limb2: 230123252682789375, + limb0: 36065897565026407402822424969, + limb1: 5642778421096624600511880406, + limb2: 1374133222330426886, limb3: 0 }, y1: u384 { - limb0: 50761894301801390182268329545, - limb1: 8291749282062842684110000230, - limb2: 3078569634761421621, + limb0: 4866520791238069053055753473, + limb1: 41885997802588735672954636507, + limb2: 2675358903281057145, limb3: 0 } }; let yInv_2: u384 = u384 { - limb0: 61300277429627758196588745792, - limb1: 65371702344221602371746612207, - limb2: 1201715663805072000, + limb0: 57586357294587522539965950398, + limb1: 53666321073120892400135537485, + limb2: 3119722154478468708, limb3: 0 }; let xNegOverY_2: u384 = u384 { - limb0: 51324685172287042751258424223, - limb1: 21947049935458474193614297183, - limb2: 1590499684733687622, + limb0: 65822080864228896420962152147, + limb1: 10691993175746280139660318242, + limb2: 3382606722338183660, limb3: 0 }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 61006692264021327587583740886, - limb1: 5452840047198647813936378193, - limb2: 905495562604064068, + limb0: 60991181882785449148801909919, + limb1: 26054618774544967551520216684, + limb2: 1605297473332700979, limb3: 0 }, x1: u384 { - limb0: 5623048473775077427032016316, - limb1: 16474942938119103132672044561, - limb2: 1323758991818633581, + limb0: 24887069490639900400169044901, + limb1: 10032634212564587979517443706, + limb2: 2237303798981682052, limb3: 0 }, y0: u384 { - limb0: 38264501596283009616878207336, - limb1: 12802603797697691894285356421, - limb2: 2525430768964335568, + limb0: 18450342426571093309087547907, + limb1: 45088968851958855927952866943, + limb2: 1266761334262939388, limb3: 0 }, y1: u384 { - limb0: 16037613092941217002962625503, - limb1: 46241588865978471759099665735, - limb2: 2110662394902654450, + limb0: 19898969138613733781337133129, + limb1: 42687011606697467886778407339, + limb2: 2293909645236143451, limb3: 0 } }; - let R_i: E12D = E12D { + let R_i = E12D { w0: u384 { - limb0: 37683213711367430600081249279, - limb1: 75878582990126893923558857619, - limb2: 2077671149597553790, + limb0: 57355407802952232347002109325, + limb1: 41136087046772969438560595665, + limb2: 2503121083105756304, limb3: 0 }, w1: u384 { - limb0: 71236166552923914896542734683, - limb1: 77832604571724359931940198877, - limb2: 388899464835588695, + limb0: 47099998407085857757075303179, + limb1: 12054436728086864517720143117, + limb2: 3176228236232214552, limb3: 0 }, w2: u384 { - limb0: 32386047933525779174386284223, - limb1: 53787818865071521340915405568, - limb2: 241493313403685979, + limb0: 71214560539815909844506915169, + limb1: 73587625385874626062469017234, + limb2: 2758082330296836740, limb3: 0 }, w3: u384 { - limb0: 51284813869307326018676770476, - limb1: 26120793132515949475084866669, - limb2: 2573151152668510883, + limb0: 19249948755232897653393997052, + limb1: 47851313726077813442024944844, + limb2: 1465074839335292610, limb3: 0 }, w4: u384 { - limb0: 69188343332762451578483774268, - limb1: 6457252387363983399172627918, - limb2: 3060370677160635067, + limb0: 15559743507936529575039347037, + limb1: 4933121752200094085296535090, + limb2: 1119946687609630195, limb3: 0 }, w5: u384 { - limb0: 27715658260901228010582353528, - limb1: 51978009774839646770852223176, - limb2: 3053559460821701933, + limb0: 53415950094176208175010075009, + limb1: 52356443885689500673772039249, + limb2: 502923712475740624, limb3: 0 }, w6: u384 { - limb0: 47144022747530892273128004548, - limb1: 6712131780807089477576435038, - limb2: 2577573093006426671, + limb0: 59994819647147234910502696701, + limb1: 73254895354466208318312831185, + limb2: 2924111405446491279, limb3: 0 }, w7: u384 { - limb0: 62721922625347861428420087324, - limb1: 10124864822119198723182889495, - limb2: 3241235298013462423, + limb0: 70149534095998784879408293365, + limb1: 39093529419513935678603442101, + limb2: 886117937259836742, limb3: 0 }, w8: u384 { - limb0: 58531759711808383649221879720, - limb1: 72291577403896224041541182895, - limb2: 430975742503925451, + limb0: 44159279369173998090423121632, + limb1: 56846673481420923847174942749, + limb2: 1802328820865981287, limb3: 0 }, w9: u384 { - limb0: 33545708500132510870861373929, - limb1: 1444372227779776890998115634, - limb2: 1424393362308543337, + limb0: 52546727230028840960173780162, + limb1: 78582390663913760313492206645, + limb2: 310473554228695835, limb3: 0 }, w10: u384 { - limb0: 16970091156379210610406438382, - limb1: 60701148816258494319717762394, - limb2: 885467854449426510, + limb0: 36752281456572119649762728627, + limb1: 16639497179252436776216649737, + limb2: 1696530043009905383, limb3: 0 }, w11: u384 { - limb0: 61074987645848044802490522730, - limb1: 58521406751332346541577759379, - limb2: 2428198578208439955, + limb0: 1685826783340539348513163453, + limb1: 6937873060060689181816957783, + limb2: 1901569277590821463, limb3: 0 } }; let c0: u384 = u384 { - limb0: 26681222254814605844287181249, - limb1: 48965497803442129444833806021, - limb2: 2754313075234205212, + limb0: 69238161660661937232108690614, + limb1: 42850067641650218881786886268, + limb2: 2920942860173916462, limb3: 0 }; let z: u384 = u384 { - limb0: 12854548382922917635362436769, - limb1: 54892886997441064982891195332, - limb2: 2881106942127155841, + limb0: 30118537958020207789746262065, + limb1: 5232646377878285644055052519, + limb2: 2789361769079530542, limb3: 0 }; let c_inv_of_z: u384 = u384 { - limb0: 13115363849027183435967200570, - limb1: 3461671064677420322483303155, - limb2: 1680034501783062454, + limb0: 39038642117437292429920446803, + limb1: 16159100659374509497653780633, + limb2: 2845472305631074125, limb3: 0 }; let previous_lhs: u384 = u384 { - limb0: 18819081064573781521648197317, - limb1: 48376353285332691747329209713, - limb2: 3469791796332136813, + limb0: 12151975343442127049480534287, + limb1: 8729794004627307850677060432, + limb2: 2062128962316845007, limb3: 0 }; @@ -14741,103 +19148,103 @@ mod tests { ); let Q0: G2Point = G2Point { x0: u384 { - limb0: 114858644870650597231200147, - limb1: 18267584061566108831833788781, - limb2: 2813839632915688647, + limb0: 19251192001347628047728699154, + limb1: 63143911230450336092700152960, + limb2: 3442555680242623703, limb3: 0 }, x1: u384 { - limb0: 21000744876217345411380989839, - limb1: 17409271236355688983755019315, - limb2: 2838862442373317344, + limb0: 44786618999801383165931836215, + limb1: 14384520143422552559303688824, + limb2: 3203431721500245216, limb3: 0 }, y0: u384 { - limb0: 2965287108278113353927554802, - limb1: 27632061619934763414419065984, - limb2: 491792928364395528, + limb0: 22704708157614631553358224521, + limb1: 68364880463274458861820037848, + limb2: 1348472765744500318, limb3: 0 }, y1: u384 { - limb0: 23213129055946261837224660914, - limb1: 2669651130609949595526032212, - limb2: 574053958570116093, + limb0: 46585022162272559020736082, + limb1: 32538928614493388437197272433, + limb2: 1532720394943760146, limb3: 0 } }; let Q1: G2Point = G2Point { x0: u384 { - limb0: 44699511033900221245357284853, - limb1: 73860392616477063665188413651, - limb2: 1079505370343957676, + limb0: 18744368379070650790001745951, + limb1: 77984972866710145916156554266, + limb2: 2227383209925463996, limb3: 0 }, x1: u384 { - limb0: 3985740842997349724119586740, - limb1: 77185057960430424093070359606, - limb2: 673030160716745877, + limb0: 57564723241604907459808333123, + limb1: 27787634208160212889606174128, + limb2: 370636501365627048, limb3: 0 }, y0: u384 { - limb0: 24652278188506567341959519109, - limb1: 13385606199308430123912278263, - limb2: 2180499106893702233, + limb0: 41325540127050167594082984105, + limb1: 885439653924479587871622609, + limb2: 722079692841878352, limb3: 0 }, y1: u384 { - limb0: 1047452106883285053489777120, - limb1: 53706348299633935578325906583, - limb2: 272956823010348300, + limb0: 26459057241028324962499598171, + limb1: 3871883677630902646846950621, + limb2: 906874523907229381, limb3: 0 } }; let Q2: G2Point = G2Point { x0: u384 { - limb0: 77080257543473396202347334540, - limb1: 69776519454874455612777674903, - limb2: 2295455060528427657, + limb0: 67270890016137884064853655819, + limb1: 49088054909869782536336699278, + limb2: 504089350346896475, limb3: 0 }, x1: u384 { - limb0: 61135438425628028842479370137, - limb1: 13572696621205425251438865229, - limb2: 500931024915100743, + limb0: 34398739751257789402747675688, + limb1: 32226414856372423564390257011, + limb2: 304409488928690665, limb3: 0 }, y0: u384 { - limb0: 10004684074309091880716331079, - limb1: 6874764866333197357450579239, - limb2: 252697978114749348, + limb0: 73425767737133513168006657185, + limb1: 29560731902110064219378607864, + limb2: 1423746059154951283, limb3: 0 }, y1: u384 { - limb0: 75725673656714922867651446672, - limb1: 28532552437587813595131482540, - limb2: 1572205008641256146, + limb0: 35939822483355883618890250998, + limb1: 49958749001378723071458669360, + limb2: 2131277108588970910, limb3: 0 } }; let new_lhs: u384 = u384 { - limb0: 36232203672429545643899144412, - limb1: 33978739666853465087499357989, - limb2: 2489689600560002150, + limb0: 3718128980213553535037556628, + limb1: 7964142153066354541314875581, + limb2: 277496136779861141, limb3: 0 }; let c_i: u384 = u384 { - limb0: 40426779447366812394780880320, - limb1: 35465779397411600813918612349, - limb2: 1789470518153613385, + limb0: 75292785982145018084782423814, + limb1: 70105346298443986114814411235, + limb2: 924924918540852994, limb3: 0 }; let f_i_plus_one_of_z: u384 = u384 { - limb0: 70353999240075856332259510833, - limb1: 34954325272728568703760868365, - limb2: 346209706157690403, + limb0: 6134980251612219339270883039, + limb1: 34884967620921470171284255290, + limb2: 282977932475493674, limb3: 0 }; assert_eq!(Q0_result, Q0); @@ -14851,206 +19258,206 @@ mod tests { #[test] fn test_run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit_BN254() { - let lambda_root: E12D = E12D { + let lambda_root = E12D { w0: u384 { - limb0: 32348530858024728078868829639, - limb1: 3592744325410968664056691049, - limb2: 171610653646008893, + limb0: 73955362770057848882111020916, + limb1: 11305331660430972841921856160, + limb2: 1649237130484661850, limb3: 0 }, w1: u384 { - limb0: 39029743339205774992390936133, - limb1: 18602774827232231696440627815, - limb2: 2478996165750910234, + limb0: 14015287804042660151540585764, + limb1: 25723101760383619261592269199, + limb2: 1752963995163783886, limb3: 0 }, w2: u384 { - limb0: 35941361193217777779108143374, - limb1: 75217693713392782649365011547, - limb2: 3211965469867011671, + limb0: 23064143363136065070009257005, + limb1: 2765135843393035962008918388, + limb2: 1893313542256730901, limb3: 0 }, w3: u384 { - limb0: 2592051239993596463807916599, - limb1: 17213877892003692861889854415, - limb2: 2050797652534201807, + limb0: 57668269013120043253904814220, + limb1: 10629463913098397361201934781, + limb2: 508664097103215486, limb3: 0 }, w4: u384 { - limb0: 67775746894387172603709592928, - limb1: 77717100777266378177987018266, - limb2: 1694033489303223788, + limb0: 13132704165771850143472419052, + limb1: 45690579751419802437512227406, + limb2: 2137605581412589417, limb3: 0 }, w5: u384 { - limb0: 77472666712588545743124569409, - limb1: 4797272463723103367575330464, - limb2: 1272278604523010765, + limb0: 56312988188237726813438070059, + limb1: 6165932981199454388095043920, + limb2: 1961939925987070678, limb3: 0 }, w6: u384 { - limb0: 9678490069161370079171398443, - limb1: 65299145282709910585301163759, - limb2: 422769034650999704, + limb0: 43885808331711628552423042426, + limb1: 12119389645993665012307570078, + limb2: 758491092220664492, limb3: 0 }, w7: u384 { - limb0: 50841065774546846668552877642, - limb1: 76937938853888598110497001166, - limb2: 233252209284329129, + limb0: 58302283039662639128435121361, + limb1: 62845779268386337754279900328, + limb2: 3155281507649443630, limb3: 0 }, w8: u384 { - limb0: 19297515645726961054274772699, - limb1: 62350828911867254326094421487, - limb2: 946343686152138415, + limb0: 55076052719734784260582682052, + limb1: 29800798926802856777603037758, + limb2: 3411721698306364697, limb3: 0 }, w9: u384 { - limb0: 26031169352814878388446845977, - limb1: 62482795222269126185267823854, - limb2: 2748480190828589993, + limb0: 24183791119880028431831289387, + limb1: 72479818074391934199740929246, + limb2: 1745830259340366309, limb3: 0 }, w10: u384 { - limb0: 68009940043291454900803327139, - limb1: 78239974089360065623061251225, - limb2: 2491304091364829717, + limb0: 75164736444848672102482833490, + limb1: 24256376622029447206460022123, + limb2: 1891257903402342694, limb3: 0 }, w11: u384 { - limb0: 13825086332014962754447925148, - limb1: 68647074228414932436004381198, - limb2: 607835110554306353, + limb0: 64407908820215540787274869508, + limb1: 77106348553075271644473439327, + limb2: 680897993778232857, limb3: 0 } }; let z: u384 = u384 { - limb0: 62589033474817270750032814819, - limb1: 46653735021394180396859958843, - limb2: 72777410472488921, + limb0: 55209875852685193781652355136, + limb1: 55306856926399327576239573858, + limb2: 2747577437254952230, limb3: 0 }; let scaling_factor: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { w0: u384 { - limb0: 4151478183251406727761585710, - limb1: 33351931671505497125534515053, - limb2: 524114904340073100, + limb0: 77779967843764946864411040194, + limb1: 21128509574656814243262863433, + limb2: 3375383533521755835, limb3: 0 }, w2: u384 { - limb0: 37732092629447400187236707193, - limb1: 28683682660648908599479904790, - limb2: 2737801276969684999, + limb0: 29778279441516612857196911029, + limb1: 2853884113489289061735285895, + limb2: 532181675341198210, limb3: 0 }, w4: u384 { - limb0: 39918213878711579092428977836, - limb1: 48733784934022290576311286791, - limb2: 3353816348178905230, + limb0: 64758244199314254565995779732, + limb1: 25222577286414459867275418662, + limb2: 3117382642239996401, limb3: 0 }, w6: u384 { - limb0: 68689304087490863220555616357, - limb1: 23897616927875537737037504310, - limb2: 2966885224459421254, + limb0: 67848466570559193034261753427, + limb1: 70191544040125742712630265117, + limb2: 118896270411703166, limb3: 0 }, w8: u384 { - limb0: 4819084699530860024356825995, - limb1: 67129906945978494766775755198, - limb2: 1965840089683616625, + limb0: 67309566965325298154031429163, + limb1: 78731803720596620846254286313, + limb2: 1885724716587762026, limb3: 0 }, w10: u384 { - limb0: 48194287442401190975179239260, - limb1: 9997927726397883000550929599, - limb2: 2879156264634905294, + limb0: 16486053105978210888132758738, + limb1: 54165843460295958344539892670, + limb2: 1218073467282208473, limb3: 0 } }; - let c_inv: E12D = E12D { + let c_inv = E12D { w0: u384 { - limb0: 43445272631878126506295251193, - limb1: 30178355159993152693592892746, - limb2: 2754983660777106602, + limb0: 10637736581276740872202573407, + limb1: 13574556094113647884803951072, + limb2: 2033581497069020375, limb3: 0 }, w1: u384 { - limb0: 67565201436882084061382168800, - limb1: 69539050526138233778943509686, - limb2: 2542584972831276507, + limb0: 72593361513602150287445855969, + limb1: 63568218407633871508674389779, + limb2: 2970189470054756956, limb3: 0 }, w2: u384 { - limb0: 17035882260747629317826606829, - limb1: 70361819709461090037174702146, - limb2: 1908378266947718676, + limb0: 26504041808206168725568964881, + limb1: 69199175886302684603409507936, + limb2: 180344751002568193, limb3: 0 }, w3: u384 { - limb0: 35929884725506956604622518500, - limb1: 57805858740019930776271531625, - limb2: 1441374862984055727, + limb0: 8065887409496938898341597165, + limb1: 40208310316078105698257927424, + limb2: 2540080683578227919, limb3: 0 }, w4: u384 { - limb0: 52695274180530494441361795060, - limb1: 75551383096477959168832075052, - limb2: 3167402939661899820, + limb0: 37449469184147634284849391499, + limb1: 18204306027512824630904301582, + limb2: 1680139565832012718, limb3: 0 }, w5: u384 { - limb0: 5318848934111001807298281301, - limb1: 6763261652414254970859848172, - limb2: 1991678899374648705, + limb0: 67516596723133538645904431284, + limb1: 72636819603573513631064533405, + limb2: 2107175956069581514, limb3: 0 }, w6: u384 { - limb0: 58533449540510171611906208325, - limb1: 10308808319958257447821756622, - limb2: 276613436898430979, + limb0: 5426488480244224812914819524, + limb1: 44852668295603369426664393406, + limb2: 1890710114633680403, limb3: 0 }, w7: u384 { - limb0: 44493459691695508293649863496, - limb1: 53083920220020036007065451370, - limb2: 1894520442841631905, + limb0: 21037182806557947695051257850, + limb1: 64529124235386424376472075250, + limb2: 1368258125783773058, limb3: 0 }, w8: u384 { - limb0: 76724443588163983100324835013, - limb1: 24754752271414615725266048174, - limb2: 477773275913878545, + limb0: 64322434779221628227453533735, + limb1: 52166777173220298294694650254, + limb2: 261521769250366329, limb3: 0 }, w9: u384 { - limb0: 66977382272283866770139525938, - limb1: 9102152327114214361285487105, - limb2: 1284669144355708780, + limb0: 10839110021676362708303216760, + limb1: 15727024575208981722372016133, + limb2: 152478803691462598, limb3: 0 }, w10: u384 { - limb0: 48612283253047197369389837369, - limb1: 44109468313663035901026715162, - limb2: 2808493327013941809, + limb0: 44231270463284578087009674878, + limb1: 47673388752408039179187209260, + limb2: 3293285524865238374, limb3: 0 }, w11: u384 { - limb0: 65716654330084571604934227912, - limb1: 2293907638690150291935286246, - limb2: 1260237224686894967, + limb0: 7727324451163395984018494332, + limb1: 19148580741642502529474139817, + limb2: 2295425438161682615, limb3: 0 } }; let c_0: u384 = u384 { - limb0: 24480288611119754958680101130, - limb1: 27810940922274926112453288455, - limb2: 836585472381691424, + limb0: 24679213248894779945634340966, + limb1: 710840269509446185907310043, + limb2: 1636526625172595363, limb3: 0 }; @@ -15067,51 +19474,51 @@ mod tests { lambda_root, z, scaling_factor, c_inv, c_0 ); let c_of_z: u384 = u384 { - limb0: 55294240156276719054463270236, - limb1: 667546056183488857237683399, - limb2: 895977177379364823, + limb0: 10113454306249608874013815587, + limb1: 8469659913684241835975024193, + limb2: 3354241974032641102, limb3: 0 }; let scaling_factor_of_z: u384 = u384 { - limb0: 23419728984145634651914716790, - limb1: 73376596255697195864875614587, - limb2: 696294771534627827, + limb0: 40004111974245422455084827081, + limb1: 26777386998462487132721494230, + limb2: 2421617065081589416, limb3: 0 }; let c_inv_of_z: u384 = u384 { - limb0: 51425125390013603783211302120, - limb1: 28150569468004767968249357925, - limb2: 371015650984907105, + limb0: 52481048651057678051398988582, + limb1: 7636492054791143979373548420, + limb2: 1797880032790175150, limb3: 0 }; let lhs: u384 = u384 { - limb0: 17012615046585564243934612914, - limb1: 62843028762366946447931336406, - limb2: 613422644348128316, + limb0: 72136202568765376236465559721, + limb1: 60147387928287444386264455240, + limb2: 1799483691734666777, limb3: 0 }; let c_inv_frob_1_of_z: u384 = u384 { - limb0: 75528119862349441109365690401, - limb1: 70251829204840027895545984361, - limb2: 2796096591874704940, + limb0: 70223080942565258915380792109, + limb1: 68159850705241073977643607613, + limb2: 1507246194560406457, limb3: 0 }; let c_frob_2_of_z: u384 = u384 { - limb0: 47420838089935972142893710267, - limb1: 39947934131573152509554539939, - limb2: 1739337804948088113, + limb0: 11462910544081125922508675873, + limb1: 42819823630259236739771881003, + limb2: 3469400611012510638, limb3: 0 }; let c_inv_frob_3_of_z: u384 = u384 { - limb0: 12894054534322000608060639685, - limb1: 8060154595841384276242846687, - limb2: 2072675743511113239, + limb0: 33956324626302579502480183840, + limb1: 10520394465303686011257649284, + limb2: 3181713012624468364, limb3: 0 }; assert_eq!(c_of_z_result, c_of_z); @@ -15128,59 +19535,59 @@ mod tests { fn test_run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit_BN254() { let p_0: G1Point = G1Point { x: u384 { - limb0: 70556734050842565848291241581, - limb1: 58050264873474175134803095378, - limb2: 925931021986593588, + limb0: 1460919488391403584707437445, + limb1: 32740733855413454919989260855, + limb2: 3312386017676031604, limb3: 0 }, y: u384 { - limb0: 14038949321681701724284220804, - limb1: 79086964293215410597809039987, - limb2: 692840025956076736, + limb0: 64239921957959740773185726562, + limb1: 17046125465325680736363791779, + limb2: 2344307043140535701, limb3: 0 } }; let Qy0_0: u384 = u384 { - limb0: 35164172637413633709427913299, - limb1: 32788174005925879893088924887, - limb2: 1147070028174346510, + limb0: 23470482717836997631536197043, + limb1: 46303497922699478825839031908, + limb2: 3357104927878383050, limb3: 0 }; let Qy1_0: u384 = u384 { - limb0: 14465280333466500616340334339, - limb1: 56366146424070553874245182265, - limb2: 1162009387839751450, + limb0: 3693059289487175868275819995, + limb1: 32796102247879431765420080329, + limb2: 822273181009806519, limb3: 0 }; let p_1: G1Point = G1Point { x: u384 { - limb0: 73008541784748497387092230171, - limb1: 51094529715297593352353656666, - limb2: 1471959629879265301, + limb0: 46896721706606870132051272417, + limb1: 1352959753330217202863730983, + limb2: 2498961738221087250, limb3: 0 }, y: u384 { - limb0: 12515826679991286710914193096, - limb1: 37258088270956290443497093944, - limb2: 2947275057470926218, + limb0: 38319424800458183675506071907, + limb1: 22267536658110947240240909700, + limb2: 3231788605519469929, limb3: 0 } }; let Qy0_1: u384 = u384 { - limb0: 12197621641096932281273716365, - limb1: 23460145356398347127480075226, - limb2: 2832970238638287316, + limb0: 41978728299607522992283864882, + limb1: 42671996334397429921255623748, + limb2: 425070741442700381, limb3: 0 }; let Qy1_1: u384 = u384 { - limb0: 14515889760088572654607931857, - limb1: 65828950749331816210515352210, - limb2: 168339560509673848, + limb0: 13509286536817450982807349151, + limb1: 32382112185483478884475776596, + limb2: 858945581748338412, limb3: 0 }; @@ -15189,54 +19596,54 @@ mod tests { ); let p_0: BNProcessedPair = BNProcessedPair { yInv: u384 { - limb0: 9259161435090404268079345020, - limb1: 65687451014403256091598314103, - limb2: 2325223505750453868, + limb0: 57011380306817652490709681975, + limb1: 78821727495295582906218196669, + limb2: 1301834067660943918, limb3: 0 }, xNegOverY: u384 { - limb0: 54697452236070132465655645274, - limb1: 50746066496101437777605617471, - limb2: 1148622336019555805, + limb0: 20939397936465622929922317450, + limb1: 55443948572467482667897130297, + limb2: 1383732076845488628, limb3: 0 }, QyNeg0: u384 { - limb0: 76387996039240115060894665460, - limb1: 24254111076697359568790844857, - limb2: 2339928238628624155, + limb0: 8853523444552413545242431380, + limb1: 10738787159923760636040737837, + limb2: 129893338924587615, limb3: 0 }, QyNeg1: u384 { - limb0: 17858725828922910560438294084, - limb1: 676138658552685587634587480, - limb2: 2324988878963219215, + limb0: 28630946872902235308502808428, + limb1: 24246182834743807696459689416, + limb2: 2664725085793164146, limb3: 0 } }; let p_1: BNProcessedPair = BNProcessedPair { yInv: u384 { - limb0: 41362225379810841058801015822, - limb1: 54474187635863045878091692174, - limb2: 2413890021205557679, + limb0: 72402353196382020788150983616, + limb1: 45192978955482715708105240391, + limb2: 3413036606119788248, limb3: 0 }, xNegOverY: u384 { - limb0: 35137550185854697786183474820, - limb1: 11275058708583437680907525440, - limb2: 1783406261418935870, + limb0: 25675156318222312945815757675, + limb1: 6826057401433888291868297225, + limb2: 1502655196920756476, limb3: 0 }, QyNeg0: u384 { - limb0: 20126384521292478895504912058, - limb1: 33582139726224892334399694519, - limb2: 654028028164683349, + limb0: 69573440377046225778038713877, + limb1: 14370288748225809540624145996, + limb2: 3061927525360270284, limb3: 0 }, QyNeg1: u384 { - limb0: 17808116402300838522170696566, - limb1: 70441496847555760844908367871, - limb2: 3318658706293296816, + limb0: 18814719625571960193971279272, + limb1: 24660172897139760577403993149, + limb2: 2628052685054632253, limb3: 0 } }; @@ -15249,88 +19656,88 @@ mod tests { fn test_run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit_BN254() { let p_0: G1Point = G1Point { x: u384 { - limb0: 12377941077409553786097612947, - limb1: 17782104531748736835525248671, - limb2: 2784392756598634541, + limb0: 17463371978957606967426645910, + limb1: 46633192462276396956509381322, + limb2: 2039381653746947174, limb3: 0 }, y: u384 { - limb0: 10051682615325258802350045923, - limb1: 75010617618362871145782529740, - limb2: 1008451027441420102, + limb0: 46826665369323305637219806716, + limb1: 15827076858150522101941310339, + limb2: 79675863563346525, limb3: 0 } }; let Qy0_0: u384 = u384 { - limb0: 56480597269194861113570348681, - limb1: 12489015124085476300510160086, - limb2: 591876590189962090, + limb0: 60464185271160186329667085333, + limb1: 47362811318260235809669271215, + limb2: 2759540647010765696, limb3: 0 }; let Qy1_0: u384 = u384 { - limb0: 36693168962073156390778268101, - limb1: 10989635017856757589619451303, - limb2: 3188783918270009862, + limb0: 75367372857432921812806258040, + limb1: 48923144314324076921700985484, + limb2: 772041197732904878, limb3: 0 }; let p_1: G1Point = G1Point { x: u384 { - limb0: 2759776095823551941717050512, - limb1: 57963889380965878628050708589, - limb2: 2295185507317062952, + limb0: 34469268177532267239172196943, + limb1: 64085060327039124260764414987, + limb2: 2778381038406882375, limb3: 0 }, y: u384 { - limb0: 57386324596293561251343305038, - limb1: 7618976517038308641445925057, - limb2: 2960922182843640226, + limb0: 16174288217937365390881565706, + limb1: 54544482347055253032647517285, + limb2: 1783571935245424777, limb3: 0 } }; let Qy0_1: u384 = u384 { - limb0: 75447057788347766527569989757, - limb1: 54509634512360888398764029013, - limb2: 1404184422289668471, + limb0: 13297768232700519033928087638, + limb1: 48329425422938152995668851685, + limb2: 1569681888374257932, limb3: 0 }; let Qy1_1: u384 = u384 { - limb0: 56828850124404589943193640763, - limb1: 47551865498185077485618623635, - limb2: 2174290563938186224, + limb0: 22129694352507552413722987028, + limb1: 4050596519157542830646697090, + limb2: 2704965446325434880, limb3: 0 }; let p_2: G1Point = G1Point { x: u384 { - limb0: 54179543564690978914219750011, - limb1: 61677089311691040596880313521, - limb2: 848072952140179033, + limb0: 21283337468805558033905394712, + limb1: 54303367948408393254155425412, + limb2: 943103654983769995, limb3: 0 }, y: u384 { - limb0: 68815624253022498187661610823, - limb1: 30030758402493479614858353112, - limb2: 3049366972651778149, + limb0: 70596304535654254379897033196, + limb1: 12281396721914970534044442752, + limb2: 3352623565113347547, limb3: 0 } }; let Qy0_2: u384 = u384 { - limb0: 32243610585906546138145771024, - limb1: 12968364091712473131679789054, - limb2: 2442887428653685264, + limb0: 74052818514397875358906432980, + limb1: 75925806636686796497163771692, + limb2: 939361765672686198, limb3: 0 }; let Qy1_2: u384 = u384 { - limb0: 21316573109193472944601748709, - limb1: 15906312413545085219758845509, - limb2: 2322420816178698199, + limb0: 30224732042144277812581889451, + limb1: 24765172145772633258597651056, + limb2: 184585862802225558, limb3: 0 }; @@ -15339,81 +19746,81 @@ mod tests { ); let p_0: BNProcessedPair = BNProcessedPair { yInv: u384 { - limb0: 69235951820255006636880856583, - limb1: 15736639199465179280183191079, - limb2: 2779440461336401692, + limb0: 46749866867682761464687842785, + limb1: 57081181046757595125079477460, + limb2: 2180233761696385884, limb3: 0 }, xNegOverY: u384 { - limb0: 66377917728082143614209761880, - limb1: 57343768467191655464316084079, - limb2: 770479960038009127, + limb0: 58008282851868232713016740245, + limb1: 6400647170887386018933774572, + limb2: 3454011542180854243, limb3: 0 }, QyNeg0: u384 { - limb0: 55071571407458887656752230078, - limb1: 44553269958537763161369609658, - limb2: 2895121676613008575, + limb0: 51087983405493562440655493426, + limb1: 9679473764363003652210498529, + limb2: 727457619792204969, limb3: 0 }, QyNeg1: u384 { - limb0: 74858999714580592379544310658, - limb1: 46052650064766481872260318441, - limb2: 298214348532960803, + limb0: 36184795819220826957516320719, + limb1: 8119140768299162540178784260, + limb2: 2714957069070065787, limb3: 0 } }; let p_1: BNProcessedPair = BNProcessedPair { yInv: u384 { - limb0: 10724115895020906773141841650, - limb1: 79201288351168061570522515765, - limb2: 3288591774162421434, + limb0: 54248374338152169713965634784, + limb1: 32527530049632567891507557521, + limb2: 2737438786982809714, limb3: 0 }, xNegOverY: u384 { - limb0: 34412879486520593581026876931, - limb1: 34077431610325845560180362114, - limb2: 2561980876531962515, + limb0: 55592572178659692972316780345, + limb1: 46661440435435862330997290882, + limb2: 413922791001683955, limb3: 0 }, QyNeg0: u384 { - limb0: 36105110888305982242752589002, - limb1: 2532650570262351063115740731, - limb2: 2082813844513302194, + limb0: 19026237929688892142850540785, + limb1: 8712859659685086466210918060, + limb2: 1917316378428712733, limb3: 0 }, QyNeg1: u384 { - limb0: 54723318552249158827128937996, - limb1: 9490419584438161976261146109, - limb2: 1312707702864784441, + limb0: 10194311809881858763055641395, + limb1: 52991688563465696631233072655, + limb2: 782032820477535785, limb3: 0 } }; let p_2: BNProcessedPair = BNProcessedPair { yInv: u384 { - limb0: 66738026748174456353769930274, - limb1: 99075119527383636843903856, - limb2: 1954233585386313548, + limb0: 52598709843883579211074535735, + limb1: 14509582835089137227087182999, + limb2: 11404515082357178, limb3: 0 }, xNegOverY: u384 { - limb0: 62865381927369834414774850383, - limb1: 18517464550186051365286650464, - limb2: 838977593065962433, + limb0: 11064484307331630916135323474, + limb1: 28682439524117427189510419961, + limb2: 2821273818780162002, limb3: 0 }, QyNeg0: u384 { - limb0: 80395576482865038632857399, - limb1: 44073920990910766330199980691, - limb2: 1044110838149285401, + limb0: 37499350162255873411416145779, + limb1: 60344640960200780558259948388, + limb2: 2547636501130284466, limb3: 0 }, QyNeg1: u384 { - limb0: 11007433053195938232176879714, - limb1: 41135972669078154242120924236, - limb2: 1164577450624272466, + limb0: 2099274120245133364196738972, + limb1: 32277112936850606203282118689, + limb2: 3302412404000745107, limb3: 0 } }; diff --git a/src/cairo/src/definitions.cairo b/src/cairo/src/definitions.cairo index 2e34f3d0b..25bcd69a4 100644 --- a/src/cairo/src/definitions.cairo +++ b/src/cairo/src/definitions.cairo @@ -391,140 +391,98 @@ const X25519: Curve = }, }; -// NAF(6 * 0x44E992B44A6909F1 + 2)[2:] +// NAF(6 * 0x44E992B44A6909F1 + 2)[2:] with consecutive zeros replaced by 3, and -1 replaced by 2 const bn_bits: [ felt252 - ; 64] = [ - -1, + ; 50] = [ + 2, 0, 1, + 3, 0, + 2, 0, + 2, + 3, 0, - -1, - 0, - -1, - 0, - 0, - 0, - -1, + 2, 0, 1, 0, - -1, - 0, - 0, - -1, - 0, - 0, - 0, - 0, + 2, + 3, + 2, + 3, + 3, 0, 1, - 0, - 0, - -1, + 3, + 2, 0, 1, - 0, - 0, - -1, - 0, - 0, - 0, - 0, - -1, + 3, + 2, + 3, + 3, + 2, 0, 1, + 3, 0, + 2, 0, - 0, - -1, - 0, - -1, - 0, - 0, + 2, + 3, 1, + 3, 0, - 0, - 0, - -1, - 0, - 0, - -1, + 2, + 3, + 2, 0, 1, 0, 1, - 0, - 0, + 3, 0 ]; -// [int(x) for x in bin(0xD201000000010000)[2:]][2:] +// [int(x) for x in bin(0xD201000000010000)[2:]][2:] with two-consecutive zeros replaced by 3 const bls_bits: [ felt252 - ; 62] = [ + ; 34] = [ 0, 1, - 0, - 0, + 3, 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 3, + 3, + 3, + 3, 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, 0, 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 ]; diff --git a/src/cairo/src/pairing.cairo b/src/cairo/src/pairing.cairo index 3a7883be3..158eff698 100644 --- a/src/cairo/src/pairing.cairo +++ b/src/cairo/src/pairing.cairo @@ -2,9 +2,11 @@ use core::option::OptionTrait; use core::array::ArrayTrait; use garaga::circuits::multi_pairing_check::{ run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit, + run_BLS12_381_MP_CHECK_BIT00_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT00_LOOP_3_circuit, run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit, run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit, run_BLS12_381_MP_CHECK_PREPARE_PAIRS_3_circuit, run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit, run_BN254_MP_CHECK_BIT0_LOOP_2_circuit, run_BN254_MP_CHECK_BIT0_LOOP_3_circuit, + run_BN254_MP_CHECK_BIT00_LOOP_2_circuit, run_BN254_MP_CHECK_BIT00_LOOP_3_circuit, run_BN254_MP_CHECK_BIT1_LOOP_2_circuit, run_BN254_MP_CHECK_BIT1_LOOP_3_circuit, run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit, run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit, run_BLS12_381_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit, @@ -14,7 +16,9 @@ use garaga::circuits::multi_pairing_check::{ run_BN254_MP_CHECK_FINALIZE_BN_3_circuit, run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit, run_BLS12_381_MP_CHECK_FINALIZE_BLS_3_circuit }; -use garaga::circuits::extf_mul::{run_BLS12_381_FP12_MUL_ASSERT_ONE_circuit}; +use garaga::circuits::extf_mul::{ + run_BLS12_381_FP12_MUL_ASSERT_ONE_circuit, run_BN254_FP12_MUL_ASSERT_ONE_circuit +}; use core::poseidon::hades_permutation; use garaga::definitions::{ @@ -30,34 +34,447 @@ fn multi_pairing_check_bn254_2_pairs( pair0: G1G2Pair, pair1: G1G2Pair, lambda_root: E12D, + lambda_root_inverse: E12D, w: MillerLoopResultScalingFactor, - Ris: Array, - Q: Array + Ris: Span, + big_Q: Array ) -> bool { assert!( - Q.len() == 58, - "Wrong Q degree for BN254 2-Pairs Pairing check, should be degree 58 (59 coefficients)" + big_Q.len() == 87, + "Wrong Q degree for BN254 2-Pairs Pairing check, should be degree 86 (87 coefficients)" + ); + assert!(Ris.len() == 53, "Wrong Number of Ris for BN254 Multi-Pairing check, should be 54"); + + let (processed_pair0, processed_pair1): (BNProcessedPair, BNProcessedPair) = + run_BN254_MP_CHECK_PREPARE_PAIRS_2_circuit( + pair0.p, pair0.q.y0, pair0.q.y1, pair1.p, pair1.q.y0, pair1.q.y1 + ); + + // Init sponge state + let (s0, s1, s2) = hades_permutation('MPCHECK_BN254_2P', 0, 1); + // Hash Inputs + let (s0, s1, s2) = utils::hash_G1G2Pair(pair0, s0, s1, s2); + let (s0, s1, s2) = utils::hash_G1G2Pair(pair1, s0, s1, s2); + let (s0, s1, s2) = utils::hash_E12D(lambda_root, s0, s1, s2); + let (s0, s1, s2) = utils::hash_E12D(lambda_root_inverse, s0, s1, s2); + let (s0, s1, s2) = utils::hash_MillerLoopResultScalingFactor(w, s0, s1, s2); + // Hash Ris to obtain base random coefficient c0 + let (s0, s1, s2) = utils::hash_E12D_transcript(Ris, s0, s1, s2); + // println!("c0 BN254 2P : {:?}", s1); + let mut c_i: u384 = s1.into(); + + // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z + let (z_felt252, _, _) = utils::hash_u384_transcript(big_Q.span(), s0, s1, s2); + println!("z BN254 2P : {:?}", z_felt252); + let z: u384 = z_felt252.into(); + + let ( + c_of_z, w_of_z, c_inv_of_z, LHS, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z + ): (u384, u384, u384, u384, u384, u384, u384) = + run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( + lambda_root, z, w, lambda_root_inverse, c_i + ); + + // println!("LHS_0 BN254 2P : {:?}", LHS); + + // init bit for bn254 is 0: + let R_0 = Ris.at(0); + let (_Q0, _Q1, _lhs, _c_i, _f_1_of_z) = run_BN254_MP_CHECK_INIT_BIT_2_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + pair0.q, + processed_pair1.yInv, + processed_pair1.xNegOverY, + pair1.q, + *R_0, + c_i, + z, + c_inv_of_z, + LHS + ); + // println!("c1 BN254 2P : {:?}", _c_i); + println!("LHS_1 BN254 2P : {:?}", _lhs); + + let mut Q0 = _Q0; + let mut Q1 = _Q1; + let mut LHS = _lhs; + let mut f_i_of_z = _f_1_of_z; + c_i = _c_i; + + // rest of miller loop + let mut bits = bn_bits.span(); + let mut R_i_index = 1; + + while let Option::Some(bit) = bits.pop_front() { + let R_i = Ris.at(R_i_index); + R_i_index += 1; + let (_Q0, _Q1, _f_i_plus_one_of_z, _LHS, _c_i): (G2Point, G2Point, u384, u384, u384) = + match *bit { + 0 => { + run_BN254_MP_CHECK_BIT0_LOOP_2_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + LHS, + f_i_of_z, + *R_i, + c_i, + z + ) + }, + 1 => { + run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + pair0.q, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + pair1.q, + LHS, + f_i_of_z, + *R_i, + c_inv_of_z, + z, + c_i, + ) + }, + 2 => { + run_BN254_MP_CHECK_BIT1_LOOP_2_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + G2Point { + x0: pair0.q.x0, + x1: pair0.q.x1, + y0: processed_pair0.QyNeg0, + y1: processed_pair0.QyNeg1 + }, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + G2Point { + x0: pair1.q.x0, + x1: pair1.q.x1, + y0: processed_pair1.QyNeg0, + y1: processed_pair1.QyNeg1 + }, + LHS, + f_i_of_z, + *R_i, + c_of_z, + z, + c_i, + ) + }, + _ => { + run_BN254_MP_CHECK_BIT00_LOOP_2_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + LHS, + f_i_of_z, + *R_i, + c_i, + z + ) + } + }; + Q0 = _Q0; + Q1 = _Q1; + LHS = _LHS; + f_i_of_z = _f_i_plus_one_of_z; + c_i = _c_i; + }; + println!("LHS_n_min_2 {:?}", LHS); + let R_n_minus_2 = Ris.at(Ris.len() - 2); + let R_last = Ris.at(Ris.len() - 1); + let (check, lhs_n_min_1) = run_BN254_MP_CHECK_FINALIZE_BN_2_circuit( + pair0.q, + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + pair1.q, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + *R_n_minus_2, + *R_last, + c_i, + w_of_z, + z, + c_inv_frob_1_of_z, + c_frob_2_of_z, + c_inv_frob_3_of_z, + LHS, + f_i_of_z, + big_Q ); - assert!(Ris.len() == 68, "Wrong Number of Ris for BN254 Multi-Pairing check, should be 68"); + println!("lhs_n_min_1 {:?}", lhs_n_min_1); + assert!(check == u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, "Final check failed"); + + assert!(*R_last == E12DDefinitions::one()); return true; } fn multi_pairing_check_bn254_3_pairs( pair0: G1G2Pair, pair1: G1G2Pair, + pair2: G1G2Pair, lambda_root: E12D, + lambda_root_inverse: E12D, w: MillerLoopResultScalingFactor, - Ris: Array, - Q: Array + Ris: Span, + big_Q: Array, + precomputed_miller_loop_result: Option, + small_Q: Option ) -> bool { assert!( - Q.len() == 76, - "Wrong Q degree for BN254 3-Pairs Pairing check, should be degree 75 (76 coefficients)" + big_Q.len() == 114, + "Wrong Q degree for BN254 3-Pairs Pairing check, should be degree 113 (114 coefficients)" ); - assert!(Ris.len() == 68, "Wrong Number of Ris for BN254 Multi-Pairing check"); + assert!(Ris.len() == 53, "Wrong Number of Ris for BN254 Multi-Pairing check"); - return true; + let ( + processed_pair0, processed_pair1, processed_pair2 + ): (BNProcessedPair, BNProcessedPair, BNProcessedPair) = + run_BN254_MP_CHECK_PREPARE_PAIRS_3_circuit( + pair0.p, + pair0.q.y0, + pair0.q.y1, + pair1.p, + pair1.q.y0, + pair1.q.y1, + pair2.p, + pair2.q.y0, + pair2.q.y1 + ); + + // Init sponge state + let (s0, s1, s2) = hades_permutation('MPCHECK_BN254_3P', 0, 1); + // Hash Inputs + let (s0, s1, s2) = utils::hash_G1G2Pair(pair0, s0, s1, s2); + let (s0, s1, s2) = utils::hash_G1G2Pair(pair1, s0, s1, s2); + let (s0, s1, s2) = utils::hash_G1G2Pair(pair2, s0, s1, s2); + let (s0, s1, s2) = utils::hash_E12D(lambda_root, s0, s1, s2); + let (s0, s1, s2) = utils::hash_E12D(lambda_root_inverse, s0, s1, s2); + let (s0, s1, s2) = utils::hash_MillerLoopResultScalingFactor(w, s0, s1, s2); + // Hash Ris to obtain base random coefficient c0 + let (s0, s1, s2) = utils::hash_E12D_transcript(Ris, s0, s1, s2); + println!("c0 BN254 3P : {:?}", s1); + + let mut c_i: u384 = s1.into(); + + // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z + let (z_felt252, _, _) = utils::hash_u384_transcript(big_Q.span(), s0, s1, s2); + println!("z BN254 3P : {:?}", z_felt252); + let z: u384 = z_felt252.into(); + + // Precompute lambda root evaluated in Z: + let ( + c_of_z, w_of_z, c_inv_of_z, LHS, c_inv_frob_1_of_z, c_frob_2_of_z, c_inv_frob_3_of_z + ): (u384, u384, u384, u384, u384, u384, u384) = + run_BN254_MP_CHECK_PREPARE_LAMBDA_ROOT_circuit( + lambda_root, z, w, lambda_root_inverse, c_i + ); + + // init bit for bn254 is 0: + let R_0 = Ris.at(0); + let (_Q0, _Q1, _Q2, _lhs, _c_i, _f_1_of_z) = run_BN254_MP_CHECK_INIT_BIT_3_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + pair0.q, + processed_pair1.yInv, + processed_pair1.xNegOverY, + pair1.q, + processed_pair2.yInv, + processed_pair2.xNegOverY, + pair2.q, + *R_0, + c_i, + z, + c_inv_of_z, + LHS + ); + + let mut Q0 = _Q0; + let mut Q1 = _Q1; + let mut Q2 = _Q2; + let mut LHS = _lhs; + let mut f_i_of_z = _f_1_of_z; + c_i = _c_i; + + // rest of miller loop + let mut bits = bn_bits.span(); + let mut R_i_index = 1; + + while let Option::Some(bit) = bits.pop_front() { + let R_i = Ris.at(R_i_index); + R_i_index += 1; + let ( + _Q0, _Q1, _Q2, _f_i_plus_one_of_z, _LHS, _c_i + ): (G2Point, G2Point, G2Point, u384, u384, u384) = + match *bit { + 0 => { + run_BN254_MP_CHECK_BIT0_LOOP_3_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + processed_pair2.yInv, + processed_pair2.xNegOverY, + Q2, + LHS, + f_i_of_z, + *R_i, + c_i, + z + ) + }, + 1 => { + run_BN254_MP_CHECK_BIT1_LOOP_3_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + pair0.q, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + pair1.q, + processed_pair2.yInv, + processed_pair2.xNegOverY, + Q2, + pair2.q, + LHS, + f_i_of_z, + *R_i, + c_inv_of_z, + z, + c_i, + ) + }, + 2 => { + run_BN254_MP_CHECK_BIT1_LOOP_3_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + G2Point { + x0: pair0.q.x0, + x1: pair0.q.x1, + y0: processed_pair0.QyNeg0, + y1: processed_pair0.QyNeg1 + }, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + G2Point { + x0: pair1.q.x0, + x1: pair1.q.x1, + y0: processed_pair1.QyNeg0, + y1: processed_pair1.QyNeg1 + }, + processed_pair2.yInv, + processed_pair2.xNegOverY, + Q2, + G2Point { + x0: pair2.q.x0, + x1: pair2.q.x1, + y0: processed_pair2.QyNeg0, + y1: processed_pair2.QyNeg1 + }, + LHS, + f_i_of_z, + *R_i, + c_of_z, + z, + c_i, + ) + }, + _ => { + run_BN254_MP_CHECK_BIT00_LOOP_3_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + processed_pair2.yInv, + processed_pair2.xNegOverY, + Q2, + LHS, + f_i_of_z, + *R_i, + c_i, + z + ) + } + }; + Q0 = _Q0; + Q1 = _Q1; + Q2 = _Q2; + LHS = _LHS; + f_i_of_z = _f_i_plus_one_of_z; + c_i = _c_i; + println!("lhs_{} BN254 3P : {:?}", R_i_index, LHS); + }; + + let R_n_minus_2 = Ris.at(Ris.len() - 2); + let R_last = Ris.at(Ris.len() - 1); + + let (check, _) = run_BN254_MP_CHECK_FINALIZE_BN_3_circuit( + pair0.q, + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + pair1.q, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + pair2.q, + processed_pair2.yInv, + processed_pair2.xNegOverY, + Q2, + *R_n_minus_2, + *R_last, + c_i, + w_of_z, + z, + c_inv_frob_1_of_z, + c_frob_2_of_z, + c_inv_frob_3_of_z, + LHS, + f_i_of_z, + big_Q + ); + + assert!(check == u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, "Final check failed"); + + match precomputed_miller_loop_result { + Option::Some(M) => { + // Use precomputed miller loop result & check f * M = 1 + let (s0, s1, s2) = utils::hash_E12D(M, s0, s1, s2); + let (z, _, _) = utils::hash_E12DMulQuotient(small_Q.unwrap(), s0, s1, s2); + let (check) = run_BN254_FP12_MUL_ASSERT_ONE_circuit( + *R_last, M, small_Q.unwrap(), z.into() + ); + assert!(check == u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }); + return true; + }, + Option::None => { + assert!(*R_last == E12DDefinitions::one()); + return true; + }, + } } fn multi_pairing_check_bls12_381_2_pairs( @@ -69,11 +486,11 @@ fn multi_pairing_check_bls12_381_2_pairs( big_Q: Array ) -> bool { assert!( - big_Q.len() == 54, - "Wrong Q degree for BLS12-381 2-Pairs Paring check, should be degree 53 (54 coeffs)" + big_Q.len() == 81, + "Wrong Q degree for BLS12-381 2-Pairs Paring check, should be degree 80 (81 coeffs)" ); assert!( - Ris.len() == 64, "Wrong Number of Ris for BLS12-381 2-Pairs Paring check, should be 64" + Ris.len() == 36, "Wrong Number of Ris for BLS12-381 2-Pairs Paring check, should be 64" ); let (processed_pair0, processed_pair1): (BLSProcessedPair, BLSProcessedPair) = run_BLS12_381_MP_CHECK_PREPARE_PAIRS_2_circuit( @@ -90,10 +507,13 @@ fn multi_pairing_check_bls12_381_2_pairs( let (s0, s1, s2) = utils::hash_MillerLoopResultScalingFactor(w, s0, s1, s2); // Hash Ris to obtain base random coefficient c0 let (s0, s1, s2) = utils::hash_E12D_transcript(Ris, s0, s1, s2); + // println!("c0 BLS12-381 2P : {:?}", s1); + let mut c_i: u384 = s1.into(); // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z let (z_felt252, _, _) = utils::hash_u384_transcript(big_Q.span(), s0, s1, s2); + // println!("z BLS12-381 2P : {:?}", z_felt252); let z: u384 = z_felt252.into(); // Precompute lambda root evaluated in Z: @@ -133,12 +553,10 @@ fn multi_pairing_check_bls12_381_2_pairs( while let Option::Some(bit) = bits.pop_front() { let R_i = Ris.at(R_i_index); R_i_index += 1; - match *bit { + let (_Q0, _Q1, _f_i_plus_one_of_z, _LHS, _c_i): (G2Point, G2Point, u384, u384, u384) = + match *bit { 0 => { - let ( - _Q0, _Q1, _f_i_plus_one_of_z, _LHS, _c_i - ): (G2Point, G2Point, u384, u384, u384) = - run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( + run_BLS12_381_MP_CHECK_BIT0_LOOP_2_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, Q0, @@ -150,16 +568,10 @@ fn multi_pairing_check_bls12_381_2_pairs( *R_i, c_i, z - ); - Q0 = _Q0; - Q1 = _Q1; - LHS = _LHS; - f_i_of_z = _f_i_plus_one_of_z; - c_i = _c_i; + ) }, - _ => { - let (_Q0, _Q1, _f_i_plus_one_of_z, _LHS, _c_i) = - run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( + 1 => { + run_BLS12_381_MP_CHECK_BIT1_LOOP_2_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, Q0, @@ -174,18 +586,32 @@ fn multi_pairing_check_bls12_381_2_pairs( conjugate_c_inv_of_z, z, c_i - ); - Q0 = _Q0; - Q1 = _Q1; - LHS = _LHS; - f_i_of_z = _f_i_plus_one_of_z; - c_i = _c_i; + ) }, - } + _ => { + run_BLS12_381_MP_CHECK_BIT00_LOOP_2_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + LHS, + f_i_of_z, + *R_i, + c_i, + z + ) + } + }; + Q0 = _Q0; + Q1 = _Q1; + LHS = _LHS; + f_i_of_z = _f_i_plus_one_of_z; + c_i = _c_i; }; let R_last = Ris.at(Ris.len() - 1); - println!("reached"); let (check,) = run_BLS12_381_MP_CHECK_FINALIZE_BLS_2_circuit( *R_last, c_i, w_of_z, z, c_inv_of_z_frob_1, LHS, f_i_of_z, big_Q ); @@ -196,6 +622,7 @@ fn multi_pairing_check_bls12_381_2_pairs( return true; } + fn multi_pairing_check_bls12_381_3_pairs( pair0: G1G2Pair, pair1: G1G2Pair, @@ -208,10 +635,10 @@ fn multi_pairing_check_bls12_381_3_pairs( small_Q: Option ) -> bool { assert!( - big_Q.len() == 70, - "Wrong Q degree for BLS12-381 3-Pairs Paring check, should be of degree 69 (70 coefficients)" + big_Q.len() == 105, + "Wrong Q degree for BLS12-381 3-Pairs Paring check, should be of degree 104 (105 coefficients)" ); - assert!(Ris.len() == 64, "Wrong Number of Ris for BLS12-381 3-Pairs Paring check"); + assert!(Ris.len() == 36, "Wrong Number of Ris for BLS12-381 3-Pairs Paring check"); let ( processed_pair0, processed_pair1, processed_pair2 @@ -231,10 +658,12 @@ fn multi_pairing_check_bls12_381_3_pairs( let (s0, s1, s2) = utils::hash_MillerLoopResultScalingFactor(w, s0, s1, s2); // Hash Ris to obtain base random coefficient c0 let (s0, s1, s2) = utils::hash_E12D_transcript(Ris, s0, s1, s2); + // println!("c0 BLS12-381 3P : {:?}", s1); let mut c_i: u384 = s1.into(); // Hash Q = (Σ_i c_i*Q_i) to obtain random evaluation point z let (z_felt252, s1, s2) = utils::hash_u384_transcript(big_Q.span(), s0, s1, s2); + // println!("z BLS12-381 3P : {:?}", z_felt252); let z: u384 = z_felt252.into(); // Precompute lambda root evaluated in Z: let (conjugate_c_inv_of_z, w_of_z, c_inv_of_z_frob_1): (u384, u384, u384) = @@ -270,6 +699,7 @@ fn multi_pairing_check_bls12_381_3_pairs( // <=> Σ_i (Π_k (c_i*P_k(z))) - Σ_i c_i * R_i(z) = (Σ_i c_i*Q_i(z)) * P(z) // => LHS = Σ_i (Π_k (c_i*P_k(z))) - Σ_i c_i * R_i(z) + // println!("LHS_0 BLS12-381 3P : {:?}", LHS); // rest of miller loop let mut bits = bls_bits.span(); let mut R_i_index = 1; @@ -277,13 +707,12 @@ fn multi_pairing_check_bls12_381_3_pairs( while let Option::Some(bit) = bits.pop_front() { // // println!("R_i_index: {}", R_i_index); let R_i = Ris.at(R_i_index); - R_i_index += 1; - match *bit { + let ( + _Q0, _Q1, _Q2, _f_i_plus_one_of_z, _LHS, _c_i + ): (G2Point, G2Point, G2Point, u384, u384, u384) = + match *bit { 0 => { - let ( - _Q0, _Q1, _Q2, _f_i_plus_one_of_z, _LHS, _c_i - ): (G2Point, G2Point, G2Point, u384, u384, u384) = - run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( + run_BLS12_381_MP_CHECK_BIT0_LOOP_3_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, Q0, @@ -298,17 +727,10 @@ fn multi_pairing_check_bls12_381_3_pairs( *R_i, c_i, z - ); - Q0 = _Q0; - Q1 = _Q1; - Q2 = _Q2; - LHS = _LHS; - f_i_of_z = _f_i_plus_one_of_z; - c_i = _c_i; + ) }, - _ => { - let (_Q0, _Q1, _Q2, _f_i_plus_one_of_z, _LHS, _c_i) = - run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( + 1 => { + run_BLS12_381_MP_CHECK_BIT1_LOOP_3_circuit( processed_pair0.yInv, processed_pair0.xNegOverY, Q0, @@ -327,15 +749,35 @@ fn multi_pairing_check_bls12_381_3_pairs( conjugate_c_inv_of_z, z, c_i, - ); - Q0 = _Q0; - Q1 = _Q1; - Q2 = _Q2; - LHS = _LHS; - f_i_of_z = _f_i_plus_one_of_z; - c_i = _c_i; + ) }, - } + _ => { + run_BLS12_381_MP_CHECK_BIT00_LOOP_3_circuit( + processed_pair0.yInv, + processed_pair0.xNegOverY, + Q0, + processed_pair1.yInv, + processed_pair1.xNegOverY, + Q1, + processed_pair2.yInv, + processed_pair2.xNegOverY, + Q2, + LHS, + f_i_of_z, + *R_i, + c_i, + z + ) + } + }; + R_i_index += 1; + Q0 = _Q0; + Q1 = _Q1; + Q2 = _Q2; + LHS = _LHS; + f_i_of_z = _f_i_plus_one_of_z; + c_i = _c_i; + // println!("LHS_{} BLS12-381 3P : {:?}", R_i_index - 1, LHS); }; let R_last = Ris.at(Ris.len() - 1); diff --git a/src/cairo/src/tests/pairing_tests.cairo b/src/cairo/src/tests/pairing_tests.cairo index d9ef215d3..d31305b82 100644 --- a/src/cairo/src/tests/pairing_tests.cairo +++ b/src/cairo/src/tests/pairing_tests.cairo @@ -2,2923 +2,2489 @@ mod pairing_tests { use garaga::pairing::{ G1G2Pair, G1Point, G2Point, E12D, MillerLoopResultScalingFactor, E12DDefinitions, + multi_pairing_check_bn254_2_pairs, multi_pairing_check_bn254_3_pairs, multi_pairing_check_bls12_381_3_pairs, multi_pairing_check_bls12_381_2_pairs, u384, Option, E12DMulQuotient }; #[test] - fn test_BLS12_381_mpcheck_2P() { + fn BN254_mpcheck_2P_() { let pair0: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { - limb0: 70862508686663820822416130908, - limb1: 4331727992494874104164226470, - limb2: 59062737899953780140782212180, - limb3: 7453365378867621491305350765 + limb0: 28610756795125421341789836686, + limb1: 867082125726060679479563787, + limb2: 517675042607557601, + limb3: 0 }, y: u384 { - limb0: 19023458711357222280422233943, - limb1: 65309851449428701748446162528, - limb2: 69207319884410755429250390104, - limb3: 341375959818195207325051504 + limb0: 36882700424042850430562664053, + limb1: 63811137145513906528257638731, + limb2: 2919654018211177231, + limb3: 0 } }, q: G2Point { x0: u384 { - limb0: 15110353713979647181704075861, - limb1: 45487897385069528474980795109, - limb2: 24007645828503655482530931115, - limb3: 5583440547926451351316627860 + limb0: 3153729208240962009983500478, + limb1: 40550523289894208045731503372, + limb2: 1084946966667758900, + limb3: 0 }, x1: u384 { - limb0: 25316568279850368070364195125, - limb1: 45457656749107460790098688065, - limb2: 30101842186331950235142416409, - limb3: 6655773989486429288668824903 + limb0: 68880333305383555718983970599, + limb1: 67893486303700750840295828244, + limb2: 105039074904354629, + limb3: 0 }, y0: u384 { - limb0: 49242560575646462576543140155, - limb1: 63719561306764738364886887969, - limb2: 32888546658225648584040285955, - limb3: 847697803213812051591700864 + limb0: 24042802651694448496166439628, + limb1: 16645378487191828916630937066, + limb2: 757214260369138307, + limb3: 0 }, y1: u384 { - limb0: 34778379520699991816591794256, - limb1: 72890068542028641707534646311, - limb2: 78149572186248283673155449849, - limb3: 2475380169003094435344379086 + limb0: 73170982836049039157350892353, + limb1: 7425931233989092027273176614, + limb2: 81769889353580197, + limb3: 0 } } }; let pair1: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { - limb0: 70862508686663820822416130908, - limb1: 4331727992494874104164226470, - limb2: 59062737899953780140782212180, - limb3: 7453365378867621491305350765 + limb0: 28610756795125421341789836686, + limb1: 867082125726060679479563787, + limb2: 517675042607557601, + limb3: 0 }, y: u384 { - limb0: 35856937790824170676907643732, - limb1: 45854290181992112907384459678, - limb2: 30847823944679166343901919846, - limb3: 7706527822267996973261274437 + limb0: 74669468252610898339759914706, + limb1: 72459310451373670527166081349, + limb2: 567344248591793433, + limb3: 0 } }, q: G2Point { x0: u384 { - limb0: 15110353713979647181704075861, - limb1: 45487897385069528474980795109, - limb2: 24007645828503655482530931115, - limb3: 5583440547926451351316627860 + limb0: 3153729208240962009983500478, + limb1: 40550523289894208045731503372, + limb2: 1084946966667758900, + limb3: 0 }, x1: u384 { - limb0: 25316568279850368070364195125, - limb1: 45457656749107460790098688065, - limb2: 30101842186331950235142416409, - limb3: 6655773989486429288668824903 + limb0: 68880333305383555718983970599, + limb1: 67893486303700750840295828244, + limb2: 105039074904354629, + limb3: 0 }, y0: u384 { - limb0: 49242560575646462576543140155, - limb1: 63719561306764738364886887969, - limb2: 32888546658225648584040285955, - limb3: 847697803213812051591700864 + limb0: 24042802651694448496166439628, + limb1: 16645378487191828916630937066, + limb2: 757214260369138307, + limb3: 0 }, y1: u384 { - limb0: 34778379520699991816591794256, - limb1: 72890068542028641707534646311, - limb2: 78149572186248283673155449849, - limb3: 2475380169003094435344379086 + limb0: 73170982836049039157350892353, + limb1: 7425931233989092027273176614, + limb2: 81769889353580197, + limb3: 0 } } }; - let lambda_root_inverse: E12D = E12D { + let lambda_root = E12D { w0: u384 { - limb0: 27021312855097774282956416526, - limb1: 7166660856401230492795143634, - limb2: 68269020554211501997069498999, - limb3: 2342917523755576555263751364 + limb0: 38068086709510612254082485182, + limb1: 51786504760645391261594354216, + limb2: 1428369825655422646, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 68359831433319880742385598866, - limb1: 11129496239004571224252583736, - limb2: 45912302496029003070815617420, - limb3: 4729046677585289900863383863 + limb0: 77103997999084909211062974773, + limb1: 19552901816132135504982568181, + limb2: 2707495480484426888, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 61141693017977119118825752985, - limb1: 35465609460985168965776913732, - limb2: 49225619771497181759925367614, - limb3: 4158982520409091668343336310 + limb0: 52811262447694327245838720818, + limb1: 55267547474926154362090438226, + limb2: 2231893042960508293, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 19430707797480439559936719565, - limb1: 46826190285186647527888427894, - limb2: 23011342423234851796800189602, - limb3: 2760224907793073811762383260 + limb0: 10548231750075343421975577629, + limb1: 6147301380349925333967268437, + limb2: 1186856682605541306, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 65885059129931375558840278994, - limb1: 171105221913520587458802687, - limb2: 25754078093739611510459059848, - limb3: 7607380014919314323053335482 + limb0: 68641248061642349584050418184, + limb1: 65848854282214291154924906713, + limb2: 1302813781691750241, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 24553006705518673119661243181, - limb1: 28397796998111755577071221357, - limb2: 41643424587638700659429858341, - limb3: 903658190841363150342684465 + limb0: 21795451507989941987487858643, + limb1: 657993115512721036598199486, + limb2: 3279552127670348227, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }; - let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + let lambda_root_inverse = E12D { w0: u384 { - limb0: 24966579076640197572322460475, - limb1: 59218905012341113074615801317, - limb2: 3293395368767745632011894710, - limb3: 7942729235589215515049455736 - }, - w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } - }; - let Ris: Array = array![ - E12D { - w0: u384 { - limb0: 19538640475580004828078233560, - limb1: 67856649159499645628982814361, - limb2: 19502807655461403928074171244, - limb3: 7308540573544923739685336892 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 21623525368527510288722615688, - limb1: 56390947712956420388715678790, - limb2: 40862176670007476471412646685, - limb3: 4347853620490523421218882022 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 14218928451404597625238658949, - limb1: 33022999108340448116493587022, - limb2: 41666480932712834323046332897, - limb3: 7928374350830631019479206024 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 36860927645639068762293355489, - limb1: 44426548991214595398565804618, - limb2: 44975532744289298800633473943, - limb3: 3300634685921002791396240584 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 24923381902216515992406157579, - limb1: 27427003838682906218535777490, - limb2: 29486072188759797154571112204, - limb3: 2679507876424869289839229675 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 40544513245142940948393397954, - limb1: 59899863863690151663830514958, - limb2: 71083646888869540017994856910, - limb3: 2758429345045117017440198419 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } - }, - E12D { - w0: u384 { - limb0: 27051000537195795344204713435, - limb1: 73992354383346311091068044753, - limb2: 49318801988047171644092877368, - limb3: 1049971235599340578161559142 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 36316039256642045331575098477, - limb1: 75349594810715970893503415803, - limb2: 2905335591302048892401388877, - limb3: 5857710127322365240791673974 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 77389810892296999107998654077, - limb1: 45779691442285118807135674372, - limb2: 15529750729831719495359947462, - limb3: 7590582746902227517937003691 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 54289952105637884257617613432, - limb1: 29893406355197079833385601131, - limb2: 35634449655025626004493924612, - limb3: 2905971712038052894002980628 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 12792356020558961286058573053, - limb1: 56463402588083659325161813373, - limb2: 41253857787226682066974601364, - limb3: 2614252761807179830271201917 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 25759492769422261890526877130, - limb1: 1591953327765736035324224056, - limb2: 66114432211268082263928498810, - limb3: 2243694464282057675524764278 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } - }, - E12D { - w0: u384 { - limb0: 70421777445386254241879247993, - limb1: 11591882444146125584543118811, - limb2: 26168644680674135662341496348, - limb3: 2285069820098347807189691214 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 54326339587148475647595995593, - limb1: 9037920384725439261696146330, - limb2: 50724154205339237401053766725, - limb3: 6310730730330600152787023247 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 4264375143270399407760443305, - limb1: 59680832228053397427330459569, - limb2: 57737043711934140891497674419, - limb3: 7031023539385020407019716925 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 38985113464742505072044134820, - limb1: 12085331797540954466294539942, - limb2: 39804728087395765442398055681, - limb3: 3696684574026235091683226358 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 26580473068195506937866367603, - limb1: 22688450165807004938052878793, - limb2: 6991978575251750132715796858, - limb3: 482680675638927583825056573 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 13270968413398186129909641820, - limb1: 5385959996320198794757576178, - limb2: 23685463771257696854755544262, - limb3: 5832312994145643682649592459 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } - }, - E12D { - w0: u384 { - limb0: 37799093991942476539988863104, - limb1: 72581998430888004813511039195, - limb2: 29869767154554872189247318914, - limb3: 6651109675423754805386910588 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 39478777576280983304757291939, - limb1: 9092847635542844573620125810, - limb2: 60446749357318154848689462001, - limb3: 2491712936584312974038783475 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 33753425297031373625374859206, - limb1: 74712024852100949133504984971, - limb2: 17333857971403671834899819454, - limb3: 5311756917498491965009864006 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 7503877974183518050858282662, - limb1: 14626555024565860228693653354, - limb2: 37585105580009879006433621659, - limb3: 7595733453001780898318669698 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 21957268514612738801088459815, - limb1: 15210350414298473654323497782, - limb2: 11938678911406470967229123745, - limb3: 4729961033315794579809735588 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 73093341363287631413328249755, - limb1: 57383061899147896924978198359, - limb2: 44274774905754418164459344664, - limb3: 6553859262069178115966135460 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + limb0: 69926147808768109009256914510, + limb1: 48898832427017216052078834432, + limb2: 2489368575696185826, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 22812386333536953902470068394, - limb1: 9180755032336863029435459767, - limb2: 65469088936848343036010996732, - limb3: 442358278344137397172301187 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 20530714511815854894881990998, - limb1: 26642441904715059051847454637, - limb2: 32610992281431623397187827059, - limb3: 36491251544958717779049524 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 48298797685559655728743789510, - limb1: 38611790882768032102970474887, - limb2: 76027855788731823859570565219, - limb3: 5326841781239861932580091889 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 3867943107572457070624285395, - limb1: 54669475075494826646182068266, - limb2: 8731950383022595799006116606, - limb3: 1747440280985705920402716291 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 18992593300341491571692955724, - limb1: 64177932137379844899361591765, - limb2: 54138050884589913681448984461, - limb3: 1657155322065268734941899731 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 63000916431652902059855877331, - limb1: 2537933124894879383956776557, - limb2: 68559471552065452763595236171, - limb3: 843426251722833893239275229 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 58477323715771757122531770948, + limb1: 13408771760032080376560083411, + limb2: 342770004373698840, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 61917153314546552278630872402, - limb1: 60705363668183910149787724792, - limb2: 66784526740969290982542997944, - limb3: 7650684300183785005070928418 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 68374870892977995075121434146, - limb1: 77773301689388975877111649829, - limb2: 21685535179319373931691211373, - limb3: 481243045438427976468366841 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 68892890135909619981515531894, - limb1: 16393151455732802473897979439, - limb2: 40865359024556607858258586584, - limb3: 7931196848699626587810635845 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 22627949321134215674859787857, - limb1: 23282611695035641206755501043, - limb2: 33579830557947766708333539468, - limb3: 4649826446058914308200955052 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 17151798771145460475072948194, - limb1: 42513847981597423874321398336, - limb2: 63012435726691300504799332784, - limb3: 2456945984053644445896089466 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 69421516793351520170906795425, - limb1: 63552666415804945079595966259, - limb2: 32644674512567719424800290494, - limb3: 5354501011288341671406713071 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 29930362995603810066277844601, + limb1: 78666667395570536661787494225, + limb2: 1555598258348923840, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 13171048564972583294294247555, - limb1: 17581063164783813149155191460, - limb2: 49057690339085983679427339223, - limb3: 1656514662639787990548042664 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 73662816695603367195735120563, - limb1: 43852736075178825420071813455, - limb2: 22126201721397434819803362834, - limb3: 1939112736733010594171441932 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 69865648827534849112390197814, - limb1: 19208929808835344207834997000, - limb2: 3277792089566409985323258, - limb3: 5592278945438261202796020335 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 33272602078710725281394371128, - limb1: 53003158379168506577048466977, - limb2: 31564367414446520671505619187, - limb3: 2720085237335813785435001900 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 61212418158274635073593423196, - limb1: 52199968105802256267668379453, - limb2: 54925700311055354704897028099, - limb3: 7127431086442472999333635638 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 41933985090260397660867256544, - limb1: 38543249516676231378981441347, - limb2: 15479218122460300938619613197, - limb3: 1699694164415508447863345069 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 64096747245774335668592600728, + limb1: 43196022356728307491180542868, + limb2: 3425518599532054910, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 8669570956563257494300031540, - limb1: 54498377661756489623464022506, - limb2: 51873550291984159551729663125, - limb3: 3693777125006434126718796289 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 54098157706182784230164862890, - limb1: 72240187544649110870863788328, - limb2: 37393726320856951147882059978, - limb3: 1780962328674075152332112011 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 5791940677046762966792577245, - limb1: 66775746477044808245929789791, - limb2: 20818868866246263956967516595, - limb3: 638266113271443046470580558 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 48864908573061157623174681851, - limb1: 70268957542906127597673832777, - limb2: 35128300594603659007886180707, - limb3: 270999237450381165099179463 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 39617794969180270979007065292, - limb1: 53051943037156472099271321060, - limb2: 45825223677506149120518788037, - limb3: 290047062020097799948109609 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 25157920951543544337445249124, - limb1: 68855654576629174319041241564, - limb2: 64486622975977962046518150313, - limb3: 4126421181623878466366204283 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 77472863767905325981423380001, + limb1: 58074200093351378643724563667, + limb2: 2150919591227434167, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 46882609544514096155157261820, - limb1: 29936172161259069055891775585, - limb2: 55400052671163000175596893537, - limb3: 7847806137647677606584470574 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 59377356968769889303153482197, - limb1: 19535177648492925762756256973, - limb2: 63348642505945716520811363186, - limb3: 7636316940523952204423805190 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 3011871268099821686787624880, - limb1: 49569896793215333349400791039, - limb2: 22769334509929241262063193994, - limb3: 1099522160010017120944586435 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 10384860935159171146728507330, - limb1: 15117877452737813086510967844, - limb2: 37141790496128565103089868878, - limb3: 1786502039739190550419241009 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 4619664275380770044876644676, - limb1: 558748022779981495264083330, - limb2: 26187580096804667771346475110, - limb3: 746233749531612391585803230 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 76227339894446223027621849262, - limb1: 23449997793318450036431624764, - limb2: 59264655336367956776714159466, - limb3: 5417371737166665623375832345 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 70496787365960542557141511962, + limb1: 49491882427034892131938367784, + limb2: 85501146640022366, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 21259582774109730772027158227, - limb1: 74488454254764532479710806898, - limb2: 69391446954673069441211248133, - limb3: 2889226736719114519156665737 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 14130424801390374167710715442, - limb1: 60368804947332822111855858194, - limb2: 6080856476794893390205609264, - limb3: 6736943187217070205046436898 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 74810139488948333560174350985, - limb1: 46824169752562452656081971210, - limb2: 53489699236986289546568228026, - limb3: 8021951574372428039325367341 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 47555122058322680243470915278, - limb1: 42639101314336008095743869234, - limb2: 72249870352036383374951526990, - limb3: 3616888818268080094126892726 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 28511601139644356560048461805, - limb1: 12628202094546721932757240494, - limb2: 56066324496337385779517822565, - limb3: 5876412972024414496406447680 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 18402451566409783112439705320, - limb1: 566568516830065940712447764, - limb2: 46156648739028623357930184852, - limb3: 6301569314225184150034641713 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }; + let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 60184622296806572439997666907, + limb1: 75008714795759192705677030670, + limb2: 3262785094589981400, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 56367159712667224525747184652, - limb1: 64196312938169095211468945501, - limb2: 44085434657922711234587814761, - limb3: 5734674171840405126017750522 - }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { - limb0: 43623981402875613433124722933, - limb1: 70462168252951890443549114947, - limb2: 58953489707714873042173435503, - limb3: 3081209021203990957154234314 - }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { - limb0: 53479914564711064408832605217, - limb1: 38685195167164551392753315413, - limb2: 4695056085654559893393966406, - limb3: 3824454630913204031460984599 - }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { - limb0: 31759525364198660149892986499, - limb1: 8340089118875818375714213327, - limb2: 77442745015012506112259539970, - limb3: 2026937521719213453442527267 - }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { - limb0: 49493357180820048988860044998, - limb1: 23510706881275518910544851252, - limb2: 66133335231773021666252637813, - limb3: 176510987135928981158504926 - }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { - limb0: 64774968947196141907003561581, - limb1: 7155567384990012354072814745, - limb2: 44882871450424943258247221416, - limb3: 2342652608409737194746673107 - }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 50185732680358774463548804626, + limb1: 10607397758555418006709821705, + limb2: 1206124784999809577, + limb3: 0 }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }; + let Ris: Array = array![ E12D { w0: u384 { - limb0: 50298759164686483508543528154, - limb1: 36062322363969853363627706637, - limb2: 64022877957790971277820926855, - limb3: 451906312182826119024865688 + limb0: 66025094163938811608793211750, + limb1: 76401083354204117993382178542, + limb2: 1218186948948914963, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 2486401023088892161033912181, - limb1: 49331955676537968545531143755, - limb2: 51890999980175521233522961352, - limb3: 292142039425917551015177773 + limb0: 71735459605966642306405955975, + limb1: 33339972369659865813194643469, + limb2: 1634651417697719553, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 38471993145029929127530719498, - limb1: 4260372223313982438263437783, - limb2: 15615217756748265655490296326, - limb3: 2573814278124222425069540684 + limb0: 30874278392531068467039759802, + limb1: 43817373983636247507110841694, + limb2: 2028159146086908786, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 34909478762695221603141026228, - limb1: 33926144416656666635960506336, - limb2: 40764875190926185800197104750, - limb3: 4542869013455031458588319482 + limb0: 42528402610212419591932434334, + limb1: 14429186611642745035106362446, + limb2: 172113536111428004, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 55102638767892572414094962559, - limb1: 1447989120299796837452938509, - limb2: 9973737421727742563395163534, - limb3: 6938069703700227727475378004 + limb0: 30566926326153916539558816753, + limb1: 40842518173883193769679568754, + limb2: 2702076219497247802, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 35891878373306400169816236792, - limb1: 37653167538709080153666302726, - limb2: 33686447140530224634076241236, - limb3: 5362669758340858418862516668 + limb0: 27014411060833745865845152003, + limb1: 14065668259487022193123625880, + limb2: 458268262862426021, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 8660266296323103777822331149, - limb1: 65614256489503128102490290598, - limb2: 25152038482689571520720634079, - limb3: 932419366040274013832994946 + limb0: 24925348374730731432397885000, + limb1: 62600508800841807537967434647, + limb2: 557430635659942117, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 46926963718258565321744385208, - limb1: 18950008490505235449569693533, - limb2: 33453470726021938517740401005, - limb3: 7564703745764601547181269157 + limb0: 10882224769721400543828775028, + limb1: 33163669291687200585466282642, + limb2: 963297352049487645, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 38383637031798550733206287695, - limb1: 60212821768841760314708716391, - limb2: 50107165933747151949749604546, - limb3: 6149690147878595073565539034 + limb0: 78521176883039289909217011164, + limb1: 48104656543468795795674193984, + limb2: 2383875699672346909, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 46875164829817440349735080183, - limb1: 68645245265884475159991457994, - limb2: 69070356208076507512882811478, - limb3: 4255365332569520084550507021 + limb0: 7490039118227870304559931986, + limb1: 74832064255028924821989061000, + limb2: 905299313689373042, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 26497488260666371255791170094, - limb1: 36970497906667906998979934748, - limb2: 28058261557384850248147620971, - limb3: 2052539717583261968088324870 + limb0: 70386624002334548559143888022, + limb1: 73660447247743789281961048991, + limb2: 3092460186871996199, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 15534120288040341596892031413, - limb1: 50468959737904304002911528711, - limb2: 12676824671967011147015403214, - limb3: 5764252412898962092294820850 + limb0: 57051611833845706536829875551, + limb1: 8085066711923213953632079179, + limb2: 3063932784316547087, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 2206459274253577504570693724, - limb1: 69938523039370192842092820232, - limb2: 18882614749581594731290595483, - limb3: 4280825191456405771333593385 + limb0: 18790014945333140125059133766, + limb1: 46535671000688017298303297836, + limb2: 1084594156470053555, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 49720095818890945638039800116, - limb1: 16757943917109576116339745611, - limb2: 8425980498776957685460001008, - limb3: 7578225064328352164246166301 + limb0: 944574435592206635734873358, + limb1: 8454455077083513949921237620, + limb2: 1716598997025524762, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 20630134012209085783084837310, - limb1: 75555455624170258920867637819, - limb2: 34369890779823592054159755860, - limb3: 1063894131226259192143408857 + limb0: 9322735180590841939519236534, + limb1: 61453601226411998294758771821, + limb2: 3185118869529199378, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 3528730106541892368473965902, - limb1: 58906396896185233444609879012, - limb2: 11530423229992048905993558764, - limb3: 6665350908080728803981315403 + limb0: 38959036015565761151809819459, + limb1: 10169975373186371439783658960, + limb2: 3069394853448111100, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 57192185537273078788981143329, - limb1: 27069846822788258689150798986, - limb2: 56778270471295270650203986076, - limb3: 7481771267146423908876039774 + limb0: 64363705293275662010461531209, + limb1: 27809051248114324262677116478, + limb2: 1517900649281705691, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 44900882189397590413570146546, - limb1: 65007402524627133547865258799, - limb2: 7781748909578742508207255347, - limb3: 1257039938670829657571908704 + limb0: 63737321413651868473286631549, + limb1: 67142737590549865823815921342, + limb2: 1797620943220348018, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 35598734326007977459642162096, - limb1: 21508024668559512389078498875, - limb2: 62633554111096154806684845903, - limb3: 539831530849915374874691717 + limb0: 39521864341132072866071513584, + limb1: 63459468067761697980278935163, + limb2: 2085288675480191169, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 69355660996452573003287336941, - limb1: 65788221547911413544349170425, - limb2: 43124760977761471899259386661, - limb3: 4574015125027520199166922946 + limb0: 39518492184524893251050084398, + limb1: 61220715965615281720670620094, + limb2: 3164031045115251467, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 4598549945537092862227836547, - limb1: 34300801482115530826490588728, - limb2: 51357795089714589135152098224, - limb3: 2298939279292289466490297737 + limb0: 2374893995844938481877095342, + limb1: 78231027564510510437026969373, + limb2: 2904234185860211465, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 65173176831910408576010305071, - limb1: 22612142897188972189780522414, - limb2: 68968068108985722749557907325, - limb3: 2516916791094074358727887278 + limb0: 27458545510732707518891638712, + limb1: 48797569204322656821603412100, + limb2: 1117512254289616938, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 71363167891416058664027249646, - limb1: 56334142255414353417898816831, - limb2: 4892373244761787201378717454, - limb3: 3343570961000742049320305863 + limb0: 67451807386525589574853093089, + limb1: 16914027746596137910699235386, + limb2: 3206193626178575068, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 30446902995978524666504509208, - limb1: 61469559697190821766657473978, - limb2: 35207048079406571934704387834, - limb3: 733407464312209738237220434 + limb0: 50721387277060514982256061570, + limb1: 57234108741282220739275720841, + limb2: 2402976396039821538, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 22804297500940636089345786206, - limb1: 2723805691699611902492678776, - limb2: 31249620335468166456648186298, - limb3: 3290458414636049404605602956 + limb0: 8908962577507099256094683501, + limb1: 55327085313060540767734393147, + limb2: 1468359256919842595, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 3501412403961808494447901421, - limb1: 48400919800052947165521963526, - limb2: 4964728458691199671247787584, - limb3: 3674842068922049421035282145 + limb0: 42579224702520162005439285017, + limb1: 27506724045370694588098508748, + limb2: 2759583677394710520, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 2576327531197359078739306984, - limb1: 57637111957725601040220175324, - limb2: 50971059572683646269948506224, - limb3: 437492883000697354034722960 + limb0: 64966445697982938819200071253, + limb1: 13334078765397138850538233681, + limb2: 199404988550739809, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 24555556458966325497867375471, - limb1: 49386896075548433652049165175, - limb2: 30567805316954079830211869633, - limb3: 5685389474872182735690880760 + limb0: 23197050528560935199632001169, + limb1: 33790451570851990465705546049, + limb2: 2419992883198642890, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 59808623833733885658256109051, - limb1: 53000066314571172446138531210, - limb2: 22814382983411395544633633998, - limb3: 4838728508509496458761316504 + limb0: 42265855062475566056367661353, + limb1: 44669648358492433146818189964, + limb2: 604174246615923935, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 14116571688103588264912471122, - limb1: 18534149423977089516018999551, - limb2: 42623975336891143920080507346, - limb3: 4925255315776754754508380241 + limb0: 17437442314957562001754884289, + limb1: 22362123219195542732213167142, + limb2: 3452629847549170457, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 43363503288187818410965697230, - limb1: 56437646071329490719086727254, - limb2: 45778918292988342234170273236, - limb3: 1316637277470370224049147825 + limb0: 72036396342526202873390369028, + limb1: 77660412647591971127085157820, + limb2: 3323358875284720276, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 47146041895496161349470845726, - limb1: 2597856312145559228344250964, - limb2: 68158396639058088529203710963, - limb3: 3596612913969578296942807987 + limb0: 32871694737850626260471704261, + limb1: 4211824850952919451068323006, + limb2: 284048361225677295, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 51520011832697108389730368250, - limb1: 2262316909690448918608223493, - limb2: 78756230233713862851311621013, - limb3: 2818917611033564506012573979 + limb0: 24359772392853450209823365758, + limb1: 67480314350416796387771217550, + limb2: 2632591501723135852, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 34917163604624993602924894115, - limb1: 36233651560296028921145493570, - limb2: 57445400169497749279312272011, - limb3: 4855234748577007597271240948 + limb0: 43530604599727609706159677060, + limb1: 48881555813242122016809522246, + limb2: 1649482529595702233, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 73367349606555541144090189961, - limb1: 49532352528638672405652836511, - limb2: 76614461355784995234473839131, - limb3: 392892227615180449291829602 + limb0: 32647825946365557619751325357, + limb1: 76030123685759319473044754053, + limb2: 2878156559745632531, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 60897101618739199167077248383, - limb1: 36095893973505063424053778689, - limb2: 77783727593797968081266674218, - limb3: 4744057558252898742004076130 + limb0: 7125046354330001336416164478, + limb1: 19960391314488607789527969853, + limb2: 2473431833069317555, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 34602816647139670747345706743, - limb1: 38716748304876967109739260162, - limb2: 22866398422868358079251474873, - limb3: 4141982679995358783274160324 + limb0: 67794138121263884805695703250, + limb1: 40434530895843550062252205941, + limb2: 2693600347549253654, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 6740543192373812636821418282, - limb1: 1462303029426879871031830932, - limb2: 54539898383867820348881529629, - limb3: 6766913923286050228972067166 + limb0: 69980517835932164828972867784, + limb1: 29719326050539437820850477199, + limb2: 3231063183348850285, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 46569931026588978396789749961, - limb1: 37428106300925637039030051742, - limb2: 20081942165336296286916138696, - limb3: 6020601312588074340267956147 + limb0: 17313634573856017861057734823, + limb1: 12479265403542133707091998420, + limb2: 2255899972552706163, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 28997770754720563316116680085, - limb1: 5717956339845801505050601268, - limb2: 24426359835833485523819839084, - limb3: 2808947394031229791791179894 + limb0: 72206392607329335935009170696, + limb1: 12031795686764211522745341015, + limb2: 2278292558494270075, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 59787909965729036034704711166, - limb1: 51915917979274180087666646336, - limb2: 34542901557462182227823340613, - limb3: 2442267806133232805054737385 + limb0: 19770753088865898052304517573, + limb1: 17821337450785756466743828615, + limb2: 2416848396715090703, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 71418813798177564652413373548, - limb1: 58366607321652121036349975695, - limb2: 32138620478126574439433097886, - limb3: 816987179862948333226754372 + limb0: 12013211849528823169307129452, + limb1: 54330717752773483329994427474, + limb2: 2043314406978149670, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 74965868804763331825792407531, - limb1: 68054201635678695957277811272, - limb2: 11403937470619838646642028584, - limb3: 7412690359506384183407336049 + limb0: 44399382131686234115728262861, + limb1: 77935753560375670596497237084, + limb2: 3248039741953472858, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 35465781115688200435838599974, - limb1: 45477829447613226783405806317, - limb2: 32151125861484681745540233269, - limb3: 2957381748607783858308721433 + limb0: 74290228795527149452026489310, + limb1: 76149212953844884557317144389, + limb2: 1905738368935090375, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 50151593655203856823907496719, - limb1: 77909163075016917432245892293, - limb2: 53516531818017816829186639764, - limb3: 4968498758955990904256621428 + limb0: 42757193584923774001516372149, + limb1: 36441340039694244802495657975, + limb2: 1169438948056656756, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 30978589314676595772321818853, - limb1: 72713612574981767934761860401, - limb2: 60232790030950196180813822959, - limb3: 573028376811036989680743205 + limb0: 54667252412165663398552733942, + limb1: 75119987640732016801411791405, + limb2: 119513858368419336, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 68068431467498846919955784310, - limb1: 65360168208574933766277184976, - limb2: 48806281187164232401442335544, - limb3: 2819925698226617785796340296 + limb0: 53704108429314335701617308271, + limb1: 38667337638267120814136583562, + limb2: 1817595041015340778, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 56785279540504426606820897519, - limb1: 48337173615520529499221987374, - limb2: 14027523979608869987707117924, - limb3: 6355398949137106726898048976 + limb0: 25686896206140122835723330755, + limb1: 37058405042323475406033331119, + limb2: 2415419679141762925, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 40364314528916177415596368939, - limb1: 46556831014010151070035937073, - limb2: 35090823159834405739164521727, - limb3: 6355607187884495628136031857 + limb0: 76191039314619279016684190621, + limb1: 22936097315238974514070512253, + limb2: 111166224885819301, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 38574117951881862145014235857, - limb1: 24897891041785290744234772156, - limb2: 26340118095924241911705627787, - limb3: 576043081322282422160637436 + limb0: 66699867457385240219217670815, + limb1: 14616766424532168751392485532, + limb2: 3446629164988639735, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 1540494180944428267393185835, - limb1: 27365921212734614576262984362, - limb2: 40578945105300936257387608059, - limb3: 2411786977940085782337916157 + limb0: 32133768404021473888594262465, + limb1: 15219556440270332383347930289, + limb2: 2082005920145247108, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 72761970822839363425088163077, - limb1: 13344777579098678592940574957, - limb2: 60071774038626579803524470995, - limb3: 6583155043789641199992844344 + limb0: 11971621821338615698172561094, + limb1: 58176108947844669229191129656, + limb2: 347744581417363235, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 68087571877417387079367190691, - limb1: 3919673115131621791682600359, - limb2: 17187782561306608744164010254, - limb3: 5322103916452855954988257586 + limb0: 75641279520705981976110716211, + limb1: 65917333827353830124139061545, + limb2: 984391077981795345, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 58081046145259352880934050503, - limb1: 76482717149685626951473249751, - limb2: 34005931869541009888507403794, - limb3: 464051886637525077354553007 + limb0: 49727987153347670161178476760, + limb1: 21622641331492960815629502942, + limb2: 2781397809055445810, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 25645279934838969089064198980, - limb1: 8759001308325694175996250164, - limb2: 54643481894096586432022577456, - limb3: 4755884855983802659905929213 + limb0: 16597746728423405260331876608, + limb1: 71145924938518245418572995179, + limb2: 440522900487556406, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 26188561236406463162776500926, - limb1: 76024905907933614697324703335, - limb2: 2413071418438779976796126276, - limb3: 5794900738152613617128485855 + limb0: 45941377711250701810439253342, + limb1: 73221804115263931400750796361, + limb2: 3416202243719533804, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 73043219609011780900208436407, - limb1: 27266000880181075126852161817, - limb2: 14713391683611108789013561753, - limb3: 7959198017542414785714112722 + limb0: 11804084237464854300823093450, + limb1: 22681543759233759109426711470, + limb2: 1934377847416155968, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 29415448043880098277601616953, - limb1: 6207403989678388756483785317, - limb2: 23550037629292846270015405911, - limb3: 5862542323204053934087506346 + limb0: 34005144147338832069941047765, + limb1: 14016418390832346816446560019, + limb2: 2594157856784634062, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 22577227813162608183074695910, - limb1: 24501166036239666459894869501, - limb2: 38199571454638832638565494287, - limb3: 2185310865987439663846390272 + limb0: 2883183992465458687012009190, + limb1: 10789533303686006946133362249, + limb2: 1508037985439991900, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 72305124306834460155076587790, - limb1: 61006883165522719048685843613, - limb2: 59776756917846978303726991519, - limb3: 4534369899638113629078664159 + limb0: 11779411226727579315003578681, + limb1: 21650433146207248382935861510, + limb2: 201456445171881985, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 60068722057440926095896547179, - limb1: 71433623374538235841287638173, - limb2: 66710254746841835370089409052, - limb3: 5340241086282016119290459780 + limb0: 66965558650273608332187850505, + limb1: 47780574289135363161729908273, + limb2: 10829512579386637, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 61027003587996973985498042801, - limb1: 75009516625171698462866493721, - limb2: 17388701949837120102426704445, - limb3: 3923974439651226801406097454 + limb0: 31436962800349243506061531297, + limb1: 30010641448974520829239106819, + limb2: 1488157964041828222, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 33933631502973184559814476303, - limb1: 60985596229620316470311592747, - limb2: 35149578401534124590707156645, - limb3: 1222574913232870114809930234 + limb0: 51003112265761517914600782375, + limb1: 72457266800256308628534407668, + limb2: 2729669252134329507, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 5660689576247986031176069040, - limb1: 36274812733848826637291113820, - limb2: 46111213827883205172866082599, - limb3: 4195218991650860160845684881 + limb0: 2243716429096121481739314231, + limb1: 47505865827664896772481822302, + limb2: 540554592523385632, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 5517293571585506480568039567, - limb1: 42823610529236223266867638406, - limb2: 34224030223165529230090018531, - limb3: 412991877972841380821213367 + limb0: 75537559416264086308772024643, + limb1: 70487548059382863752113450707, + limb2: 852966238701637649, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 39223094277658924309196693380, - limb1: 36819429392846373083724717709, - limb2: 43214630224918307336096329180, - limb3: 1517898138362640919416107453 + limb0: 54492731745642749726586819261, + limb1: 67779407607648416475697108939, + limb2: 467206228786113079, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 43508524519325954451217100088, - limb1: 27935359036124997357120052797, - limb2: 73478622047905281171009545679, - limb3: 2280382098146659177339414059 + limb0: 23350575779994018877943269541, + limb1: 34393166156106084154963733954, + limb2: 421702832839555878, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 77373253131692096493623416660, - limb1: 13234406103474101901901554194, - limb2: 52545359078445051372240588187, - limb3: 1723825565965444318417071968 + limb0: 48216447457313332403715965971, + limb1: 74207344427248350901573260733, + limb2: 262508672938913396, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 71115739290033394684487176005, - limb1: 13989006728366306028163399617, - limb2: 70515642997772120924302161038, - limb3: 6363075352015024254290699924 + limb0: 63118940119571423102790855801, + limb1: 16633243949451854023375485311, + limb2: 128833922222472210, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 62631658882263394670536433257, - limb1: 56730191822304058315193876216, - limb2: 6433594403177157350376573602, - limb3: 910688150020762945777895641 + limb0: 39625995916482047945602706752, + limb1: 7785706395134088068789685570, + limb2: 376173724984627433, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 47601331431851317847302198440, - limb1: 25952447586346570983663113068, - limb2: 71576116608833921692048124280, - limb3: 3961091596974096161891226567 + limb0: 64376716584063722650882356559, + limb1: 68522766020288406792575601342, + limb2: 2920961618637618143, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 7271470114433976872277236022, - limb1: 21062028167312599300660507519, - limb2: 16731804700683207703832269528, - limb3: 5601611127548205754951613190 + limb0: 49670125641456639022556851005, + limb1: 58017501322358528630135437643, + limb2: 450164515026835633, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 38521168423017520128918526483, - limb1: 76983182475756325918969541564, - limb2: 29566532422386578732902051521, - limb3: 1892182140517862912780495630 + limb0: 4558509832759504170152284564, + limb1: 3083915617866553440139090010, + limb2: 662402086987671876, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 22472165520285347854872081111, - limb1: 55299247577710020580279160866, - limb2: 7295235094024182182384078330, - limb3: 2380251461359542663196381820 + limb0: 9628878267333412759628106091, + limb1: 32835566504826202855126984156, + limb2: 224246955882044999, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 37103766841189680776707553845, - limb1: 63236518411068155000423382446, - limb2: 2981919569476027778509572306, - limb3: 2925575131642041374543003949 + limb0: 23373578627194481580622827905, + limb1: 40824142366179985823120457866, + limb2: 651185369800160606, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 10908303312846267447188098811, - limb1: 76819913249946014358496535869, - limb2: 60401455648087070354399867003, - limb3: 2739893192479610987613272108 + limb0: 16373847433397188305529324297, + limb1: 38150065529464777095411372403, + limb2: 3224156057273774948, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 3165256644078460331544223147, - limb1: 11189928177319511322373543889, - limb2: 27519883107070860360472043623, - limb3: 3068013124463510943526401765 + limb0: 24389947958039806350008308320, + limb1: 59039768144694099027039757227, + limb2: 1524785709859042425, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 17251572256864859856584130663, - limb1: 5763205243352629770543307452, - limb2: 48581067011891909406091715494, - limb3: 7181174225253194140478473645 + limb0: 45205695235804675574679172967, + limb1: 74665967049235102153823428286, + limb2: 1380718278706314959, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 46348018667589857900328935007, - limb1: 28421837925894067294403916678, - limb2: 49488014451665778375165978382, - limb3: 4575052026952046556591188730 + limb0: 19561108508961411316275564414, + limb1: 33126350949604535340128199904, + limb2: 3423278334652498134, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 42364643063670379053194574616, - limb1: 78620064134276669932937566465, - limb2: 75001220301989304137607305890, - limb3: 3236577327282302234756929893 + limb0: 69502285428787365988144962376, + limb1: 11838161154860034662628331837, + limb2: 2091331236260444716, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 77443415722142321171641829447, - limb1: 47397661300659072716270896796, - limb2: 36256562980003427318263128932, - limb3: 4761399994425048845359862133 + limb0: 21393309700960734312484999084, + limb1: 36106588288132621014171193283, + limb2: 269222037080883262, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 76167856197885421576060441266, - limb1: 45780872106471687841695994344, - limb2: 74868315279138366142703261010, - limb3: 6798374783236710999278619054 + limb0: 21128757208120864010857500330, + limb1: 51118032749350746098761173355, + limb2: 95462223393510240, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 49176568599723102598454133902, - limb1: 8000049683490354059215974827, - limb2: 41421353764715279913003046363, - limb3: 2375450683433575830251824856 + limb0: 54493028557012176965031226256, + limb1: 54657775962473307481235930054, + limb2: 2291456814859670859, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 8960238175531197875973270143, - limb1: 47497175250204203018004471158, - limb2: 5279442039171117625591085442, - limb3: 4296115997386708249839832053 + limb0: 19527602217872354112393058389, + limb1: 34655024064153355705146377705, + limb2: 845745228022378766, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 23262812800899090644145325222, - limb1: 14889202114256134709710313457, - limb2: 22895480456524269823476942626, - limb3: 6988553807804913836013970880 + limb0: 41853782024885824839164679138, + limb1: 52479945323402193850565966296, + limb2: 3221038305590172683, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 17304362039786325713766938257, - limb1: 46045075271049853515800368804, - limb2: 38837094046060875685308995383, - limb3: 7294706492536782612553949021 + limb0: 58017267503512047476863048812, + limb1: 62205074703712894400191135872, + limb2: 2486580569059980156, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 58094240363976798159670697090, - limb1: 77379453899207627112404357153, - limb2: 44816618947905059251896249432, - limb3: 5499178832760672722616687788 + limb0: 60253412794743075612563456943, + limb1: 8145478488139851957967928618, + limb2: 3155127265514998309, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 13672725661733503249611019141, - limb1: 35179022400369243506392306117, - limb2: 30913981932322485131946980015, - limb3: 5488205761927848223833530987 + limb0: 35612778535253294444557335976, + limb1: 17150393069239975690145877877, + limb2: 589863514485002233, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 55075584697623451031435645539, - limb1: 64704298851835394432532682504, - limb2: 21456789767582077196369926922, - limb3: 1205109997806802536758155352 + limb0: 27232514061483368493217840233, + limb1: 68826057662911325731511049324, + limb2: 1357894035907832423, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 23041915983280877761936260119, - limb1: 5998336706579962185842109329, - limb2: 78024403372897603086198639776, - limb3: 7883307776072020824753387480 + limb0: 15024912369686166058619390427, + limb1: 70359442970356051641670957603, + limb2: 1001579407528590362, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 37687932950531136803745941438, - limb1: 72224672184606073402659444583, - limb2: 76902935498088153176625285266, - limb3: 3640545759336967866479160171 + limb0: 19233648008920708567892572747, + limb1: 28590532858222572036210252320, + limb2: 3095864174160586619, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 65765135573897097218356726065, - limb1: 69013701604536361574050962596, - limb2: 24651338565469183070120297966, - limb3: 6121522133322341854912319359 + limb0: 31963952646591390945521993389, + limb1: 5216931337125740514973485772, + limb2: 1424490221393274899, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 47602343310292481666918948859, - limb1: 6734822331827381504922401841, - limb2: 68263283555443863018627923111, - limb3: 7024486646475656093207412582 + limb0: 47154676195365178199984892525, + limb1: 59785487342295181848509670881, + limb2: 3295697652711067616, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 66915817949799827363496094039, - limb1: 78537298945270935950673232463, - limb2: 71375954051981781275141978722, - limb3: 7126089842244462938643988768 + limb0: 39872731206246845118362845005, + limb1: 67091170977509086926391766130, + limb2: 2878260073482860461, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 70048450040356662430181131754, - limb1: 33972410082526330000272646180, - limb2: 54407370937230273945441553521, - limb3: 1113866117118058770701142346 + limb0: 76164189408340359596528337205, + limb1: 7896340280568761770181397633, + limb2: 1198425687133315702, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 69560624240588667418526168000, - limb1: 71467653329112435472733899564, - limb2: 50292477987015665279511569822, - limb3: 248348115437883620112609425 + limb0: 63602230645029593077741170458, + limb1: 79143497795706877495622164912, + limb2: 1585190083993157695, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 33805481490451644782897947040, - limb1: 1841314832368836656843798121, - limb2: 17380458087744655241669251497, - limb3: 4658336347205742127007182733 + limb0: 13023658680108373491232174944, + limb1: 20822745328161649841528317419, + limb2: 1239704803500934657, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 59230588879243883504808032419, - limb1: 62472653248920867019641306304, - limb2: 51485178757087027183505797954, - limb3: 253352390540942154887934633 + limb0: 68581838801093801912994214086, + limb1: 1887705577246717970420107739, + limb2: 1110052947905184217, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 29740176264433738834174236356, - limb1: 16094150758513148219817572216, - limb2: 970056291680096042358865769, - limb3: 7193509170784522187462990668 + limb0: 8189689437775358904087351573, + limb1: 23101439397330597706384958132, + limb2: 1106767845237952844, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 10485776942171124451339500718, - limb1: 5506780347785755624449629454, - limb2: 74151245890467891674542346860, - limb3: 7292851663501193943857116906 + limb0: 64647135618825299684154030757, + limb1: 2307855723929097547580044366, + limb2: 894262772576970200, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 66950333992674017165740047751, - limb1: 13608993206740356579753706300, - limb2: 6496564101617775254632185933, - limb3: 2835027621301971146483728684 + limb0: 47191426578617772016789552832, + limb1: 67363982269332042643257817836, + limb2: 574190521870184386, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 53462027906237931973362860851, - limb1: 1217474877613558054050367899, - limb2: 29425105047097763664979187887, - limb3: 4403224255775730319689376542 + limb0: 72822638448595008609134213391, + limb1: 40743611655783228231935534126, + limb2: 3155130394177046937, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 19529908191219548157199622276, - limb1: 71992634947075923037875734529, - limb2: 49142609451098742060411533529, - limb3: 1484006972300897434004292925 + limb0: 13173421783134780976655758369, + limb1: 13702391179809888818245226930, + limb2: 1638605131227428586, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 4931511096887142851136364326, - limb1: 17220071666257343594159415469, - limb2: 4042314627284208414250021232, - limb3: 1947456333869156642785109678 + limb0: 3103289241242953473934456833, + limb1: 38543615634377315596282333382, + limb2: 569124431024195760, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 68145394802202647841958061378, - limb1: 33604853309814740821569043571, - limb2: 51015225430001738940965287099, - limb3: 4356593000630073349059365383 + limb0: 66091622976554923932410962776, + limb1: 32191394184739245229899216001, + limb2: 1919909402707187974, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 34439519098894919989466583378, - limb1: 66611580312478180240475921662, - limb2: 33114039163978734314461437439, - limb3: 6487549307253936193485916954 + limb0: 34568614397664192817642385027, + limb1: 57105489489212755083135035950, + limb2: 1327096221133037222, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 37411962983526292091885734121, - limb1: 27396065778391686099607049557, - limb2: 32956590335512122721826116391, - limb3: 5704581262818155405623563216 + limb0: 73938710902326764758581787622, + limb1: 78342588800710163788318161844, + limb2: 564558999619906021, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 76405016672900117564690440579, - limb1: 66356389373701318351186913785, - limb2: 10818531713788331393210058655, - limb3: 6173735342017916834492560732 + limb0: 10094389339799975082047187074, + limb1: 26180823633811844891096654715, + limb2: 1223501932199433672, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 25199049241028398506653015281, - limb1: 67976793251000223315194111528, - limb2: 40627917565269451136789726132, - limb3: 7799317978513979929237431243 + limb0: 56405797502933093787414629934, + limb1: 23483612129631456668357791056, + limb2: 1577138574987951894, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 67924360374650260392261014718, - limb1: 49462382517551758178498017070, - limb2: 58848555772125149417065193240, - limb3: 1719783592541746738801327682 + limb0: 15840684827365754424432786607, + limb1: 46597220446814295401254864282, + limb2: 129287389531975480, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 66514048713583955886038905108, - limb1: 5640913112042438176807213355, - limb2: 25970741250661949670335463918, - limb3: 399782980361285830180900069 + limb0: 26624746109214878113130598039, + limb1: 61496686273880236528295512717, + limb2: 1535414785273458331, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 25677208653034775881400114368, - limb1: 12374800440744780485230057497, - limb2: 62766928827984504750621290760, - limb3: 5643048298161181713360869868 + limb0: 50898179679169099450897413779, + limb1: 67854739008935564157123280178, + limb2: 2298464981092895613, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 44605246175748906222149774100, - limb1: 56986762053215039476754882645, - limb2: 70349233930434169092237207679, - limb3: 1679258260517917993175269270 + limb0: 27463496084716552235348540529, + limb1: 55771418707909149626638997323, + limb2: 2894954143137181067, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 66587973868489805868650844856, - limb1: 70309111211223650207570745076, - limb2: 56783423200926785272819095963, - limb3: 1627572126278018799471977575 + limb0: 61473894481795645191646440023, + limb1: 53596466311071374166014819776, + limb2: 1350527255070045248, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 20989762040490021997147960446, - limb1: 23182530863799334541897622607, - limb2: 19061867187705044060925136852, - limb3: 5318244308541208800043406082 + limb0: 30310614206092209406022322256, + limb1: 69562292233257650731947104713, + limb2: 1713070274099542367, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 75996976693260164052665820550, - limb1: 21317613257666881113981901646, - limb2: 35027053076120394624442316496, - limb3: 5192607899808893228909311417 + limb0: 74087035672426157846770219777, + limb1: 4599211168129241480503756467, + limb2: 3295900993528997903, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 36472919691715073440825069537, - limb1: 52586212747108958850126767980, - limb2: 73676589893984042476057876074, - limb3: 7868116443642066524699178132 + limb0: 26257862329786074745448763220, + limb1: 43771346219351324730645036606, + limb2: 2177196132512683109, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 50581245030747592592704980717, - limb1: 54688963689020714346684930074, - limb2: 25548945843990831622976129019, - limb3: 1383584219271830451309705157 + limb0: 75271088835565013675362798444, + limb1: 41820359171369006549354018100, + limb2: 2196496538146176727, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 10695575843117745773671147105, - limb1: 15330186227078939784601268496, - limb2: 32284525895979775117309465827, - limb3: 1160727927083891516677963237 + limb0: 32960485100392329806443515500, + limb1: 30602606234468937475461528936, + limb2: 1704525614764188290, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 51332277127233226751173111088, - limb1: 68549061570480799551048870060, - limb2: 24712688847592804551943511103, - limb3: 1670136605178181908600292345 + limb0: 8423637874762539832707701181, + limb1: 222140142895610347135306046, + limb2: 2638160831617258423, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 56073294496616681339287260201, - limb1: 55018986716373615998375975593, - limb2: 61638168641998358752954032697, - limb3: 6547983498724962186883562785 + limb0: 63330266415773103888364153220, + limb1: 44785093807409357692811072412, + limb2: 1107764844827683839, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 27023120402797607853881154834, - limb1: 20449466663001200708320548652, - limb2: 40095884777989552421079196312, - limb3: 2052564267725698105304758948 + limb0: 60952921440852534281323697596, + limb1: 70732140861624076954550411604, + limb2: 2743614043138944326, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 19541692261621892077543528387, - limb1: 17763255207663287994716103189, - limb2: 27028279474226709253506904335, - limb3: 5610093475378076110185931739 + limb0: 15347791979054948418270295851, + limb1: 13598086387273296642495853477, + limb2: 2385268941024518390, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 76320160917748512135716287800, - limb1: 31430696648094544373825917514, - limb2: 45700015890162990034611858913, - limb3: 4079381602875848969052363786 + limb0: 19442137173063636198142969442, + limb1: 66613680489720197019432613517, + limb2: 3336581785815924606, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 1381097664576833326409771085, - limb1: 59235639988786010721262599827, - limb2: 7970884047441091842496182185, - limb3: 821554996362399954610465841 + limb0: 32421319846044009380838302450, + limb1: 23535135406557558510523737479, + limb2: 2601500185502625864, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 19595301090704927347726521016, - limb1: 78730435640583372780601264549, - limb2: 14656032268156489096163652947, - limb3: 3208954632642708712141930479 + limb0: 74523122027153563773224568995, + limb1: 37547923235793684967378780192, + limb2: 2068172197764249514, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 63936757391394694507874276690, - limb1: 23156875864107556276110440485, - limb2: 75157644790473432082296756234, - limb3: 808983251719802126640149757 + limb0: 78577755323917196126689126935, + limb1: 31071103768308530134946447380, + limb2: 1238440349017278178, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 8987430515421315259894686428, - limb1: 47126090829800005383190116910, - limb2: 14718585735985668188880944269, - limb3: 1208653380290323755926651244 + limb0: 65999268592750119293634716534, + limb1: 64763820200040368287891527746, + limb2: 2501789946036653420, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 14840888717305257972830534531, - limb1: 16934616297315988695824423760, - limb2: 21448176726920336454564307347, - limb3: 3250027992028524612183797075 + limb0: 62359876955172295265702338048, + limb1: 61198461674996924439109731989, + limb2: 420121406418393084, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 61412588701069445387030467634, - limb1: 65154642555339354000600815470, - limb2: 32880517095522663988967928303, - limb3: 4151219668039651122472412555 + limb0: 35353710335165024116434598615, + limb1: 53218215086463110159950592418, + limb2: 2721990618466207978, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 23277328559140923610334781666, - limb1: 5033962468769066831875083673, - limb2: 10953601425981565614588609632, - limb3: 6891583332901560240558119876 + limb0: 23992208531441825898626133065, + limb1: 152370737562830403677868053, + limb2: 2706182920731461817, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 66138216836163525891213975574, - limb1: 53195515726030067690764227325, - limb2: 41218508859337075578647933477, - limb3: 3466384974997425297299359215 + limb0: 57029486617465462407201700176, + limb1: 56431233549766535684183071732, + limb2: 3290903727631228348, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 3051320047888510832141120454, - limb1: 3472610083412385472177083378, - limb2: 45271735997582648944121122594, - limb3: 6382644195881369006919163806 + limb0: 66306244795722673458192105752, + limb1: 65890898271960112209533026908, + limb2: 2009220826347043038, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 69954894047413127146989745681, - limb1: 499955511102217268780720407, - limb2: 67314343984711013143313251135, - limb3: 6886008729478788949569960610 + limb0: 55057339151322022180822444658, + limb1: 16550412210771301287285528596, + limb2: 3146050972406812135, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 33919146280051994892953674157, - limb1: 15689993360034217608650674885, - limb2: 31965405846362940964204633011, - limb3: 5846766448037690285493137651 + limb0: 48818444570194561351165654547, + limb1: 78749785573299009999932459417, + limb2: 1692265389023440308, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 3897750198092733058447325109, - limb1: 19023824177350833749746028551, - limb2: 66902677722390103115804467331, - limb3: 1314923869720492028472446191 + limb0: 9622711033810258328234688913, + limb1: 31245996419260822877470180805, + limb2: 194075481919122456, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 55318604795373800661646914882, - limb1: 45469613080057669055925027271, - limb2: 9593372758926031244572082384, - limb3: 5525921770604712183598632836 + limb0: 1065531457371503110329744617, + limb1: 69940128361052491362627226316, + limb2: 3308473548811094197, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 40911606854907751934090948294, - limb1: 78913085594324490198083833023, - limb2: 49454721044971966466556193529, - limb3: 3630362418818306997521043253 + limb0: 67497435364693996750962958075, + limb1: 38627097807942557434961066915, + limb2: 3261025661289372975, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 60525153032632673445323713191, - limb1: 5549433712259320754243085960, - limb2: 34463942878382621367238514379, - limb3: 7957258042525926501699798031 + limb0: 48053065892959347630240933062, + limb1: 18347337436781240871867774013, + limb2: 3128090331035927853, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 4127787590281004903753828309, - limb1: 56653382718979735198947405138, - limb2: 45478187458297924346373320902, - limb3: 5098656264934896638902527913 + limb0: 19069597594660664663182399250, + limb1: 1591223833983468848990110078, + limb2: 444269595334697541, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 65859980767493258330832570355, - limb1: 40915779923501105839532835530, - limb2: 54695051095277182185540297217, - limb3: 2959196942894032732365991433 + limb0: 47709943370981172659282721011, + limb1: 19715931321251073288656310152, + limb2: 1052594722268313443, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 11550830628361933200480741615, - limb1: 77380387870008298716582001811, - limb2: 72949242867996093243184784109, - limb3: 2265726094683673872337867359 + limb0: 14199375855517784261375430846, + limb1: 34584209371158975360165779554, + limb2: 2147768208730901369, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 45983214026893031955234619060, - limb1: 37749122986301035140231836859, - limb2: 54425383604379570319006548956, - limb3: 5874424432635374370498595699 + limb0: 70319287261270769486186926174, + limb1: 52898265182778858887055624616, + limb2: 1221048633268055323, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 63050793511535460797139630792, - limb1: 15345588986827967140131379510, - limb2: 54507420620203214468867317909, - limb3: 133060087823440042891443281 + limb0: 13247330429048155722818221153, + limb1: 14955797169085333422788744345, + limb2: 2676684352933893394, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 68463585893835851215702500539, - limb1: 78014598274001666580639731476, - limb2: 49668354862511841903893855428, - limb3: 1051910504189465720426491370 + limb0: 4752821386268207409492047159, + limb1: 43920100179367701288023773025, + limb2: 670714840281938928, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 32251920713594657980879909840, - limb1: 59080286532638523614823201660, - limb2: 22284137550063638790716651552, - limb3: 4675604106329412657204672595 + limb0: 64710075897101503948651730143, + limb1: 25253455921106014035606678404, + limb2: 2672107987947087958, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 14526259578535447159628874897, - limb1: 32933357343471909695410911050, - limb2: 48621721316479398945166854682, - limb3: 7321078374392738882099806354 + limb0: 79209153829296413043784060894, + limb1: 64504148635044240940922964940, + limb2: 1655985040579545011, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 8388492187183358926246219367, - limb1: 13659214881156604156695802617, - limb2: 52868337358567458973859169700, - limb3: 895536620325298765383898070 + limb0: 30120002365557028597701529683, + limb1: 9533790622450004718443495585, + limb2: 2071489023276706732, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 14753554310096742683448032522, - limb1: 53087700787149364852798998403, - limb2: 27481373217427063166951850290, - limb3: 6030051263019702810736841020 + limb0: 26934320474957450397682788642, + limb1: 34600199017481581381248835730, + limb2: 544334916348971776, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 61198296235290932371767192707, - limb1: 41855387114718549058400449002, - limb2: 48150541801789476662191934748, - limb3: 5673787316272527022938345880 + limb0: 957820877074753432180970637, + limb1: 60851113400674279456191634997, + limb2: 2086094745545606605, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 6662963463757297215507530190, - limb1: 15221476857637138011719288721, - limb2: 73307540068926899938858890557, - limb3: 419540506781125405161567542 + limb0: 44905267513721041865351251561, + limb1: 34455382912754092657943366769, + limb2: 1338127057822729686, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 20431639823411105714142204879, - limb1: 4652556612174841495333805023, - limb2: 73998932096625782057444255549, - limb3: 6895851818083970547667555624 + limb0: 56514367381489942826357727154, + limb1: 71493949490012631357559952566, + limb2: 2660792568342659421, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 40615585968790266053101822574, - limb1: 10277205059536816269072201539, - limb2: 57365845881448544976177553448, - limb3: 7695451494555469359155530768 + limb0: 1871449051832785137993630173, + limb1: 58794530842002250687347365462, + limb2: 2141223663082387203, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 71772450381386048117158768518, - limb1: 18658472518887713029954361712, - limb2: 41496890521870986688968075571, - limb3: 630493327235546671319918808 + limb0: 20156416672094306505903074801, + limb1: 53933347810584503971994663649, + limb2: 1269831542728649531, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 16746754877737639626057588044, - limb1: 75547625851597826971624348048, - limb2: 10923930130142499506204499113, - limb3: 531977931246549654240115198 + limb0: 19389014799782394800358116645, + limb1: 57872843612794973828407753109, + limb2: 743127371723231110, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 29006634897840773335273196121, - limb1: 14973309896878906821026567272, - limb2: 64248259989696884438699836445, - limb3: 641410685353603393949869329 + limb0: 28465053080555816853908047768, + limb1: 9260814361523028705520185886, + limb2: 749047720469735973, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 17887804206351765737704118139, - limb1: 19605676566326865109139523010, - limb2: 66446364228158005901740226815, - limb3: 3223590737719709359375379876 + limb0: 40351102695539591993270531533, + limb1: 42028312202788785152196088822, + limb2: 854901235094402318, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 74984743789150834195000742329, - limb1: 19562668660124429013648375865, - limb2: 73329208601781978245663372070, - limb3: 7506230498471619331907401434 + limb0: 23473035960528810237115575649, + limb1: 42150419681771366035971005738, + limb2: 3000653325654996809, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 23723972498898772963680390817, - limb1: 73868916867331760734296765698, - limb2: 12767522731073345576605306952, - limb3: 956894308177405917270242421 + limb0: 67463701748729306546809479345, + limb1: 3933281955446897020327818661, + limb2: 1687410784523705984, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 52395959181872143179964699662, - limb1: 20547067172062942351354080297, - limb2: 4890465534321032002804901314, - limb3: 7080179002867738030501820472 + limb0: 73567769436046509879406861062, + limb1: 30858236528603068969084300018, + limb2: 2345829781821374946, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 1133963708600923898033259235, - limb1: 20500913192976113739878449879, - limb2: 33083130909714705464884020537, - limb3: 2685421702339551345670569526 + limb0: 57667207786704468295724376120, + limb1: 44815806801380198985336795183, + limb2: 1116094995865017856, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 59617410606737991668798411633, - limb1: 74932941211660764972656616871, - limb2: 38310436281629794923328728541, - limb3: 901445667971463608266043736 + limb0: 26321407651669457125621841017, + limb1: 76687865243179657471431746767, + limb2: 3459988181656365707, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 27585505620667028980865610296, - limb1: 18058130842493712119726852167, - limb2: 37356807248411754899998782850, - limb3: 1930773982872117760888433630 + limb0: 71325610568439009179060533966, + limb1: 11573069995701941582221065893, + limb2: 887514686782608805, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 6020272325604247808852898018, - limb1: 46518829742102036580853933680, - limb2: 5320675265146990373975886964, - limb3: 8041794052300767509586356460 + limb0: 28410648839135772173147164962, + limb1: 7013825408842440627514945261, + limb2: 1346371627504971288, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 23738528256740982291950732262, - limb1: 66813270631857189473366510503, - limb2: 26723730420498214224599589015, - limb3: 3305239859340978809216489885 + limb0: 21629487587935825669143820601, + limb1: 42036598966647463471424074758, + limb2: 252954272427485018, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 10049508160387824225031168408, - limb1: 77548015342235059919263230650, - limb2: 8478591133949354406296797985, - limb3: 3307512525671005563783562187 + limb0: 1602262461111281444137335558, + limb1: 31276893537098912430383855528, + limb2: 2288477207251550033, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 42121201777807549153992345254, - limb1: 78901099118589121175330065459, - limb2: 55600365647654839524324995060, - limb3: 2692480878340018594175231429 + limb0: 54322066258736546789832020006, + limb1: 32487576965242628053114020122, + limb2: 1698136169296414022, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 37131363110379598106000292583, - limb1: 23150902240571922273894243206, - limb2: 9347386493255782779722084240, - limb3: 3384677583898750245586429330 + limb0: 36065184946927069140683032452, + limb1: 64759367399069707887293056504, + limb2: 2628620246564712359, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 24098333449155947785777553583, - limb1: 26860089612768473075668011585, - limb2: 37050827162466708031286228855, - limb3: 3853376178023234466613815875 + limb0: 56600756998209782222627414801, + limb1: 71354310664525290692374275656, + limb2: 74665234403012968, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 73222851745560856049831050268, - limb1: 6784290052982411403517074495, - limb2: 32894376431506160248736362401, - limb3: 3723558232551689317898290271 + limb0: 63494957120519784779371031371, + limb1: 34826931900043697488540997932, + limb2: 628397540222871206, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 71523247977541496582344883586, - limb1: 29166352789134566198882290149, - limb2: 31752187181413237670342816426, - limb3: 363696443033007341843535229 + limb0: 51479747409908586117078846760, + limb1: 41025935601987059955350240233, + limb2: 1377593115483163422, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 37655732898788684714264064397, - limb1: 17951491366972216835029399897, - limb2: 30305039048437065214135637107, - limb3: 6020986594518623199990286571 + limb0: 54681778864924272244483081156, + limb1: 15765790865290645037087624095, + limb2: 883519713988187636, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 13009801561042742957306177760, - limb1: 72037373416985099090699727502, - limb2: 55868279743755995757813729140, - limb3: 1136143623514762033878170439 + limb0: 50693492374131242608974196548, + limb1: 44762889863262318317770667329, + limb2: 812382629587850868, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 64723266470453130589771707511, - limb1: 14405807982851696810224828412, - limb2: 67655553119838654557063496533, - limb3: 3611462775972354797820088010 + limb0: 71652489643942234645957181900, + limb1: 9886275415525467238813183050, + limb2: 2691906643438332121, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 70029825851763089961582120192, - limb1: 72545868424597340060628097289, - limb2: 11253168127869837697096277545, - limb3: 1288384894430021859640269552 + limb0: 12914874678742321058830800878, + limb1: 43279743852801724002331554585, + limb2: 2219731799441514380, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 71219215064411571132495384062, - limb1: 23493086230777181990941215710, - limb2: 21592091646660430377512513957, - limb3: 2588095208220521360713399996 + limb0: 67454041552511829555173333667, + limb1: 50049509293920232492990600751, + limb2: 1914014055730263743, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 22941105552069749455727170552, - limb1: 71051571968635855989914765621, - limb2: 48454553830383657748892724536, - limb3: 3754961659783406424198768829 + limb0: 46335958847088019617311525866, + limb1: 71642685521124417868513366379, + limb2: 2601177153998011817, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 59503261176722075873504269429, - limb1: 45531466366182977717932217412, - limb2: 43065387176141749681209410053, - limb3: 4729652721538907409589188397 + limb0: 3461923919532722973016004186, + limb1: 9561008852895586227712429510, + limb2: 524548017880243444, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 28115820823468379980002547087, - limb1: 37050213840369058739088300476, - limb2: 9505353252723734861139591540, - limb3: 3224697835491608194707827254 + limb0: 55418247247721604335831771887, + limb1: 71073342432657023635355077351, + limb2: 3056785041100275782, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 34771233677497806881810335901, - limb1: 25947440858497464917464924417, - limb2: 49361198596822283729701770, - limb3: 5337832623768227529680032058 + limb0: 59029906158650384604468717947, + limb1: 68717796737547490450805778676, + limb2: 2689428444859461365, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 6755630035495427225992241378, - limb1: 5711853138715839102525821354, - limb2: 56063853365502637993162291930, - limb3: 3426337448742458866689142623 + limb0: 1314313293258001463524334034, + limb1: 74108704115118813431826783441, + limb2: 2116230567950969062, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 59822131150579401071321514064, - limb1: 74028073825012252126603564332, - limb2: 8347022354892515335717542642, - limb3: 3193368891243389206894875192 + limb0: 58618810497336398573738204594, + limb1: 14278326836105709776000493101, + limb2: 2062020278591858202, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 47544588695042094347919333391, - limb1: 947846325326258764706517597, - limb2: 50859512114443280544785274692, - limb3: 5776385650853579305868178603 + limb0: 10855571336996643930415874476, + limb1: 46566604841892945967929900892, + limb2: 1477580237141899091, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 6117687400493421024969670679, - limb1: 31749666126945744168535092387, - limb2: 41841419614721869327741678723, - limb3: 5361066473472291372654861892 + limb0: 32033063736463665186214304270, + limb1: 43285321482608059850441640072, + limb2: 2348569384872726597, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 45231220261035887389265989390, - limb1: 27216961115070362955899883616, - limb2: 24510424103098924448857211768, - limb3: 1399243061114262204321196718 + limb0: 40709861412531194664920830586, + limb1: 36297514669934404381431469618, + limb2: 195352306616090179, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 48985948628846624720895315031, - limb1: 4245057677092816800558088698, - limb2: 42361120655679842342096307062, - limb3: 5225396088629456016938349383 + limb0: 7136830612122213032941966188, + limb1: 63267824922971658576872909847, + limb2: 1511196148009147078, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 9005445447431535634940696840, - limb1: 15549920436715966717343116480, - limb2: 49857990680719642427456066463, - limb3: 1500845053469059086399281320 + limb0: 30068336660958060380260249344, + limb1: 70794240044628468877869266400, + limb2: 2396261556996091627, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 31659591760286386401782701361, - limb1: 23537530752910735705514840670, - limb2: 73382853987650609943332154254, - limb3: 2153704873293125292181336358 + limb0: 23803616192601237628789607560, + limb1: 44802498445387262652074344980, + limb2: 3433521185874262933, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 9435958630417145235700272150, - limb1: 56836863145253391543037214985, - limb2: 41695705847052070705825850498, - limb3: 5956510827964546481681840500 + limb0: 17894592808709444772159085711, + limb1: 6732819551550419189019891953, + limb2: 958583744073841875, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 8509717086442067380634869260, - limb1: 39689205179956131408601163356, - limb2: 50243756716582935356544537489, - limb3: 4489140189422844558076815387 + limb0: 39789615669515386063675815895, + limb1: 36667435131780072453776980901, + limb2: 1547902144479202410, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 78088528875078601571629308013, - limb1: 29570813028428080213687347210, - limb2: 33541040161060098656331550876, - limb3: 6856117604190727586248203862 + limb0: 36183684888779317700739638157, + limb1: 40910051494382538877167050779, + limb2: 2812933323199924499, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 1247565815345279194507382379, - limb1: 42647195663834322377023744638, - limb2: 73096799007553471761840696835, - limb3: 1392054019997836465519541295 + limb0: 54830261785166636273903105234, + limb1: 32206071850053123007085107085, + limb2: 3353832936382502186, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 18658376633436847183121128904, - limb1: 31706224002876679724166408351, - limb2: 27282550598831176329389007227, - limb3: 2543540187186657776110258252 + limb0: 23592673919923999770015745119, + limb1: 22574637949741963051825122999, + limb2: 1769473254309124465, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 72173961674557674806038233292, - limb1: 54635111627401865455354812129, - limb2: 52810287926867503142562640213, - limb3: 2210224514878425294709959482 + limb0: 20474210533062209728285164203, + limb1: 25133520739054505727814527637, + limb2: 1669200035207189654, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 30787141090049766013212713159, - limb1: 63435192253750228100295630507, - limb2: 54383685786890634551697783847, - limb3: 5470842494237363647173726449 + limb0: 19997653337388932375523198983, + limb1: 36060745591280313181917174693, + limb2: 725595017474903550, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 29680363457063643550892527075, - limb1: 45914860541813490117987157508, - limb2: 65806645707266211108011230905, - limb3: 5368698666952668770748046271 + limb0: 20742570818123969188816411307, + limb1: 55023961801085840887760380174, + limb2: 2958072084987472240, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 78946873574873714829567405958, - limb1: 50453596364012879416050039971, - limb2: 33437698407078337926612695842, - limb3: 3899753294939608251972804928 + limb0: 34003667972693074303158328620, + limb1: 66099594847339235362229653243, + limb2: 4691930802026343, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 8098119143213102697028379633, - limb1: 69439122796234443079524496358, - limb2: 2787941774050989905288211920, - limb3: 5130354386793444427201731787 + limb0: 26253315960347082378489350457, + limb1: 24886282281255412135997240244, + limb2: 674446725540166839, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 3975221654068294576199495330, - limb1: 44452727859959503769819820328, - limb2: 75272248947363485000086234325, - limb3: 3352776808355094375304636347 + limb0: 78495071090266671060260654157, + limb1: 26085632174680139083146442753, + limb2: 3472386785429529911, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 43418838103018187537939986118, - limb1: 12074439572203181120099217037, - limb2: 43099280899290657251754582261, - limb3: 2140246087191880763017101120 + limb0: 10533678340705076080500919460, + limb1: 42057896110630367006101671816, + limb2: 3480581425175756694, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 53522919359393622538170920802, - limb1: 67500538497764893308520197643, - limb2: 19256641460474991972378081064, - limb3: 1764886001369396459189049602 + limb0: 17709025313535776387832136474, + limb1: 1563591548918686777323460837, + limb2: 1620495811372853047, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 63436940244616548000965744255, - limb1: 30051876427678797526763659703, - limb2: 56824184731055011345219191125, - limb3: 4094442869302745343598572684 + limb0: 59049719676431707720639495221, + limb1: 1474054261258050753938523605, + limb2: 1300649669436181041, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 2978192510526045778745368818, - limb1: 28093692535359828953800491248, - limb2: 13618526256175638109074569540, - limb3: 4477434202151144923305627192 + limb0: 18449807533423016867607677737, + limb1: 74773769612645810228544222982, + limb2: 2308380013046451606, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 23273830505346968653973571118, - limb1: 10527823705017951554733383339, - limb2: 34231132699953445130907207630, - limb3: 4268521577589488149108791051 + limb0: 17865513332524023050226638399, + limb1: 45636994160548350158932666583, + limb2: 2679089471656811323, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 13567885295645287477733252782, - limb1: 9593925845733797296807918812, - limb2: 46855566824512231797338550654, - limb3: 1848348686040921883723162821 + limb0: 50869280918536267038985148961, + limb1: 63041797022045740192477074668, + limb2: 2998941770224313849, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 11684378927186942774191696719, - limb1: 32766739644815676954848633330, - limb2: 68637932219571888691670712143, - limb3: 6868244339806596003876953872 + limb0: 61458482832977440623916899450, + limb1: 11523246697846145383396053983, + limb2: 3233267838996084815, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 5731937689769549152646724672, - limb1: 52891832098144756030329975702, - limb2: 38465014412441783809188511970, - limb3: 4143812903795249853285882856 + limb0: 5043740799401626899201144200, + limb1: 71229037771989750649896014815, + limb2: 1609654550585672660, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 21651721748785415384361316170, - limb1: 34095267022761748614478709794, - limb2: 58847169611152651326242650291, - limb3: 6860035551205752837558873164 + limb0: 78869644085677243021380443392, + limb1: 15886572477574598628367418779, + limb2: 3328280003121914165, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 47458409363389437389000032383, - limb1: 38755782684772846922700481902, - limb2: 36589761039161272685338950558, - limb3: 5386097731250663060997256901 + limb0: 77066152122836303730899654996, + limb1: 48332199458464785961837046306, + limb2: 480277827141591342, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 58845700659094607665763779650, - limb1: 67283637953506347966605699979, - limb2: 41330776137181379039875541260, - limb3: 3389532694999183851774428287 + limb0: 49343817294623673553536032951, + limb1: 65055123524887606369228832121, + limb2: 3078605919609049018, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 23028248328256578094203423324, - limb1: 54580200246323703954403884883, - limb2: 69837754031602327862391575112, - limb3: 3456069228987164131976164778 + limb0: 44701193023332207873277950368, + limb1: 2517827392901320712642409135, + limb2: 767634358351565271, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 15759454834884364247019264240, - limb1: 37420767711293378675246021430, - limb2: 9061610658849492052730088460, - limb3: 5180939404653728754700603066 + limb0: 51832396294943572727536816612, + limb1: 35269279436062713439991456065, + limb2: 242818854771031641, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 64638951234971039759820718616, - limb1: 55545139581617000134688474489, - limb2: 58011678871087024672513867606, - limb3: 363848253065294411401336138 + limb0: 19899321371579978069936166942, + limb1: 31108590158471579727765382365, + limb2: 3313943201406569143, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 75566212479895950007688822427, - limb1: 76150992531851947478651288979, - limb2: 53204046988766189657041148672, - limb3: 1590714404151160890244037811 + limb0: 13816586873154391483657856329, + limb1: 69073433824735515886203663736, + limb2: 1083289617858176408, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 26117368659368151529068132079, - limb1: 31913102097048020829066999924, - limb2: 41275619320292783404089989311, - limb3: 3284379042326700219809471221 + limb0: 69641270087773392140272484183, + limb1: 25920453965978925218890567655, + limb2: 2695427888465009616, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 60846468741319821364437126130, - limb1: 68643932328654828345420972057, - limb2: 41870023637850250270570654536, - limb3: 2537894386553982877847849579 + limb0: 75644844268765808680174374293, + limb1: 70920484419726621270478458997, + limb2: 1524264189737284411, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 76196445546303853616308560338, - limb1: 16703708492210330401926809931, - limb2: 63489343763530729074229472616, - limb3: 5796014862129819661556586266 + limb0: 24400614724877138635407407838, + limb1: 20708132235873761348505168773, + limb2: 164493074393671803, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 37463126830950234252289897460, - limb1: 38975994170409308642471982371, - limb2: 42956491464802280857999804107, - limb3: 7233162287419077477048283081 + limb0: 20995334308757600117349750040, + limb1: 62447951161531602303683761900, + limb2: 2767404092929474430, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 1611047173189836352330286794, - limb1: 74364261738464262251520359105, - limb2: 33878554333920971045845028565, - limb3: 3469952449452351376016534643 + limb0: 61902524922293417673721012439, + limb1: 56269800305863743205084249600, + limb2: 1742249552179598758, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 43133559312219808911607548812, - limb1: 63040675948561832108595662902, - limb2: 60366063444641874665785795342, - limb3: 1465224476797394047076496671 + limb0: 23856488701386210838857352501, + limb1: 7059163873180502875599795078, + limb2: 1721994363661826099, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 51274624583571867877019054095, - limb1: 63204231271752526068866475872, - limb2: 46305246148463386760465924073, - limb3: 1119099536809327615342978636 + limb0: 55966851454162871748641823395, + limb1: 18854536428614610808926506408, + limb2: 2614619725954909341, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 53130934299919206065292215308, - limb1: 74880508498004796316777653916, - limb2: 18982856786564877077047090151, - limb3: 3503391909506931748818670991 + limb0: 18570085383428868192406281232, + limb1: 1404447062258128790476194516, + limb2: 1085421772916603047, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 54367541859087894385091454811, - limb1: 21543127217090555564019860055, - limb2: 37530886878021915402417545812, - limb3: 6842553951292292252797552647 + limb0: 7937117237200976857628090213, + limb1: 24865567090492015613206991759, + limb2: 648943905000019088, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 37090722859415924382874224901, - limb1: 38213564866482612786285261136, - limb2: 73327582273947052382585947783, - limb3: 6314202411510476010223940104 + limb0: 76663875838849510981606664108, + limb1: 21153328101772792473789826538, + limb2: 2427084245823018840, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 25057914260709862888414479897, - limb1: 66971796697936633567409644150, - limb2: 61673943478146154917898856056, - limb3: 2239231997253741094575629723 + limb0: 36220235024418089647025421598, + limb1: 60819529812317428874488373966, + limb2: 942225514442341527, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 38311720253876955843429431448, - limb1: 66057401995131593177536325268, - limb2: 66146804945472326304721646819, - limb3: 3676098530762556426191161012 + limb0: 60537555105477502343015893328, + limb1: 36094962431828172784761014164, + limb2: 1195835657308315020, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 51757619691634396396438068723, - limb1: 77781184357435505895598980704, - limb2: 77348350755133016017212363586, - limb3: 6784911667611404885015787938 + limb0: 57330713380899878963382157791, + limb1: 29636459444030954809614742933, + limb2: 507754767041560884, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 79209331036207160777337978860, - limb1: 76515590954211207084963173548, - limb2: 39480017407110598484874151180, - limb3: 4939847095332576758216140611 + limb0: 5588620195730471486357033558, + limb1: 33638600786726087627620642371, + limb2: 595059248962858161, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 39775763888461102013435398857, - limb1: 58462482114887009016877736554, - limb2: 30031199835363159756457599547, - limb3: 3673523001526614253697415354 + limb0: 76565758443389554663964681847, + limb1: 18659708203896130568759155808, + limb2: 2872716932628456725, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 23537409931679825337272329502, - limb1: 49157931181587719928454640191, - limb2: 63855023179608344016813111375, - limb3: 2886248592794521885305753156 + limb0: 13404598591502659434471068553, + limb1: 71349301715303976347101641860, + limb2: 1557800424287364474, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 72501271495476248379169576269, - limb1: 49283284185160257762975894241, - limb2: 3635326553516410199457087955, - limb3: 5817029531996342910195788289 + limb0: 63786829294272656426792975661, + limb1: 64034756818000869582148235137, + limb2: 2674099280418144926, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 75520190090785308794779731152, - limb1: 59749022525788295961587463485, - limb2: 6487531125636700632231088978, - limb3: 5006681192491945319108057960 + limb0: 67741128119434139452273065753, + limb1: 51527047499675009491250688616, + limb2: 2118179051925547931, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 55355836676212481757301407209, - limb1: 50269925524111942975350450928, - limb2: 65413619172458398355905061673, - limb3: 3074720082523929889300496472 + limb0: 21831941621932693593916765972, + limb1: 8240839168684807171214199478, + limb2: 3195700735865010151, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 65583285611629635086611913923, - limb1: 35388413744658172506768761259, - limb2: 21185233484546771724421115269, - limb3: 4753617439982385730178264899 + limb0: 52095684996992698688588828502, + limb1: 11795577407757070090715627367, + limb2: 1209259725919738677, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 50467100576034957621509973294, - limb1: 29434712967734683291009519106, - limb2: 24236085701665840906468879862, - limb3: 585907036350902256238307789 + limb0: 6007039661647293954415082375, + limb1: 74867591389281135375641703890, + limb2: 2639656999386898218, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 57459296446382852786324423554, - limb1: 71441320009303557860013095490, - limb2: 40115808960369839485437107573, - limb3: 3973759782955178023215881472 + limb0: 52542891366278507175763891763, + limb1: 32920332232967644901773534827, + limb2: 1783358488205438455, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 76955643959942879718194637011, - limb1: 45142677758798311881432060060, - limb2: 13677214944740666541702659678, - limb3: 4432558266107046136174726203 + limb0: 4181287259495599493428591970, + limb1: 63104239953253421859557078906, + limb2: 2713660084378305484, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 36592562520321863399265446850, - limb1: 28951745472599615230648749624, - limb2: 34196627095393215175370043533, - limb3: 7368301105557551229552563351 + limb0: 34281639782929359963064340017, + limb1: 25869787945385337396315481399, + limb2: 3188911181300024125, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 4968492774382984806355384934, - limb1: 63402859071497794679989603296, - limb2: 30475976533209564441384454825, - limb3: 7994221444419194765244109330 + limb0: 39777449476674842176451655467, + limb1: 19692525662397626488048650901, + limb2: 1881892707501005311, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 39699769716444838828396449641, - limb1: 24402038901130117428570476331, - limb2: 43398888863846926943452416245, - limb3: 1058487976104489321263480340 + limb0: 7139414693018553486075310986, + limb1: 20482086508165019440229156072, + limb2: 710780127913238551, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 72416573269412838320124923824, - limb1: 28039562948992190961790471670, - limb2: 28508253392856354188074295265, - limb3: 7034260313201324998005471241 + limb0: 28131119194513419313442046385, + limb1: 13042652716752970886500981629, + limb2: 1362883015649825972, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 44552188399385353269177032380, - limb1: 10070990327922701280841423231, - limb2: 17817307489457187100445137431, - limb3: 3476513892980496688243948916 + limb0: 65452774687869699720437135085, + limb1: 19068179368836910794433482988, + limb2: 1066499886458135733, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 40824570822086147761806087046, - limb1: 64400473237342917364889839873, - limb2: 29127736890319926150102379440, - limb3: 4584221607306343708830972344 + limb0: 74300925615547628208720354154, + limb1: 26377823429787419155078254029, + limb2: 2315446660963932578, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 56880052126734883412134174213, - limb1: 51261034975544807019579879783, - limb2: 11181430284636354425181530454, - limb3: 6007249129875328575086728748 + limb0: 40923876422337241699058100105, + limb1: 4175754389886166324565961870, + limb2: 3081081893887257339, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 72875098027565077084675128981, - limb1: 1487418951525758926330550010, - limb2: 55438587054176420011402299374, - limb3: 7453112595890040540691017939 + limb0: 48860934251992050493938970646, + limb1: 59523665641842248493529393553, + limb2: 2458730777662704518, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 60073580121836961168712387557, - limb1: 78395271919907493446116689975, - limb2: 31496783804699397530690087194, - limb3: 1737862601830893129852619360 + limb0: 60589565095168803397166328699, + limb1: 46119912834911171448080714460, + limb2: 497153387457361972, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 72216618303188034934433342068, - limb1: 32449509065046400147320237459, - limb2: 75375219325130713610190153171, - limb3: 369398868120040227970663582 + limb0: 53195332282250948195415554001, + limb1: 42217881584580416639785657103, + limb2: 1046449613983462289, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 46735166315976709277791166258, - limb1: 60203133022102151642421574835, - limb2: 50785540040998737359678649683, - limb3: 126813234831099046071233231 + limb0: 68675010697283599885027979093, + limb1: 54820471088579861051330495477, + limb2: 248879716269783128, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 63613196572395599896240804344, - limb1: 24216871066377208103337225065, - limb2: 10539920991644608998158993798, - limb3: 7817409394769483408442435564 + limb0: 68696892675482756103702910045, + limb1: 2821168612376134089752694447, + limb2: 2326294766785363034, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 20208982862589323527507620966, - limb1: 41262611226532107876552669924, - limb2: 61838244938382139630447412613, - limb3: 2030901738842501729580134312 + limb0: 35888372288357263232188186866, + limb1: 1802319433625381705538192296, + limb2: 1336193837883526136, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 22394457765310409627446318714, - limb1: 62384634957539636615926230035, - limb2: 22481793127435819129917337268, - limb3: 4037710971771303142780482613 + limb0: 3607957730776345135581532249, + limb1: 57223346842071905335476653645, + limb2: 66714738396161719, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 78689303455607592227474846611, - limb1: 30745808322612429646227024567, - limb2: 58216575080721739420042545631, - limb3: 5302126406236851060832468977 + limb0: 58439025833066058907446557815, + limb1: 18539518811267587530216896038, + limb2: 425504168554550454, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 7078924496342032088448206433, - limb1: 55347096910842101112742393295, - limb2: 8099101716155506614330041191, - limb3: 2285992165824713315429031591 + limb0: 69522123626666130096796085769, + limb1: 69894908619008279922520363509, + limb2: 2925708367908145569, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 39263556609567233247421065355, - limb1: 58959848273109883601321636044, - limb2: 59256855949716987688691023420, - limb3: 7008550935026647340403772355 + limb0: 54950695559247675318740137803, + limb1: 65580118328586800885081527180, + limb2: 186265755750948277, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 18445435561366787173520929167, - limb1: 53263306974849405659002108119, - limb2: 76737901427244100197889960200, - limb3: 3598793115914853740216751120 + limb0: 44985095060059952128659060037, + limb1: 3135369040088303380372111797, + limb2: 1832677277556531585, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 23354125629281776802233321976, - limb1: 52902259004589104185308056249, - limb2: 50864147028281327904772140596, - limb3: 7151549316161165187963562997 + limb0: 35837419271194787857031799833, + limb1: 71632130487841585576227300295, + limb2: 2554539493275322948, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 43641103601929873593017976796, - limb1: 41958293719726680682882146661, - limb2: 22312989351484932138389173073, - limb3: 5714667046669999221669575291 + limb0: 5236107900679284745936913310, + limb1: 42808074619651997810426489722, + limb2: 1646471559857699947, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 721822908591079774064750962, - limb1: 6675746462224700701837842334, - limb2: 4248376317595409678741590064, - limb3: 3534348236216082469733166439 + limb0: 22011686010158143669913942244, + limb1: 64298908264174806921860957004, + limb2: 1023304557498623925, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 16638716522169148934230286045, - limb1: 9397763690480788475370791219, - limb2: 26481922358470517523931727810, - limb3: 3403898265576497457031705846 + limb0: 15115763463594266326533515636, + limb1: 14935453490037913962991826996, + limb2: 2944418840472450776, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 2400117890024973730123220667, - limb1: 3772577000877884326546396655, - limb2: 63069346086716736890104436251, - limb3: 3454325892567320461993761800 + limb0: 2391353078071129138387662771, + limb1: 78320408136790582552453001920, + limb2: 2692100225744643075, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 77874713285332622931923278609, - limb1: 10332603469332197929636453149, - limb2: 36056702788627864899357183300, - limb3: 626223673151609994412289104 + limb0: 77133957193303291383808648701, + limb1: 14084310503063751596077156388, + limb2: 1259260892328905077, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 46019370297489948304265508849, - limb1: 7137720759630174898691528365, - limb2: 30311825010115282516801543616, - limb3: 4720317306254689745436237024 + limb0: 12725152518779933825321254301, + limb1: 49387675283503760614499625, + limb2: 762457516003256429, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 46189818733954446427674697540, - limb1: 12417370753741786118703772083, - limb2: 463402303775620109351071836, - limb3: 4987572662722195913864568776 + limb0: 35934030633790779454412439865, + limb1: 33873078163274562866507518077, + limb2: 2273270566241587528, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 8268673961605039777749420688, - limb1: 63004901499865842828518392532, - limb2: 69288232659617594775172164344, - limb3: 7352905061934394711660905220 + limb0: 56229470305912995329993459127, + limb1: 20602567048594657560441025360, + limb2: 370563708882626612, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 58654989158123735483293163983, - limb1: 7558829896849819314558645198, - limb2: 67645269179785079725210495687, - limb3: 7246375377841543401073279844 + limb0: 6607727381404759771668544911, + limb1: 75654671990128043220089548964, + limb2: 1268656155552280430, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 58086405448981479828146588057, - limb1: 22764908292199784765682198662, - limb2: 51226114673049339447799137071, - limb3: 6300750426039620523599615384 + limb0: 64657369846703810761116671723, + limb1: 59336941033883077299219417983, + limb2: 2847001448620923268, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 18275814062223011797496545066, - limb1: 40844596312314033125420578547, - limb2: 44786674214280218438750164330, - limb3: 7227208096141446694546405058 + limb0: 52671139959677521722835979628, + limb1: 52190044507744525600311255621, + limb2: 1585399332909549021, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 18673350316274998530989075908, - limb1: 66778292265476535350457591048, - limb2: 47614542127503615598851660327, - limb3: 825595587288823414266728954 + limb0: 37349031485017969456923262395, + limb1: 14132280254242850580439181028, + limb2: 2743264202709144863, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 58540216364885076419617378409, - limb1: 4324831653284665788648352259, - limb2: 60537691782434940387916562402, - limb3: 4164977021586036136658770259 + limb0: 4382451327506875188294366315, + limb1: 70929259206770646870740388521, + limb2: 463114498064249105, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 68266255285213254513833479350, - limb1: 37401406143018012515354909923, - limb2: 32801682842516982031766106544, - limb3: 82084473855952556510093683 + limb0: 33089362016485456917369228769, + limb1: 59517027215985175888045853745, + limb2: 414010247999763937, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 28566575485766488442873021532, - limb1: 53660567827930903241954406751, - limb2: 52769014358286566074588720290, - limb3: 5029381188723927752907835813 + limb0: 1969077430491304769942652214, + limb1: 63192677337144029025424280052, + limb2: 2924642649610526341, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 1691068334133009756485024222, - limb1: 1713496082210255820432617517, - limb2: 22507092422261186985900817878, - limb3: 7266181458229898957462998507 + limb0: 69067801476521623124310111321, + limb1: 56744308762412548885516980002, + limb2: 2718165606729566575, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 35511334663802416136620249035, - limb1: 56826100978874263346804301199, - limb2: 14896583743372753295203010118, - limb3: 2888205130724188835382238028 + limb0: 8355379839920284055185989515, + limb1: 19087663954463738454288090714, + limb2: 1518042025735276444, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 72586201398234129537370667762, - limb1: 21456423338945192183242606113, - limb2: 40944014533050488891182383928, - limb3: 7694014078640430918583922839 + limb0: 42126475307121875553397681124, + limb1: 43600497854084927957356241127, + limb2: 2742935194088892152, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 65202621055379664402407781872, - limb1: 58061537642505030457523103744, - limb2: 49074135068826226086101867530, - limb3: 1975539361788616585164244823 + limb0: 70979030126264900209027138509, + limb1: 24908073715424919322562319963, + limb2: 1663490873811548880, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 27632068457869411695495344561, - limb1: 73560271896661438760732362164, - limb2: 71378437880752424013182218545, - limb3: 1190418163495666547613434483 + limb0: 17787595347341755900018965625, + limb1: 7571596122063551103834410483, + limb2: 947735780247591008, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 6164722329873541438879088184, - limb1: 53102874530846081889724438919, - limb2: 34810430570094252361129505112, - limb3: 7325308245779965180645884507 + limb0: 37690286126773348101343819031, + limb1: 3328330578602311566742652634, + limb2: 417198773052664614, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 34258347966437836648180822715, - limb1: 13337682111007732849029578577, - limb2: 41111649615335989865593341122, - limb3: 2055869962381856705272418738 + limb0: 2879082753460548621119082174, + limb1: 60470082508656309799737358612, + limb2: 1467710983772123480, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 14822700705882529338682792648, - limb1: 10511000506793209960959718118, - limb2: 51606653521187870398507646117, - limb3: 6358119556682079172773445700 + limb0: 15584400600272221302094548033, + limb1: 36432081155679580380788439321, + limb2: 2816955265584307975, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 18102725807562926412299306396, - limb1: 57167705630508192428641931466, - limb2: 12713582659633933054289003363, - limb3: 2264670973964653342981113036 + limb0: 26283423314009102327077186279, + limb1: 76866641354953759152535968315, + limb2: 793961835833817513, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 50310211884294194782265328843, - limb1: 43160670328437046236186243232, - limb2: 26521454086668886385399431460, - limb3: 3423866265655853380590497783 + limb0: 37915780699116788520405192021, + limb1: 51709016753864394283793542582, + limb2: 2401270125586393442, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 53175479664258611200828925601, - limb1: 47408796650195520661463359197, - limb2: 22808527707105766660009406426, - limb3: 7669122685172510183331173898 + limb0: 36265097981971249843663846155, + limb1: 7323153728927201076037147093, + limb2: 2060645493290518714, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 56704865876754028512760491477, - limb1: 45242521310542937191099830823, - limb2: 36867421133397533659473685623, - limb3: 2685000738038673669812067586 + limb0: 16895843015094779826947309355, + limb1: 8918232059436962584785532658, + limb2: 2365806110913046984, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 53805282842193535792899986689, - limb1: 9123070994036606829129662594, - limb2: 58146542656140758150381071039, - limb3: 3563895719300793637202559726 + limb0: 69569941734554232258047616367, + limb1: 42866899135208146062270693561, + limb2: 2061895189849344583, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 62342737964702159076981441028, - limb1: 22387242622525033779888900869, - limb2: 12028383020080926376959062155, - limb3: 7907826230717739765747523601 + limb0: 12708144762844671369376452362, + limb1: 2507386429526746462948404705, + limb2: 2776067946109351578, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 27608087451701991689131027714, - limb1: 47019086620571319161433583755, - limb2: 15666096709507066115230394654, - limb3: 5969896377881649337672055148 + limb0: 14210112887774549886668506882, + limb1: 55148396039365941007080305602, + limb2: 1233912106813366492, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 46000850360257296757239580873, - limb1: 70804505047608008391514054513, - limb2: 51768971637975334540174911132, - limb3: 2902537677055465097904989412 + limb0: 74619060133687213628768328970, + limb1: 44230437142725027914506642271, + limb2: 1738922620063067253, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 65054846733881493276587682974, - limb1: 46823085216889592361169311086, - limb2: 45751881089758373057597482467, - limb3: 3906055019960568857793338693 + limb0: 6025446288972751037672938488, + limb1: 76080717446194947894443466790, + limb2: 2379867363066884709, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 61288376258550918800070935040, - limb1: 5173122854276719195731592098, - limb2: 12774218045384217987473428850, - limb3: 2617512936736398332313368842 + limb0: 33656700785953951554366243811, + limb1: 35223962887842933347274086949, + limb2: 2025014958548551557, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 73565837169919758242229205991, - limb1: 45324825241733701762717392796, - limb2: 30640452298957563596329123915, - limb3: 502875793316358976744956037 + limb0: 21347250968755017230222735574, + limb1: 46937428616196941593753609893, + limb2: 1630584515752933240, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 65028847193817229833598007686, - limb1: 51939920964497889395920402699, - limb2: 18718134891528425346450578221, - limb3: 3321629047860859274830988286 + limb0: 58527011948056282646368142470, + limb1: 66792786381600048932145895005, + limb2: 953783205611804610, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 50924154807083979384195909883, - limb1: 23497248531865152661308899983, - limb2: 12846209665691444116710559595, - limb3: 6546852693971684362205769426 + limb0: 8924913721636767935130447177, + limb1: 25334535188779611193931456911, + limb2: 67816066780006772, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 14024751674038147738740554375, - limb1: 41983653883816953594902420114, - limb2: 39900177045845592783954199549, - limb3: 4657214975367356422168539404 + limb0: 6260341607938127416145241498, + limb1: 63544520746243403724460085056, + limb2: 2142374298306465561, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 49705775480732451280337251350, - limb1: 48886305890467648910546842523, - limb2: 51134149791857069693669521632, - limb3: 124844746875994904661319263 + limb0: 5169897746530501695581910009, + limb1: 25124187664573233087094062797, + limb2: 3184344738298773359, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 51719974330703417031081717156, - limb1: 13459585373291473320280813836, - limb2: 6752834653299860071697522896, - limb3: 6859916573933753596005458025 + limb0: 30779788573773558641977382851, + limb1: 48191682609507455312255451012, + limb2: 1078698593667634375, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 53196850481492521254587516899, - limb1: 21553496241392164027514243610, - limb2: 45813375072941401948420637257, - limb3: 1455670379063929650904463350 + limb0: 29974110555995811539388879893, + limb1: 73025493264894138866340245805, + limb2: 1784943670173387798, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 51744087147393434067438330708, - limb1: 12658478978335216840175335996, - limb2: 52211396567589849408708918294, - limb3: 4618355957912916103907947429 + limb0: 31389032610464905405144499214, + limb1: 40593889544399652035485772351, + limb2: 1567869300743367252, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 63403519990017142909138056877, - limb1: 25008807085121044590193668458, - limb2: 47853449075865960077774813442, - limb3: 6841956780686658742966468456 + limb0: 44806458938372956201463369308, + limb1: 33597281753652350137003619033, + limb2: 1710937226614024919, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 41121824894386315989829303965, - limb1: 70278479371255321435922292324, - limb2: 19465582757910784699465027147, - limb3: 4538729127001126973988495870 + limb0: 44527713432639721791702644527, + limb1: 58199780696534552243165071021, + limb2: 420733308745416773, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 8510818113821460349979946380, - limb1: 49737295042798138714386706482, - limb2: 1369351252004259310435648211, - limb3: 1102675629580605561260677276 + limb0: 55902985175459891474907515118, + limb1: 33856455136898193809846614722, + limb2: 1723884372168598620, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 68798310143704374237162382910, - limb1: 8558615372034978504258098604, - limb2: 15475840624455146277339766664, - limb3: 6559519526101527427263274921 + limb0: 49944605346856903580377397207, + limb1: 24669282948766246444798022975, + limb2: 3256444077571872963, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 49248048409848078630630019707, - limb1: 45876573319921927615990253065, - limb2: 48262360386128238743551640831, - limb3: 1467563876988592492970991383 + limb0: 11108389166217599515845742035, + limb1: 63901988457860911737806000979, + limb2: 924391030109173687, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 15047382390395255066551006607, - limb1: 67992144804568421220261027647, - limb2: 76209030830934384897494028194, - limb3: 2897931856024673611298333458 + limb0: 23455958575050028370753411117, + limb1: 56409748568826860310235793983, + limb2: 2975923030530683887, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 8922731925793519358328545623, - limb1: 73886892246907470203692786270, - limb2: 44096516282427492598534028399, - limb3: 5894456229243761565266041850 + limb0: 8950901722694730782454152267, + limb1: 65192811872449902410707815718, + limb2: 2336825492345539364, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 67403743400911028059152389289, - limb1: 70025985080844930267696528096, - limb2: 12054439718162976422912013799, - limb3: 4109585957698014963681267371 + limb0: 1415526887986392962425475265, + limb1: 16797545120156772339675942500, + limb2: 3218467576608865958, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 15873901519737891033019482190, - limb1: 63463536632208203397050689329, - limb2: 53185696948720374177225794720, - limb3: 3532409611101952867509524190 + limb0: 47512269563523567071191795599, + limb1: 58976148677288738280547599357, + limb2: 620029914221646058, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, E12D { w0: u384 { - limb0: 8631287015152271543988575096, - limb1: 56705547951738913193497150518, - limb2: 16697313982236568785265623504, - limb3: 7616721654842350184578168609 + limb0: 5776711753993950135716627922, + limb1: 10581158362725336349309807797, + limb2: 2122265329490019350, + limb3: 0 }, w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w2: u384 { - limb0: 56577998785279820589289688250, - limb1: 5304359155889223281297916071, - limb2: 23116096753788907518233857315, - limb3: 6499699896868812261681419743 + limb0: 52017464684297338903774830573, + limb1: 47491242846276950265290907300, + limb2: 3097532031659467376, + limb3: 0 }, w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w4: u384 { - limb0: 37658213988446241609631493826, - limb1: 40038704171613346632135825351, - limb2: 19153172390674890854472138246, - limb3: 3528390980170352202156586803 + limb0: 71732193170790562530921790493, + limb1: 72225494333538525287546649353, + limb2: 3430379755832553750, + limb3: 0 }, w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w6: u384 { - limb0: 65265035963421670314640116813, - limb1: 38103179743372951954909054305, - limb2: 62638973855428720710103610154, - limb3: 2298786175578388570289148953 + limb0: 29848991057488594125692024199, + limb1: 30740913657451634245383212117, + limb2: 1601898389400574029, + limb3: 0 }, w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w8: u384 { - limb0: 37144623691893737781170301309, - limb1: 17088098620958466479026214921, - limb2: 11090349066155037705137159529, - limb3: 454249645941369297491140644 + limb0: 63177480428015677856501460130, + limb1: 59575858352209950665242649017, + limb2: 3259980759615176961, + limb3: 0 }, w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 64105375756739378985529620439, - limb1: 67497955470030147255347055636, - limb2: 62880364713431585896924671739, - limb3: 603577176654208606685474045 + limb0: 51706376312708478141711811980, + limb1: 3254865247887377295085859601, + limb2: 62025808914897275, + limb3: 0 }, w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, @@ -2939,5520 +2505,19361 @@ mod pairing_tests { ]; let big_Q: Array = array![ u384 { - limb0: 51596407090018314257100963205, - limb1: 78516620689411379364309092015, - limb2: 61611404020580228398898497303, - limb3: 1727890670933496752967450576 + limb0: 26909239156497489599263403541, + limb1: 46932560794036071636366323408, + limb2: 1188691638024891382, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 74914177666413594961174215491, - limb1: 30729181610791045872552344992, - limb2: 56672790151618541706832170530, - limb3: 4995864057963738441407957296 + limb0: 12612310163192620009965873263, + limb1: 47517606060274866473025988464, + limb2: 2024210927411878178, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 57030173043982553936079369518, - limb1: 69523788269442492400006994663, - limb2: 58531436930500712004954230986, - limb3: 3272544042057606714393697166 + limb0: 46632225704153393289675213074, + limb1: 59313593318113808769188703996, + limb2: 182627004529641155, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 6019054046178713435215148134, - limb1: 37101325417167564736381319366, - limb2: 10178376896666983492383846964, - limb3: 481569626345686712209695544 + limb0: 57107896690850256542968280124, + limb1: 60576882996380541761367210828, + limb2: 2352926397085380748, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 8703186767519482056353441822, - limb1: 58780685237059099431163799243, - limb2: 5716071043558769188879794039, - limb3: 5287469079003790224559148570 + limb0: 28471505700339674868171092173, + limb1: 33056005593275424794394808217, + limb2: 946426494368708649, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 57879189355981266076462568674, - limb1: 67063055499793556197886356700, - limb2: 54434456226811602207626258256, - limb3: 8039395077725273390729583249 + limb0: 24823138548407255672138381793, + limb1: 12695018652862007468038096880, + limb2: 3295692771273929070, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 58807826056673380354391080431, - limb1: 31268652441829737310586145300, - limb2: 74273078314362852318984666823, - limb3: 6485932197766192601185990874 + limb0: 54522215790267078603806082103, + limb1: 5338864207267394911008135902, + limb2: 762739354870126906, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 1312541699604422708664345773, - limb1: 12083363377937354308477495191, - limb2: 36836807969258105023235059006, - limb3: 4813084893200320009834976504 + limb0: 2755813658537660976377092242, + limb1: 77784087309510957168741552007, + limb2: 3130356787793471443, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 11499471033503973165166851492, - limb1: 16697909568592160358160339260, - limb2: 6968170590487156233719084901, - limb3: 1906719606285218137691470365 + limb0: 52464075857430676160537145484, + limb1: 74983602985830557554211177814, + limb2: 658237768668039372, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 27349331270603278653231742810, - limb1: 53227408166515628493231343011, - limb2: 74694619705067529882233999982, - limb3: 7888268378787653573516729652 + limb0: 47364035512395338615748458831, + limb1: 50851116852444988281921866756, + limb2: 104359349253712027, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 10518414551471241990831162982, - limb1: 21703356718013239956801482688, - limb2: 8005300195049500303900330426, - limb3: 7856751553411271589390652165 + limb0: 56880494421130864520029465463, + limb1: 52118415543255083421654183395, + limb2: 179861517751971826, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 48734550833154410151290171406, - limb1: 50784443169431966053194850941, - limb2: 74929363632220443941418414584, - limb3: 2709978957189650184928489111 + limb0: 16003464506295102751330300126, + limb1: 3693021512501671296077268102, + limb2: 59390012513155728, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 61212565106259796292461051575, - limb1: 43013182233959141097506606163, - limb2: 63434689915308630858865787082, - limb3: 427319011685848450381235447 + limb0: 6407816300106996402264675656, + limb1: 52623271236109257907877778475, + limb2: 2305694249198201317, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 1761422113530226924849534301, - limb1: 71625777381938999100790609513, - limb2: 34111232419500692419798853064, - limb3: 7369253187510340528249891552 + limb0: 4609470962520181736519090594, + limb1: 52564079401481536274658623440, + limb2: 1459880119112174923, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 6389845713073535158182206450, - limb1: 70560241816093307471100135111, - limb2: 50522473064394319542183643411, - limb3: 2863598824729715302076835881 + limb0: 38009682301417764931838887793, + limb1: 41989140727376433718727590295, + limb2: 2056480144901057199, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 8726043919702727121048760464, - limb1: 6620087956910974069246430752, - limb2: 49131245155093091999563030254, - limb3: 7369664078832011265793881890 + limb0: 49037748564991433644080663789, + limb1: 29286443051662072573618148613, + limb2: 1731247969070658344, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 60916365545042081103333598266, - limb1: 66223521806363479639545637537, - limb2: 53642835354576420832949555893, - limb3: 7654671150170895106125205074 + limb0: 29194700810892725067893315765, + limb1: 65540757535391859692323075466, + limb2: 796350772894581648, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 4882643603277540531485451743, - limb1: 48245966695956743001807483251, - limb2: 70832312506907008677873725991, - limb3: 2487513161663998993475297208 + limb0: 30517982167963667980751542918, + limb1: 35256536270955894616232925099, + limb2: 2642736044012545516, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 49188884542030156181641644605, - limb1: 46558107143754227458315951783, - limb2: 28387418916887858456894138171, - limb3: 2350545257641887211945474197 + limb0: 66001172501719047544748341177, + limb1: 73734457690658107689526716190, + limb2: 2989469654525148989, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 27899923675163248284304187279, - limb1: 51848199103899214894992196790, - limb2: 52694210048207096754944625846, - limb3: 1603779378161546710522904606 + limb0: 31380457626957317068595714661, + limb1: 52103898631176390424194766429, + limb2: 1123574536176463741, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 61659846814880496056145902100, - limb1: 68003402148258709486646989796, - limb2: 32347486831890660944001382785, - limb3: 7408281898760194255511040350 + limb0: 61010789137655720729039464586, + limb1: 25566580274691520522632642085, + limb2: 2637045045569327814, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 43152954777747044249562673893, - limb1: 28574098332457488133913407459, - limb2: 8525235824076347909245158835, - limb3: 1278710453097880314888538476 + limb0: 1130916024457427912011176177, + limb1: 15580953444201801300409878447, + limb2: 2080318250647499500, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 72790112786251305769912494492, - limb1: 63325347350885407483147868053, - limb2: 19954551555653973831305239849, - limb3: 4584615583473883580645597987 + limb0: 25353388997204176395334749067, + limb1: 24103061078476772928325410571, + limb2: 3079702982118163701, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 77711738202770240666619816250, - limb1: 15214921496966769680406241769, - limb2: 38313085002574345795751073029, - limb3: 2938633844522414875988858634 + limb0: 47086830104214637463092232862, + limb1: 2794899708993558389276199749, + limb2: 1758045928529595323, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 14241619497331872424036462127, - limb1: 37864675311228514519649292390, - limb2: 1448525924784571686747268444, - limb3: 7714506825107947698392931410 + limb0: 55321047498808935143433919911, + limb1: 15235972033610045146706906032, + limb2: 1133665833786639271, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, u384 { - limb0: 68303295517590864264442816229, - limb1: 11047732957580885026600701880, - limb2: 25970148930768155053368698862, - limb3: 7287985846746811591020933108 + limb0: 21049614003114453418983392382, + limb1: 71552261682036371278490035660, + limb2: 9548593540236797, + limb3: 0 }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 32152954479686993270585669939, + limb1: 36924783642167797281383930557, + limb2: 1538589114086469734, + limb3: 0 + }, u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } - ]; - - let res = multi_pairing_check_bls12_381_2_pairs( - pair0, pair1, lambda_root_inverse, w, Ris.span(), big_Q - ); - assert!(res); - } - - #[test] - fn test_BLS12_381_mpcheck_3P() { - let pair0: G1G2Pair = G1G2Pair { - p: G1Point { + u384 { + limb0: 45427811509685819978574876414, + limb1: 76134963665488717964007309985, + limb2: 2913791202036747802, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 38566638089218226418369590205, + limb1: 75762255801316326775653302820, + limb2: 3253639204692105784, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 69678633557942918508083577565, + limb1: 43907922524936706198115700872, + limb2: 2147044723140851333, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 2046348942931545166010302102, + limb1: 50251824224106498175056165091, + limb2: 875091375080972414, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 50292324277325415601402929703, + limb1: 62235859534982005862142722589, + limb2: 2830782781557272616, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 78211424708055633797972817217, + limb1: 64588308422097312767513129763, + limb2: 3325047926779258668, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 36491527791433231868861826725, + limb1: 35725341816360902980850347058, + limb2: 496778151006184689, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 1316682558150803777705412947, + limb1: 58579312004860660212529974604, + limb2: 2698318174317802688, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 52936570934998838743585058880, + limb1: 41685414752919481950538771026, + limb2: 2316136761233685026, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 75840374889714908738269335088, + limb1: 44299616051314249607221640781, + limb2: 1605530485186179750, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 62475606067944374641073007328, + limb1: 30670403140910707371170569980, + limb2: 1177549847340914383, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 49492617195155272932191691645, + limb1: 28642459991402281443663393054, + limb2: 132307220193418464, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 14038927758639501782902973327, + limb1: 34677744688410996651942830277, + limb2: 76196042747379622, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 20352652844201192673369174649, + limb1: 53386314592271909703061151986, + limb2: 747038287568796994, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 49078779226509182257510529790, + limb1: 73675574931110674629201040112, + limb2: 614289132621405102, + limb3: 0 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + ]; + + let res = multi_pairing_check_bn254_2_pairs( + pair0, pair1, lambda_root, lambda_root_inverse, w, Ris.span(), big_Q + ); + assert!(res); + } + + + #[test] + fn BN254_mpcheck_3P_() { + let pair0: G1G2Pair = G1G2Pair { + p: G1Point { x: u384 { - limb0: 70862508686663820822416130908, - limb1: 4331727992494874104164226470, - limb2: 59062737899953780140782212180, - limb3: 7453365378867621491305350765 + limb0: 60420611275778036658161941324, + limb1: 52508887585465917640967153387, + limb2: 1891637745661062801, + limb3: 0 }, y: u384 { - limb0: 19023458711357222280422233943, - limb1: 65309851449428701748446162528, - limb2: 69207319884410755429250390104, - limb3: 341375959818195207325051504 + limb0: 27912162366924627756185188529, + limb1: 51691890845105073400270797623, + limb2: 2319795858844338651, + limb3: 0 } }, q: G2Point { x0: u384 { - limb0: 15110353713979647181704075861, - limb1: 45487897385069528474980795109, - limb2: 24007645828503655482530931115, - limb3: 5583440547926451351316627860 + limb0: 57492041199891389503063499490, + limb1: 8555513933675904234866284136, + limb2: 957207907964016337, + limb3: 0 }, x1: u384 { - limb0: 25316568279850368070364195125, - limb1: 45457656749107460790098688065, - limb2: 30101842186331950235142416409, - limb3: 6655773989486429288668824903 + limb0: 52273664341857971461428632480, + limb1: 56539957020588901040920379622, + limb2: 2437096830075718157, + limb3: 0 }, y0: u384 { - limb0: 49242560575646462576543140155, - limb1: 63719561306764738364886887969, - limb2: 32888546658225648584040285955, - limb3: 847697803213812051591700864 + limb0: 61969158769954376260179381927, + limb1: 37311248393212772275268141389, + limb2: 3459441456480773511, + limb3: 0 }, y1: u384 { - limb0: 34778379520699991816591794256, - limb1: 72890068542028641707534646311, - limb2: 78149572186248283673155449849, - limb3: 2475380169003094435344379086 + limb0: 45615757763638802041094752630, + limb1: 35446637209038290910939757694, + limb2: 2372540838520699770, + limb3: 0 } } }; let pair1: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { - limb0: 70862508686663820822416130908, - limb1: 4331727992494874104164226470, - limb2: 59062737899953780140782212180, - limb3: 7453365378867621491305350765 + limb0: 60420611275778036658161941324, + limb1: 52508887585465917640967153387, + limb2: 1891637745661062801, + limb3: 0 }, y: u384 { - limb0: 19023458711357222280422233943, - limb1: 65309851449428701748446162528, - limb2: 69207319884410755429250390104, - limb3: 341375959818195207325051504 + limb0: 27912162366924627756185188529, + limb1: 51691890845105073400270797623, + limb2: 2319795858844338651, + limb3: 0 } }, q: G2Point { x0: u384 { - limb0: 15110353713979647181704075861, - limb1: 45487897385069528474980795109, - limb2: 24007645828503655482530931115, - limb3: 5583440547926451351316627860 + limb0: 57492041199891389503063499490, + limb1: 8555513933675904234866284136, + limb2: 957207907964016337, + limb3: 0 }, x1: u384 { - limb0: 25316568279850368070364195125, - limb1: 45457656749107460790098688065, - limb2: 30101842186331950235142416409, - limb3: 6655773989486429288668824903 + limb0: 52273664341857971461428632480, + limb1: 56539957020588901040920379622, + limb2: 2437096830075718157, + limb3: 0 }, y0: u384 { - limb0: 49242560575646462576543140155, - limb1: 63719561306764738364886887969, - limb2: 32888546658225648584040285955, - limb3: 847697803213812051591700864 + limb0: 61969158769954376260179381927, + limb1: 37311248393212772275268141389, + limb2: 3459441456480773511, + limb3: 0 }, y1: u384 { - limb0: 34778379520699991816591794256, - limb1: 72890068542028641707534646311, - limb2: 78149572186248283673155449849, - limb3: 2475380169003094435344379086 + limb0: 45615757763638802041094752630, + limb1: 35446637209038290910939757694, + limb2: 2372540838520699770, + limb3: 0 } } }; let pair2: G1G2Pair = G1G2Pair { p: G1Point { x: u384 { - limb0: 33170181997013373804133127840, - limb1: 33939690934626296804765582078, - limb2: 17640165227493530456147511089, - limb3: 835353238884811811273263236 + limb0: 42281588234525168051554697765, + limb1: 75125425873884543019226023866, + limb2: 1631424036879824226, + limb3: 0 }, y: u384 { - limb0: 40957523200602509958570184386, - limb1: 26829388861342954414346563137, - limb2: 68985429973489799089559483644, - limb3: 981158336787283949798624443 + limb0: 55069593014669259943031508647, + limb1: 44864229176694697448601038831, + limb2: 2379596812209082942, + limb3: 0 } }, q: G2Point { x0: u384 { - limb0: 15110353713979647181704075861, - limb1: 45487897385069528474980795109, - limb2: 24007645828503655482530931115, - limb3: 5583440547926451351316627860 + limb0: 57492041199891389503063499490, + limb1: 8555513933675904234866284136, + limb2: 957207907964016337, + limb3: 0 }, x1: u384 { - limb0: 25316568279850368070364195125, - limb1: 45457656749107460790098688065, - limb2: 30101842186331950235142416409, - limb3: 6655773989486429288668824903 + limb0: 52273664341857971461428632480, + limb1: 56539957020588901040920379622, + limb2: 2437096830075718157, + limb3: 0 }, y0: u384 { - limb0: 49242560575646462576543140155, - limb1: 63719561306764738364886887969, - limb2: 32888546658225648584040285955, - limb3: 847697803213812051591700864 + limb0: 61969158769954376260179381927, + limb1: 37311248393212772275268141389, + limb2: 3459441456480773511, + limb3: 0 }, y1: u384 { - limb0: 34778379520699991816591794256, - limb1: 72890068542028641707534646311, - limb2: 78149572186248283673155449849, - limb3: 2475380169003094435344379086 + limb0: 45615757763638802041094752630, + limb1: 35446637209038290910939757694, + limb2: 2372540838520699770, + limb3: 0 } } }; - let lambda_root_inverse: E12D = E12D { + let lambda_root = E12D { w0: u384 { - limb0: 60421818244533472375223342754, - limb1: 59573402701100074826545473088, - limb2: 50704298658685481031988405448, - limb3: 6928924479196131031947509072 + limb0: 21443091786658420305854927388, + limb1: 13123724652074652603636038755, + limb2: 3478770317496320555, + limb3: 0 }, w1: u384 { - limb0: 64963061596604422754352757819, - limb1: 3721157960100690357739267313, - limb2: 44156709690777033573860633804, - limb3: 3323019202652366448664984097 + limb0: 30779985078342727475936236045, + limb1: 33833990326216033484076314906, + limb2: 1240504630039048178, + limb3: 0 }, w2: u384 { - limb0: 43721167362886311582012390911, - limb1: 35238075654696014783048904134, - limb2: 28585939556764513286006690343, - limb3: 6651458730232539276561453803 + limb0: 32975917897134449638445193484, + limb1: 8753983979248424814421656078, + limb2: 442368145937436576, + limb3: 0 }, w3: u384 { - limb0: 75335189071595128000729938529, - limb1: 52816117501834197005764001409, - limb2: 67030560403320405530034254025, - limb3: 1910019619587614227128811808 + limb0: 954258818624366898731141428, + limb1: 32997493505058792834537402457, + limb2: 1134841458595108458, + limb3: 0 }, w4: u384 { - limb0: 16099191433867668076346035631, - limb1: 29167826000054457169375844725, - limb2: 29299782922784909639568084743, - limb3: 1644320810824247171561457273 + limb0: 76172753347158832297348004924, + limb1: 9595778917365801034684829643, + limb2: 1161792088583207766, + limb3: 0 }, w5: u384 { - limb0: 45514399827458281872033651881, - limb1: 9311255665446924192000755509, - limb2: 63619074879777395825631783067, - limb3: 2914763093751301042888445902 + limb0: 20697636805883252996489005887, + limb1: 41792899808034438940158209150, + limb2: 3224735823710178791, + limb3: 0 }, w6: u384 { - limb0: 7477157759900139141683035768, - limb1: 51658103215594550926475568624, - limb2: 60827430162325695063571560167, - limb3: 734681030931729961042114269 + limb0: 25832902664379901500179703836, + limb1: 71521449982384759075820239815, + limb2: 3280115239500203424, + limb3: 0 }, w7: u384 { - limb0: 16532319663326135132954200560, - limb1: 5094044783989875197663100648, - limb2: 56784141097227526438300000710, - limb3: 7277063834406738147511247504 + limb0: 39124525623277100190732040735, + limb1: 9609028061127243637968874955, + limb2: 1669852470476708705, + limb3: 0 }, w8: u384 { - limb0: 42273835458149006160407062829, - limb1: 64323277997631221791155483703, - limb2: 53441843135925882738577049407, - limb3: 5378705588969470201388528245 + limb0: 32984622239142462304566926125, + limb1: 69480892197564194176165764528, + limb2: 353598342572360683, + limb3: 0 }, w9: u384 { - limb0: 10183757620355461803576508409, - limb1: 57245056921986465497198988398, - limb2: 77305236727502414370487844861, - limb3: 3868326061309246370417095875 + limb0: 58290290438493045683142021405, + limb1: 76099164551695887397433328336, + limb2: 3431626239697725836, + limb3: 0 }, w10: u384 { - limb0: 61344255014858782225302644464, - limb1: 3872642084260176117215487181, - limb2: 69055894595089078888467264310, - limb3: 1782088042927086967467539387 + limb0: 76455567205013504442542628055, + limb1: 5517314490214945087635461666, + limb2: 760536564358994534, + limb3: 0 }, w11: u384 { - limb0: 75688874366182146713183662370, - limb1: 46011732937353021237400955872, - limb2: 63578090121148972707177101748, - limb3: 3725112293041190166789956663 + limb0: 36110158791083479432442325730, + limb1: 30563824085004887848656727300, + limb2: 3466154838067267973, + limb3: 0 } }; - let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { - w0: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + let lambda_root_inverse = E12D { + w0: u384 { + limb0: 34540212406759155065957156338, + limb1: 7715442522273029457033096642, + limb2: 92304427417953104, + limb3: 0 + }, + w1: u384 { + limb0: 66781360849573770174949072034, + limb1: 33620491739370493972692144385, + limb2: 2444132775217755500, + limb3: 0 + }, + w2: u384 { + limb0: 71608319474012989629932470869, + limb1: 2580716460346683812590832869, + limb2: 376849472018679619, + limb3: 0 + }, + w3: u384 { + limb0: 67453649983146209843007627417, + limb1: 69073159531654382599597130708, + limb2: 559578523790947604, + limb3: 0 + }, w4: u384 { - limb0: 78430703600366043583691494163, - limb1: 53711741834131383607652511458, - limb2: 7899966785743209321435148396, - limb3: 5713107277284429925398707787 + limb0: 40236259513402699844647330192, + limb1: 69642814354972063446142525723, + limb2: 3145189624014932628, + limb3: 0 + }, + w5: u384 { + limb0: 55339451880488861232125204982, + limb1: 22038268387847027097147390897, + limb2: 3202313779955559900, + limb3: 0 + }, + w6: u384 { + limb0: 25284593239433315813690832446, + limb1: 22825814321445668301126143089, + limb2: 1393553141834162529, + limb3: 0 + }, + w7: u384 { + limb0: 74243538080722736414187879678, + limb1: 44585057234289035459041139376, + limb2: 1067142656079676062, + limb3: 0 + }, + w8: u384 { + limb0: 32778761270081950367066883853, + limb1: 49893704614019898274169303433, + limb2: 2847820385423413666, + limb3: 0 + }, + w9: u384 { + limb0: 78297988901363700887031422368, + limb1: 41763387512886344139121519629, + limb2: 1449528879058142133, + limb3: 0 }, - w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, w10: u384 { - limb0: 55677855416079686967182333848, - limb1: 57452399797289431048178110747, - limb2: 12927014529082374858173211218, - limb3: 2334796504801762255187618155 + limb0: 42880148036424741668648006135, + limb1: 61872337969630383773263359284, + limb2: 913176410355399158, + limb3: 0 + }, + w11: u384 { + limb0: 27383552678258094014811569177, + limb1: 10352022786967049847652218718, + limb2: 918466922584653677, + limb3: 0 } }; + let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 60184622296806572439997666907, + limb1: 75008714795759192705677030670, + limb2: 3262785094589981400, + limb3: 0 + }, + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 50185732680358774463548804626, + limb1: 10607397758555418006709821705, + limb2: 1206124784999809577, + limb3: 0 + }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }; let Ris: Array = array![ E12D { w0: u384 { - limb0: 17393106566191820252933384873, - limb1: 31684048598679436562354291618, - limb2: 35633614506013250253763738687, - limb3: 6760632252940800648764664952 + limb0: 862924850915336180692084276, + limb1: 41529508587523899955428705928, + limb2: 1043014236409543713, + limb3: 0 }, w1: u384 { - limb0: 61858794288492735535920155581, - limb1: 55233737430294027695160208262, - limb2: 28497323074399187073632459380, - limb3: 1465733349519858271305572954 + limb0: 18128913392467514646198171133, + limb1: 53586271494976327039378937238, + limb2: 107092725255048283, + limb3: 0 }, w2: u384 { - limb0: 9747429576123128671713952347, - limb1: 2208557561819732051473232821, - limb2: 53433485024430166275715953205, - limb3: 4568577681298219634079347537 + limb0: 67927949145042092014009772101, + limb1: 54957484165551438586264514419, + limb2: 2047801833661687135, + limb3: 0 }, w3: u384 { - limb0: 41172631056774114983197372425, - limb1: 66287114766325823811097581986, - limb2: 45488412089149356039104836590, - limb3: 3258402788911840230224176120 + limb0: 66021095221317026695248813254, + limb1: 10410386340849196128905843607, + limb2: 1160532533124222072, + limb3: 0 }, w4: u384 { - limb0: 41169330233466281173790211180, - limb1: 55505082112044107344911687340, - limb2: 13158477148013849806273640358, - limb3: 7983080694568313193974644017 + limb0: 34945764272068902692553929318, + limb1: 23349044181377861012291340793, + limb2: 2879619306236984768, + limb3: 0 }, w5: u384 { - limb0: 16949441861785581096187266250, - limb1: 20969993102482237757659988785, - limb2: 56956841581502150036486903611, - limb3: 2555280562880500888984273416 + limb0: 52920296652157971561423565883, + limb1: 39584966988430781495607970080, + limb2: 123471617456447588, + limb3: 0 }, w6: u384 { - limb0: 58471259618768757400542789542, - limb1: 57849023278041287138765456910, - limb2: 2099071497095596681956819020, - limb3: 6443825548425162307041449252 + limb0: 24947862363951375184600555366, + limb1: 42538844852745916106942276931, + limb2: 3267634985108491514, + limb3: 0 }, w7: u384 { - limb0: 67939017853420358666386665185, - limb1: 43868586216556532718929815011, - limb2: 12357485471937450797542130199, - limb3: 1295765998946395396152798484 + limb0: 56461807622991135436064260878, + limb1: 57800686155141748988333279038, + limb2: 785742920701051558, + limb3: 0 }, w8: u384 { - limb0: 21800534717937415927525813725, - limb1: 70802977231617982822548098859, - limb2: 25676544348716904845866826298, - limb3: 7856735525665045682105220724 + limb0: 57341634996056428663898005717, + limb1: 4577563202957250206599476716, + limb2: 2249624248129464435, + limb3: 0 }, w9: u384 { - limb0: 53146077485208713794832731329, - limb1: 11577211497832367368739822809, - limb2: 16998283987483670054344886475, - limb3: 7833709038276499353634271024 + limb0: 23346230735667388859110341100, + limb1: 35944642249410961564184151739, + limb2: 2691939570311501805, + limb3: 0 }, w10: u384 { - limb0: 15906060534271585403642950863, - limb1: 62069329947260824069114667926, - limb2: 45383606865966592672073465308, - limb3: 2860929450717604286144655092 + limb0: 76225945612239515422454021202, + limb1: 70572400626063923155372151311, + limb2: 3332771962192322890, + limb3: 0 }, w11: u384 { - limb0: 13339254399135537239917881052, - limb1: 3675433447258648793864804981, - limb2: 69747714874659383182842464555, - limb3: 2406149494369428413812441787 + limb0: 58061947060874044741807499987, + limb1: 1892855088661749667999718493, + limb2: 1678687471711100716, + limb3: 0 } }, E12D { w0: u384 { - limb0: 16515729995057466342433384544, - limb1: 71492114116749378969150513852, - limb2: 53711710574878050645192352909, - limb3: 1867211046053862516479666977 + limb0: 63853687919238116669958343931, + limb1: 34191155832059236787735154384, + limb2: 3126681725831839885, + limb3: 0 }, w1: u384 { - limb0: 50511321945721726503832549916, - limb1: 59396822168345613233102848867, - limb2: 32986583132907874580607408620, - limb3: 4883382906680523344389002303 + limb0: 60528353826376122217563758630, + limb1: 56121617386632857841468887366, + limb2: 551220429026964626, + limb3: 0 }, w2: u384 { - limb0: 2429684511641595988290120283, - limb1: 16633037610124478082477685444, - limb2: 40203691105676282540169455541, - limb3: 8042680049111295749455128208 + limb0: 72830318679480332928323075834, + limb1: 74635469996633001915496280057, + limb2: 2324364884984799675, + limb3: 0 }, w3: u384 { - limb0: 12617068379011421257027720482, - limb1: 57648504268787719759416662413, - limb2: 43580823576835821193244642792, - limb3: 6717613891039760684673734458 + limb0: 53102031744136158330590162418, + limb1: 12790116123314614692537074935, + limb2: 2182734109393582624, + limb3: 0 }, w4: u384 { - limb0: 70873130519992343032439539625, - limb1: 3980872062882563092731619670, - limb2: 47846787001719530306690734408, - limb3: 234258430034598670879429882 + limb0: 70714180922814048431818641970, + limb1: 5071633027570986803571894933, + limb2: 1291349053931435459, + limb3: 0 }, w5: u384 { - limb0: 24304221054217905154335819123, - limb1: 50220947667097400142412984057, - limb2: 23297576160614412209809786839, - limb3: 3923812976110864725322606563 + limb0: 43469738939115898765208184704, + limb1: 53973024286273195064947544161, + limb2: 3192717942644738908, + limb3: 0 }, w6: u384 { - limb0: 12648271953679893715535579933, - limb1: 13026371526990899100729395206, - limb2: 44880641791186861143053644755, - limb3: 3697595130269080989596724506 + limb0: 213404093434761086291317932, + limb1: 60042330183817867307714168023, + limb2: 3436040126188841739, + limb3: 0 }, w7: u384 { - limb0: 5821035895628470968342205023, - limb1: 20670546667408094058098854735, - limb2: 75689418848732362168670216609, - limb3: 2488366195911690488784884595 + limb0: 45431409234476556112130885972, + limb1: 11005856257157441581707803949, + limb2: 2044280354330426429, + limb3: 0 }, w8: u384 { - limb0: 62520447501970595043811666387, - limb1: 74693212195411378190277568519, - limb2: 45889957554081005180739259463, - limb3: 5465502990353280822474567399 + limb0: 34203121047132252290975795400, + limb1: 72509797122154167142769127111, + limb2: 3220249614519544347, + limb3: 0 }, w9: u384 { - limb0: 40679567391803466042545822473, - limb1: 30329144729816393131517698138, - limb2: 22813482165796281880517563809, - limb3: 1682839563339281507851881923 + limb0: 62829158478712072142497164370, + limb1: 26631036237777939618101518291, + limb2: 2126846464386898388, + limb3: 0 }, w10: u384 { - limb0: 48266604443785782140630519301, - limb1: 17543613905829639439539962076, - limb2: 64127035497742198237201764537, - limb3: 3226440464094263179842763743 + limb0: 73693865588018764679652836689, + limb1: 42449572501411159047657070992, + limb2: 178807115016659235, + limb3: 0 }, w11: u384 { - limb0: 35061411882857506027983977951, - limb1: 72197539650637497391409092251, - limb2: 70789205739484104831623964789, - limb3: 3834667976664672359622704167 + limb0: 27846831562968815136506932691, + limb1: 42923505518158459026883744472, + limb2: 1385732431258931473, + limb3: 0 } }, E12D { w0: u384 { - limb0: 42925851665335712795629859885, - limb1: 51609073933747274520346116575, - limb2: 71959939834846614898472889305, - limb3: 3571651954378817150283421407 + limb0: 43130552341138498147786220367, + limb1: 1595566167918878691463188405, + limb2: 977453002022297991, + limb3: 0 }, w1: u384 { - limb0: 50187315898333278215168957097, - limb1: 34071563917155624459411306539, - limb2: 26697682907516762670148310563, - limb3: 4584890830459080589124930259 + limb0: 3657624685822955946130939620, + limb1: 28290024153589252677326988892, + limb2: 1497953570646154602, + limb3: 0 }, w2: u384 { - limb0: 35094771857989056206079314826, - limb1: 35405476471711064486723301010, - limb2: 17188959326379864291461864743, - limb3: 1292122705046895677588948251 + limb0: 16391933703848154478889581974, + limb1: 464393517030714852778572729, + limb2: 3159954010242044252, + limb3: 0 }, w3: u384 { - limb0: 21599100715160911300779477784, - limb1: 64144998294746993653971886401, - limb2: 68097178795940086871332962755, - limb3: 568116905977379869358433265 + limb0: 65617101541992545265075214891, + limb1: 8791781138979169540717667254, + limb2: 3043920492294396420, + limb3: 0 }, w4: u384 { - limb0: 49267936740137672009644806492, - limb1: 9405297105930684517260276450, - limb2: 62443910456650709032416051388, - limb3: 705759771377049974266627581 + limb0: 15837650393169254227090240040, + limb1: 68772584505283923816942085287, + limb2: 3010946935786483016, + limb3: 0 }, w5: u384 { - limb0: 46853587187737855634429149473, - limb1: 55323347757778217106207863352, - limb2: 47833340621146751123704659594, - limb3: 5399393723933577057959344697 + limb0: 68608647402685774229130786031, + limb1: 18498729641387341668377197739, + limb2: 2487941681072745357, + limb3: 0 }, w6: u384 { - limb0: 3544003413860122059061829871, - limb1: 78848216880301374847616680039, - limb2: 21085964652907595161368610699, - limb3: 5675059436503140987928732028 + limb0: 59368315721795410604101038030, + limb1: 23390683637328367102584165156, + limb2: 3021936938780560986, + limb3: 0 }, w7: u384 { - limb0: 57516532539810329736579193172, - limb1: 77713667200862302527870819508, - limb2: 13995125755579168654747174216, - limb3: 5999509187744904648476962963 + limb0: 31574005876202910717683239259, + limb1: 63535369701078712282022047971, + limb2: 1383351780094532794, + limb3: 0 }, w8: u384 { - limb0: 77838006215836569847093768764, - limb1: 54694143867244081657774393773, - limb2: 22805245389324605178661423642, - limb3: 117867413936853328373110522 + limb0: 43370563276002353648560553514, + limb1: 55908991278451561386695003967, + limb2: 3451227890010341970, + limb3: 0 }, w9: u384 { - limb0: 16896112607810128030142596058, - limb1: 38134857448181037603223210367, - limb2: 29586016312769464945127794193, - limb3: 2177419345760330026558513510 + limb0: 55179780709143493195990532921, + limb1: 72837372929999849233880599964, + limb2: 2752361544724325336, + limb3: 0 }, w10: u384 { - limb0: 1862254226330428287579817373, - limb1: 20893462388484509222807718920, - limb2: 67971052707035397107829699243, - limb3: 3289175429986602939442433460 + limb0: 7730058227723429996016638134, + limb1: 27835141654506749339946523746, + limb2: 2927402941364544682, + limb3: 0 }, w11: u384 { - limb0: 7216673618768365893258745756, - limb1: 16798162263767516654342563778, - limb2: 13514521385598610371189540274, - limb3: 3633945410041602151249885271 + limb0: 7253228961468207156913436665, + limb1: 53416759590335499071213199051, + limb2: 1070547756176411681, + limb3: 0 } }, E12D { w0: u384 { - limb0: 60618801496489820608595072656, - limb1: 4579713129772641145014003339, - limb2: 1194366201244979194252769278, - limb3: 3810334737011461112530766022 + limb0: 7845928635450859861352564039, + limb1: 67625862260416500426032103521, + limb2: 280775669882171914, + limb3: 0 }, w1: u384 { - limb0: 39245123851390481013286799243, - limb1: 16546800948618157500696807880, - limb2: 70555611218010681292133831309, - limb3: 3872605597202535763571620310 + limb0: 12767128967433506142133712972, + limb1: 41540721581764656296484956309, + limb2: 1441619093482540280, + limb3: 0 }, w2: u384 { - limb0: 16509750194757335738943858671, - limb1: 15119877132620888625604648622, - limb2: 54392202153391985638659314622, - limb3: 3064128722482743829594331728 + limb0: 30544510893709383143799691683, + limb1: 43305386538444436584268199278, + limb2: 648003372123943705, + limb3: 0 }, w3: u384 { - limb0: 10321943514408577504464102690, - limb1: 6086492321137931508447725268, - limb2: 9981335941613880554885190553, - limb3: 3362678395673800846863329037 + limb0: 26646677843277103230802151346, + limb1: 49771408919322971647175801970, + limb2: 2029103714473736056, + limb3: 0 }, w4: u384 { - limb0: 4607790285554077173835925677, - limb1: 34065272063382888486305507854, - limb2: 67920471397114377512589797860, - limb3: 4233873926170330531009060985 + limb0: 17642570973683937383923635098, + limb1: 32494885183471059870247461003, + limb2: 1335019680473649983, + limb3: 0 }, w5: u384 { - limb0: 24628161857315999365120630069, - limb1: 26135175259371406549840517887, - limb2: 60509750433743394193912803467, - limb3: 4634566497331180890278306687 + limb0: 41020045213712490142805584633, + limb1: 8676875877020937814777285343, + limb2: 751377760049057085, + limb3: 0 }, w6: u384 { - limb0: 68313155009416767015070026657, - limb1: 57774392993928344018945598653, - limb2: 33172632182131115004928914469, - limb3: 7443249385469105102888868923 + limb0: 54743038491292069558571551752, + limb1: 23938885267646350240006695196, + limb2: 701686350816356549, + limb3: 0 }, w7: u384 { - limb0: 32616076736818347271976978054, - limb1: 73898528459778665386188609134, - limb2: 44375619133631219970472954545, - limb3: 6008141265399493219221151780 + limb0: 27826830145713340429221164831, + limb1: 35566766543358474148676152808, + limb2: 2175704889178759526, + limb3: 0 }, w8: u384 { - limb0: 34067757230385774913554358494, - limb1: 46596520617446744180266674209, - limb2: 6965646532533734739142322270, - limb3: 7724661690622384530392141002 + limb0: 10046804652238354414625712462, + limb1: 4801522119979242118121074549, + limb2: 1493806976614414419, + limb3: 0 }, w9: u384 { - limb0: 37809796108655049001611810215, - limb1: 37287403783616797753701100087, - limb2: 30126005040411049328917813843, - limb3: 2920060565249363818777128467 + limb0: 9382163025440027871386330177, + limb1: 600671747944747661168550742, + limb2: 263623399533164815, + limb3: 0 }, w10: u384 { - limb0: 25979966458952252245105803855, - limb1: 18727685701704115985403229128, - limb2: 12491743994225124812037353529, - limb3: 6669406531490222258235385285 + limb0: 34485083281285928431360500329, + limb1: 1342209345294357603372146066, + limb2: 2002046998322018604, + limb3: 0 }, w11: u384 { - limb0: 39501226868254301237327654043, - limb1: 74792694425699198136728183883, - limb2: 66266643215920744046033805315, - limb3: 286100578061889929072484039 + limb0: 33496480648262093274525768534, + limb1: 64735458505505744019567685572, + limb2: 2531617810541618772, + limb3: 0 } }, E12D { w0: u384 { - limb0: 27592256372055213939524554029, - limb1: 46022394274277917088113776670, - limb2: 38913675458205967893289772788, - limb3: 4791130474224857431074469236 + limb0: 6214203577235474758078803510, + limb1: 24112271187523767539267386044, + limb2: 1412505453501606030, + limb3: 0 }, w1: u384 { - limb0: 46045440095955978625098234042, - limb1: 21472684953624972095658080649, - limb2: 67196696447744090942526716212, - limb3: 1248036740899939116841585649 + limb0: 62400193642132577608070757404, + limb1: 6487601698749988432762237759, + limb2: 1336676028769074967, + limb3: 0 }, w2: u384 { - limb0: 66090027179131936535463378346, - limb1: 3869585526462425678593980132, - limb2: 38625096303062563239289928031, - limb3: 3670271545626006582632048336 + limb0: 22412735677764945213374669569, + limb1: 33222999619625610315413574134, + limb2: 104757076860679753, + limb3: 0 }, w3: u384 { - limb0: 32222955183376548551576793683, - limb1: 59493131069769067260266247537, - limb2: 8105954355914948893816511821, - limb3: 6959563674470930557267600529 + limb0: 70235296729731725127869301080, + limb1: 10052652950861568527573650895, + limb2: 2434113087489356652, + limb3: 0 }, w4: u384 { - limb0: 19298336366314581565647381406, - limb1: 36430765633832394241413983653, - limb2: 48904762935748210686284953238, - limb3: 406453962055174015251863834 + limb0: 38986176672614715167698308240, + limb1: 45860047568102185825780546910, + limb2: 1380310288130874304, + limb3: 0 }, w5: u384 { - limb0: 18205929824008707834757344048, - limb1: 35057078529592786859314270820, - limb2: 55521426697567854210076632933, - limb3: 849043264307618775471856977 + limb0: 5409076598668140460431466457, + limb1: 66848514374769107668910366062, + limb2: 2600855363549711736, + limb3: 0 }, w6: u384 { - limb0: 65000802675901819674648981830, - limb1: 1005459285573182047968697571, - limb2: 37654173871006621788717679079, - limb3: 4455297809234938039184369699 + limb0: 26123530794006210008598003406, + limb1: 32781150057407603041514720722, + limb2: 58182565693229654, + limb3: 0 }, w7: u384 { - limb0: 18430227047530930332181704813, - limb1: 63314752425939513865722258416, - limb2: 6700466173322447251696132388, - limb3: 7446351933901772968251341595 + limb0: 55611302763891724088491442324, + limb1: 30541373557584356908005204211, + limb2: 3155422359592474571, + limb3: 0 }, w8: u384 { - limb0: 29467498685660136326609444398, - limb1: 44488009793766896275411325509, - limb2: 44290346107672399172231524359, - limb3: 2356187907456091040408441585 + limb0: 66160575171812709510667637488, + limb1: 13554775859600174432540045972, + limb2: 2686662524620549884, + limb3: 0 }, w9: u384 { - limb0: 16702926158779896882803728449, - limb1: 33733599658068235745844106136, - limb2: 31270121997336196458358528913, - limb3: 7599939116784937519731323351 + limb0: 58217062417722506951850806735, + limb1: 78291852765819669842648715668, + limb2: 140930841014481688, + limb3: 0 }, w10: u384 { - limb0: 40310888679357888576235312781, - limb1: 70259918472553401985319293913, - limb2: 61921140269875285998895203471, - limb3: 282818769017683309912527217 + limb0: 33411462710327962285060516442, + limb1: 15385097135729817525269261891, + limb2: 3328565645822105264, + limb3: 0 }, w11: u384 { - limb0: 61837068723107851856345032473, - limb1: 63818708068136498871384248923, - limb2: 48891320467537820231040147951, - limb3: 6670169762651650934715398654 + limb0: 14333712423179553740998283046, + limb1: 41720215019685714377883706547, + limb2: 2933603648178590340, + limb3: 0 } }, E12D { w0: u384 { - limb0: 16367412647374036628934527136, - limb1: 36081985767960377932294416267, - limb2: 21633779045700033649408221317, - limb3: 163323951039864657626899343 + limb0: 53737947528670336168394946638, + limb1: 34301377224601506561276592974, + limb2: 1280756718494365027, + limb3: 0 }, w1: u384 { - limb0: 60345776172290448427153438768, - limb1: 55484952771738224878030371462, - limb2: 10017890037553073903840902829, - limb3: 4092551602533556712600476081 + limb0: 52957597948376239490070545009, + limb1: 29046390339956862088061146539, + limb2: 3368009415491006249, + limb3: 0 }, w2: u384 { - limb0: 49730479991647113499016354078, - limb1: 72898878425747281100454587433, - limb2: 34210900947252362539430703580, - limb3: 8022706823936588976801711652 + limb0: 24282647556223250724001949243, + limb1: 63777635816002841249772639497, + limb2: 2657987989070746853, + limb3: 0 }, w3: u384 { - limb0: 58999401317306481965784911032, - limb1: 77724161093427943248351324755, - limb2: 8411703215201603663791789047, - limb3: 5698879028323591575567234964 + limb0: 76114191893794622070353368622, + limb1: 25495994136868588005772612947, + limb2: 3208511801009859207, + limb3: 0 }, w4: u384 { - limb0: 69895621774765725661161315758, - limb1: 38586549620554598003660456407, - limb2: 57262226695334905332060513796, - limb3: 605233423161034767400013330 + limb0: 26436748156723602670619473307, + limb1: 49602316544963460133622792260, + limb2: 1910850610380886976, + limb3: 0 }, w5: u384 { - limb0: 32521237685356384559681005652, - limb1: 3284959868785866697910730979, - limb2: 28202574088262462638779764240, - limb3: 3343739573237023079950678219 + limb0: 41585857167173286631608728241, + limb1: 2700529494770731076769086548, + limb2: 2748887026056614903, + limb3: 0 }, w6: u384 { - limb0: 25877108143656289245913946524, - limb1: 11203740237226018055781265626, - limb2: 78818156196347087345793925345, - limb3: 5570101872386345080966005764 + limb0: 29957503211968187275423442060, + limb1: 78499526199340644171512894558, + limb2: 1270888240534542241, + limb3: 0 }, w7: u384 { - limb0: 54461049131396473718466490582, - limb1: 20914156699053635488893267752, - limb2: 1302447394270972635228469001, - limb3: 1563265931715105247561308012 + limb0: 60097574347759697804518051289, + limb1: 10127984573419492551767853007, + limb2: 1744475371408796218, + limb3: 0 }, w8: u384 { - limb0: 34673600585054929187231331039, - limb1: 30914058401746539166340246652, - limb2: 59192298643173371389555575566, - limb3: 6470296272991493855410705646 + limb0: 72461692197100475397780002335, + limb1: 23711714945691638859617114971, + limb2: 1689545400122598642, + limb3: 0 }, w9: u384 { - limb0: 51317987424229814298681994354, - limb1: 9877854091047224477250634850, - limb2: 35904275233182208393511303092, - limb3: 6775852307718674575603628373 + limb0: 52218707281253361644986197943, + limb1: 19475722508864343316966145738, + limb2: 452481508854893054, + limb3: 0 }, w10: u384 { - limb0: 68499954880158807104808853688, - limb1: 58543729637914560357817527812, - limb2: 76967601952685906019728492858, - limb3: 5261833418584051089018422441 + limb0: 73654944629336545253464178794, + limb1: 41238813676239110298428336342, + limb2: 1233274382212992043, + limb3: 0 }, w11: u384 { - limb0: 67288616247316367084204178885, - limb1: 56637711288430524124010637034, - limb2: 75469319828144057963123121020, - limb3: 823343469719792012795171305 + limb0: 51167328486317307212834989035, + limb1: 66959043050979649708169298177, + limb2: 487427813525402761, + limb3: 0 } }, E12D { w0: u384 { - limb0: 74655627040768199108481168680, - limb1: 27543789387707706540019659421, - limb2: 18531462890836371225274376492, - limb3: 3525458782961842984650057526 + limb0: 1715598668511423403227573068, + limb1: 43515097651016911365726491658, + limb2: 1691232262623576127, + limb3: 0 }, w1: u384 { - limb0: 56431915404260484199838860648, - limb1: 52854861166151628256485174393, - limb2: 16380689960020155892465378574, - limb3: 4114712916998212684622291983 + limb0: 72451331623622998349298488401, + limb1: 55817723816403456338517202717, + limb2: 1792103032491831520, + limb3: 0 }, w2: u384 { - limb0: 22297174400199563514062337301, - limb1: 54639353484338646767557785124, - limb2: 79049110419167648077612100775, - limb3: 2859726488499784472343988104 + limb0: 33903278448297807960111403434, + limb1: 64385591396992039369685047964, + limb2: 1442123781190549661, + limb3: 0 }, w3: u384 { - limb0: 20099853689710292382536862676, - limb1: 29610682057465687272295085396, - limb2: 13849570755440290447205088000, - limb3: 1591040942643311266872486397 + limb0: 17134125871172736608259025204, + limb1: 57892346910586885836379749387, + limb2: 243751890106924522, + limb3: 0 }, w4: u384 { - limb0: 42018405154625009399763589770, - limb1: 62753373525015073732769617268, - limb2: 75574648630852246223866059011, - limb3: 1216140258949897870812303677 + limb0: 20484087290657603721585762741, + limb1: 36930366827268195748073049720, + limb2: 1637176961539808024, + limb3: 0 }, w5: u384 { - limb0: 15717496051367728239532763302, - limb1: 3249830184815739268162072110, - limb2: 11771286564612824304273196983, - limb3: 4722493222298972819591096582 + limb0: 75653601870569456833928969861, + limb1: 53507397673214078761226765723, + limb2: 2843364621471557148, + limb3: 0 }, w6: u384 { - limb0: 71015303689980263527062648603, - limb1: 28284474266022509279084782053, - limb2: 70094204068416650395662638170, - limb3: 6079476964720607327033902853 + limb0: 4687975794707620030190306089, + limb1: 42378563596820661844261416604, + limb2: 3091026604630515845, + limb3: 0 }, w7: u384 { - limb0: 38459729299386951736597527886, - limb1: 11480063271155350949819031092, - limb2: 43660793247920643102858613817, - limb3: 4772137184124739932439597270 + limb0: 13611129873574375391726629682, + limb1: 14357122452446423746975062711, + limb2: 1674519240008030119, + limb3: 0 }, w8: u384 { - limb0: 30738748469011687715023530651, - limb1: 58581290406609895516164778097, - limb2: 4925600876898912405259692480, - limb3: 1383464635696019819128278067 + limb0: 3239281449077613341401998344, + limb1: 69377751764491276429910398734, + limb2: 2840022307240703069, + limb3: 0 }, w9: u384 { - limb0: 57234135861843350352453569922, - limb1: 71478615958910611400246487044, - limb2: 65965807663773109710859904661, - limb3: 1064381694604595219143379952 + limb0: 30976805690561999438998451450, + limb1: 63817873292967239790106321517, + limb2: 2738594716652947755, + limb3: 0 }, w10: u384 { - limb0: 4744177226496212833537810767, - limb1: 750838306831594684414850358, - limb2: 39853281617255637178862952375, - limb3: 681248645598089694028399304 + limb0: 14228889727254427776310813881, + limb1: 25507810821054733073678446816, + limb2: 3004013176385173244, + limb3: 0 }, w11: u384 { - limb0: 73263198736075811949018464775, - limb1: 33579811043875008817511901522, - limb2: 67322357217521763196938324045, - limb3: 1133098926616680299924564590 + limb0: 74112435727660175006992404597, + limb1: 79001492199180571922333810451, + limb2: 2103738868539948580, + limb3: 0 } }, E12D { w0: u384 { - limb0: 55026065350059393490930664153, - limb1: 9118308117954789258216837754, - limb2: 20107331725883924421482061090, - limb3: 2580151633749539233059798941 + limb0: 62673163077149526758340301080, + limb1: 55672772327865634790483147491, + limb2: 687402005005806147, + limb3: 0 }, w1: u384 { - limb0: 66831504991202284885457240729, - limb1: 58085734617229590380203324081, - limb2: 4213463430866560927370394602, - limb3: 3680534398540878814528895434 + limb0: 59374950898730167552904088087, + limb1: 41487958268517849450644797256, + limb2: 2567777470145054508, + limb3: 0 }, w2: u384 { - limb0: 54619036201328828149027988420, - limb1: 51180636525683576524117930710, - limb2: 5614423443767112556828560684, - limb3: 7901580859829685475743158126 + limb0: 57612087386825814327389634270, + limb1: 45862243028790161088638704798, + limb2: 906908102464929810, + limb3: 0 }, w3: u384 { - limb0: 39280458004672155011186574937, - limb1: 10100589381381255521855277547, - limb2: 50405499588103588614524786449, - limb3: 6621381202522507799183392757 + limb0: 37320482362698298773976469024, + limb1: 52069738112179756894775271090, + limb2: 2268606702663637647, + limb3: 0 }, w4: u384 { - limb0: 24516776951789498907879884868, - limb1: 4597761513647358623264982992, - limb2: 9571423764031480081219236578, - limb3: 1171859333827872412988665363 + limb0: 77776155856126833952135495092, + limb1: 69963802619093622143049359912, + limb2: 1751101611541752681, + limb3: 0 }, w5: u384 { - limb0: 59007930937991834402021214886, - limb1: 13609066150516777521624855138, - limb2: 29678461490416287992591916896, - limb3: 4575549162872608478431284205 + limb0: 38287732870607847830545587250, + limb1: 73333541725214566468382386923, + limb2: 1834219706549408718, + limb3: 0 }, w6: u384 { - limb0: 4080643485338051762475321162, - limb1: 11493910747461598908646092579, - limb2: 10278603764290295640953280249, - limb3: 1960202263618462792960113113 + limb0: 58389722990267241039362316856, + limb1: 65864268233662308797316383649, + limb2: 3197127826685687237, + limb3: 0 }, w7: u384 { - limb0: 52452802232126329553696607665, - limb1: 66745925002320133314186467800, - limb2: 57748774799818275963272718215, - limb3: 5999247608175422262556861300 + limb0: 23763114463094694248331678064, + limb1: 49678864033882785915916669620, + limb2: 3274823548579135779, + limb3: 0 }, w8: u384 { - limb0: 25525738429526820683442249030, - limb1: 13592599532277717574117494468, - limb2: 38214253226221169437806292210, - limb3: 871003507360218533854240680 + limb0: 72039297360775763012305802035, + limb1: 28072299758906064998698015042, + limb2: 2698075205657089454, + limb3: 0 }, w9: u384 { - limb0: 38728171195479950828109287007, - limb1: 30926494327851066591444433761, - limb2: 86572583412242182239741527, - limb3: 4273372496658577028896520698 + limb0: 22859115733365847471517370586, + limb1: 25476869307758226375021930237, + limb2: 163867263133068206, + limb3: 0 }, w10: u384 { - limb0: 52478281678927557943722722366, - limb1: 4367551224123366469519204694, - limb2: 65445956840007556158902338985, - limb3: 1999183472993438541095300938 + limb0: 39363578218904396458232965854, + limb1: 35482792010778741842056873710, + limb2: 2607075789829562358, + limb3: 0 }, w11: u384 { - limb0: 21830057982050213788831483410, - limb1: 12487317397239713619389096394, - limb2: 41480749515284044672623010328, - limb3: 2912822486071730734587700275 + limb0: 28146450647180887760104176547, + limb1: 44547830630967238080905930761, + limb2: 2354112149990781083, + limb3: 0 } }, E12D { w0: u384 { - limb0: 17068547923638214880956576859, - limb1: 42879573852628776945763943747, - limb2: 28875699021517514664327338663, - limb3: 7494150961214736564353371472 + limb0: 38308535529443780501017843934, + limb1: 10819541961077536366922055648, + limb2: 1541196588341849285, + limb3: 0 }, w1: u384 { - limb0: 71611662199376355610064957805, - limb1: 23949388934391139340961039740, - limb2: 50009312357325618794268266322, - limb3: 1158430222663174587836991095 + limb0: 6175691505998814390237710629, + limb1: 45678777845252779872922971906, + limb2: 1153689341227388464, + limb3: 0 }, w2: u384 { - limb0: 25577848162119737447516560598, - limb1: 39864703505061066448088132616, - limb2: 65509993514662087980454277654, - limb3: 4004301725224351064494909802 + limb0: 62204967774227169248177031814, + limb1: 49645492048694362892536727160, + limb2: 2678755305864977923, + limb3: 0 }, w3: u384 { - limb0: 75311143537417095896145695326, - limb1: 60285117955322453022083341094, - limb2: 49003975875053684210556498282, - limb3: 6990754847523073083101704549 + limb0: 33894304187138991363286212990, + limb1: 67418571480197698459094499791, + limb2: 921089692161769192, + limb3: 0 }, w4: u384 { - limb0: 70731119462070658008997488692, - limb1: 34471461577337150169381181969, - limb2: 74860012264788008606970338471, - limb3: 6040392183347272199235051430 + limb0: 49529879383805541194505058934, + limb1: 46973935285959346948568578200, + limb2: 1605512647073344063, + limb3: 0 }, w5: u384 { - limb0: 45145094637456915205937848896, - limb1: 31773713500447037183124053515, - limb2: 41296273609608076500456637491, - limb3: 1400767405837605875425036785 + limb0: 10756494359212189113403276081, + limb1: 77970760782371675493211263002, + limb2: 246913941741748779, + limb3: 0 }, w6: u384 { - limb0: 18834948887415499526639863140, - limb1: 60125965258487040803920619107, - limb2: 37856815907072637118753646324, - limb3: 810573289479106838115446584 + limb0: 48403273265719283380466706205, + limb1: 65629348089254163825378666723, + limb2: 17128707217128878, + limb3: 0 }, w7: u384 { - limb0: 29210601039551890540506184606, - limb1: 6733139344703493681829006855, - limb2: 68610925531985654784961522764, - limb3: 5241946794000787705993886309 + limb0: 31630809280132814682116274224, + limb1: 61331575385814999864271584505, + limb2: 980789478731039819, + limb3: 0 }, w8: u384 { - limb0: 38108963176501359090190433231, - limb1: 11077068408022715892318419149, - limb2: 53565985722023567059555548932, - limb3: 5324095297990060743668673619 + limb0: 21441217727118998930920519052, + limb1: 53722427134300415869204705490, + limb2: 1192654298109264932, + limb3: 0 }, w9: u384 { - limb0: 61643402189226778653874876021, - limb1: 51914837879930740480008901994, - limb2: 11636367797201172795877622754, - limb3: 3344189596102510677874716366 + limb0: 34399304741873632995218375365, + limb1: 24342880496623089419599430600, + limb2: 1191576369621667232, + limb3: 0 }, w10: u384 { - limb0: 39949011043240384385025181521, - limb1: 11414008764875719854721694260, - limb2: 43276196679995973799932012134, - limb3: 1338680705349583677694362922 + limb0: 57498481066714897509238301023, + limb1: 22682703960265781601790411050, + limb2: 970227461864205599, + limb3: 0 }, w11: u384 { - limb0: 6294420306663852255411778887, - limb1: 73317745892021386786542112393, - limb2: 42566486136979914258444068197, - limb3: 4882095441130467760405770709 + limb0: 33952598847283682546421182819, + limb1: 18772579803412223105032675016, + limb2: 580321773353769116, + limb3: 0 } }, E12D { w0: u384 { - limb0: 70340629271322305899859466624, - limb1: 22241047141963337729767735306, - limb2: 27537096337728256970990470033, - limb3: 2835235444179183190368803175 + limb0: 50101741711062222217224933891, + limb1: 69551242981872738494503199956, + limb2: 851045090710807956, + limb3: 0 }, w1: u384 { - limb0: 74500520355141131992873874373, - limb1: 16234240010531875549480062947, - limb2: 76951345815065053644346197508, - limb3: 6481556770944917827133027519 + limb0: 2777447069105896445384701067, + limb1: 61874888833915347449693567361, + limb2: 3311187104324527701, + limb3: 0 }, w2: u384 { - limb0: 47010609551839998230566419834, - limb1: 74573314290955848616485290406, - limb2: 51281586765708228840514938796, - limb3: 3943035960278631268077297968 + limb0: 21449679749658721933822058518, + limb1: 45311554908894863357454842603, + limb2: 2640233600135859740, + limb3: 0 }, w3: u384 { - limb0: 6889583813939106787761395018, - limb1: 62098522000735442029585373009, - limb2: 57402062416730361052894510370, - limb3: 2349670792410557843091727600 + limb0: 70201018335796333660197554153, + limb1: 13150816806472452756684953109, + limb2: 575644830794256668, + limb3: 0 }, w4: u384 { - limb0: 64112274208136292796922049409, - limb1: 39541483812058277500218704724, - limb2: 24578732611776876763871965019, - limb3: 2445787261784651806202585438 + limb0: 17207622034772877125946678581, + limb1: 37957519122384934034279614501, + limb2: 601998418582569781, + limb3: 0 }, w5: u384 { - limb0: 49296385099763890431546535183, - limb1: 29013276575468542877656223321, - limb2: 23609481322155965617685843476, - limb3: 7151843741961194231433724818 + limb0: 46524664541743287304786198130, + limb1: 30298554550474142687028196681, + limb2: 1520662930141632885, + limb3: 0 }, w6: u384 { - limb0: 60405144454844726683395516749, - limb1: 17244503043752431345323098209, - limb2: 21094941615569056514159099660, - limb3: 7755397209258208604938992262 + limb0: 28027234036185687687358004822, + limb1: 73039893109847710190234602756, + limb2: 3435970055053003762, + limb3: 0 }, w7: u384 { - limb0: 41927463942951546262902001757, - limb1: 64559828970431427302351338300, - limb2: 11690469847209485017546023367, - limb3: 5672030029308417365977868730 + limb0: 11778604382888619107374203992, + limb1: 53768560613768581049672765971, + limb2: 1151702626021188227, + limb3: 0 }, w8: u384 { - limb0: 26959273968199376098883991823, - limb1: 60093345172187278504393358501, - limb2: 57128916904346052009599782034, - limb3: 4371844430059420748808353328 + limb0: 70387008963443941817018717807, + limb1: 19112420087783153680114782363, + limb2: 2105611056021532602, + limb3: 0 }, w9: u384 { - limb0: 27830304559401848103526717642, - limb1: 20646010877675519181651892847, - limb2: 52806310660528209319336809652, - limb3: 5950283704532073611996007713 + limb0: 61049323542498970417281562855, + limb1: 52270171028136570774569107014, + limb2: 2453252158355888648, + limb3: 0 }, w10: u384 { - limb0: 44183800221795115968388056192, - limb1: 25870969665177055396193763854, - limb2: 26035895382881657737883393206, - limb3: 760896293152822196471784723 + limb0: 15237622334377632823194452604, + limb1: 17304086984407948319657321012, + limb2: 915824097021162496, + limb3: 0 }, w11: u384 { - limb0: 45556945781027944745405991460, - limb1: 62970511715093334853052320548, - limb2: 6399162958142420652021243161, - limb3: 1404036981932503539730348848 + limb0: 34373394016643233860980878403, + limb1: 47178668605051293748015784166, + limb2: 2334302726743391737, + limb3: 0 } }, E12D { w0: u384 { - limb0: 77059402961545536197842195379, - limb1: 41298184539547390943370484313, - limb2: 10601493424286162198520307156, - limb3: 1976013349635101266267310729 + limb0: 27065044853985015014224657733, + limb1: 43922050133886749389718780509, + limb2: 732513970053916813, + limb3: 0 }, w1: u384 { - limb0: 45543765211717351238893564966, - limb1: 2411349459461223059240670228, - limb2: 50357541398495578184435240022, - limb3: 6067764899120724956708857446 + limb0: 66688819054450759982590468706, + limb1: 54719529796071186205669364320, + limb2: 2352845448806930497, + limb3: 0 }, w2: u384 { - limb0: 6664486613695459594501611916, - limb1: 4205699164531895846802536820, - limb2: 65820632535404852175745047455, - limb3: 5885433707885430644683905714 + limb0: 34259976010385627904213328488, + limb1: 48949348323183566321442630080, + limb2: 1119211312879651056, + limb3: 0 }, w3: u384 { - limb0: 48097969739569639981485093152, - limb1: 4807731078514640672439175796, - limb2: 7031510612986587372269601349, - limb3: 2493928966046378965340780185 + limb0: 17274498469891603125813105823, + limb1: 53793591021123024057438828852, + limb2: 2473897961858164566, + limb3: 0 }, w4: u384 { - limb0: 77953184507705312535707068978, - limb1: 31018214570964947242531816537, - limb2: 49350996268825675919949455133, - limb3: 6352307784762675440950646648 + limb0: 66210779883163334919619350696, + limb1: 12056479891013253872746909587, + limb2: 2315880429341142516, + limb3: 0 }, w5: u384 { - limb0: 12401242716660580646557929705, - limb1: 20470677199478758815317125039, - limb2: 38457589323329714797379248977, - limb3: 1082084615635603488904267246 + limb0: 65676884377534463410785921516, + limb1: 67013503449516195586918514408, + limb2: 1485540885990746461, + limb3: 0 }, w6: u384 { - limb0: 25326933493362652364692958151, - limb1: 7923232263440600464207928134, - limb2: 3311126457888573189208728612, - limb3: 555674699242354274980024844 + limb0: 76518028257038917169274087516, + limb1: 1622481915153268371761839758, + limb2: 2143500180010469138, + limb3: 0 }, w7: u384 { - limb0: 40677504922889844927334303545, - limb1: 61660547869513512633870093176, - limb2: 39001768998406706013378152895, - limb3: 6226794327001845339534471272 + limb0: 5516765884735676148948449322, + limb1: 39550665251406870629720105612, + limb2: 1740637438622546380, + limb3: 0 }, w8: u384 { - limb0: 47361071801470108109225303518, - limb1: 39387649016773729696651924104, - limb2: 73914270949130886288417207166, - limb3: 4770926770642948189488457570 + limb0: 50896996794926988682528947766, + limb1: 74007186827639597686169361332, + limb2: 2048648075756369352, + limb3: 0 }, w9: u384 { - limb0: 71382908050251587537285827543, - limb1: 49296257872909955708006641155, - limb2: 16497047130491174609134804152, - limb3: 7238594881160185946270846818 + limb0: 16719553409160017842392727507, + limb1: 21135280166918768262925735322, + limb2: 1595082536346911589, + limb3: 0 }, w10: u384 { - limb0: 2428995958003013932612124971, - limb1: 69479897338755656117436932400, - limb2: 56479110690466286350719341098, - limb3: 2243308259795764007327286113 + limb0: 2932796441525761794804205942, + limb1: 4535912675713590710382020306, + limb2: 1903247393701532936, + limb3: 0 }, w11: u384 { - limb0: 74012306346981603370241684948, - limb1: 48966371637902281379664754647, - limb2: 6132306500349770640184498158, - limb3: 1969067995617767099384018930 + limb0: 61292511546621317472255108129, + limb1: 70072731362900109128023630642, + limb2: 2844320512148865719, + limb3: 0 } }, E12D { w0: u384 { - limb0: 34132928416731228650626868091, - limb1: 59698026754939882401998220628, - limb2: 11022916747694008925851692358, - limb3: 135611441449577690502541614 + limb0: 45074282931531789317684673269, + limb1: 39530588055644270684403955582, + limb2: 3016283110948274072, + limb3: 0 }, w1: u384 { - limb0: 36692655321978187232659033837, - limb1: 15855902086766317510798520289, - limb2: 33670851768176571872438449560, - limb3: 5827785240376980146827551832 + limb0: 69785689711036298436209912257, + limb1: 28637051819575190407121589468, + limb2: 1401631411156885304, + limb3: 0 }, w2: u384 { - limb0: 63131664380062740152911307355, - limb1: 76538365059184605661942873886, - limb2: 24721980872048783966122465100, - limb3: 5702100887276899953974013982 + limb0: 55456370497626863854659911238, + limb1: 14899842261344226194408733715, + limb2: 3165546788738596919, + limb3: 0 }, w3: u384 { - limb0: 61788291758657446010838587650, - limb1: 40002631680909235490456393210, - limb2: 9285899894235689182724239144, - limb3: 4641875000026317286763395759 + limb0: 56414835844313447278071693112, + limb1: 53719244114970036675373117714, + limb2: 676027982962259575, + limb3: 0 }, w4: u384 { - limb0: 39588295020583237201095051187, - limb1: 48212395153278692290994640850, - limb2: 20458584169497984767297654665, - limb3: 1293008679069190982759376402 + limb0: 30512088771460093925860802760, + limb1: 69456947623235213433386374240, + limb2: 2484667398686051087, + limb3: 0 }, w5: u384 { - limb0: 57676001403806494305000909680, - limb1: 22662696928123757918247637641, - limb2: 5075261652590473050775626733, - limb3: 3759361949194667242472185799 + limb0: 78248890084357494872948851989, + limb1: 13930730847971091026888798315, + limb2: 2133182305093983382, + limb3: 0 }, w6: u384 { - limb0: 23045499717800443374583310711, - limb1: 60308050917283772344448867414, - limb2: 61215145386270106923692060517, - limb3: 7149985902586442353591732275 + limb0: 10667043670875983009320319342, + limb1: 35301340300330497310504215089, + limb2: 2250903114256200693, + limb3: 0 }, w7: u384 { - limb0: 38362353660475502427655285321, - limb1: 50298204181454018081959518261, - limb2: 6052930110208113660148222268, - limb3: 6248015077774424027125246823 + limb0: 2881482243654385632517200672, + limb1: 56413108600891841109302769263, + limb2: 2799169846577261029, + limb3: 0 }, w8: u384 { - limb0: 68030873068341439399133676210, - limb1: 71506361212330031348813852394, - limb2: 41694997505712126990054657779, - limb3: 2624135116044571771098976602 + limb0: 55497442833588052457887585549, + limb1: 61735415535402293471004618883, + limb2: 3407572015472428999, + limb3: 0 }, w9: u384 { - limb0: 42998801635047722696096031344, - limb1: 59068483513381129067593558511, - limb2: 57494935088909592936694020478, - limb3: 2318085630388510970001488207 + limb0: 7757714743512549181342045504, + limb1: 77384362504397816529703241848, + limb2: 155630795797469545, + limb3: 0 }, w10: u384 { - limb0: 42483175677192624617760627472, - limb1: 64775709789001387573208931134, - limb2: 1049247932188119208852482849, - limb3: 3379362735319840479975709847 + limb0: 54055518930496907788652735725, + limb1: 31364934920173297773540150474, + limb2: 3223577119994794124, + limb3: 0 }, w11: u384 { - limb0: 33225201091997763455470737375, - limb1: 59233775546032216249906624937, - limb2: 62603844508672493020479922569, - limb3: 5736850046769124932408347116 + limb0: 2191378703038601553254304273, + limb1: 30372239792775300795024012930, + limb2: 474241110388419003, + limb3: 0 } }, E12D { w0: u384 { - limb0: 10005972294431228763834295457, - limb1: 4996659524756293909300546389, - limb2: 69606463868349700956045782159, - limb3: 6842718842994127966002062820 + limb0: 43591586234927222897653001352, + limb1: 75716837637245728801528599549, + limb2: 1274299760774820131, + limb3: 0 }, w1: u384 { - limb0: 76858762318963726120825120805, - limb1: 9494646692289861091757538600, - limb2: 55528291657150880511499552072, - limb3: 7485188283693387869067285671 + limb0: 77153570248455760243952411592, + limb1: 56719425484644150602473701229, + limb2: 503544493148719373, + limb3: 0 }, w2: u384 { - limb0: 28481925215355333411865719024, - limb1: 44805006495487988855653093117, - limb2: 76955558762912294168800918379, - limb3: 1849093881009939765984588765 + limb0: 75278430912671559676800322427, + limb1: 19453107743141487281856482105, + limb2: 2638328755397920313, + limb3: 0 }, w3: u384 { - limb0: 37433851241676529758630886014, - limb1: 30981127942880103840667833078, - limb2: 38224308187639817954678376571, - limb3: 1349699717294096960329685089 + limb0: 5215167524599430738640234006, + limb1: 3730623183951772858545311753, + limb2: 2481943551715591244, + limb3: 0 }, w4: u384 { - limb0: 32746459543664137233697671416, - limb1: 20339007240797595829724628197, - limb2: 66582769229789442071195501386, - limb3: 2152370835593751190105977162 + limb0: 30991868023985864132214763220, + limb1: 66202536897235187552706254386, + limb2: 728363063538371046, + limb3: 0 }, w5: u384 { - limb0: 856286839939656823452176621, - limb1: 73429801009610825253166872170, - limb2: 35677056624312156953998272715, - limb3: 533919142412722321268308408 + limb0: 51284508129081753873277932365, + limb1: 58526244230530658848334005422, + limb2: 1346634228548359456, + limb3: 0 }, w6: u384 { - limb0: 15098613978755541065524408526, - limb1: 63911239450918614629146464608, - limb2: 62897131229204959118255719802, - limb3: 7263604368696458582124696636 + limb0: 74166712054666384888165852999, + limb1: 75510702522493042492843699700, + limb2: 2319907299043897735, + limb3: 0 }, w7: u384 { - limb0: 44462827967875865411397133160, - limb1: 15173903705513977131622207851, - limb2: 9303953400286092629322283678, - limb3: 4931883307125828118147169528 + limb0: 36934176585009349924017312450, + limb1: 53152622631345739917121526343, + limb2: 3136021751634973193, + limb3: 0 }, w8: u384 { - limb0: 17893830749186756897674734232, - limb1: 58963423720499128001934406468, - limb2: 12816517104682653711429923292, - limb3: 3107374312412561435154678040 + limb0: 49875083255669113588392254970, + limb1: 4682146047842869533061472944, + limb2: 939186131841310615, + limb3: 0 }, w9: u384 { - limb0: 1533274479257054259832753649, - limb1: 72004798875811729967787062529, - limb2: 32330580456660060405225549723, - limb3: 6163386598715300025754305356 + limb0: 53472571435899695116980705478, + limb1: 78254493360444717094354137785, + limb2: 3103748429304074318, + limb3: 0 }, w10: u384 { - limb0: 32394799837870955537859625089, - limb1: 64665219741018905657358173903, - limb2: 76055218610921813421367970340, - limb3: 2164155122681781752062492355 + limb0: 72039364474106160720300129092, + limb1: 74241207708056977857365488673, + limb2: 1440935495314255170, + limb3: 0 }, w11: u384 { - limb0: 27523153223163554042594665633, - limb1: 70764111013333358082448188834, - limb2: 24313725856930244764414110169, - limb3: 3788295941798108247104302093 + limb0: 70011287245561870079911713099, + limb1: 37633420854681991972169418158, + limb2: 1335540814595633231, + limb3: 0 } }, E12D { w0: u384 { - limb0: 39508433447490449754608606502, - limb1: 62315700770946197557136961107, - limb2: 8492800595751945013569550900, - limb3: 5067597209062147907634395175 + limb0: 58034587096608614847866959888, + limb1: 53635927689191969341663752975, + limb2: 3278537717837022567, + limb3: 0 }, w1: u384 { - limb0: 14339062638328008313709291995, - limb1: 64195225354523826624506422849, - limb2: 51722802050313299866564259656, - limb3: 3032475951281132310310419200 + limb0: 30507926689650552112787891732, + limb1: 16682535359776888189353687646, + limb2: 2916232456942426365, + limb3: 0 }, w2: u384 { - limb0: 67442601322115777252025744249, - limb1: 61528280831516185452249649286, - limb2: 38061286344350842109039312481, - limb3: 312967249951438854313437734 + limb0: 64264529542285743333095340759, + limb1: 37170388499676294003551473111, + limb2: 779375604892534620, + limb3: 0 }, w3: u384 { - limb0: 70860876862700814206612586242, - limb1: 17525982222116528521898088887, - limb2: 16757850602935979304372658909, - limb3: 1627369646590268966191433712 + limb0: 42958166305811527692610000943, + limb1: 67968162715565757907467863445, + limb2: 1449817481941608271, + limb3: 0 }, w4: u384 { - limb0: 56678528822256177249702032639, - limb1: 10391849244579444336817862988, - limb2: 12126926523873940364398781524, - limb3: 5101121331450332354620850869 + limb0: 33006464459625808936983162649, + limb1: 26145006192681437996431568735, + limb2: 1258815155811824277, + limb3: 0 }, w5: u384 { - limb0: 33216808404315953530416022692, - limb1: 75681137358981746331759697346, - limb2: 48293333455491320438320614272, - limb3: 750712366575891865721643897 + limb0: 76170154777653168680266939387, + limb1: 54636680753412257531222855525, + limb2: 955834273852375923, + limb3: 0 }, w6: u384 { - limb0: 54592109288142154988779161273, - limb1: 20100140634580542594567187810, - limb2: 20585046566888526051583078890, - limb3: 4646093588410207752751388255 + limb0: 8990701461986896329291410029, + limb1: 30644273113288262058816870120, + limb2: 491441320652636329, + limb3: 0 }, w7: u384 { - limb0: 41425191615991384161434835509, - limb1: 73832657875942146384652980538, - limb2: 62809084627813388664929933055, - limb3: 2855220002317104557557541951 + limb0: 26393845743176553881531088191, + limb1: 55100085113239123010622166197, + limb2: 2643952393918667885, + limb3: 0 }, w8: u384 { - limb0: 11932918688441307130857831198, - limb1: 14517257019324160311226241869, - limb2: 56445750229070523050431517951, - limb3: 7103216019719488653312730233 + limb0: 48932860771230560904180383282, + limb1: 2905700118758106079324795977, + limb2: 2920791768601930184, + limb3: 0 }, w9: u384 { - limb0: 45173218435484458409169463591, - limb1: 73106384704566836065686841454, - limb2: 16237517129548250890485999833, - limb3: 2187443283178531327332285929 + limb0: 49783703234853044514776560234, + limb1: 55210105244239187292282732552, + limb2: 2495034636905113042, + limb3: 0 }, w10: u384 { - limb0: 21058585752357940070368080854, - limb1: 10632185027392180654342255821, - limb2: 75260097554258233619142068431, - limb3: 2501987664601575093935683631 + limb0: 33396155940093839723728125304, + limb1: 43145735762293041675557431813, + limb2: 257007424197863713, + limb3: 0 }, w11: u384 { - limb0: 51248443225110949112732829400, - limb1: 1781719878849053089630712271, - limb2: 11887075665519647129077076370, - limb3: 315395603489040546220283669 + limb0: 48728753535817176102379796192, + limb1: 69355683521514296987190161159, + limb2: 1736058828357832379, + limb3: 0 } }, E12D { w0: u384 { - limb0: 71008093381444846731597038910, - limb1: 53592350196040426582205085917, - limb2: 61375125935581305915000392193, - limb3: 5650455515384374138153045155 + limb0: 42473058891043491649791479644, + limb1: 30249682558425182205549994997, + limb2: 2367220962822511327, + limb3: 0 }, w1: u384 { - limb0: 54725461020022805738928115871, - limb1: 28461547347349351670306343116, - limb2: 2958701851734049417001502822, - limb3: 2642941720668000947131429263 + limb0: 6437597783581269821483511308, + limb1: 59349362312720171319667999658, + limb2: 1326454763076637026, + limb3: 0 }, w2: u384 { - limb0: 45985791339893405313370685483, - limb1: 64670278453108201198295813503, - limb2: 20254803342572596027840603945, - limb3: 7973006567012967732286484254 + limb0: 76487388421921208095160816505, + limb1: 40994095893557908786334715349, + limb2: 678236008463186608, + limb3: 0 }, w3: u384 { - limb0: 25275658178501499112202767117, - limb1: 74176082610265675980761308606, - limb2: 10165060374649568523167157394, - limb3: 5025111756269727228698166473 + limb0: 65984478182508133085560957480, + limb1: 29001614046404910795244825274, + limb2: 344858903042994250, + limb3: 0 }, w4: u384 { - limb0: 42990698877185785850524410634, - limb1: 52180994194481307426841900689, - limb2: 36096500756233134445839326230, - limb3: 1834474676054830884223416398 + limb0: 57593461239900041481689272704, + limb1: 838002044655830462744157201, + limb2: 979105939512252083, + limb3: 0 }, w5: u384 { - limb0: 37887450083483815397988503651, - limb1: 51435280516791020426462784643, - limb2: 35100356918144879415909965687, - limb3: 2897338750208435428520583215 + limb0: 76297036068454362619045266683, + limb1: 38281985313073090087588322295, + limb2: 2581820392631785283, + limb3: 0 }, w6: u384 { - limb0: 6962844194154521252079355576, - limb1: 78464810594891333292997390651, - limb2: 62955359074353462028605179940, - limb3: 7848799975088780455241540349 + limb0: 4933369975379268896156615744, + limb1: 49547841737127480075038793875, + limb2: 719602758975957867, + limb3: 0 }, w7: u384 { - limb0: 1523750473590935425244432941, - limb1: 16334091174374544170078605782, - limb2: 23747263365241059466024676671, - limb3: 4783771349510165809572140512 + limb0: 37129791021919551977374494998, + limb1: 72815146145428676264637693734, + limb2: 314726404504224443, + limb3: 0 }, w8: u384 { - limb0: 63617239864046236008970397957, - limb1: 31035467518584490723676154029, - limb2: 60475154472943491444738971001, - limb3: 3579796129430231008742307461 + limb0: 56121868529822775272299356758, + limb1: 50474767384946508454735123689, + limb2: 1170980594286293206, + limb3: 0 }, w9: u384 { - limb0: 28558638300938510450779710326, - limb1: 2755436530426743151167946442, - limb2: 59704772192669889152962720475, - limb3: 4616535218279097683358107960 + limb0: 45218751849520932272589437964, + limb1: 44209537532290308710745218755, + limb2: 2509218508053353597, + limb3: 0 }, w10: u384 { - limb0: 59421525170774785934233521180, - limb1: 78084565098391686148945182291, - limb2: 66577486693189205947070037633, - limb3: 1725270500262492246432832115 + limb0: 43957097003131421275713224497, + limb1: 13916791051281156641201825879, + limb2: 2262304789860612852, + limb3: 0 }, w11: u384 { - limb0: 22418762413583616364162483863, - limb1: 33175594586755833618189479745, - limb2: 76895814985956713895381121190, - limb3: 1188559449108053475154889907 + limb0: 24531074377361867495824639448, + limb1: 47285869524832523252269808374, + limb2: 377384588226156830, + limb3: 0 } }, E12D { w0: u384 { - limb0: 17709958294990738384033479827, - limb1: 75630646031174887616629370780, - limb2: 7954108810664040264191805676, - limb3: 2921197529430645111477482739 + limb0: 74275169427903336809451657339, + limb1: 2722333466720139154524069717, + limb2: 566165733363440579, + limb3: 0 }, w1: u384 { - limb0: 65001823389119037034185763934, - limb1: 56131334691770055397752247238, - limb2: 18100409782536577503818040885, - limb3: 7514582332593429651206562647 + limb0: 75254647282349277189267559054, + limb1: 36185106702811275749438167608, + limb2: 829030631494469499, + limb3: 0 }, w2: u384 { - limb0: 64818145169942811313079956826, - limb1: 76363931987679687733259309925, - limb2: 60731596071904593627583280661, - limb3: 1352935764654913688642138497 + limb0: 39757069285056587707158550970, + limb1: 74953407420649613579015947571, + limb2: 3235558667014317007, + limb3: 0 }, w3: u384 { - limb0: 20014102614044383997129706891, - limb1: 74969885475357864162422168824, - limb2: 48791333159854606829239237152, - limb3: 2509936893081756496348994182 + limb0: 67099366480148826916539550522, + limb1: 60063679081116463502946254553, + limb2: 1457829893938253119, + limb3: 0 }, w4: u384 { - limb0: 68692623195661612906350567981, - limb1: 47198739737862632405248800241, - limb2: 74871044436941329356939388906, - limb3: 4817163233044795113468671576 + limb0: 9451973851319672299273457304, + limb1: 16520588000998938730120685385, + limb2: 289637781200089428, + limb3: 0 }, w5: u384 { - limb0: 66632858425016896193446055159, - limb1: 65929898257931791362986445702, - limb2: 3856259895761619734983859682, - limb3: 1012885606859481313352669621 + limb0: 51748149604279299376328361621, + limb1: 69394106289267862821321436496, + limb2: 2122250136357664762, + limb3: 0 }, w6: u384 { - limb0: 68703398456192076386429926950, - limb1: 34611783595266088121570131445, - limb2: 31047417831309588114416648392, - limb3: 2366159361532123434382081623 + limb0: 4922666904429875202380821354, + limb1: 60308119337325511916706858924, + limb2: 566258693312066615, + limb3: 0 }, w7: u384 { - limb0: 52358794613848411303712839770, - limb1: 16540451179257781833515112410, - limb2: 62289224327668641129112934971, - limb3: 4350002326598822466512144511 + limb0: 31008271139810845918732447450, + limb1: 26188702681168748970885385156, + limb2: 3351944084420005226, + limb3: 0 }, w8: u384 { - limb0: 46228780196011685965564413861, - limb1: 41865582214261687555526415114, - limb2: 14561485748602636711263108813, - limb3: 5597895862182411045930176634 + limb0: 66369652624225596615081105651, + limb1: 67384457941250139517343780902, + limb2: 350640886275411672, + limb3: 0 }, w9: u384 { - limb0: 1453872870397283282667901232, - limb1: 29676206231365767009098359165, - limb2: 557259657407042449352073098, - limb3: 6497410394253822684510586832 + limb0: 54657226407993014382524173083, + limb1: 44231474304848224978277467245, + limb2: 676185648216589481, + limb3: 0 }, w10: u384 { - limb0: 14946123051302921872219410972, - limb1: 78917831233002412078911620803, - limb2: 25959841081393484415630705363, - limb3: 1947372008610684301272743807 + limb0: 26404697852657179999936926886, + limb1: 50231904901838865723544502957, + limb2: 2479708695330778799, + limb3: 0 }, w11: u384 { - limb0: 25819444395400146662907104920, - limb1: 25404562720691126561679439889, - limb2: 40118935170755838071441450107, - limb3: 7050085778748586909210999072 + limb0: 7303670727874994481275409344, + limb1: 1271643209417805192456719045, + limb2: 1332321380524263784, + limb3: 0 } }, E12D { w0: u384 { - limb0: 30832084588805593940131495926, - limb1: 33288951981735670313155047117, - limb2: 5473853635261410524104876853, - limb3: 1733831185556362938887563950 + limb0: 20034301393926671721664521559, + limb1: 44765469309438988891848091160, + limb2: 616322388389323275, + limb3: 0 }, w1: u384 { - limb0: 22163147174379111277341306479, - limb1: 12700012031733184626063814526, - limb2: 26418292213220032747963670819, - limb3: 5698912149996591975963443004 + limb0: 46416976053192455114948326907, + limb1: 44008219014550358889062912560, + limb2: 2933261632070235352, + limb3: 0 }, w2: u384 { - limb0: 41280930865196230768581016520, - limb1: 68031113634843236107083826747, - limb2: 35883769955429385136558027313, - limb3: 5264740293855109270114279160 + limb0: 38196803146903375221920890149, + limb1: 62076993485174344202554110310, + limb2: 2891928631820508574, + limb3: 0 }, w3: u384 { - limb0: 14266146853999181995665282670, - limb1: 25954555449071451498211080398, - limb2: 71113808286811297051428619007, - limb3: 1691001595307174673136709625 + limb0: 47632574678722408826909804318, + limb1: 21600828447888293116187301801, + limb2: 15287037350005706, + limb3: 0 }, w4: u384 { - limb0: 2678644195906801910974981775, - limb1: 58976073036893441234442398137, - limb2: 26116679332209940291556688180, - limb3: 2674685538650854418234169876 + limb0: 62215228388242335438304245459, + limb1: 16658984144260830332499332933, + limb2: 1491183349516336078, + limb3: 0 }, w5: u384 { - limb0: 39057493279983848049175271389, - limb1: 12366996876165379327633807493, - limb2: 38420932003366085169228143097, - limb3: 4088623185059474864402182992 + limb0: 66332520302703658977364154989, + limb1: 14372297718804415710814355132, + limb2: 2273626937470703558, + limb3: 0 }, w6: u384 { - limb0: 44060047981923890723487584619, - limb1: 36735725422201945304156104107, - limb2: 1808801587282407771214095298, - limb3: 2863323239029822114154125474 + limb0: 78772745521747946886591117610, + limb1: 31591295110749202273688961104, + limb2: 1464906889185189409, + limb3: 0 }, w7: u384 { - limb0: 11255163613524735249877826476, - limb1: 18526221156868118223681052968, - limb2: 64849806889386545436128440081, - limb3: 695241348246609497917002686 + limb0: 23468312712347266061328855213, + limb1: 53175345847916026069346504728, + limb2: 2839127025471002689, + limb3: 0 }, w8: u384 { - limb0: 68207425773136781539612850314, - limb1: 22935720027064840022751623713, - limb2: 31031489328766825552424058766, - limb3: 4131480383659724240546464757 + limb0: 28315399401325991339598597487, + limb1: 49023992628935375757425937, + limb2: 1603666407121128681, + limb3: 0 }, w9: u384 { - limb0: 1759743478870164798475029463, - limb1: 65859642218814787518148961356, - limb2: 59887717709278849750330437029, - limb3: 2503297658109796972001998194 + limb0: 59174324626171864976534280324, + limb1: 37542508551196653088927952709, + limb2: 2938775904453076411, + limb3: 0 }, w10: u384 { - limb0: 62637614926316830414123437061, - limb1: 75050385554788845458772585277, - limb2: 37214845640891553579113055676, - limb3: 284971253466575364534883341 + limb0: 33141574322659066182404119657, + limb1: 74990379188881234232824576262, + limb2: 1007138072388849780, + limb3: 0 }, w11: u384 { - limb0: 20366952798720327813282082178, - limb1: 25846710971363478107995644141, - limb2: 511225534603374416070163472, - limb3: 6051914529673147528165329134 + limb0: 35130159578378045490615717517, + limb1: 58151574247776991997587765621, + limb2: 2172985211613348476, + limb3: 0 } }, E12D { w0: u384 { - limb0: 11500031002644918930216973688, - limb1: 71534858628492068008651705121, - limb2: 38018112849718890416382093504, - limb3: 1199453337740286225238967465 + limb0: 54227664644699847199174268244, + limb1: 20741210508405394787739091177, + limb2: 2050784276335462851, + limb3: 0 }, w1: u384 { - limb0: 28598266645298459089101036030, - limb1: 63943635370131192817276787690, - limb2: 78120706542804418254285797207, - limb3: 4100631680537744595527192288 + limb0: 47366786880850951819003268855, + limb1: 59370201427803817266189134402, + limb2: 2444666155176756917, + limb3: 0 }, w2: u384 { - limb0: 65239676443185268702926876485, - limb1: 61924289932207998938791179577, - limb2: 48751869254818392553817764000, - limb3: 974612347455822400111595896 + limb0: 20112681625668724712697170438, + limb1: 62875390474522668547843982239, + limb2: 3204880880081310168, + limb3: 0 }, w3: u384 { - limb0: 34813979051686565517382928565, - limb1: 73846966100928959325901997120, - limb2: 15117021294803301158209939191, - limb3: 7122810612809652653905606856 + limb0: 27561609623557700213925081823, + limb1: 73430416171109390398534988386, + limb2: 1736050051702578835, + limb3: 0 }, w4: u384 { - limb0: 38655776379789627818302479507, - limb1: 56390968027800040571623700472, - limb2: 30918543639546979749470053256, - limb3: 7464329180066996556522937117 + limb0: 27110248519006599746653991135, + limb1: 58315021093928620775678760283, + limb2: 1900479540114899231, + limb3: 0 }, w5: u384 { - limb0: 59164434730395194650986802291, - limb1: 8463668540646045693000681650, - limb2: 59823710752887533831211766895, - limb3: 1058343481380572607147150645 + limb0: 49173290791834030557675479678, + limb1: 37555274277510409869786376212, + limb2: 757429374203729172, + limb3: 0 }, w6: u384 { - limb0: 14312371307348230330707405003, - limb1: 10457394273486238522223916373, - limb2: 22026823623382057791037987839, - limb3: 4012705643954710972243525686 + limb0: 37585440924369071630055494033, + limb1: 56187890043392441851054904132, + limb2: 163677409770128315, + limb3: 0 }, w7: u384 { - limb0: 8679957668679876177191223876, - limb1: 14146879678605618211482043186, - limb2: 75033639285584352795734303714, - limb3: 5025555703792065354414222680 + limb0: 62608754694791486178164724581, + limb1: 28588392986965599988242190906, + limb2: 3213394611011986537, + limb3: 0 }, w8: u384 { - limb0: 15724327706700329785755290042, - limb1: 47401383152104342657842965459, - limb2: 25138288446025764174082572449, - limb3: 5395048259445038851890521808 + limb0: 73213518523854506437565190209, + limb1: 733220851271432957959311797, + limb2: 2944731733331689370, + limb3: 0 }, w9: u384 { - limb0: 60343192802614299283748580677, - limb1: 1312060189588680801424351589, - limb2: 42727428262524485846708869061, - limb3: 6941173991666663160392558423 + limb0: 65765704393369377109687561651, + limb1: 68349600018890130832108142550, + limb2: 991351699553889444, + limb3: 0 }, w10: u384 { - limb0: 14706247185530023240327392859, - limb1: 45492338509951819630896936953, - limb2: 19997725604854897515376199484, - limb3: 3414268523847266364189920652 + limb0: 18976774791294610192926327906, + limb1: 10536021921717311033860262406, + limb2: 3307378266312270112, + limb3: 0 }, w11: u384 { - limb0: 39503788821347841453951953415, - limb1: 39379983805251025089315464058, - limb2: 3185618293615996109906030925, - limb3: 14648031416875328867799433 + limb0: 41900386511633917272173480814, + limb1: 51588243243464320236265034063, + limb2: 3376614053114171747, + limb3: 0 } }, E12D { w0: u384 { - limb0: 78999037043117230117526277487, - limb1: 3373144492745647565659129794, - limb2: 43911665733912495486893392627, - limb3: 5783396524759110107864927963 + limb0: 25992035511596601693176535044, + limb1: 52503270707449735630412671793, + limb2: 2084241316957787467, + limb3: 0 }, w1: u384 { - limb0: 23893659457033477421968524744, - limb1: 48980213583029385550808056236, - limb2: 21517627113037515457887866173, - limb3: 3182382817329061582500299208 + limb0: 2513738254811700807863986909, + limb1: 6177646481896318376815364146, + limb2: 2891337195169739757, + limb3: 0 }, w2: u384 { - limb0: 59990499601005802516566731414, - limb1: 2975176362299579671200999752, - limb2: 22352067660588396348483663442, - limb3: 2109631042594586211572862196 + limb0: 75573811331845203611483353054, + limb1: 49879260092734877658266220265, + limb2: 707158002247517729, + limb3: 0 }, w3: u384 { - limb0: 73684277359011580680931297625, - limb1: 24266344418942979357139897909, - limb2: 12463646770932381633313380217, - limb3: 5989504803427293369015576352 + limb0: 63704748567856338503504233061, + limb1: 55304159235059205278629570757, + limb2: 2273265776725766937, + limb3: 0 }, w4: u384 { - limb0: 15951994427254861515773297314, - limb1: 73027906850371521936857414427, - limb2: 47084504485118523495683430138, - limb3: 336247053975031495555976951 + limb0: 60452706970926899640768665527, + limb1: 29036266195320110588178662319, + limb2: 2821398168766883006, + limb3: 0 }, w5: u384 { - limb0: 74241099056979537349031945972, - limb1: 67158409597671954537990953895, - limb2: 31094446083263427183512559985, - limb3: 7520031148346806916662915322 + limb0: 45856194540093749303298357040, + limb1: 73954936714770912531738000257, + limb2: 657003465721854075, + limb3: 0 }, w6: u384 { - limb0: 52179957861337126942069451572, - limb1: 401539045543775045784065699, - limb2: 55883397251617724510809845844, - limb3: 5602730461107164226798153382 + limb0: 16316019344915534536539046488, + limb1: 21564999517789762093179502698, + limb2: 3286075174180288986, + limb3: 0 }, w7: u384 { - limb0: 56411714853534238210965299941, - limb1: 70228995079862784321785321144, - limb2: 63247503995675911490587989727, - limb3: 2295526367428405215004199769 + limb0: 76634566334940403548908551775, + limb1: 40506936895827503312416446926, + limb2: 2497112350854793903, + limb3: 0 }, w8: u384 { - limb0: 45212328735610250868406571299, - limb1: 19562515051280985685807881041, - limb2: 9551825858698081124477153434, - limb3: 7879577491015350741939902436 + limb0: 33048819872964186034709210164, + limb1: 47175589106085974173896014634, + limb2: 495905575095765222, + limb3: 0 }, w9: u384 { - limb0: 51546368347908867900587168316, - limb1: 6570030480749055618224012645, - limb2: 25172459373479730525281098595, - limb3: 2298472756372470222277001219 + limb0: 65980122742911429660720431854, + limb1: 62539480377874490331846162660, + limb2: 1829098283740411064, + limb3: 0 }, w10: u384 { - limb0: 40839067423194122577220838994, - limb1: 46866875398731724465015382231, - limb2: 40550436869937308682674045250, - limb3: 7549213033415270038994512005 + limb0: 33412399363812315739684240088, + limb1: 20462869491253490872583904837, + limb2: 332377460298969516, + limb3: 0 }, w11: u384 { - limb0: 6372039331380636101106233858, - limb1: 46151923711333120462001889902, - limb2: 19878036772719230249060160006, - limb3: 665966932874086626827768523 + limb0: 50448578394968347163668593733, + limb1: 9772870516796937524370526062, + limb2: 2154920163368425780, + limb3: 0 } }, E12D { w0: u384 { - limb0: 60187001102478234376913357533, - limb1: 66145871765062366684235405635, - limb2: 74179190947779059023045493083, - limb3: 2081651435585083125113886674 + limb0: 24404306775068944519032912944, + limb1: 5342738839664546705186304352, + limb2: 2396496203986941668, + limb3: 0 }, w1: u384 { - limb0: 42778935257641992827984118202, - limb1: 71845809248185655643168497059, - limb2: 50951374373122551847730403901, - limb3: 3216849996056497110790532393 + limb0: 40392861719271838698266077417, + limb1: 37678063177455223390349699329, + limb2: 1300086925709249578, + limb3: 0 }, w2: u384 { - limb0: 52777166830088028488996428245, - limb1: 13712744198928878847084666366, - limb2: 27833705267492422232886348568, - limb3: 1879770869297165736944258800 + limb0: 56944394523392734887970285566, + limb1: 4067087418997571436407233467, + limb2: 809936328498079002, + limb3: 0 }, w3: u384 { - limb0: 40236736695933509208979942811, - limb1: 57762110893827414198682547562, - limb2: 46559688269990148903186051942, - limb3: 193277515827519119135517788 + limb0: 1596958557904185985663994438, + limb1: 78589681581910077513810303602, + limb2: 1496784219668807802, + limb3: 0 }, w4: u384 { - limb0: 78043796603160329541241765444, - limb1: 24292008259827928130448840808, - limb2: 57002977999703498630189582761, - limb3: 5025617382598018215037975799 + limb0: 65419652882643303493969817409, + limb1: 16890433674850168769042905285, + limb2: 1261300297545579839, + limb3: 0 }, w5: u384 { - limb0: 46510531109110823507829219485, - limb1: 59813459062885671436860415976, - limb2: 21219966013341165414417999271, - limb3: 8043974649110927607039366339 + limb0: 33218835374100624191561444766, + limb1: 24719857623381434191215557261, + limb2: 2767599667711266325, + limb3: 0 }, w6: u384 { - limb0: 36889830044411524188970702828, - limb1: 32446596065715598380416755802, - limb2: 48851559048937207772740438930, - limb3: 2295526311920919361368204015 + limb0: 46384003365364954887691277679, + limb1: 28611159311874270441272318028, + limb2: 1570834598080698642, + limb3: 0 }, w7: u384 { - limb0: 24702503979968266634781496443, - limb1: 74096386895385343032822724395, - limb2: 31981308485531373221610835707, - limb3: 6432471797487108714686258792 + limb0: 3577857148520915023057239829, + limb1: 1147046622577661961652829002, + limb2: 3320836656473789468, + limb3: 0 }, w8: u384 { - limb0: 14874366902665370019426850531, - limb1: 64191808072867686367752382123, - limb2: 33400683222883810943860690975, - limb3: 1825306753510741656842791336 + limb0: 33784229926577175232870730349, + limb1: 64751202603377705709349385784, + limb2: 618018023027966927, + limb3: 0 }, w9: u384 { - limb0: 24401192799115497775839844895, - limb1: 1514015050497502987711846528, - limb2: 62429598225097608616682218525, - limb3: 1714446096240156114081700875 + limb0: 34719833915048270984015005143, + limb1: 54435454033866233180152396532, + limb2: 1536459542785014609, + limb3: 0 }, w10: u384 { - limb0: 38731269017005066273722000104, - limb1: 46687061188021336638314544662, - limb2: 55909680489823436902225901419, - limb3: 36209200734884340494931336 + limb0: 17825647587209672630781135744, + limb1: 20795150731329532113059814271, + limb2: 2857051747604925530, + limb3: 0 }, w11: u384 { - limb0: 28906163218962369101066205465, - limb1: 3996426552051328025083887596, - limb2: 71423511951697223393864522243, - limb3: 3983920095174290478018375969 + limb0: 2612787993699766234014804552, + limb1: 54879949902241455635864863449, + limb2: 2539664739608678700, + limb3: 0 } }, E12D { w0: u384 { - limb0: 1208844972483946440464076253, - limb1: 49539823275522533703806831225, - limb2: 37142036625131082675071861419, - limb3: 2233534583251059499211845818 + limb0: 31567296097751535027752758619, + limb1: 71393963806754633232284654294, + limb2: 2344506163577130452, + limb3: 0 }, w1: u384 { - limb0: 2709471139765384524692350669, - limb1: 51404986734127291700349912843, - limb2: 7877326107987113097548609986, - limb3: 6032801121882475666291077797 + limb0: 73539282806903794781534573377, + limb1: 19514085211500998614746165107, + limb2: 233981741283562439, + limb3: 0 }, w2: u384 { - limb0: 12594176075141185062840639867, - limb1: 19768688837621341167955874286, - limb2: 15557139565884359730210255423, - limb3: 1178446398910249256042308005 + limb0: 60022243992461219595500737776, + limb1: 37973355407487907452799506130, + limb2: 3210029721261034734, + limb3: 0 }, w3: u384 { - limb0: 76331572653896131508125727095, - limb1: 22369299433362983211842619491, - limb2: 61201719083353362507073397773, - limb3: 5360257514317338463535582452 + limb0: 24827766945124928917509285505, + limb1: 17320645525576359128713258325, + limb2: 2589134611391955276, + limb3: 0 }, w4: u384 { - limb0: 69524815005607636453345545258, - limb1: 8322893292798402680385419782, - limb2: 15866292484820676911658207671, - limb3: 7845088491566442343460548864 + limb0: 55163661451109968827704963798, + limb1: 70442038921592607572767099146, + limb2: 2110359030223255791, + limb3: 0 }, w5: u384 { - limb0: 47084846956975801578151315519, - limb1: 22690769485072072668518364986, - limb2: 61362274791917094248739800769, - limb3: 3825499601196846895259654030 + limb0: 37198540331867692404467717501, + limb1: 61264391724945882747584968321, + limb2: 368400197148627197, + limb3: 0 }, w6: u384 { - limb0: 79192098202070127050894501713, - limb1: 12858315530281282962407020614, - limb2: 152011630535184295853509222, - limb3: 1178365708101780302674774963 + limb0: 76514245564531596782166884655, + limb1: 26485042422491243513069218212, + limb2: 2880572515657190032, + limb3: 0 }, w7: u384 { - limb0: 53433154744284416772496145195, - limb1: 48461457473531303327380052774, - limb2: 52772460314633695099775197187, - limb3: 3320717126284060364351073698 + limb0: 44092014008280891749403004444, + limb1: 7418075666374515929034825062, + limb2: 1209036726732908623, + limb3: 0 }, w8: u384 { - limb0: 72181842958466038926717581156, - limb1: 71126202827345065161620763080, - limb2: 38363553073314316976330918894, - limb3: 3231842054219841712809361904 + limb0: 45414886962133258236997445709, + limb1: 64140171780740211510523232875, + limb2: 943486135393459960, + limb3: 0 }, w9: u384 { - limb0: 40662292459850730559461133120, - limb1: 41022277988472599076348271216, - limb2: 10435588850344816539750254594, - limb3: 3833424428666614554460698019 + limb0: 19604420812192106397439600579, + limb1: 33281626875434610621015402373, + limb2: 3440789252697259208, + limb3: 0 }, w10: u384 { - limb0: 29336467100833054188800606347, - limb1: 40050604327007705966958118127, - limb2: 52714380846050661618150596484, - limb3: 2008924058615714816635899303 + limb0: 2460414508453459180868743728, + limb1: 46892400356906845523352513122, + limb2: 1612761438121821057, + limb3: 0 }, w11: u384 { - limb0: 5330088876267895522653773321, - limb1: 52686413486746902156051680658, - limb2: 68434811612789990251561686988, - limb3: 4370916139183852797077121624 + limb0: 1468462472619725698323685234, + limb1: 32338922246389604977521510829, + limb2: 412970243806130559, + limb3: 0 } }, E12D { w0: u384 { - limb0: 22272485629984188086595247252, - limb1: 23087355457078505818938276268, - limb2: 61422820698153748130267819576, - limb3: 6842646590418603639909487358 + limb0: 37482826507476893948608696685, + limb1: 72196223794013899568620668977, + limb2: 670621861316459472, + limb3: 0 }, w1: u384 { - limb0: 21843932962311795670731758983, - limb1: 41245190676535221354453350579, - limb2: 66674578378650985640755566724, - limb3: 6756131067390033996920729226 + limb0: 79175877474362219733417508046, + limb1: 78816768970654304468953556048, + limb2: 859481255301619545, + limb3: 0 }, w2: u384 { - limb0: 29798526404960991182391580067, - limb1: 43022745050483366017681767409, - limb2: 74024309842760129147318075980, - limb3: 6995212878176767543847799926 + limb0: 65209013621568880309278894587, + limb1: 9651060157699946187152928328, + limb2: 1237093796572529907, + limb3: 0 }, w3: u384 { - limb0: 3473209954065820265736051529, - limb1: 20127883486831649823409076291, - limb2: 15775786988313174067636107303, - limb3: 8044058471697827929141317073 + limb0: 26901014973652542106022924241, + limb1: 45374986796533874742245910615, + limb2: 1761344084179820516, + limb3: 0 }, w4: u384 { - limb0: 2884003271274197959033399404, - limb1: 74053797150490061883729659910, - limb2: 2196755038556493060338425516, - limb3: 7705111614737625271921449143 + limb0: 77149099812313722907590635316, + limb1: 19707394278353158120298812471, + limb2: 3124385401604026086, + limb3: 0 }, w5: u384 { - limb0: 11927124240975289551962885435, - limb1: 75696786973728155582675568400, - limb2: 37270323617813545696998862788, - limb3: 6461138648308467879028727496 + limb0: 22543090218668141078715018754, + limb1: 30415228899808364725204981635, + limb2: 1717961030854191512, + limb3: 0 }, w6: u384 { - limb0: 4637313386940560682187440643, - limb1: 22117920856839380857144904745, - limb2: 37683931264277023109496577019, - limb3: 1801810649163977582967211021 + limb0: 72720714970169747693478775911, + limb1: 13337702572331026210325319288, + limb2: 1111017850661780143, + limb3: 0 }, w7: u384 { - limb0: 72754125702409026078956561616, - limb1: 19193122119833547547193600661, - limb2: 55299032574790147114973514272, - limb3: 1315404573119877802339163413 + limb0: 29785756318258436034537413856, + limb1: 3228351588290914627411572904, + limb2: 1750245489282223050, + limb3: 0 }, w8: u384 { - limb0: 9027669934549753610446192596, - limb1: 71068590749859118803021883554, - limb2: 76086537430864600221919695412, - limb3: 1022860172836385471872102053 + limb0: 70847965166808254983219497021, + limb1: 23317992178066556492053400760, + limb2: 657693798441284417, + limb3: 0 }, w9: u384 { - limb0: 1821947259694415428808132178, - limb1: 18108906064464823063930023045, - limb2: 7534388185663884468526020140, - limb3: 2230984753694713188639230952 + limb0: 55552626750818903147652868360, + limb1: 69783447109619835659716447795, + limb2: 562950968710497253, + limb3: 0 }, w10: u384 { - limb0: 19709207450276942305421144907, - limb1: 6029036995722099011170329134, - limb2: 74580254367244128908519772587, - limb3: 7298255682186069715639828399 + limb0: 32628658611236040616148155839, + limb1: 18601336423678161551291899192, + limb2: 1657411422307793311, + limb3: 0 }, w11: u384 { - limb0: 21272676988130416800479939731, - limb1: 60316677800362678326222758544, - limb2: 44527218491285661893665510075, - limb3: 7746622992563822052737932541 + limb0: 24696321237119363785890965806, + limb1: 17310772374580453186558595643, + limb2: 566495155368731331, + limb3: 0 } }, E12D { w0: u384 { - limb0: 57725832656700648742840934740, - limb1: 46586297607681004437227200348, - limb2: 73667812536454613137927173802, - limb3: 1232087108173819165589891487 + limb0: 49578972969000223808589634312, + limb1: 3265442814048652830083383975, + limb2: 2861998063478710869, + limb3: 0 }, w1: u384 { - limb0: 76689174199562481543533094968, - limb1: 1613849434870149624462308590, - limb2: 65402796321855840286895850263, - limb3: 2152675586452566901035878869 + limb0: 19791556079531108035354644552, + limb1: 65067993962217943638912429524, + limb2: 425442413493949042, + limb3: 0 }, w2: u384 { - limb0: 6460625661893795382940667774, - limb1: 35761630291241695628043740995, - limb2: 56484445630520740271435991450, - limb3: 924012959921483887790934054 + limb0: 3330057501986582244172720840, + limb1: 74473468317388690738158763286, + limb2: 711032259302494782, + limb3: 0 }, w3: u384 { - limb0: 44312375901413953233591416807, - limb1: 30729243125909312949176291432, - limb2: 1105032163302730406089074342, - limb3: 2407772760958007781233023144 + limb0: 50236109720554254822620037258, + limb1: 12449916629170954028163521276, + limb2: 357624783812746091, + limb3: 0 }, w4: u384 { - limb0: 76014670075519823602365107711, - limb1: 62117724145448932614733585581, - limb2: 62915500444731213858127764541, - limb3: 32486391867578866209601912 + limb0: 59883715738540117964906981167, + limb1: 48428350240367368874627385350, + limb2: 3483633808972961879, + limb3: 0 }, w5: u384 { - limb0: 3311570612968576680145325239, - limb1: 58182340308450740639862628594, - limb2: 5824850590549680640389067849, - limb3: 3102869678292936480924992588 + limb0: 75389248765255963789474248751, + limb1: 19438165097588167484784014502, + limb2: 490652063447475854, + limb3: 0 }, w6: u384 { - limb0: 10224241423268652874241622664, - limb1: 63958296218524585667996762962, - limb2: 63490897349187648271247406478, - limb3: 1848968593019209214185380259 + limb0: 44204785967762356852637033434, + limb1: 51929269937025733359086462091, + limb2: 1951042486658774119, + limb3: 0 }, w7: u384 { - limb0: 10069539940658369623917234064, - limb1: 77696264208995517050838725052, - limb2: 66911477502593923067572934320, - limb3: 5029267871406084875211725987 + limb0: 20313727677254967589907824583, + limb1: 10702503962040185774084495777, + limb2: 948964616160901478, + limb3: 0 }, w8: u384 { - limb0: 69830646762841527253274235530, - limb1: 9782118320526771839624860331, - limb2: 13688933824858580799063946882, - limb3: 4482007103279365545875773444 + limb0: 51247011385603630487123166088, + limb1: 45312322834511173528564643456, + limb2: 1711255538755012336, + limb3: 0 }, w9: u384 { - limb0: 33801656345839292040583506574, - limb1: 34693723694360855406409254344, - limb2: 4743042230232481148032357984, - limb3: 5998258653951042599971320866 + limb0: 42628841761783637758283290407, + limb1: 58647580059242491231859789532, + limb2: 1734776079372429304, + limb3: 0 }, w10: u384 { - limb0: 58525710835287064162675700198, - limb1: 11662570565751615461830611057, - limb2: 7429906554760622046625656499, - limb3: 4387262693229744717276796412 + limb0: 21030768644531548571912048584, + limb1: 54316971317272363995470143969, + limb2: 55747938104136851, + limb3: 0 }, w11: u384 { - limb0: 64622674599297858138208154171, - limb1: 6287594723926573543799161588, - limb2: 4611997958348561356881700080, - limb3: 6755682870296211298215257507 + limb0: 34301956494785400179695827764, + limb1: 65806156875083076829005058449, + limb2: 1958198948544016706, + limb3: 0 } }, E12D { w0: u384 { - limb0: 16202325186738410706778667721, - limb1: 10994346731294716721137918473, - limb2: 57539068066487019363541564385, - limb3: 7478178065685673005346213883 + limb0: 45115406646737699903863492864, + limb1: 27482275566958458509849137180, + limb2: 69741890956195175, + limb3: 0 }, w1: u384 { - limb0: 5275416987163941860436311761, - limb1: 20919901335322085828025870917, - limb2: 15456186538249472433404271585, - limb3: 3690110418607054178978007297 + limb0: 19163333809517960897030333743, + limb1: 32368232632753917241925898806, + limb2: 1041290836584615423, + limb3: 0 }, w2: u384 { - limb0: 42062219724623646009975341563, - limb1: 46532926041319921018665810397, - limb2: 74420593184187885646546516170, - limb3: 5269187564709577657533665855 + limb0: 54090062320057509356854843612, + limb1: 36225088771650326238456869238, + limb2: 1550629596383827386, + limb3: 0 }, w3: u384 { - limb0: 34299385228185143176122893037, - limb1: 78122818914240889816151097933, - limb2: 16379284047704087232849546168, - limb3: 2500858337269984356327691077 + limb0: 55908467774627310700361878300, + limb1: 31418853052702908574351477201, + limb2: 1973114810680487579, + limb3: 0 }, w4: u384 { - limb0: 8602650371762614699687613603, - limb1: 76831293759683395831565697094, - limb2: 39447104060859577059055784547, - limb3: 2104875905789153800454040167 + limb0: 76992595719085240152478174148, + limb1: 71579505286974778849266543314, + limb2: 104590910578495401, + limb3: 0 }, w5: u384 { - limb0: 24577548018627858835799616122, - limb1: 19494400234704285910530763769, - limb2: 70859887648206034708531284906, - limb3: 7204115226766905208494929830 + limb0: 60759586145307598017960572586, + limb1: 51175078556531877976121252045, + limb2: 889648293506045000, + limb3: 0 }, w6: u384 { - limb0: 29547003737910940008301430055, - limb1: 63744833335401718923112995666, - limb2: 30024515464728067710112504183, - limb3: 7164778956343936187097024354 + limb0: 65144565023361963970600820805, + limb1: 25882278488983119451533801703, + limb2: 1941385504840233272, + limb3: 0 }, w7: u384 { - limb0: 58689260821591948689168591228, - limb1: 72856158279146504973930818006, - limb2: 56069559640682247223129887743, - limb3: 3029127860161083887338412459 + limb0: 46305084501663167375623394792, + limb1: 41634625684278885303291203879, + limb2: 2365971118238839346, + limb3: 0 }, w8: u384 { - limb0: 33405674347383559377205288992, - limb1: 5004423245910798566597653426, - limb2: 13827084762895836860543372066, - limb3: 6727230340737047085892006744 + limb0: 22424878649326630677850101335, + limb1: 74838681757099032618884646569, + limb2: 1533320524270217225, + limb3: 0 }, w9: u384 { - limb0: 71583437882214377232793471311, - limb1: 5818252571729876377954819723, - limb2: 7660497729256192676354369188, - limb3: 2843388226027370538368199325 + limb0: 46893059545398736657318162154, + limb1: 69836564072924826086665487832, + limb2: 753810633133939919, + limb3: 0 }, w10: u384 { - limb0: 30805547210750379672256052403, - limb1: 37886040239218477127741867314, - limb2: 41752867089491041329458691124, - limb3: 5348895795215433031111135311 + limb0: 51156935299499294669013763604, + limb1: 75630688673464081955604092315, + limb2: 3397328045763579987, + limb3: 0 }, w11: u384 { - limb0: 38142112682193833040039062405, - limb1: 17475636574986948384273215446, - limb2: 28434636870989392198935545338, - limb3: 4869232059954211070579917012 + limb0: 76746327370633601219314343695, + limb1: 74713269191819693742489769276, + limb2: 878133975088753422, + limb3: 0 } }, E12D { w0: u384 { - limb0: 36766274837433733653955802941, - limb1: 68903295575506877423559147151, - limb2: 74150271814086956792935421558, - limb3: 1701980267412381573206191902 + limb0: 74038383089872103909826529315, + limb1: 49719986690104843689591045401, + limb2: 3146069519265938091, + limb3: 0 }, w1: u384 { - limb0: 49807670824124930222493351431, - limb1: 7412926508317515400634080614, - limb2: 26284054506969581423772887337, - limb3: 2914833615591185699746052365 + limb0: 76014273034857433376201746933, + limb1: 30832903246090888800148779520, + limb2: 2218810991670818020, + limb3: 0 }, w2: u384 { - limb0: 7459301422973226548491248579, - limb1: 79178062018021573941805679376, - limb2: 4206448703987257505450632684, - limb3: 267730961839795287442193197 + limb0: 65963554100177731183528339087, + limb1: 56211320187518831153269381225, + limb2: 1744926654782627814, + limb3: 0 }, w3: u384 { - limb0: 19436528389915580092663071147, - limb1: 22152311948417005278061523925, - limb2: 19238992358528185028500916432, - limb3: 1972173033445550778646184319 + limb0: 5678614588517377480416852342, + limb1: 38174651263548783740162172487, + limb2: 1189969099090111530, + limb3: 0 }, w4: u384 { - limb0: 76335567218661089507719171340, - limb1: 29605950695107288945887809895, - limb2: 50004941906369307886881521539, - limb3: 1513343356243917293251329210 + limb0: 44047487489838073205242716913, + limb1: 56927967320303994598682848112, + limb2: 2345823657095032610, + limb3: 0 }, w5: u384 { - limb0: 60447634349191619316229472193, - limb1: 22803976491216949356478107724, - limb2: 3516504456035201678308279330, - limb3: 1570898273600425861658428376 + limb0: 35213432396244625066464164048, + limb1: 41123082110242630670853631881, + limb2: 522485029723468864, + limb3: 0 }, w6: u384 { - limb0: 46750487360807514568577682288, - limb1: 3051632479744870077574417676, - limb2: 25643461964163717320087691468, - limb3: 4526898855202519694429543969 + limb0: 23953321369987276689252977131, + limb1: 40732359413760555076525179898, + limb2: 3460736378337537999, + limb3: 0 }, w7: u384 { - limb0: 76001180590363604037555068892, - limb1: 29176477473400936180104729376, - limb2: 2183803887153326559706122421, - limb3: 4719066747620695135831447916 + limb0: 29876484969296925920677314102, + limb1: 75924553004312022775091155470, + limb2: 2462706459646370632, + limb3: 0 }, w8: u384 { - limb0: 3951972750685978601289063754, - limb1: 11273982491646828062324954072, - limb2: 32496273278613156425840990336, - limb3: 3316540230946023234284975263 + limb0: 49156902518616794195494749580, + limb1: 71891889308510993322484754751, + limb2: 615501011916202357, + limb3: 0 }, w9: u384 { - limb0: 72174307505726628619350264176, - limb1: 76370327755595261758380731175, - limb2: 22880265365309548838852663359, - limb3: 1828068840666650046473596921 + limb0: 15317148152681973927188368678, + limb1: 57216569531262313138511933537, + limb2: 3165448229590860014, + limb3: 0 }, w10: u384 { - limb0: 9857241051588482133296024783, - limb1: 58685374232137331597032707106, - limb2: 77855931860654576202392135153, - limb3: 5072311724814032878643915358 + limb0: 17357299727505296257226894927, + limb1: 24320025223520103541353951313, + limb2: 497780636380915500, + limb3: 0 }, w11: u384 { - limb0: 35803877454246640678711765494, - limb1: 20970546522501574734543834394, - limb2: 76459271298875894919854687510, - limb3: 4510397116027182023640820000 + limb0: 52219418996336891293027337768, + limb1: 51089700172302685297803571942, + limb2: 1585684329366419942, + limb3: 0 } }, E12D { w0: u384 { - limb0: 64145814751592156795073993443, - limb1: 24320447470294211141360473155, - limb2: 73049833779365399982394610548, - limb3: 387154540130282176878128547 + limb0: 36906735607224281508272542827, + limb1: 76775222311424392197345883747, + limb2: 1199473368067461830, + limb3: 0 }, w1: u384 { - limb0: 78330570072064650699818570569, - limb1: 47454064559397399221144197702, - limb2: 4733252815112477435022961752, - limb3: 227285994575672306274489108 + limb0: 44258193517853489366496611010, + limb1: 9640071399382815547974381889, + limb2: 869411084624247339, + limb3: 0 }, w2: u384 { - limb0: 64696705903019316877515606962, - limb1: 24065989407721338949482712792, - limb2: 66140513421498613195696131136, - limb3: 7676745661263083347213968916 + limb0: 24101847968122425308306509717, + limb1: 33981983461613647643062578866, + limb2: 1247908629944818929, + limb3: 0 }, w3: u384 { - limb0: 35797422062716093892046347310, - limb1: 28808297339635261155319134138, - limb2: 12574633490039279224920485494, - limb3: 33149954130752244115587080 + limb0: 4393453239865683244527159688, + limb1: 62714139708653986936009710217, + limb2: 2386702576332394772, + limb3: 0 }, w4: u384 { - limb0: 8270093492088622701676359417, - limb1: 76284900635050769030928858500, - limb2: 5716413477144969516477201147, - limb3: 713029638083553703530717487 + limb0: 73844974984290781346363324599, + limb1: 31264104947209076391034439837, + limb2: 2549533449055933578, + limb3: 0 }, w5: u384 { - limb0: 33636480381527336051459100792, - limb1: 8595873444929143768802546706, - limb2: 45840004252290176354149785587, - limb3: 2661415746745891183628848315 + limb0: 6691463968306695177510552725, + limb1: 29576073711335468349042212980, + limb2: 2842276483908589935, + limb3: 0 }, w6: u384 { - limb0: 74746258291470528746198684738, - limb1: 20555523000143501392948817795, - limb2: 46487679974885432169759660248, - limb3: 1167826130714387215029978367 + limb0: 32928704026970709223061645300, + limb1: 29615123019839778376582955343, + limb2: 195864635110509842, + limb3: 0 }, w7: u384 { - limb0: 58376837205430100673475655517, - limb1: 73428214648565267862994079430, - limb2: 71626384925559216651027720931, - limb3: 2245253394451927784248099163 + limb0: 38399806798630736617263356049, + limb1: 16419461070596105789256976141, + limb2: 3021134507743035030, + limb3: 0 }, w8: u384 { - limb0: 39416500405999459491961104349, - limb1: 7416408571017683826710549795, - limb2: 26576793150705114024154379651, - limb3: 5650980596170753229743284164 + limb0: 6248653111931569813035344452, + limb1: 8147611180515696083146059021, + limb2: 1553024411158699395, + limb3: 0 }, w9: u384 { - limb0: 23290586382936701105187469485, - limb1: 18729783571939223134992892038, - limb2: 1466196282967465941850734337, - limb3: 4313394765426275141419813406 + limb0: 27770471825991183642170573809, + limb1: 27966422824778107396573580694, + limb2: 3207182942750484493, + limb3: 0 }, w10: u384 { - limb0: 69262786904224704518083481724, - limb1: 46864024205169234218637723850, - limb2: 21455111987228172127649984502, - limb3: 5779417336655344595843488627 + limb0: 22009103910712607601528273334, + limb1: 25444906161699863706523307321, + limb2: 935105862367806502, + limb3: 0 }, w11: u384 { - limb0: 69811380025426603911682239058, - limb1: 65661425779670092366222563000, - limb2: 33804436015059061311122037832, - limb3: 1513001113560294181792562538 + limb0: 70251460935981749294507154283, + limb1: 64374491159913272327978862373, + limb2: 617261976490831830, + limb3: 0 } }, E12D { w0: u384 { - limb0: 43656186449852951505870640026, - limb1: 78056158921546070521662980622, - limb2: 78947795152949910117473304750, - limb3: 2814421195773665353823867156 + limb0: 52214074601899523710920624448, + limb1: 15888186130908452746921689741, + limb2: 2496308157918077703, + limb3: 0 }, w1: u384 { - limb0: 1292133628128977554312264049, - limb1: 20238272206911205806959429096, - limb2: 502901696061028226986121708, - limb3: 3413031382773409483175673698 + limb0: 147700760745961011041110060, + limb1: 48155718088638687301312409341, + limb2: 3463316126724029093, + limb3: 0 }, w2: u384 { - limb0: 54398576905131772397958667064, - limb1: 62962821808687499638012226503, - limb2: 42792954445044861346692592459, - limb3: 2017610988529761041766687681 + limb0: 61999345402414314084740470318, + limb1: 64519622710325943849861597497, + limb2: 2084528619529053202, + limb3: 0 }, w3: u384 { - limb0: 24840569057889514918145534910, - limb1: 66103856990949125576315586386, - limb2: 28246919691533648720932579952, - limb3: 19526396246267247438729589 + limb0: 30164015920789920654433935175, + limb1: 76506953988190958988997660826, + limb2: 3032125328384791294, + limb3: 0 }, w4: u384 { - limb0: 64773802104003548777306361237, - limb1: 72647692646459861545074386556, - limb2: 22295578196995327307611759097, - limb3: 5309867801401152166612576057 + limb0: 66187836183316392367690361795, + limb1: 46268526216148606288434230794, + limb2: 2321468515821826162, + limb3: 0 }, w5: u384 { - limb0: 76250645462472679647879810982, - limb1: 69479810962272678655154860869, - limb2: 28269091039404753983483157352, - limb3: 771549015230169261963836578 + limb0: 35075518314730933905126158719, + limb1: 58795933040117473253008864608, + limb2: 422713746476854938, + limb3: 0 }, w6: u384 { - limb0: 45740683771427196145935242280, - limb1: 5909245404738874237436320462, - limb2: 34912107914347121672595614268, - limb3: 3621270844255995170254999421 + limb0: 67463912791620315182138510969, + limb1: 3874658131734432044700081716, + limb2: 2387851108988754150, + limb3: 0 }, w7: u384 { - limb0: 39966792531343504169236727199, - limb1: 21101274375256982569749304472, - limb2: 71576124870270942139200891515, - limb3: 2980420084610295368717726855 + limb0: 12688057726502750553147391152, + limb1: 16447988795146735024770012751, + limb2: 3235033977140542793, + limb3: 0 }, w8: u384 { - limb0: 11089494797775318485061208176, - limb1: 77602603466179977551750261881, - limb2: 16490365992470226804830224359, - limb3: 556336746056289037013229690 + limb0: 57581524262598583744154553922, + limb1: 23421541865483511250641887313, + limb2: 1443997761712872215, + limb3: 0 }, w9: u384 { - limb0: 4439313502534939823505623582, - limb1: 61084024518485350555465699006, - limb2: 53416223983887037224099869924, - limb3: 1533293253369329832823008149 + limb0: 37475568684960232870199650117, + limb1: 55194773944432357951005733318, + limb2: 2199804604539808626, + limb3: 0 }, w10: u384 { - limb0: 60132246907912494069834262311, - limb1: 18908133005775783674291028358, - limb2: 39247356730707633275972799113, - limb3: 3874514572016564650884234849 + limb0: 21296270184133300908786833497, + limb1: 47956141220958994044757272075, + limb2: 879336016070210632, + limb3: 0 }, w11: u384 { - limb0: 61124962163845011461817181567, - limb1: 68489152717936983914647726820, - limb2: 12465805858010969739025251308, - limb3: 5958407614524979214283023969 + limb0: 30227458252601247784398469802, + limb1: 71450938861288617163131169723, + limb2: 2552196868391201102, + limb3: 0 } }, E12D { w0: u384 { - limb0: 1212388812738209234652204538, - limb1: 13311007936818952462532605522, - limb2: 13592725583286171445026370711, - limb3: 5396266057741311950510072210 + limb0: 54656967918934716817049423848, + limb1: 65066766977255927873575818275, + limb2: 2626109933315688272, + limb3: 0 }, w1: u384 { - limb0: 55949444259845701115143941795, - limb1: 64718070975830372182185856974, - limb2: 1900661302870052295598681727, - limb3: 5678562343147104398163380553 + limb0: 29604492141464982635970824352, + limb1: 34566986903137883949858913949, + limb2: 644303111582562041, + limb3: 0 }, w2: u384 { - limb0: 61321989233060115897153326124, - limb1: 61460388797854519999542566398, - limb2: 39321762410395124855013823427, - limb3: 6641560332842004886322001091 + limb0: 71691581393079275096439513072, + limb1: 67475706900763957192103427173, + limb2: 1827940317266715933, + limb3: 0 }, w3: u384 { - limb0: 31311954083217794384990920988, - limb1: 22868122353424610637149847517, - limb2: 10132455299213142037030061642, - limb3: 6243261469129904039947023810 + limb0: 64896388563127204712227264490, + limb1: 78379474655466602809281487557, + limb2: 1866032525112139766, + limb3: 0 }, w4: u384 { - limb0: 4590684639141382372461277928, - limb1: 22323324346388621403531328326, - limb2: 518839792099256644703744447, - limb3: 1925267790665257338199106302 + limb0: 70303295248362921559074607057, + limb1: 25442611594453877846388078343, + limb2: 113863501302368823, + limb3: 0 }, w5: u384 { - limb0: 49923411401859445670508037937, - limb1: 54236459717284025119095362095, - limb2: 14488561270504559489982134725, - limb3: 2069828734645844297586657250 + limb0: 48555888115906504902819531390, + limb1: 5977248803226109112076232145, + limb2: 435167499811112724, + limb3: 0 }, w6: u384 { - limb0: 72100644271583501692972215007, - limb1: 76121084647491680239123127008, - limb2: 40226104232507589844699481773, - limb3: 7648218707767393369665457322 + limb0: 49569090819348290237945832584, + limb1: 7032520993627809978536831783, + limb2: 3078850680267303772, + limb3: 0 }, w7: u384 { - limb0: 75703723293894702209372376333, - limb1: 53195884127321780997166215860, - limb2: 32769374839624452833808655819, - limb3: 1521273807530526524153116831 + limb0: 74831028435753444790345840975, + limb1: 26836161152533419966912415782, + limb2: 2154094271966652285, + limb3: 0 }, w8: u384 { - limb0: 61350816357350677662736787852, - limb1: 69374847572540256655522097717, - limb2: 65668518533501162370436446802, - limb3: 1993200600730108539094324257 + limb0: 34168723938459372955962474503, + limb1: 51418567652580037485599055245, + limb2: 2777657219139179144, + limb3: 0 }, w9: u384 { - limb0: 7913890909630599686977928792, - limb1: 60904947616454316572258142816, - limb2: 61451009420868322528999503823, - limb3: 5015774893950747009675045463 + limb0: 19546436486887565925961079908, + limb1: 52920505972223084201612412271, + limb2: 1280234927589496307, + limb3: 0 }, w10: u384 { - limb0: 66951137101712053062845545735, - limb1: 2601891242760304416338120064, - limb2: 37715829712099841890868171456, - limb3: 4620590233140545500763934866 + limb0: 56860550781449194808343569999, + limb1: 44875017196490249282871866290, + limb2: 2658040861481748270, + limb3: 0 }, w11: u384 { - limb0: 60320994254674562917550517841, - limb1: 37595377406870476567963246385, - limb2: 26463545523267205385236213269, - limb3: 7388485316924333025514860150 + limb0: 11145028477845808755955083527, + limb1: 66105763065525509913248710917, + limb2: 239975325592414470, + limb3: 0 } }, E12D { w0: u384 { - limb0: 48679238848602024848854550824, - limb1: 52373786442946267025989541630, - limb2: 780951524609026609262270612, - limb3: 856284295205844512663130304 + limb0: 57554960841735346406324969068, + limb1: 55783535774349587434253222203, + limb2: 3475716370135311325, + limb3: 0 }, w1: u384 { - limb0: 70898238719830794978660301655, - limb1: 46010828274634469087577500787, - limb2: 30236004637562407990939914823, - limb3: 3570927625225884676403208865 + limb0: 15964804758642913671137910040, + limb1: 66312437560513987126266994598, + limb2: 1752930698163276692, + limb3: 0 }, w2: u384 { - limb0: 43521593881576970029779484417, - limb1: 24716018298938278684109344693, - limb2: 71216031321889074198522547835, - limb3: 6493970479527952386828058727 + limb0: 20712376221280466917920735529, + limb1: 73828901817006172550618195013, + limb2: 711906182282479241, + limb3: 0 }, w3: u384 { - limb0: 40420920179692587309967756828, - limb1: 5393619948234756473213262613, - limb2: 41508771377878751540424801379, - limb3: 940402853264330992771349539 + limb0: 58871294642512059296096682222, + limb1: 33122602443451237301822807656, + limb2: 2535660166662702165, + limb3: 0 }, w4: u384 { - limb0: 7523537274144401501535280451, - limb1: 32845184260666261029461778791, - limb2: 22154210235229227119852636278, - limb3: 3302136242987358000385278582 + limb0: 17543755448492020704074787753, + limb1: 66558123630477626205718480115, + limb2: 1095206654890052926, + limb3: 0 }, w5: u384 { - limb0: 26942034689126504155033944758, - limb1: 37537791269896172260215956567, - limb2: 37512377582482419392860239333, - limb3: 4720699641563106114917760006 + limb0: 20865816551745281221759328224, + limb1: 68567652817902961297931695973, + limb2: 2217729709615530045, + limb3: 0 }, w6: u384 { - limb0: 18363338072840425004000566076, - limb1: 45368777270735591807895784007, - limb2: 22716265825328948919434110658, - limb3: 2360534359149135290852460279 + limb0: 12140383661640659217202315714, + limb1: 11410201212991410978248462005, + limb2: 415085855282076730, + limb3: 0 }, w7: u384 { - limb0: 54569077651332184742048606255, - limb1: 18233620611553281700609941786, - limb2: 66903075656365392568404475582, - limb3: 1562659495646824832548635146 + limb0: 45097659027324578320225922281, + limb1: 49243646429675132855310873999, + limb2: 1085383923358513964, + limb3: 0 }, w8: u384 { - limb0: 1189538904617104571102827178, - limb1: 14597035158772196164605349780, - limb2: 72682151553826374623892329676, - limb3: 45313980171837331007601776 + limb0: 35225284294350686417691656803, + limb1: 46678070780162149894533647798, + limb2: 565418327960243569, + limb3: 0 }, w9: u384 { - limb0: 58305044583354712376829914655, - limb1: 3083625363603146938294973414, - limb2: 46561316868801707513085795206, - limb3: 373123233575915578536221080 + limb0: 38410947988165218442743710416, + limb1: 28148040369299366428105884411, + limb2: 2246006017337378766, + limb3: 0 }, w10: u384 { - limb0: 3883723136848503112026681544, - limb1: 15294584374647937767214288059, - limb2: 26957608428273328081642702917, - limb3: 7759967935016690998322831037 + limb0: 62413079874085096708065565232, + limb1: 49474555893980920204748093813, + limb2: 1013818676594709676, + limb3: 0 }, w11: u384 { - limb0: 30992501086306661906143123569, - limb1: 70818819790415458585166862833, - limb2: 47542927721564695357029257420, - limb3: 1967285673704307739092487624 + limb0: 69288271935100971061364191299, + limb1: 78542979916298419970057138834, + limb2: 3398482044508922908, + limb3: 0 } }, E12D { w0: u384 { - limb0: 14866985407058312972980323007, - limb1: 41785982416281510742185344575, - limb2: 65604375627792360647732733770, - limb3: 5503946091884874315830678611 + limb0: 66522470068946061001030505786, + limb1: 36454868509348863720107439683, + limb2: 1409858577625376708, + limb3: 0 }, w1: u384 { - limb0: 18587391895924136419569841739, - limb1: 43874222252018992503717388895, - limb2: 57081888136650971987709306802, - limb3: 41531041701337925794714974 + limb0: 27996463034123724179774884919, + limb1: 28034030364154566418937207111, + limb2: 1945594834551906948, + limb3: 0 }, w2: u384 { - limb0: 66988767910393872226097927461, - limb1: 12036699662720653252173536903, - limb2: 43638983260579321809670340758, - limb3: 3578124761001619557833674940 + limb0: 9682850595476306318800884148, + limb1: 52004798040224738388506727693, + limb2: 782517920223341268, + limb3: 0 }, w3: u384 { - limb0: 65383367098532876627926253670, - limb1: 69510803141430785599054756786, - limb2: 76288933884912571234186490630, - limb3: 1952669406300151914631452392 + limb0: 56655748737864934930171714940, + limb1: 68332566836918079756870758154, + limb2: 3425392841505998948, + limb3: 0 }, w4: u384 { - limb0: 25008624351092233646743668909, - limb1: 27427066028716032383670780813, - limb2: 74958157677079102979416977702, - limb3: 4415329366437500624332311750 + limb0: 20533426386323085770602653662, + limb1: 79163726869124201284626431261, + limb2: 3063346461278716446, + limb3: 0 }, w5: u384 { - limb0: 24122281657832564947579914318, - limb1: 64672090228320049004387251980, - limb2: 63756786022864102142685087021, - limb3: 3477885955532444481055237367 + limb0: 4571335861078754540936574343, + limb1: 22430551532441988714447575076, + limb2: 2646365759971603057, + limb3: 0 }, w6: u384 { - limb0: 66389772213249267747307907903, - limb1: 51670607470974776164857633624, - limb2: 35361738765213728960770302411, - limb3: 4255258277863294947757022259 + limb0: 1731248674363193991135177744, + limb1: 48345198769067945177722463908, + limb2: 2016788012647344565, + limb3: 0 }, w7: u384 { - limb0: 62265506543717001223524154568, - limb1: 46282537324724162887862108876, - limb2: 55745780899641334466380916532, - limb3: 7045421197023364630075715085 + limb0: 50618685849743466034066206503, + limb1: 3082402086128631851086568502, + limb2: 908515210338181319, + limb3: 0 }, w8: u384 { - limb0: 23490597898996970383905476358, - limb1: 24971619522424255514223765742, - limb2: 34548929419783847940058959519, - limb3: 7509564105015468668441454587 + limb0: 23703958965107260958900706503, + limb1: 9199638622105088289936893833, + limb2: 3029922088586063509, + limb3: 0 }, w9: u384 { - limb0: 31821462123858865598450000393, - limb1: 67680480968615351680116910730, - limb2: 36909680612031420766492629576, - limb3: 481493971649895864448479452 + limb0: 18226143687052925835309884412, + limb1: 46873087645795693190765395171, + limb2: 2449423132787296045, + limb3: 0 }, w10: u384 { - limb0: 60624690301501977221527687153, - limb1: 17649383300979540259133719929, - limb2: 29852286734159654706796486111, - limb3: 2688568618270560775399469394 + limb0: 79226738972515818490230841480, + limb1: 65431751634809063189331051277, + limb2: 2163484868838181512, + limb3: 0 }, w11: u384 { - limb0: 76045475614875890168965911948, - limb1: 22763056147081788915982584489, - limb2: 44330462409669054923500805557, - limb3: 5465076933149731422157635394 + limb0: 42676793178222632127011128699, + limb1: 62041906152895340647079908783, + limb2: 3232300642939297919, + limb3: 0 } }, E12D { w0: u384 { - limb0: 34764144734118468546690467644, - limb1: 66965639027661045692741563376, - limb2: 72597985806672736000911036690, - limb3: 4048836275823366831103017643 + limb0: 18083178191960395148523684212, + limb1: 52401257438415049620744600707, + limb2: 209191867858387884, + limb3: 0 }, w1: u384 { - limb0: 35038420503366373639458940685, - limb1: 50841675516236546865849055866, - limb2: 72887735735060213769299346875, - limb3: 7438484832308595553353701024 + limb0: 74647937579397884395873676743, + limb1: 74427001968110229154454597296, + limb2: 1004724317296089875, + limb3: 0 }, w2: u384 { - limb0: 39606807096391174088048612693, - limb1: 28350611274438456281247214828, - limb2: 74445163926085063560518345214, - limb3: 7311521431756356291299846975 + limb0: 59654372970077331533818240319, + limb1: 66222056191217046045607617636, + limb2: 349086466744137168, + limb3: 0 }, w3: u384 { - limb0: 16696804989559804365872713293, - limb1: 27112463587209599374377180034, - limb2: 41120336820022380432407749954, - limb3: 7432212445239452953972278353 + limb0: 42731231118769305449294365910, + limb1: 6290083678482025544506797624, + limb2: 2037120718718433672, + limb3: 0 }, w4: u384 { - limb0: 52591478875172739302420865619, - limb1: 27586585864714337896292570943, - limb2: 6398797226010240233961850903, - limb3: 1304666110496358999983498978 + limb0: 65236455569590275665738034634, + limb1: 58965220285695631767273952922, + limb2: 1339311185788674044, + limb3: 0 }, w5: u384 { - limb0: 68216279974375094094746251152, - limb1: 23757502873211497273373948511, - limb2: 51548804449615599277790705578, - limb3: 7089433184587526761610049641 + limb0: 52520998274643621004687035893, + limb1: 39612062111622598209776559285, + limb2: 1738383310407164059, + limb3: 0 }, w6: u384 { - limb0: 46680207871173575548825787609, - limb1: 57441645444739366297983604161, - limb2: 76987108638380884422831003449, - limb3: 5673083702119381860899317351 + limb0: 38063028664312118209919756521, + limb1: 69830557524065280415058033978, + limb2: 2546658134935943605, + limb3: 0 }, w7: u384 { - limb0: 9086489538250560452315495241, - limb1: 46836093390441523743818103961, - limb2: 42114450615863576338639911315, - limb3: 7389421781226724806071190818 + limb0: 77486444985788050191549017963, + limb1: 67648782315299791065069769912, + limb2: 2112424433552399988, + limb3: 0 }, w8: u384 { - limb0: 15324504017580404278509666483, - limb1: 25855795391873788123833821705, - limb2: 1550114935573976677248992083, - limb3: 2400560704679766441543656003 + limb0: 20747806669209541934763197247, + limb1: 58291595043258347375132689957, + limb2: 1752984141911262489, + limb3: 0 }, w9: u384 { - limb0: 11042038235948789489205900771, - limb1: 58241702482894058500440582506, - limb2: 26634811995479610255816948408, - limb3: 5081364165516706139367726987 + limb0: 9146985685498826849486752169, + limb1: 77551958381501369565067612907, + limb2: 1865199148636612253, + limb3: 0 }, w10: u384 { - limb0: 49407670092516156997638978460, - limb1: 44162689874140321595137165069, - limb2: 29127906516835026132502014121, - limb3: 3045434300378124248786214893 + limb0: 12303648621231138648705355885, + limb1: 75208437586205808839622533414, + limb2: 1333553651182638965, + limb3: 0 }, w11: u384 { - limb0: 39512175674239918860550506833, - limb1: 30822946905404782755928920648, - limb2: 31928966853236461651580009236, - limb3: 315805691692065657838487589 + limb0: 43057548885943568626610345690, + limb1: 77932723328821519890888655364, + limb2: 1218980697295255533, + limb3: 0 } }, E12D { w0: u384 { - limb0: 22785005704484127777279411490, - limb1: 8748287312271472416895851907, - limb2: 24734988219177074098695968160, - limb3: 7619598899211658912662438716 + limb0: 76856900689503036685691824725, + limb1: 33060843561014633182598997412, + limb2: 3142493007268638999, + limb3: 0 }, w1: u384 { - limb0: 70228636839822186477982667259, - limb1: 76926055595273887158726789447, - limb2: 9858375620726110944509326151, - limb3: 3071361100888698077927751948 + limb0: 19246555351292791778938574744, + limb1: 7943229833551406058926652307, + limb2: 2374407518549218591, + limb3: 0 }, w2: u384 { - limb0: 77445144997545492319696567749, - limb1: 3995139915855840352694588991, - limb2: 30533892804607153521429709104, - limb3: 7768335987724172453939193454 + limb0: 29094797692738576293476194030, + limb1: 35746132139236457171991877887, + limb2: 1941811620203972202, + limb3: 0 }, w3: u384 { - limb0: 39134792997341949510928253718, - limb1: 4350779899905138300984088670, - limb2: 12553995094047513471458589432, - limb3: 8005382696498822004332417691 + limb0: 9492838061101109373581200281, + limb1: 66517072807795007630598914089, + limb2: 244595500837140823, + limb3: 0 }, w4: u384 { - limb0: 68782320492223048160850969783, - limb1: 43500044392725250968843673531, - limb2: 23833953055364337666638746617, - limb3: 7763518261760993481965659924 + limb0: 73938325040357021719449649227, + limb1: 76054754576163916101112340944, + limb2: 3025060965565013992, + limb3: 0 }, w5: u384 { - limb0: 44842162500470726659970844554, - limb1: 35222267444594611424054617932, - limb2: 2163811495312486908802475120, - limb3: 456353566748989567769149570 + limb0: 37781653131669667154736991254, + limb1: 35432732971600476262222070451, + limb2: 3100501750563160240, + limb3: 0 }, w6: u384 { - limb0: 58684794311138906053785758645, - limb1: 46607462750756136152670614864, - limb2: 63963988598930439748019043585, - limb3: 5652750940308297189730596551 + limb0: 3815084256007049319981502237, + limb1: 37976100445300685656002618883, + limb2: 2967731527340256182, + limb3: 0 }, w7: u384 { - limb0: 6028024683801816107589033933, - limb1: 74834682972486054716087324294, - limb2: 14966713017428421389843143912, - limb3: 4757928364244002577396339027 + limb0: 15963616753799179551671043173, + limb1: 73585657230819262997180446010, + limb2: 3044935972010255526, + limb3: 0 }, w8: u384 { - limb0: 50491767981697985812036634714, - limb1: 78416522288594750376140527544, - limb2: 6777753761865254800200235615, - limb3: 3509823404156904487416489418 + limb0: 59810360654717339136724797085, + limb1: 19233291694446874431765625842, + limb2: 3479906350224826022, + limb3: 0 }, w9: u384 { - limb0: 37502405075553917576361657525, - limb1: 7185810975145039429550045924, - limb2: 19502977184361327769003532985, - limb3: 2683909007794923521176463635 + limb0: 49254534524537180175405492223, + limb1: 78337608809176119354669747017, + limb2: 2576014988084753621, + limb3: 0 }, w10: u384 { - limb0: 2533367156105665643558211451, - limb1: 35332699546015564263149433517, - limb2: 75768769944326304191107475356, - limb3: 4898461961235545823976565576 + limb0: 77570534589396359213226900348, + limb1: 26239246211470683618442416877, + limb2: 2026080119070855608, + limb3: 0 }, w11: u384 { - limb0: 60445928642228413169097426297, - limb1: 59992806736564643023897235586, - limb2: 45678384795040578544026288226, - limb3: 5761911899221943962539091716 + limb0: 6086375945019156409181056676, + limb1: 53198414363757877720366446859, + limb2: 3080849966704868406, + limb3: 0 } }, E12D { w0: u384 { - limb0: 8392511630459441989467934016, - limb1: 18034165821355528899801529223, - limb2: 59582746615485661688741549166, - limb3: 904919812496253151580644284 + limb0: 5407364719022437960051643491, + limb1: 68834243297035727857374332787, + limb2: 1986134675965611880, + limb3: 0 }, w1: u384 { - limb0: 66666578400341119668407409104, - limb1: 76373352180231461871099590261, - limb2: 30924824723331233738617771447, - limb3: 5120378792737492594802181158 + limb0: 75495468366919587389218672436, + limb1: 32817229571894746482030577951, + limb2: 6896561928409880, + limb3: 0 }, w2: u384 { - limb0: 21519584736334827140243431129, - limb1: 69693833107592920987472463329, - limb2: 68963371942560225693899984269, - limb3: 4587209588459026531930669813 + limb0: 26755914300092937739065876531, + limb1: 19644009336830887511533210968, + limb2: 2310874844929795936, + limb3: 0 }, w3: u384 { - limb0: 76380889755334217818772103967, - limb1: 69204487972577329500181750432, - limb2: 47998118768663999058462587276, - limb3: 6695154309757576838744531418 + limb0: 14502413978836886619849664566, + limb1: 14992202877190184779159677737, + limb2: 1379118489646079101, + limb3: 0 }, w4: u384 { - limb0: 43504440337112840718148710858, - limb1: 67532538453652921971286606189, - limb2: 28480791505663766299012744306, - limb3: 3859304748461944394605256977 + limb0: 65458094873519974989499516958, + limb1: 34482369587093555621471490806, + limb2: 1522544666915001134, + limb3: 0 }, w5: u384 { - limb0: 6993317874561392982268309764, - limb1: 45099053669706322039249272669, - limb2: 55965115907080747089610318814, - limb3: 1073861778975935783211833088 + limb0: 63594237744011204388707618080, + limb1: 31764885460818009498103901163, + limb2: 409113465591006553, + limb3: 0 }, w6: u384 { - limb0: 42709326469169776068810509086, - limb1: 8468933209652513444649535827, - limb2: 75768057906898197788859944251, - limb3: 4481400693148258899439387795 + limb0: 59173294204606585974212562978, + limb1: 13166002683580457964708723149, + limb2: 2162421085935216933, + limb3: 0 }, w7: u384 { - limb0: 27339563517113712731490449165, - limb1: 53300322990787871833859309810, - limb2: 68804906317137964103277310574, - limb3: 7689723372122997940427515827 + limb0: 15082868833116302065169629242, + limb1: 4256354818712676012840402829, + limb2: 1099836496657625285, + limb3: 0 }, w8: u384 { - limb0: 68476940878980797920824133406, - limb1: 29641952007045557732997746151, - limb2: 11121911711851236999940914317, - limb3: 736464725842967300258981226 + limb0: 48879611074610213304099451225, + limb1: 42872242774143942922049192579, + limb2: 965841358321511509, + limb3: 0 }, w9: u384 { - limb0: 51003915985697252875177974135, - limb1: 47094199037670572856246809608, - limb2: 51035971603167443056159673364, - limb3: 7513348360936080740366384361 + limb0: 11569048571006358495307835798, + limb1: 40696045853142910329254272171, + limb2: 1697507066103608696, + limb3: 0 }, w10: u384 { - limb0: 45785315169362222691893411330, - limb1: 74388461430982541234559197261, - limb2: 19099792478252444513827186323, - limb3: 8027087853652580493393941041 + limb0: 77109086067436367331660937977, + limb1: 24942032224176955167802859953, + limb2: 1059259266210768751, + limb3: 0 }, w11: u384 { - limb0: 15064782943332327623583017238, - limb1: 37881342521653728203066632589, - limb2: 4926379275958068264146350387, - limb3: 5365428402998666583857324858 + limb0: 68620275165144478999560094892, + limb1: 40067483193204576711718501276, + limb2: 2529198858365937931, + limb3: 0 } }, E12D { w0: u384 { - limb0: 15764121788175673766742726104, - limb1: 76650272339794495997121253570, - limb2: 49725216237187850217489284272, - limb3: 7933263981628421805261336513 + limb0: 70097302338902665978562098861, + limb1: 68205533469278433508824705784, + limb2: 1550927622206488810, + limb3: 0 }, w1: u384 { - limb0: 37404356471970749217608794057, - limb1: 52348804847809749560806507609, - limb2: 37620762533085524121330492230, - limb3: 7492476976592929133802956681 + limb0: 42616338744740776668289393619, + limb1: 58878235607714130571561467869, + limb2: 2186194617656786282, + limb3: 0 }, w2: u384 { - limb0: 38179854987510744195828759535, - limb1: 7151020430182196048596302695, - limb2: 35381630034584795138054028803, - limb3: 3139088338878479395600422064 + limb0: 40016348015741658943566948118, + limb1: 18240424166224330328389443671, + limb2: 3306363225547800334, + limb3: 0 }, w3: u384 { - limb0: 37879268053780968717302567483, - limb1: 38625669417041405575442790495, - limb2: 55936848747152116807401685132, - limb3: 7350245861410752599718079212 + limb0: 47749193430859965503752117232, + limb1: 24777122356018008750066210144, + limb2: 1542227587878240123, + limb3: 0 }, w4: u384 { - limb0: 46502019272269373819544089987, - limb1: 75117119718163284881919744087, - limb2: 29167962632959248102806955395, - limb3: 5032901204727879427650494933 + limb0: 233811677822195995061082989, + limb1: 41664267356323616294927101599, + limb2: 2911314817400373772, + limb3: 0 }, w5: u384 { - limb0: 41851858269920210884314125958, - limb1: 78671384224912562828576618689, - limb2: 7821892016886272710777275114, - limb3: 7417515172662185461075793415 + limb0: 51368371054826753842693373734, + limb1: 9017912406556340508892120484, + limb2: 3153622740688840006, + limb3: 0 }, w6: u384 { - limb0: 72863877507301246864746997662, - limb1: 1764290527351352683647481645, - limb2: 35911932834396801921699136137, - limb3: 5654477658237129102702684454 + limb0: 29587349685066073715314916776, + limb1: 73939116991275282243418915614, + limb2: 1380521045429893614, + limb3: 0 }, w7: u384 { - limb0: 16995445476330903430203699211, - limb1: 68268024395076521950242746116, - limb2: 41809176143738560658349301254, - limb3: 5529321276596589839541464815 + limb0: 27558185938530722262932882869, + limb1: 73790608793427562726766160351, + limb2: 488716382773076905, + limb3: 0 }, w8: u384 { - limb0: 40801915682916041126492804539, - limb1: 40280624845913537656349659426, - limb2: 52027607210852510758789731520, - limb3: 3752316418001289114685654591 + limb0: 42513941360500228648921430627, + limb1: 63804577592455948913346953731, + limb2: 2757725056258984557, + limb3: 0 }, w9: u384 { - limb0: 42993374600679952627807692356, - limb1: 68583434853050496454196793511, - limb2: 70885491534518302963389784422, - limb3: 2293322955629370500534633582 + limb0: 44963997024232054465954392327, + limb1: 74328306696419925203053366032, + limb2: 195885997260385632, + limb3: 0 }, w10: u384 { - limb0: 5252297226815490752937378895, - limb1: 52240544560253358785058513178, - limb2: 62970650275970395606790603781, - limb3: 7038424179009824543290248322 + limb0: 51423136230319437162892124541, + limb1: 76935168793469622755687397304, + limb2: 1988721998299855565, + limb3: 0 }, w11: u384 { - limb0: 54292765787399805022301767212, - limb1: 78564626528279320828208395458, - limb2: 10289644401871334540324957298, - limb3: 913188667751092405427565272 + limb0: 64930185958456500743891002066, + limb1: 79131427616080151624562800783, + limb2: 1857366752203715488, + limb3: 0 } }, E12D { w0: u384 { - limb0: 14530611259391394696111599693, - limb1: 54097566364484876393157906081, - limb2: 8376455271753971171176415324, - limb3: 4954184436230738607690669942 + limb0: 70702967717424202798861112060, + limb1: 25203811161729649186305425250, + limb2: 2859480942600353517, + limb3: 0 }, w1: u384 { - limb0: 52039123821810570408162717538, - limb1: 31112036743298996777624456869, - limb2: 110072966043132417514355448, - limb3: 4693344732935717539841661280 + limb0: 66179016624143988582291827587, + limb1: 12833745245442509428028428997, + limb2: 492324948946605630, + limb3: 0 }, w2: u384 { - limb0: 50482155833549850697751728481, - limb1: 5956729154048307163279649880, - limb2: 73175643248100776414217127694, - limb3: 1370632885601004982207107537 + limb0: 19666118631243084135949728545, + limb1: 56733770509802496952985891733, + limb2: 2750975562549885083, + limb3: 0 }, w3: u384 { - limb0: 14171793024414680835769576022, - limb1: 79022939047477691185061234398, - limb2: 47558792026310941708159578048, - limb3: 6820965020507982874994957698 + limb0: 9988748812516911895043052846, + limb1: 40852595548480127656037777474, + limb2: 3035812673518145885, + limb3: 0 }, w4: u384 { - limb0: 20647848828760565867213605138, - limb1: 2800259491016855798901492274, - limb2: 38917443476397626128104704570, - limb3: 3837077508027058380672032931 + limb0: 76816839080746837317551133774, + limb1: 70355459149093473806865556048, + limb2: 2902421614812695493, + limb3: 0 }, w5: u384 { - limb0: 65610777137678061230080317755, - limb1: 5437263230946638295418440125, - limb2: 13431936630688389111464451699, - limb3: 5606579515196553877560188401 + limb0: 41462753873799946156017413085, + limb1: 60924277757993456340898273398, + limb2: 355308621153988427, + limb3: 0 }, w6: u384 { - limb0: 6628385535562398288733579607, - limb1: 44886618479900628727489047137, - limb2: 10457777591321155147144378598, - limb3: 415951300600556348686167485 + limb0: 48088762493700406634236487668, + limb1: 78525106037294244364492167894, + limb2: 1812269206297410216, + limb3: 0 }, w7: u384 { - limb0: 77045338508716981319507296004, - limb1: 32358158655527916504723327928, - limb2: 46599169098817498945537572044, - limb3: 1024730284349301774575220147 + limb0: 50507138688647007932412271510, + limb1: 75243532908888291438139051665, + limb2: 377680926491961576, + limb3: 0 }, w8: u384 { - limb0: 64016605413809185148363358681, - limb1: 56968925748588050556065982004, - limb2: 15929293906680125653699528517, - limb3: 4733517968797417126996921319 + limb0: 33715695891078607471316471544, + limb1: 16202281412025507182304862407, + limb2: 3374052558437681499, + limb3: 0 }, w9: u384 { - limb0: 48549376176028529265983779110, - limb1: 697098319283875393287901613, - limb2: 21801809498387253313752457031, - limb3: 838804027544897192725062084 + limb0: 26383816174824036247542443035, + limb1: 68064395619530262963768209245, + limb2: 1471234189078994035, + limb3: 0 }, w10: u384 { - limb0: 10710221129036580380470066858, - limb1: 23717032659852784380220196056, - limb2: 28707024940651686241248251507, - limb3: 1674683015308386311516650516 + limb0: 24459523766476448659757151551, + limb1: 33111935543826189056021758284, + limb2: 2016097546557994101, + limb3: 0 }, w11: u384 { - limb0: 52382406995577660811276544981, - limb1: 7153080328679681202580178043, - limb2: 30001817851619512731711601811, - limb3: 6937824028116277011472601719 + limb0: 18110747773959791977557317159, + limb1: 48231930514396244853836060830, + limb2: 2228075274703158384, + limb3: 0 } }, E12D { w0: u384 { - limb0: 74577846593608325813977980909, - limb1: 17677441660744337791344558691, - limb2: 71401047452586882483998215311, - limb3: 4995157598305025289628159690 + limb0: 7397766212407204443990930948, + limb1: 6062212389684524101962301113, + limb2: 1790075984676054516, + limb3: 0 }, w1: u384 { - limb0: 43721055623936366206380446718, - limb1: 10704098381112974105529465977, - limb2: 12561749286296879071708900702, - limb3: 3994154478800516064448690441 + limb0: 52250231688867735452203292556, + limb1: 4685933276066462553552207074, + limb2: 2020839272183120519, + limb3: 0 }, w2: u384 { - limb0: 39989955616876189293760773409, - limb1: 77927968519221988713006679020, - limb2: 1784054026272396176298517375, - limb3: 2889722048039526532347222802 + limb0: 37085136790169456892845727960, + limb1: 56786270985131731726130949050, + limb2: 478048121305891317, + limb3: 0 }, w3: u384 { - limb0: 4113411939395198605871062714, - limb1: 13393221079644512575388788570, - limb2: 41498288673304661905731038188, - limb3: 1806596703971791705134805825 + limb0: 29804693541592150605519659719, + limb1: 43218515336637065872017007352, + limb2: 1765342775170427745, + limb3: 0 }, w4: u384 { - limb0: 36969980655197382180726429355, - limb1: 2872090666855217711007519837, - limb2: 31723396324746805326877955437, - limb3: 1068434758376320341688634964 + limb0: 60267102956567058888135192214, + limb1: 4542115262576050368040764413, + limb2: 1759401876880928604, + limb3: 0 }, w5: u384 { - limb0: 8209715889432439642860358549, - limb1: 15800820868933981184460097209, - limb2: 41694752895023144982778414518, - limb3: 3864529302941184725200598627 + limb0: 59813740589644216211377892962, + limb1: 6422186619407907447151688822, + limb2: 258008473369158861, + limb3: 0 }, w6: u384 { - limb0: 66862648871778687929875114938, - limb1: 69342130039986257410289779906, - limb2: 62337276326900695761496288464, - limb3: 8017295163035814469447871900 + limb0: 17906256748200332096659891912, + limb1: 63984093161034019659680218735, + limb2: 1696610338279708043, + limb3: 0 }, w7: u384 { - limb0: 57467153750505537020648373599, - limb1: 47223619386453898068887354642, - limb2: 26768000096326151959483772839, - limb3: 4967200606195208652481583915 + limb0: 73865329812555412409994743618, + limb1: 16908008157106745349014643499, + limb2: 3128874680218550569, + limb3: 0 }, w8: u384 { - limb0: 58212398841594788980803705586, - limb1: 61411493972489126939268762828, - limb2: 19139416354826628350711807813, - limb3: 512078085720406898204231613 + limb0: 19488545099093265511927066423, + limb1: 22962944345758111785636106546, + limb2: 3130857578072025359, + limb3: 0 }, w9: u384 { - limb0: 29899333859161556256464872908, - limb1: 23293001299417690585999976168, - limb2: 23867147488176656230866755830, - limb3: 2330269001674758076981313327 + limb0: 61559333582912215483014478672, + limb1: 57823576229923777781349744944, + limb2: 547395244939789083, + limb3: 0 }, w10: u384 { - limb0: 32416458511573250229290010097, - limb1: 10564010775010215142672842918, - limb2: 54964496379044996527532114105, - limb3: 2597413246335202760041690474 + limb0: 31529970367022023879493672333, + limb1: 27528692484299938325959866361, + limb2: 1531184805028370745, + limb3: 0 }, w11: u384 { - limb0: 9388849222628695990815018202, - limb1: 32071671054362250565029859340, - limb2: 58755720939741983911738663799, - limb3: 6214456692013773889269554744 + limb0: 37239215293365080738603851543, + limb1: 32726277981354505354105688636, + limb2: 396774661825538791, + limb3: 0 } }, E12D { w0: u384 { - limb0: 67999952305433789381778175135, - limb1: 18851474948043136237356605102, - limb2: 68548242901834829209540502373, - limb3: 6190058322466040684927628262 + limb0: 23340118865670825963650552354, + limb1: 45112720911871828120498375866, + limb2: 1564853061858215730, + limb3: 0 }, w1: u384 { - limb0: 61452997423552541511634653039, - limb1: 24948682214021641440191720696, - limb2: 15302756227803762661791184854, - limb3: 6875256399643272576841033987 + limb0: 25344627731332076116854180042, + limb1: 62478352643449411912746935280, + limb2: 2878900981835668227, + limb3: 0 }, w2: u384 { - limb0: 41499847142727715397991190795, - limb1: 19015746986618999239332019504, - limb2: 55092714258884146568893700156, - limb3: 3249779013943408616630013854 + limb0: 64923955165359248244925102441, + limb1: 17784048758007009883115637239, + limb2: 3291123783638637134, + limb3: 0 }, w3: u384 { - limb0: 28114507148232565592602618079, - limb1: 19621814452217449989355510902, - limb2: 8376996042080069410205519905, - limb3: 4562717580173360640762090586 + limb0: 8653205754127920454348200738, + limb1: 34919445659383135803658899724, + limb2: 2619229326914254970, + limb3: 0 }, w4: u384 { - limb0: 76653432028285050367782173118, - limb1: 69333481923252861062904934820, - limb2: 66037071427371206182149717150, - limb3: 2578008724302404341936622142 + limb0: 42735953577577375601517826928, + limb1: 12140635515368722399021264266, + limb2: 870661345258586262, + limb3: 0 }, w5: u384 { - limb0: 11744541545174129453416400204, - limb1: 23036249235180056459184710777, - limb2: 78233514341508978652868243753, - limb3: 7262031133601061364014802591 + limb0: 20377831299011783944075184480, + limb1: 73751131018645937154629367477, + limb2: 742953086618380247, + limb3: 0 }, w6: u384 { - limb0: 22328055897538179578936983332, - limb1: 25586273108198292027438126843, - limb2: 28200377862512534930614301025, - limb3: 2478826194581747892586073842 + limb0: 4064540310919571795239138668, + limb1: 46751630489618154494086470136, + limb2: 817742609912205626, + limb3: 0 }, w7: u384 { - limb0: 40577675781350598233625820987, - limb1: 65160085642506495467574894021, - limb2: 25323787572540237179085497126, - limb3: 2948151520396827061139905617 + limb0: 13345610213355516869027624399, + limb1: 54393443103671651691697271308, + limb2: 3263220232595829021, + limb3: 0 }, w8: u384 { - limb0: 54712680132395479154531418335, - limb1: 4952939913663255335944049680, - limb2: 31009886988886338734781321669, - limb3: 2275319561242698539627474862 + limb0: 8134583432441613939981414158, + limb1: 57316542298506396401635650428, + limb2: 1702499249470070527, + limb3: 0 }, w9: u384 { - limb0: 43747591181358905114377907499, - limb1: 67530842118223637409302391951, - limb2: 17161285959424080609161907052, - limb3: 4494110726168654061161170652 + limb0: 39782890817558563570135378079, + limb1: 74556394317626751076385562229, + limb2: 355940877916176951, + limb3: 0 }, w10: u384 { - limb0: 27409059106948280078499246058, - limb1: 14558094158608911557049327486, - limb2: 78946432458723694998927848867, - limb3: 741724002650681577032895816 + limb0: 72164846814007190091327862741, + limb1: 39205979889780815245905802509, + limb2: 412687442246594190, + limb3: 0 }, w11: u384 { - limb0: 15444526967952629749161430221, - limb1: 40218939667276381382822067051, - limb2: 50928846777734204280402997474, - limb3: 6779522089199926414553765378 + limb0: 4784766685184931035247977453, + limb1: 77940613458435725992184302112, + limb2: 2796161008320947595, + limb3: 0 } }, E12D { w0: u384 { - limb0: 71572043141089437656431671688, - limb1: 18819926162513438879282584368, - limb2: 3291525540052640832310008932, - limb3: 2352241466599018358918355844 + limb0: 71695253387492025672645206439, + limb1: 49064254819335680823462242762, + limb2: 2186931183607838950, + limb3: 0 }, w1: u384 { - limb0: 52493245152762301473564251746, - limb1: 9847938977131446476317635831, - limb2: 21096940842628393249626012129, - limb3: 7619396468023290001986468166 + limb0: 60110291123148743476926231593, + limb1: 76484782737366373904731380501, + limb2: 140133213478576938, + limb3: 0 }, w2: u384 { - limb0: 40817522227432885411676558627, - limb1: 67624606943263117020879305582, - limb2: 62429669932733354567819002543, - limb3: 4906873479171568330754010971 + limb0: 17172727009071399299357738481, + limb1: 3435966203675341119569718520, + limb2: 248368397167093389, + limb3: 0 }, w3: u384 { - limb0: 63373539705970768367006903184, - limb1: 67651086749963119020457967874, - limb2: 20549378302223381737538897785, - limb3: 2569388229018210113492136972 + limb0: 33642097527475936047339462271, + limb1: 55793841905789530774483807039, + limb2: 3476683350171493496, + limb3: 0 }, w4: u384 { - limb0: 41893371121527089074408110934, - limb1: 72795176162678473662988980893, - limb2: 39773095779860653956978112555, - limb3: 7682516280053370749653811122 + limb0: 2780886505634939858266745450, + limb1: 5186824312033322051261725264, + limb2: 2257325678344936339, + limb3: 0 }, w5: u384 { - limb0: 32626966296246269192046099823, - limb1: 59517497987733167782877765695, - limb2: 2193612560929813953253250927, - limb3: 6718672436507645453465981105 + limb0: 67120849816484129375364276551, + limb1: 15497236830773573304702747423, + limb2: 3138678849768293415, + limb3: 0 }, w6: u384 { - limb0: 71008210577624178521356711651, - limb1: 65819585649108647068509156114, - limb2: 34888212267633879105228869719, - limb3: 4138035080675119998837463426 + limb0: 50034988568506845232964575580, + limb1: 38901696981086857033054602635, + limb2: 745442643005042917, + limb3: 0 }, w7: u384 { - limb0: 71538443773880100750780561093, - limb1: 4093567025827762066230010518, - limb2: 74100944949166103346127098160, - limb3: 4142823264776081185247480976 + limb0: 28196083574082180377868475248, + limb1: 23653536518371424669176968890, + limb2: 2745571549615046842, + limb3: 0 }, w8: u384 { - limb0: 10897948486241853270410391356, - limb1: 72315099534572239209829723838, - limb2: 3669638503987782986783458153, - limb3: 5755633464819232945827204189 + limb0: 66671824656873851750740596204, + limb1: 40690249696267282428867293957, + limb2: 56874598931457591, + limb3: 0 }, w9: u384 { - limb0: 28556522609835400308020428162, - limb1: 36220267255222411331766358707, - limb2: 42390016953831761392421604897, - limb3: 732640605304394950979474615 + limb0: 58848825141420364414846644782, + limb1: 34518077141877945785844810441, + limb2: 1713713576326407055, + limb3: 0 }, w10: u384 { - limb0: 7767637267765218126833303151, - limb1: 55488595396615478481816345489, - limb2: 35986668950794432836602566172, - limb3: 4152388781977675171423210543 + limb0: 37935051096820538747906693287, + limb1: 13367804743119575794481968545, + limb2: 2098569588110402528, + limb3: 0 }, w11: u384 { - limb0: 69097236902348602942327676080, - limb1: 1729798832908389746829798429, - limb2: 45350879568514800619351099048, - limb3: 7276820795517336046806115338 + limb0: 47803441183449007961848596458, + limb1: 14718518240386362413961751938, + limb2: 3396766995992538654, + limb3: 0 } }, E12D { w0: u384 { - limb0: 68756787529646944706038246514, - limb1: 75849499339769484910536621367, - limb2: 52454932773001712009960352070, - limb3: 5515321760429003968304495832 + limb0: 42970916755460842739824290571, + limb1: 35465998270465666947558002347, + limb2: 3467027590921748692, + limb3: 0 }, w1: u384 { - limb0: 78242720795249632301702111729, - limb1: 25961834800819423350179744291, - limb2: 69667574727988761294512626339, - limb3: 4901725423898560908968742367 + limb0: 2606030631395588012178640270, + limb1: 49036722384862243349787002158, + limb2: 22568645376614403, + limb3: 0 }, w2: u384 { - limb0: 13911635702231459387901381161, - limb1: 9188595976983954834886861285, - limb2: 53653188304824189187769704172, - limb3: 7624444839383157998626005523 + limb0: 31245491328770353947255249278, + limb1: 58141201589755088610048911461, + limb2: 155378598672899536, + limb3: 0 }, w3: u384 { - limb0: 46071493721927657529542681184, - limb1: 56018320076479420339593995250, - limb2: 22441089827348559345332106065, - limb3: 3367553757798903450066392652 + limb0: 45287137905846038504494969068, + limb1: 75455909243296458157494510294, + limb2: 845587174646425592, + limb3: 0 }, w4: u384 { - limb0: 10012918661227775939392660982, - limb1: 32928296706449838909853539376, - limb2: 18792119847253654608673900553, - limb3: 3029385291342647312136606718 + limb0: 62803993733535431613181821798, + limb1: 36085038401197114088140350470, + limb2: 633054526627926493, + limb3: 0 }, w5: u384 { - limb0: 76921475384987918344616630022, - limb1: 73081653389313081519062456279, - limb2: 7027464996171197341670437493, - limb3: 4051222745773754908410930178 + limb0: 40757683864762350635209227570, + limb1: 8042424502152686327963615580, + limb2: 1442478473949614878, + limb3: 0 }, w6: u384 { - limb0: 22003107996099531343783324127, - limb1: 70533104205211683493339558344, - limb2: 16835920529060330173976199850, - limb3: 948519295106059028215841143 + limb0: 44337202477737747128062668880, + limb1: 1855049495400306760433699129, + limb2: 1347899654969564101, + limb3: 0 }, w7: u384 { - limb0: 57597905245128291013940259596, - limb1: 9454020871832201091176317981, - limb2: 37560559019162071243134254864, - limb3: 7806035847426244647348121432 + limb0: 50458098857237754792242695098, + limb1: 540571459185287506547893631, + limb2: 3261103834411630152, + limb3: 0 }, w8: u384 { - limb0: 19511517993132956342602106559, - limb1: 31128226008173213747200443156, - limb2: 47576482707615031831248312682, - limb3: 1622824385442948022214747861 + limb0: 402670113031042640879031072, + limb1: 23413240234480743488837802503, + limb2: 1633758771187241760, + limb3: 0 }, w9: u384 { - limb0: 55594081832733563875914980828, - limb1: 33109176300316865559403271796, - limb2: 47998919343088525642083676452, - limb3: 5977866970862462607328306595 + limb0: 42149944663064179888125558196, + limb1: 38277686346116118284842226123, + limb2: 1442729995817943069, + limb3: 0 }, w10: u384 { - limb0: 70795796492022086567827640975, - limb1: 52993623527387582468959406944, - limb2: 25538627013226078901436844054, - limb3: 4897554774951721782121837926 + limb0: 53752091703395558300859602931, + limb1: 24128172951140525121586800306, + limb2: 1983153687286558504, + limb3: 0 }, w11: u384 { - limb0: 1732731783413060328548791172, - limb1: 66283727928521774066251714567, - limb2: 63788115448867699316597431446, - limb3: 3871487618491403852435464964 + limb0: 2099242446950259742390919433, + limb1: 9438520363245979948181053951, + limb2: 3161746319073097241, + limb3: 0 } }, E12D { w0: u384 { - limb0: 19088509674329883874674207571, - limb1: 19198454803310387636927911541, - limb2: 65828884597086257375461068432, - limb3: 1988932152072082947578490980 + limb0: 68014496405447883343200128204, + limb1: 5709428217488883572557748017, + limb2: 3075710117869547600, + limb3: 0 }, w1: u384 { - limb0: 20034303244309049074760220605, - limb1: 37504503349893427251800976657, - limb2: 74118765934733653978355719767, - limb3: 4148410894222773169445475935 + limb0: 65209884780439587125384934655, + limb1: 68761799421163674289628485072, + limb2: 2338364914152264858, + limb3: 0 }, w2: u384 { - limb0: 56248935094435146348614256338, - limb1: 49483299012892585773744346151, - limb2: 38524815659452541814606825900, - limb3: 6383862887924190352351723143 + limb0: 21069957172853055669432778112, + limb1: 43944711877723711219882207499, + limb2: 1692650727782199594, + limb3: 0 }, w3: u384 { - limb0: 62466694337757164952011391972, - limb1: 49310389667093156524116216092, - limb2: 78576255393045548433502266688, - limb3: 5277655662003724086419875030 + limb0: 64861619221289731293097014032, + limb1: 17747590571437412911550258054, + limb2: 627509997858562553, + limb3: 0 }, w4: u384 { - limb0: 54531767241282403748116159729, - limb1: 3182199724279343412868317676, - limb2: 77462423740154039549067083375, - limb3: 2647068528060804003246834370 + limb0: 73059041029098233180777107956, + limb1: 14868560131437155765260062778, + limb2: 1128720862634382252, + limb3: 0 }, w5: u384 { - limb0: 55944021809267207759707936656, - limb1: 74640430233870104384223461915, - limb2: 50052578122114328266805421681, - limb3: 2907699955866504350197759745 + limb0: 32870550043838398287051178784, + limb1: 8232555352485300601000937477, + limb2: 2742026119331411552, + limb3: 0 }, w6: u384 { - limb0: 55519909751599081499393233477, - limb1: 18862690239277666307827981847, - limb2: 10315011428872242964557311094, - limb3: 6741407665367969003096212436 + limb0: 10167722370132831534413430839, + limb1: 1911315185998132026360751402, + limb2: 1246213575874984696, + limb3: 0 }, w7: u384 { - limb0: 6788324315111947493743789929, - limb1: 56367054148555011104664282144, - limb2: 71542187862603368968692079521, - limb3: 5029825923691641753595921809 + limb0: 66285581240935448694493731106, + limb1: 22281597189281987673224227577, + limb2: 201429892551002919, + limb3: 0 }, w8: u384 { - limb0: 72610793485718314511625492720, - limb1: 57333337390492208915861880712, - limb2: 61341240294190753287932661120, - limb3: 675133440411270719728674989 + limb0: 49607155998507830525695657167, + limb1: 36281473983746177171831604918, + limb2: 3044716429033479795, + limb3: 0 }, w9: u384 { - limb0: 1855131246460152208092277859, - limb1: 4646034713586621546720931589, - limb2: 15555040307640322733950057219, - limb3: 4008764302425442417423544744 + limb0: 11298302211631529197662548629, + limb1: 41039134319246324517149118047, + limb2: 1793397037996325059, + limb3: 0 }, w10: u384 { - limb0: 36423012997290869905167655673, - limb1: 55644428773575409183577933971, - limb2: 18652367335520900242628978833, - limb3: 1682312327814159509756131921 + limb0: 65148979706303579989130887099, + limb1: 17200837501976006614858089136, + limb2: 1702016585201114826, + limb3: 0 }, w11: u384 { - limb0: 59359566576858340348969325392, - limb1: 63402742405042782991668468315, - limb2: 47764410623252632180956000853, - limb3: 3960554518154196601805681480 + limb0: 12801659086830662084561726369, + limb1: 38349400382584709211499376687, + limb2: 1002624325724435051, + limb3: 0 } }, E12D { w0: u384 { - limb0: 56755014909193340568825305447, - limb1: 13011527489247393627051387053, - limb2: 7657168332744440179939082681, - limb3: 7182991471758613707146149885 + limb0: 54981262599710306403085657489, + limb1: 29507140025342118871547033214, + limb2: 2656044423509792677, + limb3: 0 }, w1: u384 { - limb0: 59437174403589783558793103945, - limb1: 24098030613708076378578229920, - limb2: 50822282034146417793403300497, - limb3: 6465446300408550336347347789 + limb0: 26307484205195756047042528046, + limb1: 19169245921622118828843859158, + limb2: 1227212523708539410, + limb3: 0 }, w2: u384 { - limb0: 19252443050160833256308038939, - limb1: 44880327659041890680890552130, - limb2: 70346703354732695660044222374, - limb3: 4158280771887647450183984548 + limb0: 75464066885236752274885445983, + limb1: 67685606376463625117867036570, + limb2: 500163708301861210, + limb3: 0 }, w3: u384 { - limb0: 54245934932702721822992796168, - limb1: 1199614665557721706334434090, - limb2: 75958677722987605180983089151, - limb3: 7357941545225934177620190600 + limb0: 26893740977818836092940892261, + limb1: 77992763160314987238794051494, + limb2: 2901453573069703572, + limb3: 0 }, w4: u384 { - limb0: 56959305148920295948535308333, - limb1: 74798379408882608650630211107, - limb2: 3215062308844702493283368705, - limb3: 5272542314964688951200195503 + limb0: 41804320650448354469091858305, + limb1: 12416062832336300372259193735, + limb2: 873477733447987868, + limb3: 0 }, w5: u384 { - limb0: 39967680549350345640848835322, - limb1: 12204758793490774240060863582, - limb2: 13117743822245513290524511721, - limb3: 3024249076518838682314426820 + limb0: 22785503498993622846120673750, + limb1: 44325105357306171563261167104, + limb2: 2711233256801054197, + limb3: 0 }, w6: u384 { - limb0: 16149770652870939873802791360, - limb1: 48597752286389362641920121207, - limb2: 10597515106510758014924605061, - limb3: 990044058101734966442504847 + limb0: 68988790494242344929693762312, + limb1: 53169500552366073960587018927, + limb2: 1916627178168507279, + limb3: 0 }, w7: u384 { - limb0: 47848840542282818305549551840, - limb1: 34331721290030467810418958152, - limb2: 10488223121876072047905837948, - limb3: 7300479267781054828249032652 + limb0: 2235604758609564127568902014, + limb1: 61432564709966687545953062047, + limb2: 2758706918989898820, + limb3: 0 }, w8: u384 { - limb0: 35409413871406451250029132121, - limb1: 32549409287054962713058383057, - limb2: 26133508269284119503083855471, - limb3: 7708461773172965275094121822 + limb0: 42852097440082890818059669456, + limb1: 62262220521291454531939473976, + limb2: 1427887565683263373, + limb3: 0 }, w9: u384 { - limb0: 6071695685412311224499323858, - limb1: 4235419802230826917700967176, - limb2: 18895397298559089982762979741, - limb3: 3715481095774987377185286246 + limb0: 70198163641149098129354287209, + limb1: 40090122593913513874867414007, + limb2: 1234424751270255507, + limb3: 0 }, w10: u384 { - limb0: 37020108917794317863388035880, - limb1: 50073732601695757835453644945, - limb2: 9962972090329147153820731050, - limb3: 7274949768393822448675518931 + limb0: 19595694572551431398436943675, + limb1: 53916232133471961121235722194, + limb2: 3388530565912857896, + limb3: 0 }, w11: u384 { - limb0: 62149150931038522156188319645, - limb1: 52412371853594402030429905991, - limb2: 5307202739145339378452910040, - limb3: 321560531721290429630693228 + limb0: 76073848001520243753417603474, + limb1: 12553581427485303954929782266, + limb2: 935474942602578345, + limb3: 0 } }, E12D { w0: u384 { - limb0: 50979818540072433004528186586, - limb1: 47921953929472322284454322814, - limb2: 54470721980105222990952282013, - limb3: 7396779502044500033125363551 + limb0: 15348884437967046686099486792, + limb1: 65739750751678616631181414503, + limb2: 2753651784164594048, + limb3: 0 }, w1: u384 { - limb0: 32898826871266360001821087325, - limb1: 17575693631886346823708719497, - limb2: 1146001980621274639388273390, - limb3: 7062271877743153018986974584 + limb0: 58856021440697769198218800922, + limb1: 57012137721997734239378808829, + limb2: 92965550765341430, + limb3: 0 }, w2: u384 { - limb0: 4424330317131965167006500941, - limb1: 55746319313812018135094424784, - limb2: 66175959297365404876095336307, - limb3: 3033486536532383522598606317 + limb0: 61769987668316389291089484449, + limb1: 7930187716445133457709872741, + limb2: 390287174782015518, + limb3: 0 }, w3: u384 { - limb0: 38707947321608545293681906649, - limb1: 22112233517347744815557939699, - limb2: 68257201500953578511853008819, - limb3: 2733302864937386781771491816 + limb0: 41100358600502508714336422876, + limb1: 76683695173326043921112187378, + limb2: 1137731075767177566, + limb3: 0 }, w4: u384 { - limb0: 43450092104746775315208400930, - limb1: 75138448798577197004983381277, - limb2: 57697881263708946696738460891, - limb3: 1502955318832221996757344979 + limb0: 75634127432712152251592417863, + limb1: 46759767648117031022623978172, + limb2: 3060076854084831739, + limb3: 0 }, w5: u384 { - limb0: 43824899435666067824391198826, - limb1: 65688060030627587569202829479, - limb2: 6721344591726251630045066784, - limb3: 4579262294300235166006765847 + limb0: 59402509816300458575117928757, + limb1: 44538503751848413290156240493, + limb2: 1965994068270301430, + limb3: 0 }, w6: u384 { - limb0: 69374483947925490312674438690, - limb1: 13897523464417927258920958818, - limb2: 66312255710841994119574232950, - limb3: 2648996138423239737590455645 + limb0: 56122162794452793338280007495, + limb1: 6086395294532671389222906179, + limb2: 343545346486185085, + limb3: 0 }, w7: u384 { - limb0: 69361593472724480437777950602, - limb1: 17602227627581383501602155239, - limb2: 65425677292139259832507478616, - limb3: 6968969662931419533116052101 + limb0: 24686918906834990748488376676, + limb1: 14678663650584458690283027838, + limb2: 1618398704163283911, + limb3: 0 }, w8: u384 { - limb0: 42181492235588436391652430852, - limb1: 76561092415678721840298610022, - limb2: 64528834942402712935139122609, - limb3: 1518557042713049176948127031 + limb0: 56787589900022410289936981709, + limb1: 30114542110990250590137616279, + limb2: 168339675275543635, + limb3: 0 }, w9: u384 { - limb0: 5364428491101078904611505979, - limb1: 15919328255551822626630500469, - limb2: 68771076055035516266669275943, - limb3: 4563552300431388928493201629 + limb0: 18972278997462717974760344857, + limb1: 21826710771087290553596299000, + limb2: 757665672099918960, + limb3: 0 }, w10: u384 { - limb0: 44494905906931955173210579670, - limb1: 54907082516313910614625901330, - limb2: 12790346879640332541330787926, - limb3: 120698008412741083211288483 + limb0: 61827514745136113104563022067, + limb1: 30904479207586709795371672134, + limb2: 3094569337918470060, + limb3: 0 }, w11: u384 { - limb0: 18401604091700981340248095342, - limb1: 69828630008546172940822673427, - limb2: 75098739304058665173857232558, - limb3: 5725364366709355214676953518 + limb0: 59556900527160575595353365690, + limb1: 8120420950656485632597404083, + limb2: 2805997009118873027, + limb3: 0 } }, E12D { w0: u384 { - limb0: 33683212138748947516820609540, - limb1: 58750494026750958694733176494, - limb2: 67976990359660859074230445604, - limb3: 4190407987525764844006340210 + limb0: 67171260012549960826524260342, + limb1: 13661772033859099127468455620, + limb2: 2610971232759090893, + limb3: 0 }, w1: u384 { - limb0: 53080040443155969505530008485, - limb1: 53244448593990277139217139437, - limb2: 39229416197007157467649849092, - limb3: 3044751026754863577636050806 + limb0: 952382637830479630191138268, + limb1: 17323755358292085930506100607, + limb2: 3051868227046778712, + limb3: 0 }, w2: u384 { - limb0: 72348475253185305785222682624, - limb1: 24037438310190177272665557783, - limb2: 9932615215967285371592278233, - limb3: 4785188343852851866029165145 + limb0: 77062489601419024450087251776, + limb1: 6880106522444406655763323633, + limb2: 2261874767519602941, + limb3: 0 }, w3: u384 { - limb0: 64426715091515176337818501883, - limb1: 47079815258248575400307389384, - limb2: 8618387911041646360881535861, - limb3: 4650462772306438900100373125 + limb0: 72631388334723364151582901805, + limb1: 12647306609794968869999888687, + limb2: 1448576176615266537, + limb3: 0 }, w4: u384 { - limb0: 36642322665121383961967882088, - limb1: 36452889781984384468002565298, - limb2: 73243805554538027837209962447, - limb3: 616436811349234335785328778 + limb0: 10957534190996502560552408559, + limb1: 34536304503527193715556266539, + limb2: 1837962935179711793, + limb3: 0 }, w5: u384 { - limb0: 51908408732037676912250445233, - limb1: 68753093910276695709482023202, - limb2: 54726708520939461478915419949, - limb3: 8039473752292984326789123541 + limb0: 68717331936254158444052389946, + limb1: 47031416226679476101240577171, + limb2: 3102654982472282563, + limb3: 0 }, w6: u384 { - limb0: 76036561417861622936366085949, - limb1: 25179994721130397823685689885, - limb2: 67597911326440400846482133712, - limb3: 4292844167028533131381261752 + limb0: 7578455257075534905093246170, + limb1: 4250294385248751946445816746, + limb2: 2464945422371814090, + limb3: 0 }, w7: u384 { - limb0: 7209014713490844095233804131, - limb1: 3575804675440034213737982611, - limb2: 9834250908448799181711791811, - limb3: 4495717403639295858213918142 + limb0: 62304827895689362631158896084, + limb1: 52893131656931778423142288378, + limb2: 690107004338902128, + limb3: 0 }, w8: u384 { - limb0: 23265655580054762340539271014, - limb1: 27499587681215574656111504180, - limb2: 73399821714118737847658721840, - limb3: 2717227642354706319033274158 + limb0: 10578418776403761976807868921, + limb1: 27297626494169653104046298279, + limb2: 1062334693473603981, + limb3: 0 }, w9: u384 { - limb0: 41073982937580605822168572695, - limb1: 72119640781467343233049395872, - limb2: 45334873404405727112321430583, - limb3: 1599788099716172894620033234 + limb0: 317591516914258520984885758, + limb1: 79169133507855835308273272242, + limb2: 1929948134604411968, + limb3: 0 }, w10: u384 { - limb0: 77854377187646553948560206172, - limb1: 73477386452744631250516228826, - limb2: 44420688670817219861610560165, - limb3: 6595166676162270307144906570 + limb0: 1536955871737998264600958804, + limb1: 4022623802954792198916454804, + limb2: 295424921392696144, + limb3: 0 }, w11: u384 { - limb0: 18656189400979031108447511625, - limb1: 18730912542172970878603491982, - limb2: 66337790839823400980996528566, - limb3: 7918522448797803996992552518 + limb0: 67136123298379686151309230178, + limb1: 54409623579416795585703116659, + limb2: 2045640439227113266, + limb3: 0 } }, E12D { w0: u384 { - limb0: 44889683174370299349675478906, - limb1: 62859634672349170787780291265, - limb2: 77560850468609796398300860825, - limb3: 6666250346759096993498823929 + limb0: 66334179628586710031370972674, + limb1: 5415496466389233195739320112, + limb2: 490266394535644645, + limb3: 0 }, w1: u384 { - limb0: 7652077557841814812470546792, - limb1: 26599985649506146978311569067, - limb2: 12158517658226595817139750021, - limb3: 311106489050637710129723845 + limb0: 58572811982469358032387278131, + limb1: 60309122528841470542527671760, + limb2: 821120344041357255, + limb3: 0 }, w2: u384 { - limb0: 11530356296941472569264562524, - limb1: 902097324892060945932215916, - limb2: 70562154926110971109665488841, - limb3: 6220636423802228596833704947 + limb0: 41368666524067238958568669283, + limb1: 12762311471628296793176523654, + limb2: 1648383218248683364, + limb3: 0 }, w3: u384 { - limb0: 7123219030294440791116561259, - limb1: 64523828978115345836650863699, - limb2: 26270465121521142351555915831, - limb3: 86132952494923747646822933 + limb0: 12099093337402139871299875117, + limb1: 71861639098472386373434926947, + limb2: 2332754966575248725, + limb3: 0 }, w4: u384 { - limb0: 35962985502244433696839955335, - limb1: 37975288274940534844775522909, - limb2: 13026018765287762481030467890, - limb3: 7396132939688148203871778118 + limb0: 17012157031741162563262709557, + limb1: 74250412248662822211229954157, + limb2: 567411333620464861, + limb3: 0 }, w5: u384 { - limb0: 9384637921603182076567160897, - limb1: 47892565426616531367469398565, - limb2: 47452572479920048538957578668, - limb3: 4441444195297732138835437273 + limb0: 59216932946224401030658771399, + limb1: 9153690422504181881532984238, + limb2: 1040605841013580682, + limb3: 0 }, w6: u384 { - limb0: 40429234021979164284534554042, - limb1: 36063256267217745528289950974, - limb2: 60294964327968394701979056834, - limb3: 5619512328232607941158165301 + limb0: 77251466085081485161247461034, + limb1: 11543910965537542566379680655, + limb2: 1973451061995738047, + limb3: 0 }, w7: u384 { - limb0: 61866607013577472814384664509, - limb1: 46759593570401907481389259188, - limb2: 62939575888530084578400248797, - limb3: 3071960520153771640524206230 + limb0: 41678673205292994278069652266, + limb1: 49431602550509714406611938212, + limb2: 1409955891876274772, + limb3: 0 }, w8: u384 { - limb0: 31653580472488961685566840066, - limb1: 55064172755160221023737056889, - limb2: 26387664239376522542800998878, - limb3: 7639813917859402517725742720 + limb0: 28041253935575732247356160152, + limb1: 37233192147060574168230045944, + limb2: 2827642204549215207, + limb3: 0 }, w9: u384 { - limb0: 76867777227560571067067281514, - limb1: 73132086517976663062508975657, - limb2: 30490104964432969306035041109, - limb3: 4790370861926406186156940692 + limb0: 18618420635180474323230131974, + limb1: 21210279290693320243830837810, + limb2: 422660619409902450, + limb3: 0 }, w10: u384 { - limb0: 25549027329103064884335723271, - limb1: 53840302147085135796312204616, - limb2: 63199111953834453014107982878, - limb3: 6913380723457874453031068478 + limb0: 2144804525108846419151225960, + limb1: 61782047800308723919316456428, + limb2: 1564913913022936450, + limb3: 0 }, w11: u384 { - limb0: 27274761909465705561047452422, - limb1: 58750694534664493721831256188, - limb2: 28868924482758071515549539394, - limb3: 6483977161179521862062211720 + limb0: 60135546715640573240388280025, + limb1: 16788191024529698047550550625, + limb2: 380156361823715972, + limb3: 0 } }, E12D { w0: u384 { - limb0: 59443192775570008904894078949, - limb1: 28679880644972342540853178151, - limb2: 63841431776053406454662788704, - limb3: 5781627761570962072952302109 + limb0: 70990282533056439709992334644, + limb1: 64675960802024954167470277712, + limb2: 1325927113365075798, + limb3: 0 }, w1: u384 { - limb0: 42270651084575380379274903842, - limb1: 26793003520159327575513254570, - limb2: 23440257930693682858667320223, - limb3: 4201587459224149392392766300 + limb0: 19657341685302675082547505324, + limb1: 19348903904866090093088521966, + limb2: 1977582025234317255, + limb3: 0 }, w2: u384 { - limb0: 74973878765535231886891156608, - limb1: 71090432911707421897633597093, - limb2: 76977830845852677157740284247, - limb3: 6083266769949730962083458372 + limb0: 417771556476990154212779836, + limb1: 21513746088824268229421312962, + limb2: 2387009752112933172, + limb3: 0 }, w3: u384 { - limb0: 57185617829805810150153811186, - limb1: 75371241363648049270035313929, - limb2: 48681089934581479932223731832, - limb3: 2550914725113621947313186022 + limb0: 60832878408405203970973706519, + limb1: 54671851409518148043077317744, + limb2: 1509812495398771816, + limb3: 0 }, w4: u384 { - limb0: 11686758139776925449762325703, - limb1: 63011225172278802701795415156, - limb2: 78694518217403672682468432704, - limb3: 4737264510369249749195914979 + limb0: 21146557342065038885012237585, + limb1: 51537468531976990835645363723, + limb2: 209827205896288407, + limb3: 0 }, w5: u384 { - limb0: 61755460547635808343963473515, - limb1: 57403081930651455778776805101, - limb2: 51519707352183287311069921775, - limb3: 5469619759393817085275444506 + limb0: 28105972538603616415559210056, + limb1: 55653481848793672418294142186, + limb2: 850870651902091266, + limb3: 0 }, w6: u384 { - limb0: 41534493610256193869376115751, - limb1: 42794565066228330225894520957, - limb2: 24873608463675900550116199648, - limb3: 5124227010371502974391757388 + limb0: 18390186384108499114238891840, + limb1: 76748055965637960196678929534, + limb2: 294790231450428117, + limb3: 0 }, w7: u384 { - limb0: 7692846487095671911731200609, - limb1: 4832821241791160226357848260, - limb2: 3342397113541795991713514059, - limb3: 5680447163940915913758919633 + limb0: 15391480246333597676219089817, + limb1: 42311254659961465302177329995, + limb2: 2944414578962218707, + limb3: 0 }, w8: u384 { - limb0: 78478946717600669166628630859, - limb1: 25166234320209723412902646828, - limb2: 12482144834548853696218429520, - limb3: 6167467482484461227234669654 + limb0: 47699244239479366024648203276, + limb1: 75196183953704020786657402405, + limb2: 3367857431027012437, + limb3: 0 }, w9: u384 { - limb0: 66480587818629757337090345187, - limb1: 61068206504025685522561683495, - limb2: 13069938405408314978156558790, - limb3: 2047406858177921077534627894 + limb0: 17220184768016890648489921837, + limb1: 41826375435994172170294986067, + limb2: 1084661098622728568, + limb3: 0 }, w10: u384 { - limb0: 14739589837926507545775444340, - limb1: 13616150076382448521140649958, - limb2: 38869600466615761054951043266, - limb3: 591309862297731026848953625 + limb0: 33320312860525495317831298974, + limb1: 8206688975583968306018388295, + limb2: 842553959768539049, + limb3: 0 }, w11: u384 { - limb0: 5299427639880190466706885390, - limb1: 40568465566599860922045686294, - limb2: 21007338805501984862911290393, - limb3: 4155553328725309831163288911 + limb0: 15172923197888930361354142591, + limb1: 55866405167526926003892723413, + limb2: 641439962046770395, + limb3: 0 } }, E12D { w0: u384 { - limb0: 30983311721529690982178787137, - limb1: 65570395538635109122078872367, - limb2: 64861481390150712364378108576, - limb3: 2961326750494238107411909098 + limb0: 12448301119413904841711232819, + limb1: 38871157077427075453739216263, + limb2: 3463786720430645595, + limb3: 0 }, w1: u384 { - limb0: 20435857845349507273669238861, - limb1: 37707031330249026912229086552, - limb2: 17898580385435948851205345719, - limb3: 5802512472912504110101514032 + limb0: 65440228625850646330035694276, + limb1: 54946582287681436204818425434, + limb2: 458988921598636559, + limb3: 0 }, w2: u384 { - limb0: 70090355676583641049550766984, - limb1: 39700086905681838321098550641, - limb2: 38924429929794194174810287756, - limb3: 3319980875188998129985063221 + limb0: 21061982732688600954346012489, + limb1: 68624869798515099609104446522, + limb2: 2550070713583331817, + limb3: 0 }, w3: u384 { - limb0: 74785399582824380329558751595, - limb1: 65824332849496095846767775238, - limb2: 45895162932134618563417522657, - limb3: 3101378424810846344802489296 + limb0: 64330001058360148664140869294, + limb1: 61203800253110609469667863875, + limb2: 2319694111644971769, + limb3: 0 }, w4: u384 { - limb0: 33863256308250714577857826774, - limb1: 63129582497676188020366320440, - limb2: 53420101339322597191968328440, - limb3: 7006990915510800982119948731 + limb0: 48380905291015787460511708453, + limb1: 26395434279365896983654843069, + limb2: 2952056638471918040, + limb3: 0 }, w5: u384 { - limb0: 21775723843634892097351922935, - limb1: 70941596697451179251961798503, - limb2: 45092970208210694272474224539, - limb3: 6615866694611190877676556388 + limb0: 12505575182896188628934524874, + limb1: 64182188173980931223779822647, + limb2: 1404021287633530536, + limb3: 0 }, w6: u384 { - limb0: 23641906522391987845866073170, - limb1: 59103341367083939899633282139, - limb2: 7652178779430504129091486555, - limb3: 1458061964509528667466182370 + limb0: 22663021239389084741368173371, + limb1: 56351498253245614161383552765, + limb2: 859931649442462671, + limb3: 0 }, w7: u384 { - limb0: 15598422767512953723778407556, - limb1: 69771218147258944893986549831, - limb2: 62984171215095884851222028674, - limb3: 5707572067389274536346262039 + limb0: 25252723641290984718994123538, + limb1: 6445326992979747708628662696, + limb2: 527411020852449553, + limb3: 0 }, w8: u384 { - limb0: 10684859914612923903906014878, - limb1: 9008446354000406297541251068, - limb2: 65775164095197263379529091456, - limb3: 2036734464900161803772508112 + limb0: 77990125633984517417616225326, + limb1: 75309872128014171793141724935, + limb2: 2190559998581588500, + limb3: 0 }, w9: u384 { - limb0: 62343782968444461723170328825, - limb1: 32007819020120984520084953070, - limb2: 66162201411062513266559727995, - limb3: 4899562438605795907607915491 + limb0: 14847064612722075904676888910, + limb1: 11971270101479335667201518119, + limb2: 665939875203354964, + limb3: 0 }, w10: u384 { - limb0: 42062317692639695663612645312, - limb1: 31756671916839774772677616001, - limb2: 38581703796553980979578262454, - limb3: 3782039542599785498226564698 + limb0: 65227353718530349703764503144, + limb1: 28185458262431025288065364980, + limb2: 1805128305181459078, + limb3: 0 }, w11: u384 { - limb0: 27451277439055115400295948082, - limb1: 8344660617930523210910375555, - limb2: 61493809257131450384761971470, - limb3: 7999268810168771268061900587 + limb0: 58071686916778700736952184360, + limb1: 20044236197926461114780369512, + limb2: 2945550900069835313, + limb3: 0 } }, E12D { w0: u384 { - limb0: 32722803204519364496674126626, - limb1: 20311185358657756448537946717, - limb2: 42442045462311424611709021103, - limb3: 5495742194859439521196804025 + limb0: 5501653916194916543520505979, + limb1: 13170802951290761962780670666, + limb2: 646243564864907365, + limb3: 0 }, w1: u384 { - limb0: 70876993159108591146871140971, - limb1: 71580057420156555243036583104, - limb2: 47860266893448789048583205597, - limb3: 2442338386301096812084723428 + limb0: 15209472496159723635658573943, + limb1: 872949265997086951463216966, + limb2: 1360774826010158524, + limb3: 0 }, w2: u384 { - limb0: 37522135796395882317238583169, - limb1: 36561788381516335317805460009, - limb2: 41138304335426098617564845703, - limb3: 5267680028702481149825037476 + limb0: 75744515430392914437196872735, + limb1: 35041871965501733658827524497, + limb2: 2763157793362042866, + limb3: 0 }, w3: u384 { - limb0: 25918728355970567145413681427, - limb1: 44156525944962076097087998562, - limb2: 11373435505324633771517819610, - limb3: 7985593729394994951340834877 + limb0: 56158812215793348378882313435, + limb1: 58971360425653380965575394167, + limb2: 3358329413370374722, + limb3: 0 }, w4: u384 { - limb0: 16596379685882621342964591408, - limb1: 39865704563617363222413155257, - limb2: 42020500363736758613500496397, - limb3: 1508977568847068399429835272 + limb0: 23039736457518625785950436175, + limb1: 11052110203850062398390720363, + limb2: 1048131677739141832, + limb3: 0 }, w5: u384 { - limb0: 25785675896956592079614610809, - limb1: 69015301013659751749225935817, - limb2: 41004608156974335437799871157, - limb3: 5735006306032365209755994518 + limb0: 14927433571941238851986563029, + limb1: 28909906422545126975071058169, + limb2: 2684180178660378319, + limb3: 0 }, w6: u384 { - limb0: 42797622257032242888230454709, - limb1: 56964791910423621345958938276, - limb2: 3246530105082337313441372138, - limb3: 7689363663672706791113622142 + limb0: 48197315744033502715995110127, + limb1: 35878899621975478711263203754, + limb2: 3071921890267261039, + limb3: 0 }, w7: u384 { - limb0: 16107196742557985052877284304, - limb1: 58735553899495844377420733693, - limb2: 78725312824130962476370630778, - limb3: 772431909923405633022481961 + limb0: 75867496398384723130656600956, + limb1: 26805787594408085848585074480, + limb2: 1707525261702003435, + limb3: 0 }, w8: u384 { - limb0: 11881534010973565437634309197, - limb1: 36214509256158291743490353714, - limb2: 51199010210940113964841278556, - limb3: 3782550608731190090785074131 + limb0: 35178308120205007532279861285, + limb1: 51049625401966862727804828569, + limb2: 78619768937501621, + limb3: 0 }, w9: u384 { - limb0: 77761786657323847975510936710, - limb1: 44057961201445125282646567921, - limb2: 60763278301620733935476186416, - limb3: 3186492779996826970335213381 + limb0: 41300034277692837978107240231, + limb1: 9269465721420415126425356381, + limb2: 2082286025569799454, + limb3: 0 }, w10: u384 { - limb0: 12613068735708732082936000326, - limb1: 40697505833454968951518511099, - limb2: 21491628212202822306021491845, - limb3: 2635826918660653349657961979 + limb0: 71926380910608134293027470969, + limb1: 49676059906608434532738219823, + limb2: 2282248177131122114, + limb3: 0 }, w11: u384 { - limb0: 2764807452209920622265951954, - limb1: 59918196002602288819808612981, - limb2: 43523855913607085251509184480, - limb3: 564246960157824991926088509 + limb0: 34364434006481199063991963440, + limb1: 18887102767066228105252300774, + limb2: 2465265404329653658, + limb3: 0 } }, E12D { w0: u384 { - limb0: 45570489667532355032212752794, - limb1: 28328812424164990796486128413, - limb2: 24512493608327559720995365604, - limb3: 4475866024375044358866890499 + limb0: 60849331914328212282178456094, + limb1: 29256399044236353909189007819, + limb2: 2324202104184324455, + limb3: 0 }, w1: u384 { - limb0: 23276249629452020035144769852, - limb1: 30491322936241738765049223910, - limb2: 23022312435084131947149227859, - limb3: 7843727819035284807492617619 + limb0: 71742543543625693091237895191, + limb1: 18960778712172410264012675054, + limb2: 1812347433886068268, + limb3: 0 }, w2: u384 { - limb0: 64208439190777584007905927814, - limb1: 28127848233568227479159666592, - limb2: 72390875878358401221811560537, - limb3: 5352226208062450083414842330 + limb0: 5303790084350938911840671919, + limb1: 39817303951457544016805008433, + limb2: 948668488463569482, + limb3: 0 }, w3: u384 { - limb0: 5721002181200145584739097236, - limb1: 31623113701944805840936179856, - limb2: 4353190054397962135556718260, - limb3: 6642804104386893142202316944 + limb0: 30453015527901939265327458835, + limb1: 71167044635035586048832385507, + limb2: 2209996776287789289, + limb3: 0 }, w4: u384 { - limb0: 68042904791501004187216038078, - limb1: 61858907894220181227358327633, - limb2: 11954992619560476559539816975, - limb3: 3243705196822340330673229104 + limb0: 60104317410667522561124857356, + limb1: 58191169002715013041905053338, + limb2: 1260946416598232233, + limb3: 0 }, w5: u384 { - limb0: 75149113055503673959691780216, - limb1: 53755149843957040983493068211, - limb2: 61376149647964578713154141437, - limb3: 2398040842253211592411850088 + limb0: 52980269838676699017766928511, + limb1: 37745110837275639679096259351, + limb2: 226885283666153280, + limb3: 0 }, w6: u384 { - limb0: 44982919690750348527343082420, - limb1: 69926931622300213089739464976, - limb2: 33054689262325443201564803035, - limb3: 7548013455850342445995099705 + limb0: 50147922143832490195418042581, + limb1: 36331893651982709183606926433, + limb2: 795991600709546843, + limb3: 0 }, w7: u384 { - limb0: 35000825991018356327199975043, - limb1: 3304623479585558731240103741, - limb2: 63590572646151297901351406147, - limb3: 3980128244484374789049192862 + limb0: 45009319649473314692124955281, + limb1: 26712009409586753014783239186, + limb2: 3023233633176951155, + limb3: 0 }, w8: u384 { - limb0: 74240552079301836485011104990, - limb1: 63513107858858226914637064803, - limb2: 12296404790428100918568651039, - limb3: 3722462357972493279493852591 + limb0: 18899571570900874525612945448, + limb1: 18067081632324118017944629619, + limb2: 1442357181271872746, + limb3: 0 }, w9: u384 { - limb0: 15806168619739415732840612430, - limb1: 58193801259994895824524473260, - limb2: 2623183231746224269515499000, - limb3: 2897001055083033485300176581 + limb0: 45311154601897204391572374173, + limb1: 54336463440134621717553731619, + limb2: 105784773789467296, + limb3: 0 }, w10: u384 { - limb0: 20429632779691943472082328510, - limb1: 63389277012629106237259454764, - limb2: 68035177101106208160606493402, - limb3: 6180084488366659598079181509 + limb0: 6506212184349982783649213856, + limb1: 14233019279346782555153714859, + limb2: 2738448925390207804, + limb3: 0 }, w11: u384 { - limb0: 17893004401223519902366918062, - limb1: 74260325032335342834889097941, - limb2: 60128864923232456637240165928, - limb3: 3046638135790646494159669819 + limb0: 64321416691946352969953682256, + limb1: 78873692079144900993910088301, + limb2: 1519972737721043313, + limb3: 0 } }, E12D { w0: u384 { - limb0: 30097318619664137694816110820, - limb1: 51383350893236172548907998572, - limb2: 69588090172333374646612824177, - limb3: 5092012391380186850179342253 + limb0: 45785725368626789374042510696, + limb1: 10324251216144871818262645201, + limb2: 2421472701801417617, + limb3: 0 }, w1: u384 { - limb0: 12662983460479996254367053430, - limb1: 50726891143962599524087664312, - limb2: 21905354372886286589402807726, - limb3: 4909263358625606372548769931 + limb0: 71698097758563178560199846536, + limb1: 46539064330230039337716918036, + limb2: 3421226475059745560, + limb3: 0 }, w2: u384 { - limb0: 16909234233912904630561703417, - limb1: 1320491167900332600175258754, - limb2: 78492275271568391288846613243, - limb3: 48814373912771415765798060 + limb0: 76497057093628496222635120270, + limb1: 63054118650515245628997002615, + limb2: 2668130982350087108, + limb3: 0 }, w3: u384 { - limb0: 75326212871012874866852352323, - limb1: 16524183009112477131666909423, - limb2: 15462461766887641859382132023, - limb3: 1220049513792106964273029905 + limb0: 41897957430027218305890450381, + limb1: 79220519292298743478768853573, + limb2: 1810348993248048130, + limb3: 0 }, w4: u384 { - limb0: 8437539011331635625112427572, - limb1: 31179197914862536553730461208, - limb2: 40669507130288594857984952704, - limb3: 6886377701477212531991673127 + limb0: 56318278776405747491438967888, + limb1: 19922253992793476425908381435, + limb2: 668512928583505432, + limb3: 0 }, w5: u384 { - limb0: 36309965978161475980279178263, - limb1: 35395376180477787181854753128, - limb2: 71654999401436057067564647410, - limb3: 5726936154646869963516416369 + limb0: 72572368692953174654479154773, + limb1: 60396642878388474778201765204, + limb2: 3583745984096968, + limb3: 0 }, w6: u384 { - limb0: 16749100466739365944410824115, - limb1: 6737133363175240139227038505, - limb2: 3149944664072211183781011926, - limb3: 4492240477871773232450606616 + limb0: 11498765058138442312649000110, + limb1: 36504251823816302801989708332, + limb2: 178336548971226363, + limb3: 0 }, w7: u384 { - limb0: 33838978736100089387650476122, - limb1: 52608086147115360744865239548, - limb2: 21173590250637846580892845452, - limb3: 4347118428521376177675093682 + limb0: 42365475969493272106738736928, + limb1: 72618330064246464182893321403, + limb2: 1909248071970735377, + limb3: 0 }, w8: u384 { - limb0: 61667965720987986006723920101, - limb1: 22178796716797408360207475533, - limb2: 6593401934689238304538515800, - limb3: 7090789030937242034230014646 + limb0: 48912349518521414884524696912, + limb1: 47907533470625753080389298184, + limb2: 573050961631526960, + limb3: 0 }, w9: u384 { - limb0: 76449851833523876885477289998, - limb1: 26415319030834076793367942672, - limb2: 12522001675888929541835146319, - limb3: 5610482688908468464924516117 + limb0: 73363512072035293977822053253, + limb1: 3754689082262116546887872421, + limb2: 690161856276060993, + limb3: 0 }, w10: u384 { - limb0: 79157541866929209563596478908, - limb1: 18028567084735055504271466028, - limb2: 42419652919933382407846738204, - limb3: 1326004698151086755792387528 + limb0: 55653502731390386407386946803, + limb1: 8428320505617022836368029630, + limb2: 1300484821976993204, + limb3: 0 }, w11: u384 { - limb0: 26358248983045602262881196006, - limb1: 31685646632059322133030424946, - limb2: 78083932260189241048681630720, - limb3: 5262427171901586392626434919 + limb0: 22854810998258082967665591727, + limb1: 73501830944268183799394710424, + limb2: 3305750074634809491, + limb3: 0 } }, E12D { w0: u384 { - limb0: 32989039267573724178433919875, - limb1: 75510373123237207294188767625, - limb2: 17821064412437643384473113899, - limb3: 2314697403965554176206306586 + limb0: 34546184505705219798691192940, + limb1: 75142706694855062806897864752, + limb2: 1557296938922434697, + limb3: 0 }, w1: u384 { - limb0: 49767636892590960689521911670, - limb1: 708571986970809750188111598, - limb2: 42904763715593049880209347139, - limb3: 4838372465513358360041266472 + limb0: 36103993156539785434052517733, + limb1: 56946040578272752950368846067, + limb2: 1117767932316468361, + limb3: 0 }, w2: u384 { - limb0: 76636206280857770650410907325, - limb1: 68869781138087951321463936593, - limb2: 35179791290650528043306760452, - limb3: 4971681057083509913053065733 + limb0: 52942156320243857946258096612, + limb1: 74654213611243213930434881037, + limb2: 1144990202366400965, + limb3: 0 }, w3: u384 { - limb0: 68568936611347226262225285052, - limb1: 42956286395312289931080669574, - limb2: 12185006674654014472318423175, - limb3: 5175276647902732660937163154 + limb0: 2681071511166481680955213877, + limb1: 60573611674876214718550457719, + limb2: 190222364832234543, + limb3: 0 }, w4: u384 { - limb0: 40400280605068547195272498121, - limb1: 46415619163231234711092770052, - limb2: 36597174616325291611103934412, - limb3: 698812134572648830593490154 + limb0: 58843122770044600775530603289, + limb1: 39224782296569771836336283634, + limb2: 3227379261562900084, + limb3: 0 }, w5: u384 { - limb0: 26046011138923901789610587401, - limb1: 67670231088018411426619972688, - limb2: 17869207484896302672463746449, - limb3: 1158973060671342004894383248 + limb0: 12932773543919498405821633707, + limb1: 43848031433932001255013175771, + limb2: 86915864955296811, + limb3: 0 }, w6: u384 { - limb0: 54987365325223880304779548136, - limb1: 11489392279826989966789481325, - limb2: 30395750044045995786221110042, - limb3: 8018867142486761579974321181 + limb0: 61696450290307446363513682336, + limb1: 78431291219329155766663300715, + limb2: 868499180681742334, + limb3: 0 }, w7: u384 { - limb0: 58632285917771017734906316975, - limb1: 62830532626994369189090182001, - limb2: 50090589193536606062691699080, - limb3: 2083267683826127462077912426 + limb0: 149982433672422763572692602, + limb1: 34618948230831926615449794840, + limb2: 821101303698431975, + limb3: 0 }, w8: u384 { - limb0: 6880589985660811315428434695, - limb1: 16732380114593644163884267917, - limb2: 3182579847988908159814739658, - limb3: 5580855264722146597178307187 + limb0: 58948157122156113214861825131, + limb1: 69044195439479634610462998112, + limb2: 983401288847691026, + limb3: 0 }, w9: u384 { - limb0: 24674178915395014104628795958, - limb1: 56244365734817911413837002885, - limb2: 24085902339143128098886726665, - limb3: 7805096712894228188368753988 + limb0: 8890070193923260646188899588, + limb1: 15576396055912577006901083409, + limb2: 2707051980849069580, + limb3: 0 }, w10: u384 { - limb0: 60070830619207106140908247988, - limb1: 77744773004781825556617670745, - limb2: 23229477502516407394386358172, - limb3: 4873765528949503314464835065 + limb0: 78171235566734580630343464902, + limb1: 32790074693967417505981064202, + limb2: 1193518073001827393, + limb3: 0 }, w11: u384 { - limb0: 66006365947668481646637513728, - limb1: 16307874775895439071086409952, - limb2: 33794168489085240658964311987, - limb3: 7036332921916650125657641790 + limb0: 4580569820287223264045499249, + limb1: 1292444897691606558179529836, + limb2: 644606494228996541, + limb3: 0 } }, E12D { w0: u384 { - limb0: 33047845068313745981273319028, - limb1: 23198042342681753185099984097, - limb2: 46130974362080640344268623183, - limb3: 1928401618368051646053482262 + limb0: 51952948960412404724024499202, + limb1: 60265376380788849314423587544, + limb2: 3451729967295511754, + limb3: 0 }, w1: u384 { - limb0: 56445023101448379223442948836, - limb1: 10699693844843629680077462643, - limb2: 2113447655844052351579661652, - limb3: 5489797381920610369538623364 + limb0: 5464896036642464657599401979, + limb1: 26298046600223804197630530192, + limb2: 38862035331628079, + limb3: 0 }, w2: u384 { - limb0: 31806586877734024853168483751, - limb1: 16747599185670165720990273302, - limb2: 61299221187985080703548891911, - limb3: 1229319187697783832339671716 + limb0: 59411577892201543925619185303, + limb1: 43470828403152017316128934277, + limb2: 2475460383877624141, + limb3: 0 }, w3: u384 { - limb0: 27020116574466863086025132206, - limb1: 74794859616150525835320373924, - limb2: 63318921952002251767132218787, - limb3: 5362627152371078840385556052 + limb0: 44749422930780759292380053439, + limb1: 25517724502096140548629739603, + limb2: 2343856752004983787, + limb3: 0 }, w4: u384 { - limb0: 39824087743721698875330763655, - limb1: 22333668058703394007222896205, - limb2: 7278197749453535025401172050, - limb3: 2427800758112489189066472581 + limb0: 45940219949172732798265384934, + limb1: 60030864583493923960901739811, + limb2: 1560077481692236230, + limb3: 0 }, w5: u384 { - limb0: 8568725863996575216601949616, - limb1: 30755324709260402855805011703, - limb2: 67080746857595467992806801704, - limb3: 1858241577340514526063134144 + limb0: 70664695826425598375007315776, + limb1: 48664017886347699879680602854, + limb2: 792215367278012960, + limb3: 0 }, w6: u384 { - limb0: 46130126484436596318489334054, - limb1: 30727360533786283881930751355, - limb2: 35749953476047171328970128570, - limb3: 5655988041544579510270502319 + limb0: 76645288409017884125084805817, + limb1: 60625336999183537008633669809, + limb2: 3206681494657112609, + limb3: 0 }, w7: u384 { - limb0: 4408998513937225978611235579, - limb1: 60864229903135985855544973010, - limb2: 62789281196049331528962370641, - limb3: 4807276186109350106216905483 + limb0: 65008558847104371906399050911, + limb1: 57303983777086478366553664737, + limb2: 1088056372181703459, + limb3: 0 }, w8: u384 { - limb0: 54479215044344450890187488638, - limb1: 18777015386366245228157454355, - limb2: 32158039869407906065017176151, - limb3: 5781049404148711777460257642 + limb0: 26965410684119064820661422804, + limb1: 329214936222853283387143366, + limb2: 2355272841036058614, + limb3: 0 }, w9: u384 { - limb0: 22751092709551538291168634587, - limb1: 69095561077761960094248087107, - limb2: 15252461947905596288647273090, - limb3: 7584160758466518368146614661 + limb0: 57325245561605867670667281650, + limb1: 4495308360330737251194310346, + limb2: 3224371001139623740, + limb3: 0 }, w10: u384 { - limb0: 2783503421707483843415276358, - limb1: 63126136459159200091529631559, - limb2: 1409892959637569286535197681, - limb3: 408599674562130805167663387 + limb0: 27373685771484152829227914113, + limb1: 21810136896005847701094460463, + limb2: 135726481959054780, + limb3: 0 }, w11: u384 { - limb0: 33565721935154101153976576356, - limb1: 49101437328851878795629561720, - limb2: 73224968559959786587971444102, - limb3: 979659148901705211587606194 + limb0: 67639457130845490760947344281, + limb1: 11072124325140829546038534229, + limb2: 1334102869310671665, + limb3: 0 } }, E12D { w0: u384 { - limb0: 58168915748617837039005396437, - limb1: 77571093190933167131338271766, - limb2: 58675834343395188650614754880, - limb3: 3464179278810961606139713116 + limb0: 54198463714420995757145544445, + limb1: 38676926844422720412916885733, + limb2: 2757109026302614663, + limb3: 0 }, w1: u384 { - limb0: 75267466558478933876387814325, - limb1: 36449274780074796023840390355, - limb2: 60318388402234882559911395365, - limb3: 2364967227026127510809452278 + limb0: 69254403257616575896332858977, + limb1: 25771305112532696841359111447, + limb2: 3395748012088931227, + limb3: 0 }, w2: u384 { - limb0: 29217911222567823897644542406, - limb1: 46597440973629419917327261618, - limb2: 74434094825614247454793625745, - limb3: 491820937629957729031216435 + limb0: 44704720572767425833381400855, + limb1: 28310588249161543911305061236, + limb2: 1722052954430668111, + limb3: 0 }, w3: u384 { - limb0: 8274050290749014446145327643, - limb1: 71565865010034470206480205293, - limb2: 75688354461294352358563495458, - limb3: 938716077252606422127909928 + limb0: 37802001175392771473626858677, + limb1: 53265849906695427719641845554, + limb2: 1792512002773038052, + limb3: 0 }, w4: u384 { - limb0: 67699138631459184196895111667, - limb1: 48027531481711575464940238135, - limb2: 76615167948788792436592844308, - limb3: 2421252564454562314732565285 + limb0: 20733213348682806722489614925, + limb1: 34075852246346293150617301389, + limb2: 3330857185309742066, + limb3: 0 }, w5: u384 { - limb0: 38113907408569962625187094145, - limb1: 76675981856573160459002949852, - limb2: 26564656920782192237811860636, - limb3: 1402021095322999862309682450 + limb0: 69467164746482399659824085792, + limb1: 77612586090375132119957431770, + limb2: 1404644817246104830, + limb3: 0 }, w6: u384 { - limb0: 16184643354690510414599274379, - limb1: 6928456796094659947378674341, - limb2: 55604421575617941869161130878, - limb3: 4538102806792412085132510623 + limb0: 8914165154643274410600956797, + limb1: 19465578810824618442227771065, + limb2: 1816322690565728681, + limb3: 0 }, w7: u384 { - limb0: 43093766725467625805348209040, - limb1: 33215766892384916267168342255, - limb2: 52120263052377946411043472554, - limb3: 2317810384349792698642149750 + limb0: 63715387730633668675505032119, + limb1: 57126041753728793532647229677, + limb2: 2572338402275245231, + limb3: 0 }, w8: u384 { - limb0: 49436634762443127749708241608, - limb1: 33344664372385804702865426441, - limb2: 61197277084625000678749545759, - limb3: 5760889027134513819118814302 + limb0: 65740089186444402709982969862, + limb1: 43803737434143335360756423802, + limb2: 772794713725172116, + limb3: 0 }, w9: u384 { - limb0: 33622544381070636797646078678, - limb1: 32326381370470385036527637137, - limb2: 11297343551077178551566459215, - limb3: 2724749941243231978025506567 + limb0: 23843726152209785593031854745, + limb1: 19873024363480161797622988621, + limb2: 570666976431231853, + limb3: 0 }, w10: u384 { - limb0: 69218391933016794193307200795, - limb1: 19268331556305036616377800201, - limb2: 20451835692754040690843658683, - limb3: 2967366962442872137795925447 + limb0: 63756803341788771969918063567, + limb1: 34591190243864099210008805305, + limb2: 2829968216191993658, + limb3: 0 }, w11: u384 { - limb0: 70190839660514336237981690020, - limb1: 77930722530844712288474524830, - limb2: 30617300003056596396150172357, - limb3: 2704443122636671306818655039 + limb0: 64496449675783811548127343823, + limb1: 78997099946012057772379129874, + limb2: 3110008235175694008, + limb3: 0 } }, E12D { - w0: u384 { - limb0: 32180751365346380930591058001, - limb1: 68361195613962126640299251252, - limb2: 8148328108456822430712864260, - limb3: 4712370305775514378214249688 - }, - w1: u384 { - limb0: 15092865763164220636888070046, - limb1: 44273762124596184295617995789, - limb2: 12004266100719862730186822212, - limb3: 406126457413436039030476804 - }, - w2: u384 { - limb0: 5768811008539169873880003962, - limb1: 51611265232815394665093006700, - limb2: 63387584693078000191978171141, - limb3: 2995943142498419797059615729 - }, - w3: u384 { - limb0: 28192251080623082205300543059, - limb1: 75159267529067733829878999745, - limb2: 53073441088191541427474437140, - limb3: 4303195458560558738532604086 - }, - w4: u384 { - limb0: 52206679976369475692363631317, - limb1: 40525277421438831387427777767, - limb2: 29361905528602303919038997028, - limb3: 7222657320896163876462102344 - }, - w5: u384 { - limb0: 48395361302957399779767815901, - limb1: 65676454814004649651293879055, - limb2: 489257826520747633806422838, - limb3: 1723032034506624384554735740 - }, - w6: u384 { - limb0: 51660690465171263677638483928, - limb1: 47915621985345711084141921894, - limb2: 52815900855203026729419203269, - limb3: 84584150685997746302385778 - }, - w7: u384 { - limb0: 58604888442028271083539850679, - limb1: 73069139013836764195692564220, - limb2: 17925514535885518358285656390, - limb3: 3410597294201048480697543864 - }, - w8: u384 { - limb0: 78521393377660023415106869163, - limb1: 13967723210960134202038142030, - limb2: 62710256861173212371209329002, - limb3: 4105885731847914174904938873 - }, - w9: u384 { - limb0: 70792082940134035878192853298, - limb1: 9300405690411341487423397912, - limb2: 59441722493127580811686956812, - limb3: 4170509631941612233374727511 - }, - w10: u384 { - limb0: 72633713910417655928104779760, - limb1: 37074520583290176435418038293, - limb2: 76428394726185897430139716418, - limb3: 147386187662398812030087950 - }, - w11: u384 { - limb0: 36469029361898365977412304027, - limb1: 4801960096452140378176326575, - limb2: 46946094674409534333298509132, - limb3: 5741589944272304283417969854 - } + w0: u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } }, - E12D { - w0: u384 { - limb0: 65689287364267849097896443055, - limb1: 13858174877904091374640320969, - limb2: 24645677633439104890317034126, - limb3: 3729951650269999811919859100 - }, - w1: u384 { - limb0: 2240660202626641148761959502, - limb1: 46008911045098129343495291684, - limb2: 74834489164073432143958969373, - limb3: 3141494690599533700771378648 - }, - w2: u384 { - limb0: 17064164279974829218426114047, - limb1: 60980486099390616155735390345, - limb2: 33706969715986900579343643834, - limb3: 3518470699771976050300845110 - }, - w3: u384 { - limb0: 51363973083293276525436486081, - limb1: 22429551579348786583618597345, - limb2: 9964782750378979491066455781, - limb3: 2292646290428073277381119715 - }, - w4: u384 { - limb0: 35097734773725134842960695666, - limb1: 71316877223600142702768228977, - limb2: 40892163436985283680079032609, - limb3: 1573745019026902567983430871 - }, - w5: u384 { - limb0: 36268144515596983793480821140, - limb1: 64075154318699991495516786933, - limb2: 27753352105183464892149014258, - limb3: 7167935181681868771113754652 - }, - w6: u384 { - limb0: 19815934773205432160143891950, - limb1: 47779184072160964371052676400, - limb2: 576904620973585483499774033, - limb3: 6684280174436488672833267633 - }, - w7: u384 { - limb0: 11254183274349618904209286395, - limb1: 16279290516472673497822333664, - limb2: 56360593935683122264305043331, - limb3: 535746699472443592789172737 - }, - w8: u384 { - limb0: 52472336368839121138854521865, - limb1: 19489759512602580259854722042, - limb2: 19573990110573074695600002455, - limb3: 4253512894414914638481992766 - }, - w9: u384 { - limb0: 71003701350288389130575766792, - limb1: 40366248103426910243832012954, - limb2: 40116515432188389083738877752, - limb3: 7893797130928622565441637708 - }, - w10: u384 { - limb0: 3572416407474566180146304524, - limb1: 6075844007726948227251940537, - limb2: 49264996218119528573180034529, - limb3: 7482041070874473607343252578 - }, - w11: u384 { - limb0: 58732648377119198324638266297, - limb1: 2039423562429317746730614593, - limb2: 75949018029685964757457912026, - limb3: 7535767002645190631017462382 - } + ]; + let big_Q: Array = array![ + u384 { + limb0: 4543924799162825723273643566, + limb1: 63725720735051378693759129167, + limb2: 2685788670990756458, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 40500302325786220776890368785, - limb1: 24891535969426980462973137196, - limb2: 3742936174436529351095198056, - limb3: 6536619131976788751437101878 - }, - w1: u384 { - limb0: 48188965127346012640325752297, - limb1: 78977936394207881160703273111, - limb2: 78256957352888974154524428293, - limb3: 5794169945785722486687601341 - }, - w2: u384 { - limb0: 19636308444415205561406019549, - limb1: 30123420554002929939910768378, - limb2: 25982751156363998375857885060, - limb3: 3255251170666899507600015521 - }, - w3: u384 { - limb0: 8682625865057431857514193227, - limb1: 69502966180799629192623913326, - limb2: 72098555757371843577018754226, - limb3: 7914310021695074897009939105 - }, - w4: u384 { - limb0: 31339112969762094177640185449, - limb1: 33127893000197629500744921326, - limb2: 40228144259644533253139235591, - limb3: 2430376873678833508653794590 - }, - w5: u384 { - limb0: 13226914140714013193884160994, - limb1: 9251509487655153901438509985, - limb2: 13166964694020561783451380907, - limb3: 2703412113256186543233933737 - }, - w6: u384 { - limb0: 11949036978005835934464267775, - limb1: 12291758785562842862372717126, - limb2: 58879825493573043514118415143, - limb3: 1405681932833416757076138191 - }, - w7: u384 { - limb0: 43844396594582757050798489893, - limb1: 42619217974859493164460948418, - limb2: 27086619157746530990920752171, - limb3: 6666035816078091253211113415 - }, - w8: u384 { - limb0: 21569096022750635025577372155, - limb1: 75623368339031642848466577820, - limb2: 54833519652743319641199063343, - limb3: 5431376952339295038820784827 - }, - w9: u384 { - limb0: 44423101293889708243838319771, - limb1: 29596119591222702183346736970, - limb2: 60245196321985050706087378744, - limb3: 5961726481146226876070519428 - }, - w10: u384 { - limb0: 38653472691587207691664758894, - limb1: 20763939322638012218115593235, - limb2: 16765217720292994565200571871, - limb3: 155412482926827230601163464 - }, - w11: u384 { - limb0: 25425909172823439482545110280, - limb1: 57824264034101896548475996918, - limb2: 16784622879481310833137661527, - limb3: 7740396016193596998471964346 - } + u384 { + limb0: 10959442833774360492630455052, + limb1: 67023809822293951770494699625, + limb2: 330595259550241231, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 61871801876575529850221710790, - limb1: 65550112193154885769220600753, - limb2: 15163624703965533319315476734, - limb3: 5940422228787739921849008620 - }, - w1: u384 { - limb0: 65236858055684046568412198889, - limb1: 11016347015383880729988707712, - limb2: 46189974636067927152433438461, - limb3: 1545471098518954706693633994 - }, - w2: u384 { - limb0: 54520323794997658278260219197, - limb1: 66998344937713679292378932913, - limb2: 5706088304440608004781100130, - limb3: 5151253283799896896648353324 - }, - w3: u384 { - limb0: 47564761829368664330605690633, - limb1: 35672779972746004255638971125, - limb2: 67098794153119359728749719555, - limb3: 1590131046698894621811027146 - }, - w4: u384 { - limb0: 40002503981861068693755315679, - limb1: 63230294868821310054194714866, - limb2: 12323571275200463247727992772, - limb3: 3061061873063425352349566527 - }, - w5: u384 { - limb0: 64126848754071096074364706848, - limb1: 49471827944752636467736900186, - limb2: 16112514352280688797494196813, - limb3: 942908585688898189488854876 - }, - w6: u384 { - limb0: 57658766307093181831908941149, - limb1: 60690864470474842337541600763, - limb2: 69081867212935368483661886325, - limb3: 7593086062461807897037804814 - }, - w7: u384 { - limb0: 23104035831115469052324348675, - limb1: 3867077045305176938098576021, - limb2: 6582452541282837797918179127, - limb3: 6527732425324746785028150056 - }, - w8: u384 { - limb0: 79068933508610393655910877177, - limb1: 3006635297728318197530959005, - limb2: 51780950918779652489840836606, - limb3: 6068832681778333778824082215 - }, - w9: u384 { - limb0: 10247381949856814141708095508, - limb1: 48253189918533556081625277045, - limb2: 77874843737104549490810836445, - limb3: 2370929197231791959122227353 - }, - w10: u384 { - limb0: 39588879660811788411511867936, - limb1: 60541407081775683133239281625, - limb2: 45215513640883031999153995039, - limb3: 3421959085168869488550660292 - }, - w11: u384 { - limb0: 52289191272823679346578137924, - limb1: 3486965526539981694765653508, - limb2: 24175333551598170689318099015, - limb3: 959256830671909257258851989 - } + u384 { + limb0: 57012439784564954757916525478, + limb1: 26041647098112767181528212346, + limb2: 971826159007659235, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 19693128333831473441973347200, - limb1: 42831010054119334084230450999, - limb2: 63846707139688198750090799375, - limb3: 238290804072150812563566436 - }, - w1: u384 { - limb0: 66242938479167882319669980653, - limb1: 46295833796186856482596073758, - limb2: 42931191115604116897958507886, - limb3: 5843427959914322242972141139 - }, - w2: u384 { - limb0: 49215310754974522332118676772, - limb1: 29172879273815576865395506164, - limb2: 30973780825701912546507374178, - limb3: 6657407078234311287924750933 - }, - w3: u384 { - limb0: 42146643242003891382904498256, - limb1: 43476668547998992055679943944, - limb2: 22321566705658677525597418004, - limb3: 129674359536119619730896671 - }, - w4: u384 { - limb0: 45748306074272547603579688773, - limb1: 56115214783684665128792716143, - limb2: 52507627768727297865499253535, - limb3: 7528380115307727648172820601 - }, - w5: u384 { - limb0: 20493727950428514984343394376, - limb1: 48348503790628966875438302368, - limb2: 26830020036183707717625882154, - limb3: 516245476159091049660032713 - }, - w6: u384 { - limb0: 38566673118500025189514044980, - limb1: 17551706225483449565182593861, - limb2: 11223628053141770280433992286, - limb3: 7224082763881664630805341848 - }, - w7: u384 { - limb0: 41312790839387098945101673471, - limb1: 47977309412346328161479935515, - limb2: 15207903023430312779783023831, - limb3: 238499908199058504012264440 - }, - w8: u384 { - limb0: 4609324091959169836755726041, - limb1: 66424583748021924320227256501, - limb2: 27340998760786060495297374460, - limb3: 854983461578071758286040525 - }, - w9: u384 { - limb0: 66075840559517974360198097070, - limb1: 54238334548001967896397203511, - limb2: 16233652840297798617236006585, - limb3: 6312282073346550296095931670 - }, - w10: u384 { - limb0: 10836003615564210937654509593, - limb1: 79178326337930640102046222392, - limb2: 11769280441626165132912746917, - limb3: 5160369822244239604359165300 - }, - w11: u384 { - limb0: 738436081502427784081724765, - limb1: 35865110628783330118638892828, - limb2: 51642205277526823629906267148, - limb3: 6647692408127034472366061956 - } + u384 { + limb0: 26176453569812512927054337745, + limb1: 75567521343854266515383419687, + limb2: 1517526368286501346, + limb3: 0 }, - E12D { - w0: u384 { - limb0: 78044406163063246081185320246, - limb1: 52514832585166417725534783465, - limb2: 61727661134100657661519909720, - limb3: 4924327143263605373131873153 - }, - w1: u384 { - limb0: 56129334063507451668195500390, - limb1: 1295469407629219462883800593, - limb2: 2409895099541466426498763284, - limb3: 2872518485243494370553325275 - }, - w2: u384 { - limb0: 30638416695999161827822141830, - limb1: 40236841147236355634982536133, - limb2: 21188342596372969468800023068, - limb3: 2281001067570034771523814438 - }, - w3: u384 { - limb0: 40613610350252074606757802575, - limb1: 8119693461293823895576441581, - limb2: 362403006607451551262635180, - limb3: 4129422726605382180801442339 - }, - w4: u384 { - limb0: 76441256390462253815759040686, - limb1: 61560833069605188811852216886, - limb2: 66512457584384951303360403227, - limb3: 7688676552855322435512689743 - }, - w5: u384 { - limb0: 41596250420158021099873253629, - limb1: 65942347456409461645373767226, - limb2: 64037445313764755268714833337, - limb3: 3289386810798385306746380469 - }, - w6: u384 { - limb0: 45298617740731082406715238264, - limb1: 78945786586976376011802087827, - limb2: 63265420935628451537057340979, - limb3: 2991201144681316133976296125 - }, - w7: u384 { - limb0: 72621570758956174948477344589, - limb1: 62486311241639226961972359166, - limb2: 68930666784185037515904891814, - limb3: 450786098651110902039338508 - }, - w8: u384 { - limb0: 40691829032370607560803541156, - limb1: 13489108291248451110140972788, - limb2: 55419885225471777588518020210, - limb3: 752569544928677100726473794 - }, - w9: u384 { - limb0: 37503469638126881256538110263, - limb1: 16630757724145299512227190101, - limb2: 49122117196058824745066835697, - limb3: 4056377476813199862169565331 - }, + u384 { + limb0: 4635095916491694909460638622, + limb1: 4139320336051645862701135957, + limb2: 2205777903708634715, + limb3: 0 + }, + u384 { + limb0: 625860021473275907160628226, + limb1: 75770102448913194937711333612, + limb2: 1051750703305306306, + limb3: 0 + }, + u384 { + limb0: 29607924733900552805328652778, + limb1: 56060663622450454488572579001, + limb2: 3309227585534208307, + limb3: 0 + }, + u384 { + limb0: 70683584267389059859537210147, + limb1: 37430418218278806952123882665, + limb2: 1347696402390778709, + limb3: 0 + }, + u384 { + limb0: 72927087012188284125612330259, + limb1: 56443972777811699276423252682, + limb2: 2880624029468980354, + limb3: 0 + }, + u384 { + limb0: 42140610457385420521510768140, + limb1: 68186946416856570735925125642, + limb2: 3240154474916389911, + limb3: 0 + }, + u384 { + limb0: 51888741239652251345831497485, + limb1: 60438738978562383822357826783, + limb2: 2246465323254666237, + limb3: 0 + }, + u384 { + limb0: 45746643101350211129310418631, + limb1: 21042656186854785865281794154, + limb2: 592512629519220325, + limb3: 0 + }, + u384 { + limb0: 67512166318696036157016653452, + limb1: 34717338577931397452743645095, + limb2: 2581976305451657556, + limb3: 0 + }, + u384 { + limb0: 53506467296552837893800984215, + limb1: 71961787135083770895695377656, + limb2: 903512191057238004, + limb3: 0 + }, + u384 { + limb0: 32372577427604559082344360835, + limb1: 68571402079970216840259176958, + limb2: 1141662132323492859, + limb3: 0 + }, + u384 { + limb0: 20949897033391519212287903084, + limb1: 77776684205108906985967656149, + limb2: 2421538435375560982, + limb3: 0 + }, + u384 { + limb0: 51048759869767095006190194309, + limb1: 61406027872656592392810172407, + limb2: 1144676081115346080, + limb3: 0 + }, + u384 { + limb0: 67515081501371951890857958696, + limb1: 16034965058407399471359364286, + limb2: 748937001202948537, + limb3: 0 + }, + u384 { + limb0: 22074983526432215133027965865, + limb1: 64195034458533149824787666341, + limb2: 3200672528084704055, + limb3: 0 + }, + u384 { + limb0: 32617255856017371394964686321, + limb1: 59184218942253206665589366731, + limb2: 3096797357484834720, + limb3: 0 + }, + u384 { + limb0: 8948496562270526330094514541, + limb1: 12612666477980012736806359927, + limb2: 2137595033266429466, + limb3: 0 + }, + u384 { + limb0: 71588409888115903273876063824, + limb1: 27203666330325561161247342606, + limb2: 1101794943773271726, + limb3: 0 + }, + u384 { + limb0: 77174740725772825700593436254, + limb1: 25716097719909095274538851449, + limb2: 2143175857891107074, + limb3: 0 + }, + u384 { + limb0: 44168571005396298790687645589, + limb1: 51675107254659349270908111528, + limb2: 867015118807392820, + limb3: 0 + }, + u384 { + limb0: 15154768374433854958817917988, + limb1: 28055194668668033582513592950, + limb2: 125967059835897382, + limb3: 0 + }, + u384 { + limb0: 32114733086231741371912598749, + limb1: 3116251685401924315723891244, + limb2: 1298778875989513480, + limb3: 0 + }, + u384 { + limb0: 1375993849278421591032375251, + limb1: 75545965397360151877092424070, + limb2: 3315798189682903654, + limb3: 0 + }, + u384 { + limb0: 25270205849275333020417781936, + limb1: 34803272140143256613988712571, + limb2: 639573435543503245, + limb3: 0 + }, + u384 { + limb0: 63715825462150402108394352750, + limb1: 23039619574117054736122854940, + limb2: 273587185287297004, + limb3: 0 + }, + u384 { + limb0: 7580701237637548164168250688, + limb1: 25117420341635980931061435783, + limb2: 3185670779917048264, + limb3: 0 + }, + u384 { + limb0: 57813595922490000956552394147, + limb1: 36551800434794519718329899877, + limb2: 262826737637494802, + limb3: 0 + }, + u384 { + limb0: 47479540613846057992664513314, + limb1: 49051627707600436038621725760, + limb2: 620778534281364340, + limb3: 0 + }, + u384 { + limb0: 36801740786687113343614240655, + limb1: 51147132954931912082149876605, + limb2: 2346515516626911790, + limb3: 0 + }, + u384 { + limb0: 24250796300750398942181267430, + limb1: 61708937349289754469708888236, + limb2: 1830211584362502892, + limb3: 0 + }, + u384 { + limb0: 75392548978849138851279347777, + limb1: 1582899077612263955123852141, + limb2: 2685057938486290543, + limb3: 0 + }, + u384 { + limb0: 45834205836100880543213619025, + limb1: 54195929942073381200578377399, + limb2: 3065784719104341116, + limb3: 0 + }, + u384 { + limb0: 70784620124491220003782080111, + limb1: 30919584050690839801456930244, + limb2: 2352818237071393051, + limb3: 0 + }, + u384 { + limb0: 72594773429375278163032362645, + limb1: 71569214074610006586583108077, + limb2: 271977668393965791, + limb3: 0 + }, + u384 { + limb0: 20914618866610991930316215002, + limb1: 13195335353878872776566043540, + limb2: 1330999858416326987, + limb3: 0 + }, + u384 { + limb0: 69482942780067335372797096333, + limb1: 71334272171693977916054842598, + limb2: 29811136765186013, + limb3: 0 + }, + u384 { + limb0: 64247478219682178325935778090, + limb1: 57221855183099093431197201919, + limb2: 85670073760627383, + limb3: 0 + }, + u384 { + limb0: 69533921909221990638279595721, + limb1: 58171580092299814277845681478, + limb2: 6040527695838962, + limb3: 0 + }, + u384 { + limb0: 57501440423685929614743096537, + limb1: 73290173615172770192138708079, + limb2: 3243846018499397046, + limb3: 0 + }, + u384 { + limb0: 1096615999746398948736963663, + limb1: 71173611476217940854050017326, + limb2: 2635346159090350520, + limb3: 0 + }, + u384 { + limb0: 50400256882559121982109910589, + limb1: 38323398157149353038013655350, + limb2: 2547565864914229246, + limb3: 0 + }, + u384 { + limb0: 36101695883555592884271508973, + limb1: 38072143570165332141290962826, + limb2: 791498304187017475, + limb3: 0 + }, + u384 { + limb0: 74771713837233393392777308299, + limb1: 28961078935735563243917312055, + limb2: 2701058354487962135, + limb3: 0 + }, + u384 { + limb0: 26973161600416210496399729421, + limb1: 60339818602265131474821068454, + limb2: 2308439056256173950, + limb3: 0 + }, + u384 { + limb0: 75073121137450350657862784959, + limb1: 25231014820537821519750182456, + limb2: 2546645993943371754, + limb3: 0 + }, + u384 { + limb0: 37076167844978629145616714308, + limb1: 11457779356672692513776128251, + limb2: 742012908414576964, + limb3: 0 + }, + u384 { + limb0: 71312463761913709932866881424, + limb1: 59533033968329071099420861458, + limb2: 1798873679227288586, + limb3: 0 + }, + u384 { + limb0: 30876707927270942687445775368, + limb1: 64113367974705402965145984278, + limb2: 3331782992502787877, + limb3: 0 + }, + u384 { + limb0: 7795241450723783625800853950, + limb1: 47545783757775205354668582543, + limb2: 879299171691426714, + limb3: 0 + }, + u384 { + limb0: 79102134640384091123988166620, + limb1: 56539980482352216492276216902, + limb2: 83333161667289846, + limb3: 0 + }, + u384 { + limb0: 41703488162990884576376594685, + limb1: 4128646999502052167199176489, + limb2: 3116351466512716279, + limb3: 0 + }, + u384 { + limb0: 27745805998106432169416726072, + limb1: 52445680282872830827615862861, + limb2: 1832541052944450588, + limb3: 0 + }, + u384 { + limb0: 55936340692831836267310703385, + limb1: 18752482790350071170012254418, + limb2: 2679807382959991529, + limb3: 0 + }, + u384 { + limb0: 66045160172355976624023705069, + limb1: 33428941784935969500031101673, + limb2: 210322054234390754, + limb3: 0 + }, + u384 { + limb0: 69730944432649843915436661434, + limb1: 75880739133830901374330368443, + limb2: 774403210044650700, + limb3: 0 + }, + u384 { + limb0: 22347587027763931007168167394, + limb1: 65617048168778391841551253159, + limb2: 46238664350047012, + limb3: 0 + }, + u384 { + limb0: 60928875453192974211300687288, + limb1: 57293641434141440213085945495, + limb2: 2291245777806213034, + limb3: 0 + }, + u384 { + limb0: 63745508797731768271542655670, + limb1: 59015213523276759164908968556, + limb2: 245427336841943077, + limb3: 0 + }, + u384 { + limb0: 4284717395296546812232760549, + limb1: 15622413091600761514759220636, + limb2: 1691573838781102982, + limb3: 0 + }, + u384 { + limb0: 3254691526038868348720542525, + limb1: 46548078232441987459440755988, + limb2: 3057113503155461860, + limb3: 0 + }, + u384 { + limb0: 70393732930432822266057272309, + limb1: 37949603956728849399150558760, + limb2: 891404738536900558, + limb3: 0 + }, + u384 { + limb0: 34115673100530053106882815815, + limb1: 36941661512233452407570021422, + limb2: 3345884309542888919, + limb3: 0 + }, + u384 { + limb0: 43799836761696246993191853689, + limb1: 2774809220529349069320446691, + limb2: 2147047766550108234, + limb3: 0 + }, + u384 { + limb0: 14573212982845584588247281084, + limb1: 78485224570036879596894435895, + limb2: 2223791378068789202, + limb3: 0 + }, + u384 { + limb0: 72258661966726652810638340711, + limb1: 1459721528900778290653297713, + limb2: 1217120983608740691, + limb3: 0 + }, + u384 { + limb0: 9194777805211257618892282199, + limb1: 57318897682045324457381720052, + limb2: 2883997558014780993, + limb3: 0 + }, + u384 { + limb0: 49437390049954627337603911689, + limb1: 19897898153370034647548526159, + limb2: 1441686121304330634, + limb3: 0 + }, + u384 { + limb0: 12624041755440436455303540203, + limb1: 41595349558133950216294573509, + limb2: 3397330685086093649, + limb3: 0 + }, + u384 { + limb0: 15379779055300941069030949862, + limb1: 37351404749117687047760312894, + limb2: 776674734599386049, + limb3: 0 + }, + u384 { + limb0: 61609484838111352767231366447, + limb1: 50775242263075416997286569725, + limb2: 2689471554752816242, + limb3: 0 + }, + u384 { + limb0: 41742809279277610891964067325, + limb1: 34177947544343585574312791307, + limb2: 2437214956409850105, + limb3: 0 + }, + u384 { + limb0: 26800671933413803730090330007, + limb1: 3317719587025907761402624262, + limb2: 1007837591079003324, + limb3: 0 + }, + u384 { + limb0: 69683160498168963965170499690, + limb1: 39561557804736978929550028510, + limb2: 601726118708330189, + limb3: 0 + }, + u384 { + limb0: 60415405938047730959630263962, + limb1: 68327650553447002870194658342, + limb2: 1753862292575795173, + limb3: 0 + }, + u384 { + limb0: 36049608718338202138433480628, + limb1: 3518711306876342779124433611, + limb2: 1892461922858310002, + limb3: 0 + }, + u384 { + limb0: 65121157567649433746176737358, + limb1: 41670053276526940317066912372, + limb2: 2838706235161881167, + limb3: 0 + }, + u384 { + limb0: 39674167644186383449429667097, + limb1: 11205579732879646047918469703, + limb2: 2392490989122967895, + limb3: 0 + }, + u384 { + limb0: 38627916259769536382373088761, + limb1: 39136880387436627025685214042, + limb2: 3426358390413888438, + limb3: 0 + }, + u384 { + limb0: 7306607900177242858902731562, + limb1: 43138915967003356165827903130, + limb2: 5868917555671170, + limb3: 0 + }, + u384 { + limb0: 67111997354612300623009716227, + limb1: 18540747792551303098967649759, + limb2: 2005414686122920074, + limb3: 0 + }, + u384 { + limb0: 27466398543870415938974627296, + limb1: 59835727060034421347564187839, + limb2: 1891166773747605578, + limb3: 0 + }, + u384 { + limb0: 8558770510044306934313981924, + limb1: 40866644776116781881548838452, + limb2: 3254280505881738412, + limb3: 0 + }, + u384 { + limb0: 29820297926503729939077673822, + limb1: 40836628997185275728970473918, + limb2: 378694386225247566, + limb3: 0 + }, + u384 { + limb0: 73375192182840598954851444723, + limb1: 23626458242322413767675798695, + limb2: 2055199601693547493, + limb3: 0 + }, + u384 { + limb0: 28689287538636241632345010796, + limb1: 48430029188136331642918804948, + limb2: 2822589435959801289, + limb3: 0 + }, + u384 { + limb0: 52417664067207316315340043226, + limb1: 50084725439765653779459890790, + limb2: 3068064725359699711, + limb3: 0 + }, + u384 { + limb0: 63218971245953178841640285686, + limb1: 77546568512794716757550406622, + limb2: 629864593963916937, + limb3: 0 + }, + u384 { + limb0: 184362118199510850471531040, + limb1: 13310489313192808536371711135, + limb2: 1561099552363480912, + limb3: 0 + }, + u384 { + limb0: 45236256041423090165055977319, + limb1: 57488147725968512085054064971, + limb2: 427912613664435752, + limb3: 0 + }, + u384 { + limb0: 50196508256547118367033555714, + limb1: 22604311945536327257653586636, + limb2: 2913037851613708831, + limb3: 0 + }, + u384 { + limb0: 37257146874325334450440346564, + limb1: 77045646156829238163999003614, + limb2: 2620684117776724721, + limb3: 0 + }, + u384 { + limb0: 67640632892742160417324344327, + limb1: 43845891240527655947500828129, + limb2: 917149848595779867, + limb3: 0 + }, + u384 { + limb0: 71195172900135421386735610677, + limb1: 75561828584337129425531547900, + limb2: 3482028759996996880, + limb3: 0 + }, + u384 { + limb0: 6540307097749030999128509792, + limb1: 79135980203848395486316515431, + limb2: 2738217708511358812, + limb3: 0 + }, + u384 { + limb0: 67492277854156312868823075841, + limb1: 78971476701429928674019464367, + limb2: 2406158424030802951, + limb3: 0 + }, + u384 { + limb0: 37836912822438670617331658523, + limb1: 57330784952579670981428650574, + limb2: 2667763783969158569, + limb3: 0 + }, + u384 { + limb0: 8390135713823073429907294794, + limb1: 28643454080893241226100739705, + limb2: 1501903695759766012, + limb3: 0 + }, + u384 { + limb0: 6860783913846990528571891665, + limb1: 38800398873781856953789857531, + limb2: 1080952069279259226, + limb3: 0 + }, + u384 { + limb0: 4716306258252746967130083424, + limb1: 52564039923043087667670280220, + limb2: 3278428939024813920, + limb3: 0 + }, + u384 { + limb0: 72924318052614261667331036962, + limb1: 6723593930113215986786054790, + limb2: 1641196733258516696, + limb3: 0 + }, + u384 { + limb0: 48267140908551714050333008046, + limb1: 56058526873407525738363026709, + limb2: 1013936458652435090, + limb3: 0 + }, + u384 { + limb0: 25405073956252567993913653630, + limb1: 23105491197019258525302481393, + limb2: 158179025522962930, + limb3: 0 + }, + u384 { + limb0: 42158354798316796979388969841, + limb1: 42433563437827954262769832845, + limb2: 1268485352699683093, + limb3: 0 + }, + u384 { + limb0: 30420792792066715646600553464, + limb1: 46358134870610356295930296470, + limb2: 350403112104042189, + limb3: 0 + }, + u384 { + limb0: 11684969053001871340738450362, + limb1: 4638928234391705664506543226, + limb2: 3253320165107964707, + limb3: 0 + }, + u384 { + limb0: 54393627260536852103502911815, + limb1: 40476384041743326608236422187, + limb2: 54377565938536274, + limb3: 0 + }, + u384 { + limb0: 45781146262911813319891004920, + limb1: 19232020545713668325172628803, + limb2: 3430935294610778895, + limb3: 0 + }, + u384 { + limb0: 13205825940231534331094324174, + limb1: 68150625678581612793689878832, + limb2: 41714033244312221, + limb3: 0 + }, + u384 { + limb0: 55488462506766629243751325365, + limb1: 21759079814599649892980004995, + limb2: 345836623347368291, + limb3: 0 + }, + u384 { + limb0: 52148213722767218839276721346, + limb1: 2859246161468534333981953154, + limb2: 2142819401810718317, + limb3: 0 + } + ]; + let precomputed_miller_loop_result: Option = Option::None; + let small_Q: Option = Option::None; + + let res = multi_pairing_check_bn254_3_pairs( + pair0, + pair1, + pair2, + lambda_root, + lambda_root_inverse, + w, + Ris.span(), + big_Q, + precomputed_miller_loop_result, + small_Q + ); + assert!(res); + } + + + #[test] + fn BN254_mpcheck_3P_with_extra_m() { + let pair0: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 34399334629840442660845209013, + limb1: 11622521964330367761798127805, + limb2: 1442010974130927617, + limb3: 0 + }, + y: u384 { + limb0: 78999688876163110811481841047, + limb1: 74773866536591008598068915759, + limb2: 1066046158971752493, + limb3: 0 + } + }, + q: G2Point { + x0: u384 { + limb0: 36444467523455710008806959626, + limb1: 46967712129888760580083014137, + limb2: 1446832769159411256, + limb3: 0 + }, + x1: u384 { + limb0: 26007579772597093211547926310, + limb1: 35070174430050209204537160718, + limb2: 2585910415241199351, + limb3: 0 + }, + y0: u384 { + limb0: 38408214285615766760345478652, + limb1: 53413588526762889116126031762, + limb2: 2757132923836411071, + limb3: 0 + }, + y1: u384 { + limb0: 62488648829261311047339415388, + limb1: 68721959232506222509456818126, + limb2: 258001665812062098, + limb3: 0 + } + } + }; + let pair1: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 34399334629840442660845209013, + limb1: 11622521964330367761798127805, + limb2: 1442010974130927617, + limb3: 0 + }, + y: u384 { + limb0: 78999688876163110811481841047, + limb1: 74773866536591008598068915759, + limb2: 1066046158971752493, + limb3: 0 + } + }, + q: G2Point { + x0: u384 { + limb0: 36444467523455710008806959626, + limb1: 46967712129888760580083014137, + limb2: 1446832769159411256, + limb3: 0 + }, + x1: u384 { + limb0: 26007579772597093211547926310, + limb1: 35070174430050209204537160718, + limb2: 2585910415241199351, + limb3: 0 + }, + y0: u384 { + limb0: 38408214285615766760345478652, + limb1: 53413588526762889116126031762, + limb2: 2757132923836411071, + limb3: 0 + }, + y1: u384 { + limb0: 62488648829261311047339415388, + limb1: 68721959232506222509456818126, + limb2: 258001665812062098, + limb3: 0 + } + } + }; + let pair2: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 34399334629840442660845209013, + limb1: 11622521964330367761798127805, + limb2: 1442010974130927617, + limb3: 0 + }, + y: u384 { + limb0: 78999688876163110811481841047, + limb1: 74773866536591008598068915759, + limb2: 1066046158971752493, + limb3: 0 + } + }, + q: G2Point { + x0: u384 { + limb0: 36444467523455710008806959626, + limb1: 46967712129888760580083014137, + limb2: 1446832769159411256, + limb3: 0 + }, + x1: u384 { + limb0: 26007579772597093211547926310, + limb1: 35070174430050209204537160718, + limb2: 2585910415241199351, + limb3: 0 + }, + y0: u384 { + limb0: 38408214285615766760345478652, + limb1: 53413588526762889116126031762, + limb2: 2757132923836411071, + limb3: 0 + }, + y1: u384 { + limb0: 62488648829261311047339415388, + limb1: 68721959232506222509456818126, + limb2: 258001665812062098, + limb3: 0 + } + } + }; + let lambda_root = E12D { + w0: u384 { + limb0: 52065075707221929842149790333, + limb1: 2563771708005191729529613504, + limb2: 504434028209515045, + limb3: 0 + }, + w1: u384 { + limb0: 75723931276643742996971591949, + limb1: 45454951558750158410774559216, + limb2: 111260306685149993, + limb3: 0 + }, + w2: u384 { + limb0: 73704542277418954786172992115, + limb1: 72907074541345714074407590229, + limb2: 705601261652404887, + limb3: 0 + }, + w3: u384 { + limb0: 11153504230733254471421045220, + limb1: 79105190831078252999489201102, + limb2: 1901157378985971864, + limb3: 0 + }, + w4: u384 { + limb0: 70461810215331189661949501061, + limb1: 65952545618138006450343989383, + limb2: 2798638515849571983, + limb3: 0 + }, + w5: u384 { + limb0: 3638947677676638013655119853, + limb1: 39415159213476282725670550804, + limb2: 1048911600451609439, + limb3: 0 + }, + w6: u384 { + limb0: 75840398164719011780773462685, + limb1: 47710229333854272848787058309, + limb2: 2790262448055221776, + limb3: 0 + }, + w7: u384 { + limb0: 24679212885705997196311935936, + limb1: 14045379664758200995198527246, + limb2: 3191778684307759665, + limb3: 0 + }, + w8: u384 { + limb0: 27361265700286942047854055843, + limb1: 78182574737450573764610678955, + limb2: 2705592921775137346, + limb3: 0 + }, + w9: u384 { + limb0: 45978184793504853182808648690, + limb1: 2929304795226647780376577433, + limb2: 3081573332664091477, + limb3: 0 + }, + w10: u384 { + limb0: 27366109371140106238524310542, + limb1: 58098680633133403973461629167, + limb2: 1479319987230630828, + limb3: 0 + }, + w11: u384 { + limb0: 78744763744462144356459569429, + limb1: 48476023510757239590669852503, + limb2: 684979968047635305, + limb3: 0 + } + }; + let lambda_root_inverse = E12D { + w0: u384 { + limb0: 26145707182029849894926069812, + limb1: 31682204140060994130179729710, + limb2: 1056498765118151090, + limb3: 0 + }, + w1: u384 { + limb0: 26924650026273727425724701862, + limb1: 29931369729302839861981222601, + limb2: 1999406657227840501, + limb3: 0 + }, + w2: u384 { + limb0: 46314495994875041849671787394, + limb1: 65922884442297166256772998478, + limb2: 23142300159704122, + limb3: 0 + }, + w3: u384 { + limb0: 10708073961883174992553600356, + limb1: 33256715279319905282238954222, + limb2: 1068894020881992867, + limb3: 0 + }, + w4: u384 { + limb0: 64099248884134851464989747320, + limb1: 680880718828873633627582426, + limb2: 1461172904759977901, + limb3: 0 + }, + w5: u384 { + limb0: 49726254725557653591774812144, + limb1: 74682906367702882429152553497, + limb2: 3157470069718481399, + limb3: 0 + }, + w6: u384 { + limb0: 58142753313140803798049700764, + limb1: 75986334777575723811713709421, + limb2: 1988438426265448412, + limb3: 0 + }, + w7: u384 { + limb0: 41304596474556504651978765747, + limb1: 18174058384368576819720933918, + limb2: 116436928043128458, + limb3: 0 + }, + w8: u384 { + limb0: 46832189880168664837956335138, + limb1: 44121056787722195504026005674, + limb2: 3058851641656940787, + limb3: 0 + }, + w9: u384 { + limb0: 167832828334620290018582715, + limb1: 27114371911890122242577310785, + limb2: 250952580644907652, + limb3: 0 + }, + w10: u384 { + limb0: 24409153637275100864272210253, + limb1: 61001240340975005031671102335, + limb2: 643298211136603609, + limb3: 0 + }, + w11: u384 { + limb0: 23542885475074782234459062879, + limb1: 42659961724463316689934734132, + limb2: 2998562870040637932, + limb3: 0 + } + }; + let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 35717919122505863182793101258, + limb1: 38321232967395819819318928199, + limb2: 33653293845735846, + limb3: 0 + }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 60126610212574038899502857656, + limb1: 7521540037295293717633716927, + limb2: 2853604986499631260, + limb3: 0 + } + }; + let Ris: Array = array![ + E12D { + w0: u384 { + limb0: 60898444033243718920377807675, + limb1: 5681484021289789294535480555, + limb2: 1064329070269185626, + limb3: 0 + }, + w1: u384 { + limb0: 53492349782522081384125691337, + limb1: 67481848691501710867282277803, + limb2: 1491424384082509144, + limb3: 0 + }, + w2: u384 { + limb0: 33782539780217539067480777848, + limb1: 40028073958717035115954133923, + limb2: 2170327936513230285, + limb3: 0 + }, + w3: u384 { + limb0: 11498463124694051330240548868, + limb1: 31779314301916008729924475303, + limb2: 2800760613529909178, + limb3: 0 + }, + w4: u384 { + limb0: 9025253385278600350377787149, + limb1: 36979815584062148402787304982, + limb2: 201568302098066813, + limb3: 0 + }, + w5: u384 { + limb0: 74863030714577762559714044791, + limb1: 69314563605818378171620972834, + limb2: 1151186942674578515, + limb3: 0 + }, + w6: u384 { + limb0: 34538557321727635603974724853, + limb1: 59222102173356427518332978610, + limb2: 1812254627635866822, + limb3: 0 + }, + w7: u384 { + limb0: 3648646146737541690367911968, + limb1: 6030092651212521140479630921, + limb2: 2777683556709155081, + limb3: 0 + }, + w8: u384 { + limb0: 63880261422513377322971661, + limb1: 72816041243629202504055166255, + limb2: 2282621938628748160, + limb3: 0 + }, + w9: u384 { + limb0: 13820339372062284675976250819, + limb1: 21447176573629646850325665690, + limb2: 2715236139442463616, + limb3: 0 + }, + w10: u384 { + limb0: 38103060962353665009261847440, + limb1: 35051556780291152750316085576, + limb2: 2481597960321556812, + limb3: 0 + }, + w11: u384 { + limb0: 53342977366074686845873089193, + limb1: 52609876074632675357747632852, + limb2: 1499675370355712681, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 18194995779353060947428755795, + limb1: 61068731190994299942641866830, + limb2: 2031313565871032123, + limb3: 0 + }, + w1: u384 { + limb0: 42732635715672991413000726121, + limb1: 53397567376514387598104960239, + limb2: 3474581422776927775, + limb3: 0 + }, + w2: u384 { + limb0: 38146832660532651888613730949, + limb1: 47608673529406938464000447684, + limb2: 3243144859916773978, + limb3: 0 + }, + w3: u384 { + limb0: 15567595146631121399387517730, + limb1: 73061187814114715762615849405, + limb2: 1846384360484416044, + limb3: 0 + }, + w4: u384 { + limb0: 61078853400651367318206256902, + limb1: 68330843862048219769428406366, + limb2: 2640683418943475982, + limb3: 0 + }, + w5: u384 { + limb0: 76060451788142958494812809798, + limb1: 10020079843447990766395316195, + limb2: 715277713402411262, + limb3: 0 + }, + w6: u384 { + limb0: 53018707554114982894535734845, + limb1: 74100522170108698248947970427, + limb2: 1117652248606108022, + limb3: 0 + }, + w7: u384 { + limb0: 70646293877958361276996599635, + limb1: 47088869177043536394438938180, + limb2: 1114642057476218971, + limb3: 0 + }, + w8: u384 { + limb0: 38874548488861164018461117301, + limb1: 27470047670912445587809031412, + limb2: 3371666900323506872, + limb3: 0 + }, + w9: u384 { + limb0: 57341556792062798434122266357, + limb1: 72871023573189301900543799435, + limb2: 1097736164191533272, + limb3: 0 + }, + w10: u384 { + limb0: 35341913951499698822181825839, + limb1: 58104191347516556722065984814, + limb2: 975655873277631286, + limb3: 0 + }, + w11: u384 { + limb0: 56245108529617277581930206941, + limb1: 70997948496025043944594704141, + limb2: 1609926131916539407, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 39886023877103652857395864134, + limb1: 10520904079656434195548701954, + limb2: 3161105535915344631, + limb3: 0 + }, + w1: u384 { + limb0: 76249830095997892312962460022, + limb1: 13652686133624864308626516435, + limb2: 2842491437515232449, + limb3: 0 + }, + w2: u384 { + limb0: 60003235952386331239100476275, + limb1: 28993377691215180310843676934, + limb2: 1146263264007321029, + limb3: 0 + }, + w3: u384 { + limb0: 18044707101077169461630196646, + limb1: 24019606971680985837677722304, + limb2: 2486945603021182052, + limb3: 0 + }, + w4: u384 { + limb0: 50973690044403852646410446444, + limb1: 34791652102888590052043849048, + limb2: 1744612296153651755, + limb3: 0 + }, + w5: u384 { + limb0: 52675211326760948296124243040, + limb1: 3183993834236127147490000275, + limb2: 2810786411092206729, + limb3: 0 + }, + w6: u384 { + limb0: 39359581193406476861162707719, + limb1: 47499502565563218104924599586, + limb2: 19202762439544401, + limb3: 0 + }, + w7: u384 { + limb0: 75016079075898143045332076743, + limb1: 7910326451009965878587190783, + limb2: 5402823715162290, + limb3: 0 + }, + w8: u384 { + limb0: 2325487102174502283135606968, + limb1: 41695087864189142043264690108, + limb2: 3377240430710342055, + limb3: 0 + }, + w9: u384 { + limb0: 71360722572230014290338369439, + limb1: 16259156277087556269241792030, + limb2: 949102702460842220, + limb3: 0 + }, + w10: u384 { + limb0: 4503195330349702460983502504, + limb1: 59303020340261517553658832098, + limb2: 534864416070168510, + limb3: 0 + }, + w11: u384 { + limb0: 18099520126939447783836221849, + limb1: 50270380517278113212399752171, + limb2: 1745088636063499379, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 51821758880470323596117857873, + limb1: 77967804012015777559223241478, + limb2: 132133377193377853, + limb3: 0 + }, + w1: u384 { + limb0: 33831766086491290813180510828, + limb1: 49314760104722147481564754050, + limb2: 300238367604827581, + limb3: 0 + }, + w2: u384 { + limb0: 43692220399733083363870882982, + limb1: 46273162141642302449988117870, + limb2: 1526414626513011965, + limb3: 0 + }, + w3: u384 { + limb0: 58619934163172907526323391726, + limb1: 9567598502021706286549243773, + limb2: 1148999632363773324, + limb3: 0 + }, + w4: u384 { + limb0: 21167504612045766174200052444, + limb1: 40034079070512278218126164259, + limb2: 3172242354740305261, + limb3: 0 + }, + w5: u384 { + limb0: 37483354941569363187973506414, + limb1: 15409436614330811079254343687, + limb2: 1912926210365345404, + limb3: 0 + }, + w6: u384 { + limb0: 64910132748045470383990755038, + limb1: 3065117585859755226750491483, + limb2: 2433785753539995426, + limb3: 0 + }, + w7: u384 { + limb0: 26087306402983308108580169957, + limb1: 56431529331753301892768970273, + limb2: 3061144448158278594, + limb3: 0 + }, + w8: u384 { + limb0: 47901129995010727541493339046, + limb1: 33832064532643804240481044354, + limb2: 395763918399228836, + limb3: 0 + }, + w9: u384 { + limb0: 14222802721851629756633291081, + limb1: 28707270648730174360523143966, + limb2: 2012117736358571491, + limb3: 0 + }, + w10: u384 { + limb0: 33006988723811007550216889888, + limb1: 72249749496924549357723403442, + limb2: 842162479667104018, + limb3: 0 + }, + w11: u384 { + limb0: 71136110110437375373835879208, + limb1: 38618832472660528868467262656, + limb2: 2317336318433812949, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 61491085814178631504614914173, + limb1: 57497760439438189011591570057, + limb2: 3285945577521081962, + limb3: 0 + }, + w1: u384 { + limb0: 58650341911535073431568358067, + limb1: 44918641362566416904996316011, + limb2: 1706006939447633220, + limb3: 0 + }, + w2: u384 { + limb0: 8674029986986997708009167207, + limb1: 49381662941502069791013239198, + limb2: 2157737126995725350, + limb3: 0 + }, + w3: u384 { + limb0: 12327961264133546877598689836, + limb1: 2986678242521558267445444740, + limb2: 1425487184128078979, + limb3: 0 + }, + w4: u384 { + limb0: 19945829202894638583996153205, + limb1: 16966721825139991676941747393, + limb2: 1279468773176569381, + limb3: 0 + }, + w5: u384 { + limb0: 72770558737791235399512988028, + limb1: 60084916228055308762990239247, + limb2: 3024564442516837878, + limb3: 0 + }, + w6: u384 { + limb0: 16657348471834350635596908314, + limb1: 30276523740277926327579915848, + limb2: 1519091217507266365, + limb3: 0 + }, + w7: u384 { + limb0: 64358722587074166751964910878, + limb1: 25388259420046470150781051391, + limb2: 1172247291019434887, + limb3: 0 + }, + w8: u384 { + limb0: 24926041740130084547452133250, + limb1: 76047547298090336153167418172, + limb2: 1497159888930870699, + limb3: 0 + }, + w9: u384 { + limb0: 62795750590753113662951663674, + limb1: 11769890738765162034782575364, + limb2: 1311538833391046600, + limb3: 0 + }, + w10: u384 { + limb0: 65102192012354319498348073819, + limb1: 15638694331523774374113334932, + limb2: 768878062162735744, + limb3: 0 + }, + w11: u384 { + limb0: 26483896032318582488919090630, + limb1: 19262598338067151699905165781, + limb2: 1552218654110873291, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 932696731173166769898230310, + limb1: 23607454404973797747456079567, + limb2: 2269600729143467314, + limb3: 0 + }, + w1: u384 { + limb0: 63522080641659984047816481476, + limb1: 63973297354050804967796603616, + limb2: 2833597293492113760, + limb3: 0 + }, + w2: u384 { + limb0: 28266397614254717743942930122, + limb1: 62878670933735440858136358736, + limb2: 2765756382392957917, + limb3: 0 + }, + w3: u384 { + limb0: 27804341854594645785748346576, + limb1: 25459447389539918757653122540, + limb2: 940988089461720513, + limb3: 0 + }, + w4: u384 { + limb0: 40344387979552133802359456228, + limb1: 6057131409042381044175852472, + limb2: 2982093787808106659, + limb3: 0 + }, + w5: u384 { + limb0: 55236135180310756194810580210, + limb1: 31247542207860057295080831737, + limb2: 1363385532241358223, + limb3: 0 + }, + w6: u384 { + limb0: 18543588370552394552603361175, + limb1: 8848824546422712882229171814, + limb2: 206132376106926114, + limb3: 0 + }, + w7: u384 { + limb0: 18423472705702301769000882407, + limb1: 28058779927107925494271368686, + limb2: 994540928254172011, + limb3: 0 + }, + w8: u384 { + limb0: 63317764700570209748354471432, + limb1: 40430774699585991474286671972, + limb2: 2022410337820153146, + limb3: 0 + }, + w9: u384 { + limb0: 50561075705785774967474300562, + limb1: 43222986106365834987625240740, + limb2: 3029553397375838177, + limb3: 0 + }, + w10: u384 { + limb0: 36021007897756768164898211721, + limb1: 22606386307768079700442541693, + limb2: 351118685512276658, + limb3: 0 + }, + w11: u384 { + limb0: 18090010000060573967087086677, + limb1: 45913160673338576007832396076, + limb2: 303440145910657244, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 18595256584401821193258587988, + limb1: 46877674490536101423783506707, + limb2: 2613614148529119854, + limb3: 0 + }, + w1: u384 { + limb0: 14301749257168989932966665437, + limb1: 14301303567617651498402596984, + limb2: 3007853779405421968, + limb3: 0 + }, + w2: u384 { + limb0: 9633691341573504332674953620, + limb1: 66054638695936640213583480082, + limb2: 2043559347125822464, + limb3: 0 + }, + w3: u384 { + limb0: 77448148361789149640025287774, + limb1: 45936784474120454302415400185, + limb2: 46305033873391102, + limb3: 0 + }, + w4: u384 { + limb0: 39702290088388910189017727652, + limb1: 53882937647808841315012314865, + limb2: 3403196204471039543, + limb3: 0 + }, + w5: u384 { + limb0: 51668423832208669417415891649, + limb1: 21368077179650170674663072357, + limb2: 2559250475817615501, + limb3: 0 + }, + w6: u384 { + limb0: 43939248312539015888375591989, + limb1: 25115019402488746128665078404, + limb2: 2749375552507173244, + limb3: 0 + }, + w7: u384 { + limb0: 70775718806781168053872039498, + limb1: 45354313639915441136393505283, + limb2: 2944657198280578284, + limb3: 0 + }, + w8: u384 { + limb0: 38441755427857808549939723514, + limb1: 10734588884952661132581974318, + limb2: 3067152199816493311, + limb3: 0 + }, + w9: u384 { + limb0: 38408157013186188592313974595, + limb1: 2414933488480046457883620093, + limb2: 962414051902297301, + limb3: 0 + }, + w10: u384 { + limb0: 47758264273531468281565360242, + limb1: 44193327444275823927167590337, + limb2: 241921257841127606, + limb3: 0 + }, + w11: u384 { + limb0: 18049078411440952598666141926, + limb1: 30619693546616181187751734402, + limb2: 2909684769234648912, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 9826763846179065164520000074, + limb1: 25017410609565797959064402829, + limb2: 688581488127602899, + limb3: 0 + }, + w1: u384 { + limb0: 60004044486273096640040960908, + limb1: 76128917374660625846384290567, + limb2: 14698285475303689, + limb3: 0 + }, + w2: u384 { + limb0: 42832343024011283383079977210, + limb1: 56990499494729049575043644439, + limb2: 3212316271404246293, + limb3: 0 + }, + w3: u384 { + limb0: 24482141722677818633198304910, + limb1: 31760326098576048555535024843, + limb2: 1243797216843875148, + limb3: 0 + }, + w4: u384 { + limb0: 37510241516255680046115651932, + limb1: 66518331030153468967872680707, + limb2: 705361997423030586, + limb3: 0 + }, + w5: u384 { + limb0: 75716539015323839952028989884, + limb1: 11166631842937450651799908624, + limb2: 1349684153955728097, + limb3: 0 + }, + w6: u384 { + limb0: 44623672243860496387797007953, + limb1: 52939448339502289252423034789, + limb2: 3365533022117526728, + limb3: 0 + }, + w7: u384 { + limb0: 37513712083065309479186031333, + limb1: 61152675168790575197995897506, + limb2: 91845570645000337, + limb3: 0 + }, + w8: u384 { + limb0: 77073437450436216715782656378, + limb1: 72803856143344149038347285214, + limb2: 2655355790940176426, + limb3: 0 + }, + w9: u384 { + limb0: 20026674459105304862058445443, + limb1: 50717317564593788264573369499, + limb2: 659931557998674964, + limb3: 0 + }, + w10: u384 { + limb0: 8964149535558522524080104396, + limb1: 14865012829104168086050339243, + limb2: 1010909151625975, + limb3: 0 + }, + w11: u384 { + limb0: 58658175391109199108694492010, + limb1: 64323195905611587650450771927, + limb2: 1560870429124413169, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 16217751238057107240694850167, + limb1: 655907282721891925643525069, + limb2: 195962621422814396, + limb3: 0 + }, + w1: u384 { + limb0: 35932868977438995759827195590, + limb1: 41696432596184299612561901124, + limb2: 402916862030060568, + limb3: 0 + }, + w2: u384 { + limb0: 15099649574955538002973045019, + limb1: 40547024560899630418828268896, + limb2: 137095664931274293, + limb3: 0 + }, + w3: u384 { + limb0: 36373829399004883072123806577, + limb1: 65307062728031226323133071102, + limb2: 2301111908144848219, + limb3: 0 + }, + w4: u384 { + limb0: 69855651620982899924453368384, + limb1: 64839253516099783051100524203, + limb2: 553501052704446769, + limb3: 0 + }, + w5: u384 { + limb0: 16088652871738094449911156962, + limb1: 20694657477375931152809447818, + limb2: 2720578280359359579, + limb3: 0 + }, + w6: u384 { + limb0: 2160700104841821490918622346, + limb1: 40268357664467393536118293345, + limb2: 797883988890859795, + limb3: 0 + }, + w7: u384 { + limb0: 7847846028143965018673572551, + limb1: 10832189540270348383724095474, + limb2: 1106246400836840008, + limb3: 0 + }, + w8: u384 { + limb0: 26298040836911338393054205836, + limb1: 18388072819732595699121358089, + limb2: 1787294273156797573, + limb3: 0 + }, + w9: u384 { + limb0: 40405309060790076433554532889, + limb1: 59572431576160070779178975940, + limb2: 282523129539282191, + limb3: 0 + }, + w10: u384 { + limb0: 52026498781102807272707908459, + limb1: 63489522442959071372579406677, + limb2: 2247022107751544170, + limb3: 0 + }, + w11: u384 { + limb0: 62249408390231856470287562168, + limb1: 42535551378286924854686239761, + limb2: 1799129360875159219, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 33335036853016072454516087635, + limb1: 72862531584103543969632119947, + limb2: 181952403157393012, + limb3: 0 + }, + w1: u384 { + limb0: 12054570541400130767231004499, + limb1: 16084290478186050974032645984, + limb2: 817582641345089520, + limb3: 0 + }, + w2: u384 { + limb0: 21374460768046069588056921281, + limb1: 31043395234619135070743030791, + limb2: 2373721645047575878, + limb3: 0 + }, + w3: u384 { + limb0: 51733343551941372371937681938, + limb1: 18046845911367254728703130833, + limb2: 3469636447984664856, + limb3: 0 + }, + w4: u384 { + limb0: 23499734924007771519296169308, + limb1: 71248301979061932353509879471, + limb2: 376543330550185488, + limb3: 0 + }, + w5: u384 { + limb0: 74195505053789310873086732729, + limb1: 10483885843916822238246073326, + limb2: 424128628517413690, + limb3: 0 + }, + w6: u384 { + limb0: 59542646784803739977400859517, + limb1: 28748246505797750861171891402, + limb2: 1650311792145185347, + limb3: 0 + }, + w7: u384 { + limb0: 34418898585541588871572584013, + limb1: 64566961910827654662340619369, + limb2: 2598813710753322840, + limb3: 0 + }, + w8: u384 { + limb0: 43896193509724558760203896718, + limb1: 72510207714043841042507094462, + limb2: 3104614162652118583, + limb3: 0 + }, + w9: u384 { + limb0: 8524112007472377993043976679, + limb1: 14617891228146196381686980584, + limb2: 3013134550336131353, + limb3: 0 + }, + w10: u384 { + limb0: 37253906281533910083416996318, + limb1: 75783971825646189192826509534, + limb2: 1475390119206470591, + limb3: 0 + }, + w11: u384 { + limb0: 39061443445796700450828729669, + limb1: 17666735925523535935450958920, + limb2: 1843721593963721546, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 71857958705240771241299366722, + limb1: 63288336880424444064980005882, + limb2: 319425980172049313, + limb3: 0 + }, + w1: u384 { + limb0: 38990492733418503507099911779, + limb1: 16977586840599967840739649914, + limb2: 3020863397552884461, + limb3: 0 + }, + w2: u384 { + limb0: 17857513779933150965472309445, + limb1: 28818040790582140339746159537, + limb2: 200619787579830322, + limb3: 0 + }, + w3: u384 { + limb0: 34804957139093250537389815051, + limb1: 70116351621193093278761637767, + limb2: 1825008866773699017, + limb3: 0 + }, + w4: u384 { + limb0: 71284786605444652413122143023, + limb1: 27635347252897738960003420265, + limb2: 1668839791001759956, + limb3: 0 + }, + w5: u384 { + limb0: 76821372437183329801455139282, + limb1: 42874810512193268613526242215, + limb2: 2023999959373522648, + limb3: 0 + }, + w6: u384 { + limb0: 9701538704650673518690687980, + limb1: 27991459904996992758715745655, + limb2: 3347995288220076346, + limb3: 0 + }, + w7: u384 { + limb0: 60553362842197299285227736114, + limb1: 70307227118270459038564889309, + limb2: 2880566343092545958, + limb3: 0 + }, + w8: u384 { + limb0: 75802769641062073980346560709, + limb1: 61542789988379166563145635923, + limb2: 2697051952435574100, + limb3: 0 + }, + w9: u384 { + limb0: 51072593221077532442444475193, + limb1: 16182974544951209241269011662, + limb2: 1279205933923553946, + limb3: 0 + }, + w10: u384 { + limb0: 30502752680678853204366876981, + limb1: 63887709969435674170089942160, + limb2: 2601214864874941648, + limb3: 0 + }, + w11: u384 { + limb0: 66738678129924510146942846628, + limb1: 48200597531040013508479929861, + limb2: 491152054478181677, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 43618045639946406218687198342, + limb1: 705322208479090321383789111, + limb2: 2595224494889195495, + limb3: 0 + }, + w1: u384 { + limb0: 16535775195768346715660222567, + limb1: 76067993300360199742095532742, + limb2: 243294044174748686, + limb3: 0 + }, + w2: u384 { + limb0: 62066057362786086885971751187, + limb1: 4453805965861038620072756048, + limb2: 1271375276768224479, + limb3: 0 + }, + w3: u384 { + limb0: 27456770127608050780850191493, + limb1: 50336244024420511441000040169, + limb2: 2524397282051665905, + limb3: 0 + }, + w4: u384 { + limb0: 4434531918634790118228607188, + limb1: 55399766354519003947016550536, + limb2: 2623599683777769675, + limb3: 0 + }, + w5: u384 { + limb0: 63292101872590419997107273661, + limb1: 30281139780783505057143882383, + limb2: 702157178231739874, + limb3: 0 + }, + w6: u384 { + limb0: 74028109009844419607541059329, + limb1: 25784469742109297592795682372, + limb2: 2028849282791282449, + limb3: 0 + }, + w7: u384 { + limb0: 74341803006620367356493502501, + limb1: 36591431952801764744880400917, + limb2: 3381706895761963221, + limb3: 0 + }, + w8: u384 { + limb0: 76520067765132203557004963785, + limb1: 24236294423753065922083913641, + limb2: 2324507198428822896, + limb3: 0 + }, + w9: u384 { + limb0: 7416863976524683709774060563, + limb1: 12895148197878565519449643276, + limb2: 901952517234535111, + limb3: 0 + }, + w10: u384 { + limb0: 11087013310578894676141603801, + limb1: 19249127182359364037175639434, + limb2: 2257420903416983474, + limb3: 0 + }, + w11: u384 { + limb0: 37120830846780660308919598805, + limb1: 76621272238811862472158808511, + limb2: 76011070984868225, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 18305825122362861604528359030, + limb1: 36038835589563134287374279862, + limb2: 2629631555200973941, + limb3: 0 + }, + w1: u384 { + limb0: 56761075151492577394488911849, + limb1: 56084809652654756327037694623, + limb2: 22236557243461573, + limb3: 0 + }, + w2: u384 { + limb0: 71996357644678531929740700342, + limb1: 37088657243587462070338314192, + limb2: 1162677504741781651, + limb3: 0 + }, + w3: u384 { + limb0: 71290402716878862119699665392, + limb1: 33877702549104760329342396861, + limb2: 960882280061518521, + limb3: 0 + }, + w4: u384 { + limb0: 3913172502158040692266125713, + limb1: 50804104662313698763617839163, + limb2: 1667708750126340991, + limb3: 0 + }, + w5: u384 { + limb0: 13829769895504877559173236088, + limb1: 9355656153611934675037470492, + limb2: 1371030696575309261, + limb3: 0 + }, + w6: u384 { + limb0: 41212047066142803781339940044, + limb1: 12988481748680198264127414364, + limb2: 3156376828476392654, + limb3: 0 + }, + w7: u384 { + limb0: 46837477560895619865672188630, + limb1: 1848772033449096373205860362, + limb2: 3079564062521206138, + limb3: 0 + }, + w8: u384 { + limb0: 54360127454225468905091427632, + limb1: 71359667805901868850664962401, + limb2: 3076016402971186439, + limb3: 0 + }, + w9: u384 { + limb0: 26912864610543344528331468454, + limb1: 28010526609267717072177647023, + limb2: 1114111428801006414, + limb3: 0 + }, + w10: u384 { + limb0: 49127806407852051475845774047, + limb1: 25864454638123220567685036844, + limb2: 3276181151272943470, + limb3: 0 + }, + w11: u384 { + limb0: 37946323015386940939394007413, + limb1: 76763385787270944933548361423, + limb2: 1898710780109656137, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 74245178646395523139265787122, + limb1: 55828463690896811479815805481, + limb2: 1113639506970185488, + limb3: 0 + }, + w1: u384 { + limb0: 25328617397913203847558159976, + limb1: 9425142685618904576696888815, + limb2: 2251568908530882930, + limb3: 0 + }, + w2: u384 { + limb0: 79075649778706464650008346025, + limb1: 8982925287134791496544618394, + limb2: 3299664952823641308, + limb3: 0 + }, + w3: u384 { + limb0: 30075491907661397195783617942, + limb1: 77364914719359181178375817623, + limb2: 1643514998214717331, + limb3: 0 + }, + w4: u384 { + limb0: 23012155860038367794778292289, + limb1: 35876103178032026139024629456, + limb2: 2561354353751900099, + limb3: 0 + }, + w5: u384 { + limb0: 69374703189794066850690983168, + limb1: 65131640190329298116736493915, + limb2: 1466097240692949042, + limb3: 0 + }, + w6: u384 { + limb0: 36379929828271508020719619800, + limb1: 51648256152646044672144417827, + limb2: 167552687366489784, + limb3: 0 + }, + w7: u384 { + limb0: 65737070157159957685863906429, + limb1: 8219280371305503016622215176, + limb2: 1862473481976968305, + limb3: 0 + }, + w8: u384 { + limb0: 36295302285511058127545740445, + limb1: 39532929353011493929201338526, + limb2: 3477191426649074676, + limb3: 0 + }, + w9: u384 { + limb0: 39628292743166233868678896779, + limb1: 16096743457615090305391801354, + limb2: 2580571484089516926, + limb3: 0 + }, + w10: u384 { + limb0: 40202184636082569195346059347, + limb1: 69981600115973067043642474526, + limb2: 2945524482897659393, + limb3: 0 + }, + w11: u384 { + limb0: 34144528846145468199725638838, + limb1: 36029092811578954489663694776, + limb2: 472007541164150347, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 38971769035348101016714321295, + limb1: 72582171553049940102707253105, + limb2: 1530347643082118617, + limb3: 0 + }, + w1: u384 { + limb0: 67746623662685257981928100219, + limb1: 40082488563774743441894949776, + limb2: 2568542761724550878, + limb3: 0 + }, + w2: u384 { + limb0: 284450690506331589280746971, + limb1: 1926578532069710695145612578, + limb2: 2995065526838110249, + limb3: 0 + }, + w3: u384 { + limb0: 21118238330922545124586192573, + limb1: 60230773717089407371688862369, + limb2: 2566512601646687960, + limb3: 0 + }, + w4: u384 { + limb0: 40908542677357502305913798471, + limb1: 47600732959428426369706120365, + limb2: 3126470299195013822, + limb3: 0 + }, + w5: u384 { + limb0: 6340556790682540858792592359, + limb1: 27350306252609282920005170564, + limb2: 1424006255383274412, + limb3: 0 + }, + w6: u384 { + limb0: 19711160390373161023357899486, + limb1: 45957912328366876489297375180, + limb2: 3472661383098821975, + limb3: 0 + }, + w7: u384 { + limb0: 67196068896237815755329137973, + limb1: 59634156295073020718786756705, + limb2: 2129945002663965964, + limb3: 0 + }, + w8: u384 { + limb0: 34455078785960158908910031469, + limb1: 19962618068333359690477069954, + limb2: 3428880845918942640, + limb3: 0 + }, + w9: u384 { + limb0: 30282006779722868422363424381, + limb1: 62561759996996407265499270497, + limb2: 1175020772124966094, + limb3: 0 + }, + w10: u384 { + limb0: 46047045611240137944239003462, + limb1: 25784248305692293664541704333, + limb2: 1759284120340549551, + limb3: 0 + }, + w11: u384 { + limb0: 38221118689364377051594426816, + limb1: 71125028717115905258717277244, + limb2: 590158600764359979, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 70300332585772248206149926974, + limb1: 28784831177579962510004261113, + limb2: 403384338537745849, + limb3: 0 + }, + w1: u384 { + limb0: 71801908795806893404356213837, + limb1: 20318814196665223481290308625, + limb2: 2055823352993643460, + limb3: 0 + }, + w2: u384 { + limb0: 23032661678101248128833654950, + limb1: 28409387437331615468550902976, + limb2: 2288316991238779615, + limb3: 0 + }, + w3: u384 { + limb0: 25640053524745436930855114179, + limb1: 32924684137072758852070551417, + limb2: 1475781170795946910, + limb3: 0 + }, + w4: u384 { + limb0: 28248844960418614781957980691, + limb1: 27565424015313488671257046270, + limb2: 293943707861736660, + limb3: 0 + }, + w5: u384 { + limb0: 78560211583306183242676148734, + limb1: 16994403701823620610051000407, + limb2: 1712958126124795391, + limb3: 0 + }, + w6: u384 { + limb0: 46678970245323763031231839319, + limb1: 52968259592399903898511637030, + limb2: 3038821513292920520, + limb3: 0 + }, + w7: u384 { + limb0: 19893170578871282562928526438, + limb1: 3623527024478418525151751549, + limb2: 543574318091742628, + limb3: 0 + }, + w8: u384 { + limb0: 69739143382703485733225638644, + limb1: 68153122516026063395748695821, + limb2: 2141196157165994697, + limb3: 0 + }, + w9: u384 { + limb0: 78034029749314355534439125545, + limb1: 55725709243828563276851002986, + limb2: 2710517253372005482, + limb3: 0 + }, + w10: u384 { + limb0: 12204882548083694037813538530, + limb1: 4966744791328436289079500204, + limb2: 82629353188230064, + limb3: 0 + }, + w11: u384 { + limb0: 11476739851604872876219793785, + limb1: 46914823561980497220410896386, + limb2: 2060568463377098868, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 73692195663984062856996272063, + limb1: 2179144085958473743044833756, + limb2: 1207601879872717150, + limb3: 0 + }, + w1: u384 { + limb0: 49383538432749572119482696133, + limb1: 60797036375044278307269872706, + limb2: 2555751058729950518, + limb3: 0 + }, + w2: u384 { + limb0: 23531991197674250991271522227, + limb1: 33069694378258761153579399503, + limb2: 3093250582640017231, + limb3: 0 + }, + w3: u384 { + limb0: 2942977558206056979189913875, + limb1: 24577893586135831819460763957, + limb2: 871436306992622087, + limb3: 0 + }, + w4: u384 { + limb0: 38295058889763131557338337980, + limb1: 75916409622667826954401468457, + limb2: 2541821747245033102, + limb3: 0 + }, + w5: u384 { + limb0: 30055026178815579262871563074, + limb1: 10240886234653590167186255783, + limb2: 884783099755964999, + limb3: 0 + }, + w6: u384 { + limb0: 17637778851915638660994452933, + limb1: 4563536973063196432865740228, + limb2: 1876129746280233069, + limb3: 0 + }, + w7: u384 { + limb0: 53014715276964518499116408042, + limb1: 22265167294917995492342025609, + limb2: 2129880884890020400, + limb3: 0 + }, + w8: u384 { + limb0: 61179780555696508882005824691, + limb1: 24721233150802164512650650373, + limb2: 2934129771291064571, + limb3: 0 + }, + w9: u384 { + limb0: 43954788276147774532748037298, + limb1: 4318703993904663600247147834, + limb2: 586814914187845981, + limb3: 0 + }, + w10: u384 { + limb0: 9704739499345173123242001410, + limb1: 34699320629474913642073104883, + limb2: 1882185004846674563, + limb3: 0 + }, + w11: u384 { + limb0: 2996543686360229906976546757, + limb1: 14322251146105254518364224989, + limb2: 1637137675155045993, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 42488038327718023504607770455, + limb1: 7856147126969547066566338367, + limb2: 2027837113182969675, + limb3: 0 + }, + w1: u384 { + limb0: 77736518561153436204331930451, + limb1: 30099476769353072835022128084, + limb2: 195077932441811037, + limb3: 0 + }, + w2: u384 { + limb0: 7850599317731752218552038693, + limb1: 33490959880445721750828715711, + limb2: 2174213194217302735, + limb3: 0 + }, + w3: u384 { + limb0: 61409462658576775553872511104, + limb1: 73866803200006605542212835729, + limb2: 1711814550716941746, + limb3: 0 + }, + w4: u384 { + limb0: 10238494944357515891453280862, + limb1: 18433439919583372289095499897, + limb2: 938811328448681426, + limb3: 0 + }, + w5: u384 { + limb0: 119663372470101521692965597, + limb1: 12181157311063744498622303829, + limb2: 229705169992152499, + limb3: 0 + }, + w6: u384 { + limb0: 42880982812462574427151769484, + limb1: 46731395345768598726392874504, + limb2: 1993393431403018716, + limb3: 0 + }, + w7: u384 { + limb0: 49731517089373438882254841750, + limb1: 66403281557991419712377499980, + limb2: 2779714582654868921, + limb3: 0 + }, + w8: u384 { + limb0: 54719084159543135372300289562, + limb1: 59256304413848862332840730018, + limb2: 2912360371081287613, + limb3: 0 + }, + w9: u384 { + limb0: 78067824148279628608161155534, + limb1: 47836129838966734570558994694, + limb2: 521131708791543826, + limb3: 0 + }, + w10: u384 { + limb0: 19801545751431157873528054862, + limb1: 47073830228121327043264195162, + limb2: 2203478256557344967, + limb3: 0 + }, + w11: u384 { + limb0: 38202527368136665860448189480, + limb1: 49891766654623945292028592579, + limb2: 7872840229959576, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 67366613619057993237080317188, + limb1: 50539300957954159595754789545, + limb2: 1942590124219591029, + limb3: 0 + }, + w1: u384 { + limb0: 13157046610241108683895858860, + limb1: 2659643386866280260196646851, + limb2: 2925677076604786501, + limb3: 0 + }, + w2: u384 { + limb0: 38838895494960089222138440796, + limb1: 11340505608646535986044034617, + limb2: 1430075693749951693, + limb3: 0 + }, + w3: u384 { + limb0: 47299121976910872955277210207, + limb1: 25980308614989485242867691914, + limb2: 2056522364646261239, + limb3: 0 + }, + w4: u384 { + limb0: 76497263737455883494931957391, + limb1: 15260494464119360964678850198, + limb2: 1523333287592011071, + limb3: 0 + }, + w5: u384 { + limb0: 9528793191238664658327071095, + limb1: 51154189927703041025081950081, + limb2: 3357792504542124473, + limb3: 0 + }, + w6: u384 { + limb0: 18126197650906472983269873283, + limb1: 31884856562572937575161320075, + limb2: 447637255097407103, + limb3: 0 + }, + w7: u384 { + limb0: 54111834810725427150963178325, + limb1: 54724167438609093036256637594, + limb2: 2421130282440958860, + limb3: 0 + }, + w8: u384 { + limb0: 29378159904164867838471924352, + limb1: 70102147799353143619653357230, + limb2: 142164538072941572, + limb3: 0 + }, + w9: u384 { + limb0: 34300851998367679736597492884, + limb1: 46510948585171873434065470558, + limb2: 190333143428208495, + limb3: 0 + }, + w10: u384 { + limb0: 47069419611382444806309932973, + limb1: 41450406206356326447709667481, + limb2: 237412835339975727, + limb3: 0 + }, + w11: u384 { + limb0: 51757266817004041305154653518, + limb1: 31310270106408100246468338690, + limb2: 1238722828651346917, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 19282452722834063852558271006, + limb1: 10881430593838458856337929456, + limb2: 551234422735938239, + limb3: 0 + }, + w1: u384 { + limb0: 59521850445816900712159649220, + limb1: 41099048013966161888681698192, + limb2: 1896266345487376027, + limb3: 0 + }, + w2: u384 { + limb0: 73950238730633784375227901389, + limb1: 4572545682048251288559081672, + limb2: 263630481175049139, + limb3: 0 + }, + w3: u384 { + limb0: 54347348177037631636120299122, + limb1: 50189066501432262501093102446, + limb2: 2101312052915788865, + limb3: 0 + }, + w4: u384 { + limb0: 69771546391500996143849827524, + limb1: 68887204440532373063844554460, + limb2: 1641759673044465808, + limb3: 0 + }, + w5: u384 { + limb0: 63909372095199809160270680042, + limb1: 68824235355414113560286375425, + limb2: 1974419506984645170, + limb3: 0 + }, + w6: u384 { + limb0: 26762838751524548239827791275, + limb1: 4406673031029456580168152144, + limb2: 2521835122209661432, + limb3: 0 + }, + w7: u384 { + limb0: 71582192585096480097339846577, + limb1: 70233919948226321567049878096, + limb2: 176410803188624096, + limb3: 0 + }, + w8: u384 { + limb0: 8987765172946070696690835710, + limb1: 15472902056618399811240877013, + limb2: 1973356984542719332, + limb3: 0 + }, + w9: u384 { + limb0: 31532239116494136525057125813, + limb1: 54386926541063183742448323241, + limb2: 1263697225117983016, + limb3: 0 + }, + w10: u384 { + limb0: 74052695565936129483340067668, + limb1: 14901246593700382839070787180, + limb2: 2428440494796925515, + limb3: 0 + }, + w11: u384 { + limb0: 33876243241093485676874820012, + limb1: 14954019546988624248826293811, + limb2: 117491450094179235, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 35153425745022197632526664368, + limb1: 34842491340607705348207123603, + limb2: 2674544359109445941, + limb3: 0 + }, + w1: u384 { + limb0: 38366375203389758071343017844, + limb1: 44901521456977641318439077102, + limb2: 1348747811510417995, + limb3: 0 + }, + w2: u384 { + limb0: 46475986784341043031114611281, + limb1: 24241934812390930337442864276, + limb2: 424062032779431469, + limb3: 0 + }, + w3: u384 { + limb0: 29895981789788719014849515431, + limb1: 60408659692852714781962741041, + limb2: 2700981590782179815, + limb3: 0 + }, + w4: u384 { + limb0: 26857021701709790978824190262, + limb1: 45899823591643321586018547530, + limb2: 1364414839912390337, + limb3: 0 + }, + w5: u384 { + limb0: 75605062458618303880546101387, + limb1: 68885443288872959413220906961, + limb2: 457975905758200577, + limb3: 0 + }, + w6: u384 { + limb0: 32455567409070609584739245235, + limb1: 58690886164090467250214873996, + limb2: 2130475107797622881, + limb3: 0 + }, + w7: u384 { + limb0: 78273240599600512730622518551, + limb1: 54315614886628267953280970703, + limb2: 2312336512347395453, + limb3: 0 + }, + w8: u384 { + limb0: 40254100009940381037400532204, + limb1: 49222027814241140044607545527, + limb2: 526380821954531818, + limb3: 0 + }, + w9: u384 { + limb0: 74549683842655217370072245826, + limb1: 29460026924805748554132986271, + limb2: 2607182868261222324, + limb3: 0 + }, + w10: u384 { + limb0: 16189962507052366903192537593, + limb1: 53282498546458141950872278209, + limb2: 1916639012175114188, + limb3: 0 + }, + w11: u384 { + limb0: 56703302381486382088667463966, + limb1: 69713935171897776445443820265, + limb2: 567681345207575023, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 32147264012675523075500243402, + limb1: 1398725484592705100224601048, + limb2: 1005875676975298482, + limb3: 0 + }, + w1: u384 { + limb0: 74398051961387609560572002831, + limb1: 42132061447966446788219772967, + limb2: 1714465769751051239, + limb3: 0 + }, + w2: u384 { + limb0: 4810043219892615257205648292, + limb1: 77617316466674562291126014701, + limb2: 1291006371039230188, + limb3: 0 + }, + w3: u384 { + limb0: 25969074542137200842386165474, + limb1: 13584338039296672655943765626, + limb2: 1620505247044175816, + limb3: 0 + }, + w4: u384 { + limb0: 50122810614719094278931086111, + limb1: 60780789798992023947119337525, + limb2: 649736637510346875, + limb3: 0 + }, + w5: u384 { + limb0: 32706477750939568588581254593, + limb1: 2936756833410286456702661110, + limb2: 1152161463365331035, + limb3: 0 + }, + w6: u384 { + limb0: 56191799912946197240541138957, + limb1: 64911398718815091438320141040, + limb2: 1161909087156278878, + limb3: 0 + }, + w7: u384 { + limb0: 64801990564935210683571923680, + limb1: 62495421446636464790294305046, + limb2: 1976316991529489283, + limb3: 0 + }, + w8: u384 { + limb0: 73929587395055431330604682296, + limb1: 33209834508459210334210120466, + limb2: 516799062347944648, + limb3: 0 + }, + w9: u384 { + limb0: 1954357659855619227667396808, + limb1: 8854673776846885282597331763, + limb2: 2989234515450526235, + limb3: 0 + }, + w10: u384 { + limb0: 36928035829683378579421347297, + limb1: 11531201007272510843292381198, + limb2: 643116226435331085, + limb3: 0 + }, + w11: u384 { + limb0: 1051802455061700193845198857, + limb1: 33434622984012508461153251784, + limb2: 2485665345428280438, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 20391060365286071601584837692, + limb1: 53476678037044770384347460136, + limb2: 3310410307304294195, + limb3: 0 + }, + w1: u384 { + limb0: 38335683462091172127187610587, + limb1: 41692175447010101392178909941, + limb2: 2643577811167204608, + limb3: 0 + }, + w2: u384 { + limb0: 50850579403307656900486678018, + limb1: 66701565905433006052265627668, + limb2: 1407007414326663023, + limb3: 0 + }, + w3: u384 { + limb0: 69251105625323688591853725233, + limb1: 13021309340397322043333063739, + limb2: 2735721401570617230, + limb3: 0 + }, + w4: u384 { + limb0: 24873677224621461059708911545, + limb1: 56272528932792493061943288380, + limb2: 2507681602071250257, + limb3: 0 + }, + w5: u384 { + limb0: 62481009421947063168241989078, + limb1: 15575941194806713305181595158, + limb2: 2449793440701702468, + limb3: 0 + }, + w6: u384 { + limb0: 37923785295907391415859585964, + limb1: 8544399042063763742175260720, + limb2: 2775595243765534634, + limb3: 0 + }, + w7: u384 { + limb0: 547973907563614537862039671, + limb1: 5055121255105272366847289287, + limb2: 2792173200680522416, + limb3: 0 + }, + w8: u384 { + limb0: 5812763573148403302679558383, + limb1: 38083386502006911943967409841, + limb2: 963444875525411158, + limb3: 0 + }, + w9: u384 { + limb0: 75465827843436000620963014915, + limb1: 510973088327086633285629792, + limb2: 2489193958859125284, + limb3: 0 + }, + w10: u384 { + limb0: 6363186012971562520756490812, + limb1: 46739629862073461242322681944, + limb2: 1000545557337498493, + limb3: 0 + }, + w11: u384 { + limb0: 4195166613750445429316778348, + limb1: 53888243163911933491499838860, + limb2: 354411372405021527, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 36863512934660789556834682230, + limb1: 64948442911185605950969951096, + limb2: 2838730914785105742, + limb3: 0 + }, + w1: u384 { + limb0: 3148550972730119288692641980, + limb1: 39969798774533013879258012474, + limb2: 1475145145279891061, + limb3: 0 + }, + w2: u384 { + limb0: 20834762926712019759293626538, + limb1: 58444538510221924167146136750, + limb2: 1824528766656201374, + limb3: 0 + }, + w3: u384 { + limb0: 54148360677131480074930311081, + limb1: 54700984987236824942492335866, + limb2: 1799570483921870198, + limb3: 0 + }, + w4: u384 { + limb0: 5381537869531867469751613077, + limb1: 10001306749662504473296541180, + limb2: 1652601462495894113, + limb3: 0 + }, + w5: u384 { + limb0: 42202148586123825137117331235, + limb1: 10217848389189192331467525045, + limb2: 1807163168106579788, + limb3: 0 + }, + w6: u384 { + limb0: 3944735091523754230696460579, + limb1: 67773740258680559441435375880, + limb2: 609914693005002768, + limb3: 0 + }, + w7: u384 { + limb0: 18319303200463232033755797545, + limb1: 9114465859774815475833761419, + limb2: 2798576834751665661, + limb3: 0 + }, + w8: u384 { + limb0: 49226654243010047232932806465, + limb1: 56277853336780039802244425106, + limb2: 2920436427125400867, + limb3: 0 + }, + w9: u384 { + limb0: 27308046310004724774546461382, + limb1: 12047730333019641251766142043, + limb2: 3223235431569681294, + limb3: 0 + }, + w10: u384 { + limb0: 47597405129667787938893923123, + limb1: 31650422096034768510145611050, + limb2: 68759679436395019, + limb3: 0 + }, + w11: u384 { + limb0: 4145343463766134100289461071, + limb1: 21361953005104988565724050500, + limb2: 786779798127856575, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 1674517298435189572709497729, + limb1: 66608947110066525900469995344, + limb2: 1898399457888197931, + limb3: 0 + }, + w1: u384 { + limb0: 4959837429252775808205042604, + limb1: 71859219817365475235962707556, + limb2: 19230413314005097, + limb3: 0 + }, + w2: u384 { + limb0: 61322039825635759132117991158, + limb1: 11090718687103425523661517585, + limb2: 2674247475713382990, + limb3: 0 + }, + w3: u384 { + limb0: 52628834034892722375356906844, + limb1: 67995809387508493364254708056, + limb2: 558482114713398558, + limb3: 0 + }, + w4: u384 { + limb0: 4991834659362321418108294792, + limb1: 5053991784545533677163221448, + limb2: 1482084083506670677, + limb3: 0 + }, + w5: u384 { + limb0: 2679460992303073186038071967, + limb1: 12981539579806300362032378573, + limb2: 816447742888421529, + limb3: 0 + }, + w6: u384 { + limb0: 41709800774940153360674947202, + limb1: 75039822206585403297205715420, + limb2: 1491815914124273432, + limb3: 0 + }, + w7: u384 { + limb0: 38476194333256704548983863960, + limb1: 24064101732200352917820228992, + limb2: 507865802295810329, + limb3: 0 + }, + w8: u384 { + limb0: 29588838957195004901725822906, + limb1: 39763663943093744622532987755, + limb2: 1236593212578987639, + limb3: 0 + }, + w9: u384 { + limb0: 31766900310562088732463268846, + limb1: 2261487279013467310796932779, + limb2: 1460352732841942282, + limb3: 0 + }, + w10: u384 { + limb0: 41159106958616417749509224769, + limb1: 1000103511342801976854105787, + limb2: 1246418905179102621, + limb3: 0 + }, + w11: u384 { + limb0: 62921094935521853654908322674, + limb1: 30798832640954598353869920388, + limb2: 2387056692810806318, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 26031735520735575243489418249, + limb1: 72439387481542144015925202963, + limb2: 2654833181468416700, + limb3: 0 + }, + w1: u384 { + limb0: 44118093710332760788512671329, + limb1: 75798845736997659670650484188, + limb2: 2593705322519637353, + limb3: 0 + }, + w2: u384 { + limb0: 23513586712772106351227428466, + limb1: 57906237509743905965673949829, + limb2: 2376925747674382370, + limb3: 0 + }, + w3: u384 { + limb0: 22322273174646028238695993237, + limb1: 67491771143517512167080606563, + limb2: 575008134983221208, + limb3: 0 + }, + w4: u384 { + limb0: 27789869870584343064873915988, + limb1: 33441573557735656114369247517, + limb2: 2985444414031247270, + limb3: 0 + }, + w5: u384 { + limb0: 32321871707610445596152141390, + limb1: 36591162614045562369911326757, + limb2: 1724959978475484540, + limb3: 0 + }, + w6: u384 { + limb0: 30773663563935461234026744395, + limb1: 15696996701070168887911183634, + limb2: 1164501254850818160, + limb3: 0 + }, + w7: u384 { + limb0: 61232958080399526604721263071, + limb1: 59660906703732033332197281183, + limb2: 2816598796516828734, + limb3: 0 + }, + w8: u384 { + limb0: 58026974076429858075178635272, + limb1: 77591903413773073210741523296, + limb2: 10981901092057589, + limb3: 0 + }, + w9: u384 { + limb0: 10336498883551251803025417193, + limb1: 15422411237968342701780773824, + limb2: 2852061013706558029, + limb3: 0 + }, + w10: u384 { + limb0: 4060611681561692550681542893, + limb1: 27102319643716092989335338771, + limb2: 2140741570536774054, + limb3: 0 + }, + w11: u384 { + limb0: 25532838840652512946594385155, + limb1: 24629161648473324697086292725, + limb2: 1939781336046822417, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 52063040535658779326848683326, + limb1: 70666375437702618851085181363, + limb2: 1780951458844841941, + limb3: 0 + }, + w1: u384 { + limb0: 41489508618048688850707576330, + limb1: 63251281255609581290447478325, + limb2: 3235056419193581409, + limb3: 0 + }, + w2: u384 { + limb0: 3382095606105515002030260593, + limb1: 37061446407687062749221443844, + limb2: 919633358531308329, + limb3: 0 + }, + w3: u384 { + limb0: 29619319884736813617586217467, + limb1: 46537817648714225411368231673, + limb2: 3311351919480970327, + limb3: 0 + }, + w4: u384 { + limb0: 52162879030434901501524153060, + limb1: 55911497674994954687596490388, + limb2: 1703720337524535261, + limb3: 0 + }, + w5: u384 { + limb0: 44944902634864115776558792654, + limb1: 50816411942826878361172779808, + limb2: 490462344344381577, + limb3: 0 + }, + w6: u384 { + limb0: 14106121803358684055419640156, + limb1: 54955924522180449601225618345, + limb2: 94893475561726255, + limb3: 0 + }, + w7: u384 { + limb0: 11986363888025292755435373474, + limb1: 70019276577888766189468747534, + limb2: 2832223351858347124, + limb3: 0 + }, + w8: u384 { + limb0: 13549522484990993315445690657, + limb1: 44340788548738712321395054891, + limb2: 3192557119212884632, + limb3: 0 + }, + w9: u384 { + limb0: 31386112639230345033826059117, + limb1: 33363884354013673034907957697, + limb2: 137048880415149711, + limb3: 0 + }, + w10: u384 { + limb0: 78562371676224049751980288488, + limb1: 43720562483797047355499710258, + limb2: 2831959354656909779, + limb3: 0 + }, + w11: u384 { + limb0: 30579832821155725066880054091, + limb1: 66316897323113082376264335144, + limb2: 412983060520145635, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 4975821414861981083863408784, + limb1: 72784033926512109556228295834, + limb2: 3446743201999238480, + limb3: 0 + }, + w1: u384 { + limb0: 19877220865716115197835332947, + limb1: 43842671131157685794900692892, + limb2: 1620193155724911198, + limb3: 0 + }, + w2: u384 { + limb0: 23434930324890792232893121843, + limb1: 14357465269943355820485315371, + limb2: 1651828263369128769, + limb3: 0 + }, + w3: u384 { + limb0: 48578965631005189411873258791, + limb1: 11226249984317677503336744595, + limb2: 2408992515107885228, + limb3: 0 + }, + w4: u384 { + limb0: 76225192639741915270288203064, + limb1: 73529698070893860173756671373, + limb2: 623845448399023573, + limb3: 0 + }, + w5: u384 { + limb0: 53177963320530137591150451245, + limb1: 31921064008556483107492265056, + limb2: 170438232823555164, + limb3: 0 + }, + w6: u384 { + limb0: 58070813929700562607137738173, + limb1: 10790763988197813670057238626, + limb2: 1466827860150194002, + limb3: 0 + }, + w7: u384 { + limb0: 32293947568630151414792244627, + limb1: 12463379141487113753556905476, + limb2: 2456568392315210863, + limb3: 0 + }, + w8: u384 { + limb0: 74210919523104451809136385586, + limb1: 74396752360490743121487465434, + limb2: 2771352615189900808, + limb3: 0 + }, + w9: u384 { + limb0: 45159295266920478868247864044, + limb1: 51633719977608653275540646974, + limb2: 1530813633919205236, + limb3: 0 + }, + w10: u384 { + limb0: 31568603628106383212826788330, + limb1: 65941011613508625024065954706, + limb2: 794111980961620488, + limb3: 0 + }, + w11: u384 { + limb0: 11709155950128528394298522256, + limb1: 5541733544043380897931239334, + limb2: 825076610038962663, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 40449192882843829516845575865, + limb1: 20392788898875981907861841289, + limb2: 1803939649967702143, + limb3: 0 + }, + w1: u384 { + limb0: 58439922340503524433336769951, + limb1: 14181905653709697340604452998, + limb2: 1076951851732610292, + limb3: 0 + }, + w2: u384 { + limb0: 31990520468342727810732832090, + limb1: 43134816750954929624094512619, + limb2: 895283267882949915, + limb3: 0 + }, + w3: u384 { + limb0: 53106670626756327893403522089, + limb1: 26816588189511499630264973362, + limb2: 2961798167994034968, + limb3: 0 + }, + w4: u384 { + limb0: 46626610657951173875707754325, + limb1: 39921055762538214962788562790, + limb2: 1071803779212280018, + limb3: 0 + }, + w5: u384 { + limb0: 11272247792834177589389894864, + limb1: 54022357243900161147282598656, + limb2: 51591023412701201, + limb3: 0 + }, + w6: u384 { + limb0: 18070527122972304973608320596, + limb1: 12836759888568176482935571587, + limb2: 2851434858323794176, + limb3: 0 + }, + w7: u384 { + limb0: 3284612919223765353380526933, + limb1: 79195452892722799242662729402, + limb2: 3032909293526922223, + limb3: 0 + }, + w8: u384 { + limb0: 3026123644241475489763945004, + limb1: 43905634240083661408118816753, + limb2: 3148005964810811257, + limb3: 0 + }, + w9: u384 { + limb0: 43106949174640177162107485544, + limb1: 21773397636743269571706374969, + limb2: 1381310886481785646, + limb3: 0 + }, + w10: u384 { + limb0: 17009484528262101966150405703, + limb1: 33315787477329032678999299197, + limb2: 2975627948593495632, + limb3: 0 + }, + w11: u384 { + limb0: 4065201008105222294971391933, + limb1: 44971941176891964652043511376, + limb2: 1043666571174705849, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 6856391458218020023050023000, + limb1: 47160876498246023873737251991, + limb2: 1683177694525677941, + limb3: 0 + }, + w1: u384 { + limb0: 27287652904281327691814439942, + limb1: 63991740087980997057900598485, + limb2: 2544316897746426707, + limb3: 0 + }, + w2: u384 { + limb0: 13649260401454642890014455966, + limb1: 48594949756667986843526575963, + limb2: 870970408656583137, + limb3: 0 + }, + w3: u384 { + limb0: 36500176238442898388579370513, + limb1: 24849102200064339502226720238, + limb2: 1741520844420030688, + limb3: 0 + }, + w4: u384 { + limb0: 68353652519484928214248174263, + limb1: 61276469773965102449525299847, + limb2: 1716825465299218042, + limb3: 0 + }, + w5: u384 { + limb0: 43162421618184130447772316837, + limb1: 33000336333778233025492567484, + limb2: 1162796279290403470, + limb3: 0 + }, + w6: u384 { + limb0: 52723538540941799347230749755, + limb1: 58278434471439907420278001538, + limb2: 616282122072926193, + limb3: 0 + }, + w7: u384 { + limb0: 75939240624103682757169632401, + limb1: 9934170502797558519570190127, + limb2: 488602641092384869, + limb3: 0 + }, + w8: u384 { + limb0: 10793613254929686109409679143, + limb1: 65316573075386196803647327019, + limb2: 2593994527865775476, + limb3: 0 + }, + w9: u384 { + limb0: 42512884971120871768937677643, + limb1: 38771575634638118910565660673, + limb2: 2696825535811868766, + limb3: 0 + }, + w10: u384 { + limb0: 13450464751884840653453787411, + limb1: 4180782356883477915704733411, + limb2: 2403099852453891534, + limb3: 0 + }, + w11: u384 { + limb0: 58014321449969610592048697891, + limb1: 62935468769732850838090781234, + limb2: 1128686835874576587, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 42818733234172474571797230715, + limb1: 69640216433863366542048389179, + limb2: 2835703926148236336, + limb3: 0 + }, + w1: u384 { + limb0: 30363617726783111605729353857, + limb1: 6571329920098945483844152056, + limb2: 1140877031763208798, + limb3: 0 + }, + w2: u384 { + limb0: 4039527929773112403169917770, + limb1: 67745985641012948395376304923, + limb2: 1122577359943307842, + limb3: 0 + }, + w3: u384 { + limb0: 19111566667056846901018197469, + limb1: 68120781129332990162300690723, + limb2: 2891716252578174786, + limb3: 0 + }, + w4: u384 { + limb0: 30143021760011978871845232558, + limb1: 4567405052036354116235569595, + limb2: 614269524357276981, + limb3: 0 + }, + w5: u384 { + limb0: 11225557376566427458242773869, + limb1: 72312767840152778898779053579, + limb2: 3187405401820951339, + limb3: 0 + }, + w6: u384 { + limb0: 10407373226292499708651791405, + limb1: 68252278250351608932915161088, + limb2: 293105614602504446, + limb3: 0 + }, + w7: u384 { + limb0: 11724749874551566698337140078, + limb1: 39322243929345552223523507778, + limb2: 2522098710357027082, + limb3: 0 + }, + w8: u384 { + limb0: 43486834287738800061798675704, + limb1: 38481142533980754598296280700, + limb2: 293673237766106890, + limb3: 0 + }, + w9: u384 { + limb0: 1927815534919863872939099680, + limb1: 74724447832056933833309801027, + limb2: 3205507459203538091, + limb3: 0 + }, + w10: u384 { + limb0: 2679022067102076391351228237, + limb1: 3906796231552112960764757077, + limb2: 1877754398756219416, + limb3: 0 + }, + w11: u384 { + limb0: 15499296564533064286754725506, + limb1: 73969024528753187638867178414, + limb2: 2378114881302632782, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 43140325516290972483965866178, + limb1: 25720534795501928657696305610, + limb2: 596255480420947824, + limb3: 0 + }, + w1: u384 { + limb0: 9617816415604313390592202481, + limb1: 61416122160963170345582274390, + limb2: 1961674130550637378, + limb3: 0 + }, + w2: u384 { + limb0: 14521043927572614926450095349, + limb1: 36465189088820621430873729456, + limb2: 435105340769609640, + limb3: 0 + }, + w3: u384 { + limb0: 64024149568902557393790795796, + limb1: 19610907406268018861639582876, + limb2: 1167582162802737748, + limb3: 0 + }, + w4: u384 { + limb0: 56428224976633968460486215053, + limb1: 61907320179301610934123826859, + limb2: 298911718708909510, + limb3: 0 + }, + w5: u384 { + limb0: 23171136582209440738504414218, + limb1: 45276171215078850924117736765, + limb2: 2900957193346834191, + limb3: 0 + }, + w6: u384 { + limb0: 16864553164562728682422918041, + limb1: 26269615937878710969074470081, + limb2: 2186117180934305742, + limb3: 0 + }, + w7: u384 { + limb0: 18969208936416662365419298647, + limb1: 78882671488576887078258751063, + limb2: 347874111475200684, + limb3: 0 + }, + w8: u384 { + limb0: 2150196056428620653389241855, + limb1: 19449716883427546360088792275, + limb2: 2800340653749766773, + limb3: 0 + }, + w9: u384 { + limb0: 67674672012640441070468854044, + limb1: 65245354384024129528953428656, + limb2: 938953177044887084, + limb3: 0 + }, + w10: u384 { + limb0: 73495423691650583377901999968, + limb1: 71852232978850982579093228810, + limb2: 3398558997942561259, + limb3: 0 + }, + w11: u384 { + limb0: 28201090281911265709786910164, + limb1: 74426005817330641853219509221, + limb2: 1762257898672358008, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 31368307957814443190894280734, + limb1: 7792327381815405366851563774, + limb2: 2651025189663877908, + limb3: 0 + }, + w1: u384 { + limb0: 11583240745942207893145467381, + limb1: 72770827369596287978546150171, + limb2: 2427326194441603959, + limb3: 0 + }, + w2: u384 { + limb0: 78063398248120427803161953413, + limb1: 66909904970305833627589937064, + limb2: 3103059382747878869, + limb3: 0 + }, + w3: u384 { + limb0: 71920920436026399532035532954, + limb1: 78989842991852284713203217307, + limb2: 1881817599728486486, + limb3: 0 + }, + w4: u384 { + limb0: 45905085461751031805940288647, + limb1: 8970729694337402676865892539, + limb2: 2949337381729559507, + limb3: 0 + }, + w5: u384 { + limb0: 7570189444173189066320828419, + limb1: 2265056785907938333740054958, + limb2: 2893902580855783106, + limb3: 0 + }, + w6: u384 { + limb0: 11507554980270797464350330186, + limb1: 41973201202938626585433837969, + limb2: 1097324089403120260, + limb3: 0 + }, + w7: u384 { + limb0: 53059220268563402555375819990, + limb1: 57707056683971621213453768617, + limb2: 3269343532337161345, + limb3: 0 + }, + w8: u384 { + limb0: 4297420592397696369228553017, + limb1: 67044634783449516603042877800, + limb2: 675232312972658264, + limb3: 0 + }, + w9: u384 { + limb0: 56166448345295259734876677478, + limb1: 62056239425962630927393160933, + limb2: 373111560348544588, + limb3: 0 + }, + w10: u384 { + limb0: 68543768260133250118916233034, + limb1: 25793804401510473706942135679, + limb2: 275011239055514590, + limb3: 0 + }, + w11: u384 { + limb0: 52878382483444025720302384516, + limb1: 33777720674228026009936061851, + limb2: 1838908866823668404, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 34110164466904481555013432274, + limb1: 8557362272869883244282454955, + limb2: 3022442364648094616, + limb3: 0 + }, + w1: u384 { + limb0: 12248105529746302197771561942, + limb1: 47020955001679216891699926063, + limb2: 2099727756059539791, + limb3: 0 + }, + w2: u384 { + limb0: 35928397190722186025308670331, + limb1: 10272350764604974353330595062, + limb2: 3088793637634349359, + limb3: 0 + }, + w3: u384 { + limb0: 60628528242915452029027161132, + limb1: 34360354225442692423645542454, + limb2: 3088643783295212082, + limb3: 0 + }, + w4: u384 { + limb0: 19963746366646192359888128578, + limb1: 3930491042641582351823153286, + limb2: 1829553288584433225, + limb3: 0 + }, + w5: u384 { + limb0: 20131803811419589935911518237, + limb1: 53271771267169903590831715904, + limb2: 1824895969790851473, + limb3: 0 + }, + w6: u384 { + limb0: 36071513954021974243145552204, + limb1: 62573182251948525303819262956, + limb2: 2532497181627930885, + limb3: 0 + }, + w7: u384 { + limb0: 35860255908468655939813427765, + limb1: 56276533009674224222055400904, + limb2: 1614162318197511848, + limb3: 0 + }, + w8: u384 { + limb0: 18770502921724248753489551338, + limb1: 25896147654549970336615740983, + limb2: 2258598381549723848, + limb3: 0 + }, + w9: u384 { + limb0: 8198118326466328241190965139, + limb1: 48475743271278138236254021042, + limb2: 2091552917768924231, + limb3: 0 + }, + w10: u384 { + limb0: 52262167893754276103831783732, + limb1: 1779115808628153542780594962, + limb2: 2097208647940748871, + limb3: 0 + }, + w11: u384 { + limb0: 5492903241365516036423021230, + limb1: 6694924523888446864644699323, + limb2: 540541514274578028, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 899691902171777233203654829, + limb1: 15947981182785215776431089828, + limb2: 2818145546062580383, + limb3: 0 + }, + w1: u384 { + limb0: 48371735033442797893697513230, + limb1: 19324775222973268866823306899, + limb2: 2198952380440528600, + limb3: 0 + }, + w2: u384 { + limb0: 56731135656415403044314523375, + limb1: 21962963553378645691691779005, + limb2: 1613596774029274873, + limb3: 0 + }, + w3: u384 { + limb0: 40611263737874064996921610986, + limb1: 8941634369400169576289946798, + limb2: 657980469674897377, + limb3: 0 + }, + w4: u384 { + limb0: 12643690082060643913974488119, + limb1: 70695217863216193213461357791, + limb2: 1390855975594516991, + limb3: 0 + }, + w5: u384 { + limb0: 22769406545301888654367765454, + limb1: 60977381687808576293011633429, + limb2: 759581118163004196, + limb3: 0 + }, + w6: u384 { + limb0: 7331498966993822567137097952, + limb1: 30132187428242770834249745936, + limb2: 1934407238199301711, + limb3: 0 + }, + w7: u384 { + limb0: 7530129250168568989439064844, + limb1: 42140001009019154429663355686, + limb2: 3314543241161070119, + limb3: 0 + }, + w8: u384 { + limb0: 34491760762904903851735888310, + limb1: 15556214748774719889903468127, + limb2: 944034103574724105, + limb3: 0 + }, + w9: u384 { + limb0: 49932674158782852208460297874, + limb1: 14031738605917959000808845396, + limb2: 3008391143672385798, + limb3: 0 + }, + w10: u384 { + limb0: 28114620856550014953202560192, + limb1: 8712139616039694715687059401, + limb2: 2178103843538028670, + limb3: 0 + }, + w11: u384 { + limb0: 67721570272945712033987368079, + limb1: 69107916574415177579409247226, + limb2: 614376079700109442, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 28085238020181662478530665856, + limb1: 22007665829848177677209852353, + limb2: 2367085200702357764, + limb3: 0 + }, + w1: u384 { + limb0: 68741046183174519360495524943, + limb1: 62807134596162306095292544606, + limb2: 454118489645124115, + limb3: 0 + }, + w2: u384 { + limb0: 35356911171789200473052161200, + limb1: 29167571754895756499532241002, + limb2: 598586539547197837, + limb3: 0 + }, + w3: u384 { + limb0: 15800343732882601382687913934, + limb1: 8270428120244371949380149533, + limb2: 654250945813472252, + limb3: 0 + }, + w4: u384 { + limb0: 40170710034141544361529841548, + limb1: 74109368525337503547678637494, + limb2: 3337491313429373240, + limb3: 0 + }, + w5: u384 { + limb0: 68268491131414010926646511617, + limb1: 49828445117403467761089093309, + limb2: 1108391317240372187, + limb3: 0 + }, + w6: u384 { + limb0: 74562501221445998822604237708, + limb1: 10597110105247285318039009188, + limb2: 347139150298369102, + limb3: 0 + }, + w7: u384 { + limb0: 17181895062668367867757973751, + limb1: 12243958495709336653047371821, + limb2: 2878140439432175527, + limb3: 0 + }, + w8: u384 { + limb0: 71472967301193652207406695564, + limb1: 43085944906011168677813609013, + limb2: 1468893161457871831, + limb3: 0 + }, + w9: u384 { + limb0: 54722249977108097704304865929, + limb1: 44237953576073159593845771271, + limb2: 3396184603262077089, + limb3: 0 + }, + w10: u384 { + limb0: 9339439821808257643437464656, + limb1: 35349457549008279573720482053, + limb2: 1396031436017204291, + limb3: 0 + }, + w11: u384 { + limb0: 76732355674436655825931541299, + limb1: 20293336184584432170679198761, + limb2: 916369163427138223, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 36103571481994776766283595747, + limb1: 66120758116069327084444861801, + limb2: 1441161400330093739, + limb3: 0 + }, + w1: u384 { + limb0: 61581127659691848559939266840, + limb1: 63505361913038240158828104073, + limb2: 1914175888228696280, + limb3: 0 + }, + w2: u384 { + limb0: 54336453608588243088184410450, + limb1: 40430116879128604993471348088, + limb2: 993986595701318579, + limb3: 0 + }, + w3: u384 { + limb0: 27639492975485314540219967760, + limb1: 19206594061908086564253274090, + limb2: 2629460741061704096, + limb3: 0 + }, + w4: u384 { + limb0: 52800488830162547565767993128, + limb1: 14948065798188400993525751481, + limb2: 3284816860726867536, + limb3: 0 + }, + w5: u384 { + limb0: 8117332048903558612887361751, + limb1: 62153649082778708840930402691, + limb2: 2788379691313492313, + limb3: 0 + }, + w6: u384 { + limb0: 54809342938051249685335573914, + limb1: 62819475950513195137456185468, + limb2: 2167696134988495659, + limb3: 0 + }, + w7: u384 { + limb0: 26674209171321621885893945409, + limb1: 35657185201361099926007322628, + limb2: 703993051524495854, + limb3: 0 + }, + w8: u384 { + limb0: 60863139078021467539217404081, + limb1: 11933391773963477525216945389, + limb2: 275269639581142464, + limb3: 0 + }, + w9: u384 { + limb0: 59349468633743299214639799333, + limb1: 23614678503267307538594935435, + limb2: 2016512859806474057, + limb3: 0 + }, + w10: u384 { + limb0: 11304481467390543757722342775, + limb1: 48335562967188381050673630944, + limb2: 886730127080814611, + limb3: 0 + }, + w11: u384 { + limb0: 74390233135153527660242200259, + limb1: 72100114236584289029615241923, + limb2: 2256261241865285566, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 62646527900106025291699524969, + limb1: 77158354577592340704170119057, + limb2: 3203332628995179923, + limb3: 0 + }, + w1: u384 { + limb0: 42411109260371431969414337816, + limb1: 57430801495898748026886937425, + limb2: 334365207174318382, + limb3: 0 + }, + w2: u384 { + limb0: 58771438471353708641820317393, + limb1: 45169115752504286938494963425, + limb2: 3131395574930649259, + limb3: 0 + }, + w3: u384 { + limb0: 43246488076222625360432049000, + limb1: 6688240677958580875671398594, + limb2: 313260680073537281, + limb3: 0 + }, + w4: u384 { + limb0: 10412089291820148771091911169, + limb1: 72997430355142824802824026424, + limb2: 1993435016706465000, + limb3: 0 + }, + w5: u384 { + limb0: 12985221491940571545372752297, + limb1: 28141271367376028683238167226, + limb2: 2675111861705576364, + limb3: 0 + }, + w6: u384 { + limb0: 52859982871384483056491252489, + limb1: 19233380941092911569254869654, + limb2: 45565388891949149, + limb3: 0 + }, + w7: u384 { + limb0: 47991485944843115565458358751, + limb1: 38876479051824227202447554578, + limb2: 2049430356758785438, + limb3: 0 + }, + w8: u384 { + limb0: 78015129557867824177872382281, + limb1: 67408344826038957969602312446, + limb2: 1201609930567560418, + limb3: 0 + }, + w9: u384 { + limb0: 26327823541433477165092992554, + limb1: 23727748150628237743607604614, + limb2: 1795966255306802599, + limb3: 0 + }, + w10: u384 { + limb0: 62506024320506694365935222083, + limb1: 61960975447366700136579956719, + limb2: 316521456665587394, + limb3: 0 + }, + w11: u384 { + limb0: 1090540317466997061061774799, + limb1: 54600382766145079438457577219, + limb2: 2433007282317937668, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 52337335358672763577563092552, + limb1: 37905429498547201255829887211, + limb2: 1123640169841179745, + limb3: 0 + }, + w1: u384 { + limb0: 63323004187482150971052984706, + limb1: 841706462991375113988407667, + limb2: 3380652578472483175, + limb3: 0 + }, + w2: u384 { + limb0: 323612899283506715868253110, + limb1: 66200364407816394320990875086, + limb2: 3276877728986498245, + limb3: 0 + }, + w3: u384 { + limb0: 56407363405045092471112185972, + limb1: 19207048061564038346945291955, + limb2: 111938628338694331, + limb3: 0 + }, + w4: u384 { + limb0: 3333724032176482718491271786, + limb1: 32804179255955597923079961421, + limb2: 516532613557663737, + limb3: 0 + }, + w5: u384 { + limb0: 75227627289398749247781265497, + limb1: 27318392684056797873805862026, + limb2: 1838252201912806724, + limb3: 0 + }, + w6: u384 { + limb0: 73869410436758993396591977746, + limb1: 55730583335140020617348585422, + limb2: 2542649567064060585, + limb3: 0 + }, + w7: u384 { + limb0: 25958015582713242977221423737, + limb1: 24175019464986711332038155523, + limb2: 601170435419702633, + limb3: 0 + }, + w8: u384 { + limb0: 7720769687870824135252811153, + limb1: 48078749676842040788313118255, + limb2: 1452210739730265178, + limb3: 0 + }, + w9: u384 { + limb0: 62174942646709884851540092364, + limb1: 10738545598327181064945018595, + limb2: 1936609206149424047, + limb3: 0 + }, + w10: u384 { + limb0: 70357436248868684673744258411, + limb1: 10996700140018529995357206313, + limb2: 2062005338473040877, + limb3: 0 + }, + w11: u384 { + limb0: 46735815492572623861820311163, + limb1: 48633677531782793930736212695, + limb2: 1645416276391318449, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 62001769674714687539718772521, + limb1: 68665158954531797141710721307, + limb2: 1859760304814260558, + limb3: 0 + }, + w1: u384 { + limb0: 30093164947905058911343853711, + limb1: 7672017736181722468783162148, + limb2: 3173895489124217866, + limb3: 0 + }, + w2: u384 { + limb0: 66774041693231460553089549027, + limb1: 71117842477058420506686403693, + limb2: 1299738993452673258, + limb3: 0 + }, + w3: u384 { + limb0: 11897311228132311817420694705, + limb1: 15660675265318199394137048078, + limb2: 2228362425129635956, + limb3: 0 + }, + w4: u384 { + limb0: 4391837127423826896211454900, + limb1: 39293796044190122523322640498, + limb2: 2186609037931989880, + limb3: 0 + }, + w5: u384 { + limb0: 30072476468297912178504574948, + limb1: 29554435592819532283051400727, + limb2: 1965617963035389281, + limb3: 0 + }, + w6: u384 { + limb0: 29088615366543932375098692275, + limb1: 13093684704001464820565185752, + limb2: 2858218968241404377, + limb3: 0 + }, + w7: u384 { + limb0: 3271252639966701913974165246, + limb1: 30314228881636877161924999679, + limb2: 2965501800723549108, + limb3: 0 + }, + w8: u384 { + limb0: 32530777782224862830593882574, + limb1: 35216290468302733251349105581, + limb2: 1145428681450979445, + limb3: 0 + }, + w9: u384 { + limb0: 45246563092345437271571256056, + limb1: 14544160198558958500662386442, + limb2: 1513084744663425457, + limb3: 0 + }, + w10: u384 { + limb0: 21000594898701942647560364523, + limb1: 39027576023233132320340827544, + limb2: 2866993815129609328, + limb3: 0 + }, + w11: u384 { + limb0: 76507293218919840521051549709, + limb1: 10386283570888344368423650409, + limb2: 1383733840470166685, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 56173709803984853111429666218, + limb1: 58371472575190488304213063356, + limb2: 84842688801158613, + limb3: 0 + }, + w1: u384 { + limb0: 33721526589496570225030665184, + limb1: 44806070489086677629863179198, + limb2: 2974283147549057926, + limb3: 0 + }, + w2: u384 { + limb0: 65998458682033629556189538002, + limb1: 18479697300548345109481376222, + limb2: 2395996666605430400, + limb3: 0 + }, + w3: u384 { + limb0: 53217881571615326225036461112, + limb1: 64270850973567368570602302602, + limb2: 2618724770842341875, + limb3: 0 + }, + w4: u384 { + limb0: 60035202998629537914883069437, + limb1: 28815243599709469335979488035, + limb2: 265993700686702333, + limb3: 0 + }, + w5: u384 { + limb0: 45032700589536651289411027364, + limb1: 64155754478077299945383017496, + limb2: 3209115984696211371, + limb3: 0 + }, + w6: u384 { + limb0: 52682425342423506416745456010, + limb1: 13301782366627445286315426211, + limb2: 1506255058871860057, + limb3: 0 + }, + w7: u384 { + limb0: 29759286899596154080682015560, + limb1: 21356858078300963468182913432, + limb2: 2876397442336916470, + limb3: 0 + }, + w8: u384 { + limb0: 78282905310432946187126190405, + limb1: 18162394164343077640560142030, + limb2: 3082062505288495442, + limb3: 0 + }, + w9: u384 { + limb0: 13908052303231379433952977690, + limb1: 10205758096915950174523496203, + limb2: 890686555754831180, + limb3: 0 + }, + w10: u384 { + limb0: 72210365052669145740498101072, + limb1: 76834422120187524864989728604, + limb2: 344330747574809352, + limb3: 0 + }, + w11: u384 { + limb0: 35095584389122297078677427368, + limb1: 49139030086973704011048208934, + limb2: 408284083458436549, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 32883796965278505447767637586, + limb1: 63805297304557260788305133359, + limb2: 3037972869059371226, + limb3: 0 + }, + w1: u384 { + limb0: 58542617330962652197834136562, + limb1: 59454418215647343619560021395, + limb2: 952913757657965815, + limb3: 0 + }, + w2: u384 { + limb0: 25912718083579711020927004392, + limb1: 33327030621735534594508445908, + limb2: 50855219641813036, + limb3: 0 + }, + w3: u384 { + limb0: 53672475137468734532723258234, + limb1: 47048285906521888255838659911, + limb2: 2527874596932552283, + limb3: 0 + }, + w4: u384 { + limb0: 66807698699144566236510022173, + limb1: 21788664665007540254135466868, + limb2: 1623103943717741282, + limb3: 0 + }, + w5: u384 { + limb0: 73627661882133415081376147337, + limb1: 18274263498920154106606018930, + limb2: 2482856557994242597, + limb3: 0 + }, + w6: u384 { + limb0: 23069335344713941411983826555, + limb1: 36012959565455092934092964379, + limb2: 549361507320518722, + limb3: 0 + }, + w7: u384 { + limb0: 72693798784870342964402450988, + limb1: 4888698047020850611485567079, + limb2: 2296743970271672961, + limb3: 0 + }, + w8: u384 { + limb0: 68048286153882810314788555504, + limb1: 78370023942676675082493498631, + limb2: 266279408206311520, + limb3: 0 + }, + w9: u384 { + limb0: 65271057157013860448662662206, + limb1: 75259886829978622389419861098, + limb2: 2216338804781170069, + limb3: 0 + }, + w10: u384 { + limb0: 57882739914909567051541765818, + limb1: 77880865400701501188465705899, + limb2: 631591611812092743, + limb3: 0 + }, + w11: u384 { + limb0: 9514136069160487068533081608, + limb1: 12336656597386618628667271983, + limb2: 1099911068185700624, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 3983317841629609321103213616, + limb1: 56107256439493617458905846434, + limb2: 552103384444049854, + limb3: 0 + }, + w1: u384 { + limb0: 31562807642943324201744200795, + limb1: 70271648081671938827522256867, + limb2: 100245793591432466, + limb3: 0 + }, + w2: u384 { + limb0: 2484761649592711938055146428, + limb1: 71697962333806903209823477700, + limb2: 3221979250102026936, + limb3: 0 + }, + w3: u384 { + limb0: 9350814538163631899342252452, + limb1: 47184645853365872958458261978, + limb2: 2717548272136734151, + limb3: 0 + }, + w4: u384 { + limb0: 6283849250562886666542486759, + limb1: 1871770148649222304581419318, + limb2: 2611118725942217217, + limb3: 0 + }, + w5: u384 { + limb0: 47621524487637462183459170756, + limb1: 57753973425531809298703500629, + limb2: 405223174514175453, + limb3: 0 + }, + w6: u384 { + limb0: 75311183806108463721892738810, + limb1: 21955678261205215063576286336, + limb2: 1009909152439874661, + limb3: 0 + }, + w7: u384 { + limb0: 5107029760153308667008184561, + limb1: 43252226759988778285233910564, + limb2: 1504574843987257509, + limb3: 0 + }, + w8: u384 { + limb0: 78559646714347166367672383660, + limb1: 62383352396655682301069446915, + limb2: 53154468751787009, + limb3: 0 + }, + w9: u384 { + limb0: 5550808191026072057506049333, + limb1: 35746153759695325189473500175, + limb2: 2355691814791780697, + limb3: 0 + }, + w10: u384 { + limb0: 53693497155273592388598099524, + limb1: 1519125474905740815506070432, + limb2: 673973360878667279, + limb3: 0 + }, + w11: u384 { + limb0: 57354673478306994218258775136, + limb1: 50187654419520903536975293374, + limb2: 2319722390097127827, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 32262861222732323685534715781, + limb1: 53378304975445949235717961012, + limb2: 534399824303844371, + limb3: 0 + }, + w1: u384 { + limb0: 71713006187464868885129015016, + limb1: 4341628008806033015366597889, + limb2: 2754476173277864369, + limb3: 0 + }, + w2: u384 { + limb0: 38040198434297942290287251566, + limb1: 63722432526359170561224096023, + limb2: 1105736749830828900, + limb3: 0 + }, + w3: u384 { + limb0: 37206390025271614105289885122, + limb1: 27456610080212987388498512206, + limb2: 3372764154840732814, + limb3: 0 + }, + w4: u384 { + limb0: 66383935707633798585187697547, + limb1: 64447205424955938257006766424, + limb2: 2838145910766049532, + limb3: 0 + }, + w5: u384 { + limb0: 3820383159632279473696734232, + limb1: 67795371621920965206376722864, + limb2: 1842016887821386315, + limb3: 0 + }, + w6: u384 { + limb0: 16142566055340536277415180865, + limb1: 64241585072043288469540902689, + limb2: 552791962567716714, + limb3: 0 + }, + w7: u384 { + limb0: 68840563990319001197794571035, + limb1: 77230920230140863973910636175, + limb2: 1180207130742525229, + limb3: 0 + }, + w8: u384 { + limb0: 62032474320499023666402042947, + limb1: 49714448569644373930728460539, + limb2: 3430659722770943599, + limb3: 0 + }, + w9: u384 { + limb0: 77168338579657104709872014190, + limb1: 70893240769636643174441494704, + limb2: 1363520071738909582, + limb3: 0 + }, + w10: u384 { + limb0: 9276544986522603527199019321, + limb1: 56779795621952991961913926001, + limb2: 2031104538709247678, + limb3: 0 + }, + w11: u384 { + limb0: 40147437853192952487696380183, + limb1: 25209684566878193730335029456, + limb2: 1964789090633886875, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 67053641486504082642943532946, + limb1: 46798600359307845321053037962, + limb2: 3229956192555105037, + limb3: 0 + }, + w1: u384 { + limb0: 60289319288920643628596418483, + limb1: 43134031740721837475568152500, + limb2: 1069302353066715752, + limb3: 0 + }, + w2: u384 { + limb0: 40603491627898525252608345376, + limb1: 17665768696964008486139671336, + limb2: 2302072197714399435, + limb3: 0 + }, + w3: u384 { + limb0: 8928882195898838280930883888, + limb1: 77227880885967743500059874333, + limb2: 2113539651138341212, + limb3: 0 + }, + w4: u384 { + limb0: 62784574076038767641996499449, + limb1: 64619701121696619652191590892, + limb2: 2401485967355480839, + limb3: 0 + }, + w5: u384 { + limb0: 70603323077052162094456413688, + limb1: 16884617069268279767825927050, + limb2: 436758784224654814, + limb3: 0 + }, + w6: u384 { + limb0: 16074587525552404945022353233, + limb1: 31369019354627616650439617042, + limb2: 1867646305141970843, + limb3: 0 + }, + w7: u384 { + limb0: 40025973485815122518584991211, + limb1: 20970449873881380105145121417, + limb2: 1714421470504605422, + limb3: 0 + }, + w8: u384 { + limb0: 23374771250893914494821109297, + limb1: 30020287785461753339750600944, + limb2: 411817827503269026, + limb3: 0 + }, + w9: u384 { + limb0: 2486353870663291636936897230, + limb1: 17970054658570829182905969124, + limb2: 591130321171617786, + limb3: 0 + }, + w10: u384 { + limb0: 20082003102492062483757444239, + limb1: 17062282814293351526034958058, + limb2: 1193585707550855073, + limb3: 0 + }, + w11: u384 { + limb0: 56027969357034055149822911325, + limb1: 63533730328142746212527544010, + limb2: 1719430479130332723, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 51783312308340640234437498718, + limb1: 29388381024072939503880115545, + limb2: 3305289331841451048, + limb3: 0 + }, + w1: u384 { + limb0: 26047467001380494005501522461, + limb1: 54297303481870484741614043721, + limb2: 771358572815440544, + limb3: 0 + }, + w2: u384 { + limb0: 27980836657383620682429868212, + limb1: 18300648770341915088898037378, + limb2: 3182817725335229560, + limb3: 0 + }, + w3: u384 { + limb0: 33408169030803698190835627756, + limb1: 63458502639194212519861535144, + limb2: 1699136652032958769, + limb3: 0 + }, + w4: u384 { + limb0: 12018238280917940806216598399, + limb1: 9332817230669704753332757220, + limb2: 1364615428960410251, + limb3: 0 + }, + w5: u384 { + limb0: 40727786709737409443907634568, + limb1: 5628454923718889844449431218, + limb2: 169453806941582591, + limb3: 0 + }, + w6: u384 { + limb0: 70169479343786549818688835761, + limb1: 1871662783975143807155391326, + limb2: 1800468807340656813, + limb3: 0 + }, + w7: u384 { + limb0: 11518615557960856338421828185, + limb1: 62223372521269914811896867732, + limb2: 856543406053990575, + limb3: 0 + }, + w8: u384 { + limb0: 35655766703984412970433852695, + limb1: 28043948491781631001652133815, + limb2: 1322166411997313235, + limb3: 0 + }, + w9: u384 { + limb0: 16019230960979975543691586483, + limb1: 15195599104875388599253061681, + limb2: 334383663383034610, + limb3: 0 + }, + w10: u384 { + limb0: 2812105796463941309962488443, + limb1: 46741520594956518392307932073, + limb2: 624978357331279651, + limb3: 0 + }, + w11: u384 { + limb0: 68301627727101476536895160069, + limb1: 13801092208357894325869377643, + limb2: 3134012298672960025, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 25926751292810127016536042294, + limb1: 62633127104088532217398717112, + limb2: 1341442147190488512, + limb3: 0 + }, + w1: u384 { + limb0: 46693691852909746271924180772, + limb1: 73961407759666496762099416140, + limb2: 450144758129358791, + limb3: 0 + }, + w2: u384 { + limb0: 26149550806474772346881228963, + limb1: 44615367928086524976392628521, + limb2: 2630007420177764085, + limb3: 0 + }, + w3: u384 { + limb0: 42077227718817528550169058107, + limb1: 19637857962521366564157054304, + limb2: 135432774631315902, + limb3: 0 + }, + w4: u384 { + limb0: 39694428865899574756342326533, + limb1: 78661221997346255686742243110, + limb2: 1582413592238119890, + limb3: 0 + }, + w5: u384 { + limb0: 46827264528485412444752834493, + limb1: 17103205926637932267959657826, + limb2: 2239572045709989812, + limb3: 0 + }, + w6: u384 { + limb0: 27633131936013851943955314857, + limb1: 47647095190443468277847517218, + limb2: 1432634099900597678, + limb3: 0 + }, + w7: u384 { + limb0: 58084509974292360735641043210, + limb1: 38003012797591169211549183903, + limb2: 2691868016245463498, + limb3: 0 + }, + w8: u384 { + limb0: 27734384035444991193498347163, + limb1: 56058220372424371695830031800, + limb2: 2459705305124040821, + limb3: 0 + }, + w9: u384 { + limb0: 76162250953502961975929879273, + limb1: 54573976987370348790721057260, + limb2: 1202651830265968770, + limb3: 0 + }, + w10: u384 { + limb0: 70452489398699718938615166237, + limb1: 58572106399578020953166025772, + limb2: 257192488541865495, + limb3: 0 + }, + w11: u384 { + limb0: 34838097330053920464837473381, + limb1: 60693803632423781998677120271, + limb2: 879341268774484903, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 59019833624394497430291856506, + limb1: 31957114760308304921718990520, + limb2: 1086534761811002544, + limb3: 0 + }, + w1: u384 { + limb0: 79018542957765367777390083236, + limb1: 26888066043339357098636432163, + limb2: 302510786575411012, + limb3: 0 + }, + w2: u384 { + limb0: 72858541142872142114666503194, + limb1: 42544426417539817561948804147, + limb2: 630444072951723178, + limb3: 0 + }, + w3: u384 { + limb0: 7087088584139659181067362158, + limb1: 912199449005146127631377652, + limb2: 2011756821228240781, + limb3: 0 + }, + w4: u384 { + limb0: 73342195486549289617638423938, + limb1: 57760430199591391554694693212, + limb2: 1879218054956428706, + limb3: 0 + }, + w5: u384 { + limb0: 72183421903970956510450026191, + limb1: 78448218664936005137143819182, + limb2: 626313470821674924, + limb3: 0 + }, + w6: u384 { + limb0: 35930457108203718328155975818, + limb1: 70503914135912087874256724822, + limb2: 1420515303593550052, + limb3: 0 + }, + w7: u384 { + limb0: 54441488375650092855831445104, + limb1: 53918949380809914337686940487, + limb2: 817042465287340774, + limb3: 0 + }, + w8: u384 { + limb0: 71236477459438697608974383425, + limb1: 24828931976419637562227030099, + limb2: 1569486256049744677, + limb3: 0 + }, + w9: u384 { + limb0: 31272476230740742264126148586, + limb1: 27402307854542666522222920927, + limb2: 1717859074060998130, + limb3: 0 + }, + w10: u384 { + limb0: 28820080210134320095059452334, + limb1: 28011747081664841564804990481, + limb2: 2918525472821856380, + limb3: 0 + }, + w11: u384 { + limb0: 1106266196016747360216651990, + limb1: 27435880917252902258371036084, + limb2: 1461018896103193777, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 31532756654334422823484715570, + limb1: 44558596966934860930832552290, + limb2: 1967919671513249307, + limb3: 0 + }, + w1: u384 { + limb0: 45556220362366804450494719585, + limb1: 23894438882357046852937660478, + limb2: 1307772566821607918, + limb3: 0 + }, + w2: u384 { + limb0: 689937018002300051686859870, + limb1: 36774105819619204917247432641, + limb2: 1606712545255632008, + limb3: 0 + }, + w3: u384 { + limb0: 78098967795524078699871788152, + limb1: 14576791447080386444370144342, + limb2: 3145780983656740840, + limb3: 0 + }, + w4: u384 { + limb0: 9141676169405378255689246659, + limb1: 5251164333230282636392154509, + limb2: 631067208622966444, + limb3: 0 + }, + w5: u384 { + limb0: 30409494980304529478527460842, + limb1: 20572861791124192652969045369, + limb2: 35720599790242959, + limb3: 0 + }, + w6: u384 { + limb0: 67718033204489626047001469170, + limb1: 75580120917765966344346558616, + limb2: 8724874565631974, + limb3: 0 + }, + w7: u384 { + limb0: 42251107758048121469681455616, + limb1: 69687782129643749900538186728, + limb2: 1615456293615746240, + limb3: 0 + }, + w8: u384 { + limb0: 7234017944966461204571785030, + limb1: 33326867255782528969986440826, + limb2: 3176560815594597781, + limb3: 0 + }, + w9: u384 { + limb0: 8663321768128381497950830483, + limb1: 65637902043511022209382883165, + limb2: 2860289278896039986, + limb3: 0 + }, + w10: u384 { + limb0: 52220316324743703774799200324, + limb1: 9855009367561807246891673830, + limb2: 2791936487107062465, + limb3: 0 + }, + w11: u384 { + limb0: 79065287113291033463644601252, + limb1: 56302763765490734815138107375, + limb2: 3371797988883816939, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 46234774883843870292488526882, + limb1: 68894874951721243856450631072, + limb2: 1000272653538712889, + limb3: 0 + }, + w1: u384 { + limb0: 37597493683092401820537706698, + limb1: 62446492009148999730959013058, + limb2: 3126133466649568629, + limb3: 0 + }, + w2: u384 { + limb0: 32128789762158034745772341626, + limb1: 12314328026961949278834461331, + limb2: 3442341997246745768, + limb3: 0 + }, + w3: u384 { + limb0: 33638737433315380832868647145, + limb1: 55309906856286667988450893075, + limb2: 2586304393846160914, + limb3: 0 + }, + w4: u384 { + limb0: 13121269487801411708772107447, + limb1: 50272773343040754127164291666, + limb2: 3477732310643532934, + limb3: 0 + }, + w5: u384 { + limb0: 12798825811512617124994987113, + limb1: 4332065499001183019549307783, + limb2: 2094402275449293742, + limb3: 0 + }, + w6: u384 { + limb0: 66257617345613393009392531912, + limb1: 22995411905860696079228876888, + limb2: 1374573002924435749, + limb3: 0 + }, + w7: u384 { + limb0: 37172581844770001279050555090, + limb1: 35541632585650966614392182251, + limb2: 3260564657672192911, + limb3: 0 + }, + w8: u384 { + limb0: 21283630913304004985118257869, + limb1: 29504886482569925449816991359, + limb2: 3479758726137627015, + limb3: 0 + }, + w9: u384 { + limb0: 32251830019979729460213753963, + limb1: 47245381110589612303373584913, + limb2: 1551101459215310180, + limb3: 0 + }, + w10: u384 { + limb0: 28956135840668540357022681452, + limb1: 15259242410454603166044914353, + limb2: 2154694352687554699, + limb3: 0 + }, + w11: u384 { + limb0: 30561519554313485821623404132, + limb1: 40666269854767105750420828524, + limb2: 1441046289213677057, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 54338118980523938420895116851, + limb1: 45055655285264915527320794748, + limb2: 2710010391991880847, + limb3: 0 + }, + w1: u384 { + limb0: 27630548066002718190407881900, + limb1: 30717817895859016487856463868, + limb2: 119262763559620423, + limb3: 0 + }, + w2: u384 { + limb0: 51886549383898180365624112625, + limb1: 45665871601457925933810818866, + limb2: 2271764021242994152, + limb3: 0 + }, + w3: u384 { + limb0: 20862249282951113957612016167, + limb1: 14821385999883889413930655027, + limb2: 1258245544970751548, + limb3: 0 + }, + w4: u384 { + limb0: 69134998214048737549225487246, + limb1: 57240577429016085083055896627, + limb2: 1217298651414688780, + limb3: 0 + }, + w5: u384 { + limb0: 32050451738328658668200345505, + limb1: 13271107229457712615789769222, + limb2: 1865400628633667231, + limb3: 0 + }, + w6: u384 { + limb0: 26719678139154499861686404642, + limb1: 63004400419767167927091210966, + limb2: 1251915051847970996, + limb3: 0 + }, + w7: u384 { + limb0: 17094023202092723271236005285, + limb1: 43787424768944118873824151232, + limb2: 2256336039027012630, + limb3: 0 + }, + w8: u384 { + limb0: 65847143788856817958278482497, + limb1: 7229583883477537943683327054, + limb2: 3008251761314907620, + limb3: 0 + }, + w9: u384 { + limb0: 38651740792098653091240651082, + limb1: 11151412999673733524274535341, + limb2: 184761950506313391, + limb3: 0 + }, + w10: u384 { + limb0: 64289577911686308880237261456, + limb1: 14320867273145252042750420001, + limb2: 1318104667349651323, + limb3: 0 + }, + w11: u384 { + limb0: 45372598821460681385913577294, + limb1: 26701792168802615255192079756, + limb2: 906823134233040725, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 17068168928228020227754696629, + limb1: 31749404939266091462242207645, + limb2: 1639932283470668040, + limb3: 0 + }, + w1: u384 { + limb0: 14776654925228184061089369852, + limb1: 57404560659229383237247710741, + limb2: 3329682716780384052, + limb3: 0 + }, + w2: u384 { + limb0: 59765726102610377372274901836, + limb1: 41453434192388889118169680353, + limb2: 1368800526319006528, + limb3: 0 + }, + w3: u384 { + limb0: 56071791246929480673436156412, + limb1: 3227962890733967464423171160, + limb2: 2033393893686942133, + limb3: 0 + }, + w4: u384 { + limb0: 17994183906722115165236674078, + limb1: 49925701366051034731356626458, + limb2: 557806661563926878, + limb3: 0 + }, + w5: u384 { + limb0: 30509395776235078082145845480, + limb1: 64974926139805711083048787025, + limb2: 401736101076113880, + limb3: 0 + }, + w6: u384 { + limb0: 63146547785896461370811807659, + limb1: 51443401265057823245803498359, + limb2: 2688832750739939938, + limb3: 0 + }, + w7: u384 { + limb0: 16538042856880721395668233810, + limb1: 26566539479793335484887676940, + limb2: 510908255662619527, + limb3: 0 + }, + w8: u384 { + limb0: 13418506946743225523546772889, + limb1: 43872040860899062984264102986, + limb2: 842593548644238042, + limb3: 0 + }, + w9: u384 { + limb0: 70942139187072929722198325564, + limb1: 42944778841736399521562692457, + limb2: 2223871697026674565, + limb3: 0 + }, + w10: u384 { + limb0: 10651529756225541840430696702, + limb1: 6466082943312168764357207357, + limb2: 1968586410198678415, + limb3: 0 + }, + w11: u384 { + limb0: 77380853986425630048532375069, + limb1: 26595695086782114750882908353, + limb2: 1451794882790066566, + limb3: 0 + } + }, + E12D { + w0: u384 { + limb0: 62974843483780259249085053616, + limb1: 1280343136844234849930241561, + limb2: 1568956703368306666, + limb3: 0 + }, + w1: u384 { + limb0: 61313418313508118424369029804, + limb1: 79145767230943137228681677538, + limb2: 2846139226438413303, + limb3: 0 + }, + w2: u384 { + limb0: 33958390811101007459855256706, + limb1: 5354752501666784321538780563, + limb2: 1023818032408716377, + limb3: 0 + }, + w3: u384 { + limb0: 71820304958496550968530186990, + limb1: 3542087910140180248883298994, + limb2: 1737822879462370136, + limb3: 0 + }, + w4: u384 { + limb0: 69823151717956107349935703458, + limb1: 76387441737018874591684525097, + limb2: 3389674176629023927, + limb3: 0 + }, + w5: u384 { + limb0: 73163028996258534823457349866, + limb1: 63530415813799912686779453970, + limb2: 3291617866977928603, + limb3: 0 + }, + w6: u384 { + limb0: 21080339298248632223091084031, + limb1: 40491896492137325199557305496, + limb2: 2821702423721324895, + limb3: 0 + }, + w7: u384 { + limb0: 31906782760384276868760183358, + limb1: 51227734429959320412902964944, + limb2: 1867172998409809822, + limb3: 0 + }, + w8: u384 { + limb0: 74086670791783466529869447085, + limb1: 30109525965982589436454948826, + limb2: 1178970358178059585, + limb3: 0 + }, + w9: u384 { + limb0: 52479891955174425150794710240, + limb1: 1960686238383947951304407240, + limb2: 1692847802152528984, + limb3: 0 + }, + w10: u384 { + limb0: 75676891466544788947548515711, + limb1: 57933899681930506273340814216, + limb2: 2118012911361867617, + limb3: 0 + }, + w11: u384 { + limb0: 68443856178229268835267672371, + limb1: 34625172185879585259412443759, + limb2: 1930608056163771453, + limb3: 0 + } + }, + ]; + let big_Q: Array = array![ + u384 { + limb0: 60895037210267172983842734299, + limb1: 47220005028242038095130950240, + limb2: 1704949888957668411, + limb3: 0 + }, + u384 { + limb0: 31572591169409323520656851822, + limb1: 35187065567217811823418564828, + limb2: 2598862180079794039, + limb3: 0 + }, + u384 { + limb0: 5175094617744719368708189196, + limb1: 73767835099439471757086171126, + limb2: 2444002853899091881, + limb3: 0 + }, + u384 { + limb0: 59519541612167277157939602297, + limb1: 75811586633750552975664134818, + limb2: 3382364836642362669, + limb3: 0 + }, + u384 { + limb0: 37680339065924578078551633598, + limb1: 51971917561084128917318814506, + limb2: 894222119535011350, + limb3: 0 + }, + u384 { + limb0: 16432731314575055686879522140, + limb1: 72436239229487267281064799736, + limb2: 3275730114778340281, + limb3: 0 + }, + u384 { + limb0: 34118009218853393041058702838, + limb1: 70135395327662545314818907946, + limb2: 1339272947104572832, + limb3: 0 + }, + u384 { + limb0: 51241783085864933271554340704, + limb1: 38666911161311955926302732102, + limb2: 1087771665234936396, + limb3: 0 + }, + u384 { + limb0: 45952848857745976452342541061, + limb1: 56565746643600380114301329837, + limb2: 3324168420112722996, + limb3: 0 + }, + u384 { + limb0: 6287545497351563515539105975, + limb1: 73631288536147293937043990117, + limb2: 844081083108394348, + limb3: 0 + }, + u384 { + limb0: 58216866922524583987357960738, + limb1: 12845217041930115615632996987, + limb2: 1550011207657755782, + limb3: 0 + }, + u384 { + limb0: 15847421233644933095315118466, + limb1: 77607957560042554819429094926, + limb2: 1456981245875834704, + limb3: 0 + }, + u384 { + limb0: 67879921973190411669714487619, + limb1: 44530505185043448776206503090, + limb2: 3022291399756505911, + limb3: 0 + }, + u384 { + limb0: 58171873292123359112668852478, + limb1: 20422000230829485980742286291, + limb2: 2931377777146462933, + limb3: 0 + }, + u384 { + limb0: 15811357492899702137765484130, + limb1: 1601910413213920938694018384, + limb2: 1093483319418478662, + limb3: 0 + }, + u384 { + limb0: 561008339283541402329208890, + limb1: 7017251209043900269184208720, + limb2: 2694418175672814095, + limb3: 0 + }, + u384 { + limb0: 13575754026719797254670953564, + limb1: 64598456868303167266399298214, + limb2: 1309058039680058609, + limb3: 0 + }, + u384 { + limb0: 45381099745509721464153484537, + limb1: 57285269447929871466771685289, + limb2: 408751676848291492, + limb3: 0 + }, + u384 { + limb0: 78886684594956294021217791682, + limb1: 76610557323060497322125981387, + limb2: 3156940540792657894, + limb3: 0 + }, + u384 { + limb0: 15674442171449489444291108855, + limb1: 69227363429958655548472410996, + limb2: 2585455210874615228, + limb3: 0 + }, + u384 { + limb0: 38350749507913632907850444035, + limb1: 31890179833073222529677248885, + limb2: 1135250647089303316, + limb3: 0 + }, + u384 { + limb0: 17461926504780081800997256452, + limb1: 10009797184032955284158023404, + limb2: 2017543319303541, + limb3: 0 + }, + u384 { + limb0: 55508641002273540373823139782, + limb1: 1785310089393945457292946887, + limb2: 2836323273986361343, + limb3: 0 + }, + u384 { + limb0: 18870030903073072327247064435, + limb1: 36821599178788834382538431194, + limb2: 2578918169500031069, + limb3: 0 + }, + u384 { + limb0: 10561053125565899620401702218, + limb1: 42043048776303054305350186606, + limb2: 1616723047966832831, + limb3: 0 + }, + u384 { + limb0: 2363012247877504571121738095, + limb1: 50377368712718302302826047383, + limb2: 2121321795121864601, + limb3: 0 + }, + u384 { + limb0: 70503433171783342371465484795, + limb1: 26620181975059304687111129468, + limb2: 1895733413445938633, + limb3: 0 + }, + u384 { + limb0: 18047353529685214794591389294, + limb1: 17464755789923080666025535183, + limb2: 3055909014341486585, + limb3: 0 + }, + u384 { + limb0: 41863967088127456650296603282, + limb1: 62605182507500504236448870596, + limb2: 946755486825720166, + limb3: 0 + }, + u384 { + limb0: 35848764548628850056822622291, + limb1: 27919924027564056625488668214, + limb2: 2032473993467441561, + limb3: 0 + }, + u384 { + limb0: 16830116440044042087649045579, + limb1: 7069819977118791010573961739, + limb2: 2127263764304722668, + limb3: 0 + }, + u384 { + limb0: 68793059178165025826617500549, + limb1: 75140905092139173770453010054, + limb2: 950042641002585926, + limb3: 0 + }, + u384 { + limb0: 37478851075175244802126708475, + limb1: 9231995451414028868192994130, + limb2: 2268927753777811581, + limb3: 0 + }, + u384 { + limb0: 54797868268547860776229114151, + limb1: 9890898674464044809404068306, + limb2: 429759848846287836, + limb3: 0 + }, + u384 { + limb0: 34654659176847989303961004809, + limb1: 77736957420425283128150824525, + limb2: 235799833078382241, + limb3: 0 + }, + u384 { + limb0: 67265233796732780767943690559, + limb1: 59218311205352684895696207821, + limb2: 1108811673513374898, + limb3: 0 + }, + u384 { + limb0: 42979982488553529712353901000, + limb1: 59167110598825747059327046039, + limb2: 1918779539546496931, + limb3: 0 + }, + u384 { + limb0: 26709987767712336752335872503, + limb1: 38593511347672767914048611196, + limb2: 1756750966786319689, + limb3: 0 + }, + u384 { + limb0: 16364393796022110952412589814, + limb1: 27924242083704170359072961603, + limb2: 25597980188283603, + limb3: 0 + }, + u384 { + limb0: 52410437263975794633860468374, + limb1: 20488528667546400719785324891, + limb2: 3440900994615120968, + limb3: 0 + }, + u384 { + limb0: 3523486436155511689616600022, + limb1: 53689453039511921906527321412, + limb2: 666742222807439697, + limb3: 0 + }, + u384 { + limb0: 77809346179872335523613792973, + limb1: 53188766676224159667605431560, + limb2: 441244225355144509, + limb3: 0 + }, + u384 { + limb0: 7534792396411587149723845519, + limb1: 39522256862474844927839269272, + limb2: 2051259865561228777, + limb3: 0 + }, + u384 { + limb0: 78969014450731047791469690711, + limb1: 73648092182973373424141038092, + limb2: 1763981727300567565, + limb3: 0 + }, + u384 { + limb0: 77972590836894614142033121836, + limb1: 22113599996563860763606661180, + limb2: 3361752855254871471, + limb3: 0 + }, + u384 { + limb0: 53053760776513288162307374513, + limb1: 30060639609023329532755245089, + limb2: 861675784781160421, + limb3: 0 + }, + u384 { + limb0: 54063115440798097631433721386, + limb1: 69184143017058070712179653678, + limb2: 3286185148018949260, + limb3: 0 + }, + u384 { + limb0: 14484652153552073149438067246, + limb1: 73378790851392593888831253367, + limb2: 1388199153182000672, + limb3: 0 + }, + u384 { + limb0: 55488675908210186093287967820, + limb1: 26438634541558515676549108158, + limb2: 2386496804852524826, + limb3: 0 + }, + u384 { + limb0: 53195000989288178287000497177, + limb1: 67997722748864778460433077044, + limb2: 309100428666452371, + limb3: 0 + }, + u384 { + limb0: 25105845158404837608993663100, + limb1: 69958600388587164432368649105, + limb2: 3345115295230062087, + limb3: 0 + }, + u384 { + limb0: 60700469679407585260674168527, + limb1: 40777474244254197431301351105, + limb2: 720460426731105016, + limb3: 0 + }, + u384 { + limb0: 46612654658389989740730618850, + limb1: 41890545366407855981255086461, + limb2: 1573961820785108868, + limb3: 0 + }, + u384 { + limb0: 38586734822243591292583547690, + limb1: 14795127923366145517862905760, + limb2: 2415947259880990861, + limb3: 0 + }, + u384 { + limb0: 36035382506388039560003040291, + limb1: 69330861923259827373980240025, + limb2: 329186704174879113, + limb3: 0 + }, + u384 { + limb0: 59579960535371911160825009820, + limb1: 19608996259836589471258873310, + limb2: 398177791843266603, + limb3: 0 + }, + u384 { + limb0: 13477492921149462937202508638, + limb1: 45648396730770671501111014131, + limb2: 1148366063539265771, + limb3: 0 + }, + u384 { + limb0: 11830858465915135308250417173, + limb1: 20868491508915220086647232502, + limb2: 272342994025682041, + limb3: 0 + }, + u384 { + limb0: 12213219606308978513633633808, + limb1: 8274380055659322858656253376, + limb2: 1822634492898360440, + limb3: 0 + }, + u384 { + limb0: 17379889686175006820527659491, + limb1: 40369082413607518754593286204, + limb2: 2194510870947718131, + limb3: 0 + }, + u384 { + limb0: 70442177369934747837956287550, + limb1: 36045816633825872382318065042, + limb2: 3038492822115472173, + limb3: 0 + }, + u384 { + limb0: 25562756821366075026743886539, + limb1: 55640521462847943672694721675, + limb2: 2161798906282818269, + limb3: 0 + }, + u384 { + limb0: 48687981575477786134771211342, + limb1: 22169616681137570658052161024, + limb2: 1406996341107376639, + limb3: 0 + }, + u384 { + limb0: 24606709687096974144665177443, + limb1: 50032371035463848220892535449, + limb2: 1335116035928419496, + limb3: 0 + }, + u384 { + limb0: 16896350526505085070310278939, + limb1: 55804986870622569684202515552, + limb2: 2005227010016563497, + limb3: 0 + }, + u384 { + limb0: 40628102566076256428834811692, + limb1: 15282073041783893608356794359, + limb2: 2207289394995997410, + limb3: 0 + }, + u384 { + limb0: 40710698226306992798840928604, + limb1: 57049311909252183249324869970, + limb2: 602765446229449106, + limb3: 0 + }, + u384 { + limb0: 5924829671970058204883748837, + limb1: 38454259536968882313457266598, + limb2: 858196461287414055, + limb3: 0 + }, + u384 { + limb0: 38281414232442533146380580251, + limb1: 1636942419643634135451733505, + limb2: 2438757346020849554, + limb3: 0 + }, + u384 { + limb0: 14888471543468897532558631135, + limb1: 44225674846462417509596413265, + limb2: 3052228604905497461, + limb3: 0 + }, + u384 { + limb0: 59110478407859550855626804711, + limb1: 42392442521141719582129992984, + limb2: 1942734388278306997, + limb3: 0 + }, + u384 { + limb0: 19097140705125414615083129446, + limb1: 35313784433158060809859224258, + limb2: 3206317054549742533, + limb3: 0 + }, + u384 { + limb0: 59942036684442338667614211865, + limb1: 32829711530851226378887024345, + limb2: 2706807053287151157, + limb3: 0 + }, + u384 { + limb0: 48656994732178813124535732163, + limb1: 17617272452724223696130097924, + limb2: 3275884422723214726, + limb3: 0 + }, + u384 { + limb0: 41687132551987402767910697008, + limb1: 65869474474344973880916606699, + limb2: 1078619918928598286, + limb3: 0 + }, + u384 { + limb0: 21347627721034014083098857996, + limb1: 48278033632900745998160985771, + limb2: 2100400766406304822, + limb3: 0 + }, + u384 { + limb0: 1384147899296990540277371814, + limb1: 18246713837659385292429424478, + limb2: 2903905583396693853, + limb3: 0 + }, + u384 { + limb0: 38879144259909736382793425755, + limb1: 14818409165035053814869627421, + limb2: 1078630600320243522, + limb3: 0 + }, + u384 { + limb0: 66412096378116658151912869349, + limb1: 61438209883737109118316446024, + limb2: 267967214170654706, + limb3: 0 + }, + u384 { + limb0: 56002668237201505964717941316, + limb1: 27126549587672117914317475140, + limb2: 56796302067306017, + limb3: 0 + }, + u384 { + limb0: 40332859065579827130736200643, + limb1: 73016505063037653352629212083, + limb2: 2437158133970141823, + limb3: 0 + }, + u384 { + limb0: 63071025597825191692780480870, + limb1: 19494002844215733367240053837, + limb2: 3262644716875705817, + limb3: 0 + }, + u384 { + limb0: 77265524725036698267485750909, + limb1: 20088656035538838335816108035, + limb2: 17833018163640938, + limb3: 0 + }, + u384 { + limb0: 32050601732155611275992177255, + limb1: 68518270061533910934233172633, + limb2: 1642960633753875057, + limb3: 0 + }, + u384 { + limb0: 465312044477661682082963035, + limb1: 8445968581023630213814960833, + limb2: 1807828469521005769, + limb3: 0 + }, + u384 { + limb0: 5462462373671778524084322533, + limb1: 31086348573300359993858631016, + limb2: 3067988608364122287, + limb3: 0 + }, + u384 { + limb0: 24916182145954495807946146229, + limb1: 10413778046703673629054468870, + limb2: 812748456267222244, + limb3: 0 + }, + u384 { + limb0: 28353426807414315521280080557, + limb1: 40272950995734200832151165604, + limb2: 1574545727152181320, + limb3: 0 + }, + u384 { + limb0: 44395311878651317133403884654, + limb1: 30503515379794205502283021469, + limb2: 2106923940419345683, + limb3: 0 + }, + u384 { + limb0: 52274560312418184432772921130, + limb1: 15665221373004180939206495579, + limb2: 160405720195454695, + limb3: 0 + }, + u384 { + limb0: 55102754179046485793209220943, + limb1: 55866706593384383229224005719, + limb2: 832267973471655110, + limb3: 0 + }, + u384 { + limb0: 54688273565256626049057448297, + limb1: 2621785425243814371817233664, + limb2: 133607610326189188, + limb3: 0 + }, + u384 { + limb0: 23177648295969714689270542088, + limb1: 603412903143387095634310635, + limb2: 3059239397646586374, + limb3: 0 + }, + u384 { + limb0: 7854854966518908722414678576, + limb1: 77141459608139483826720892610, + limb2: 3191017824374339750, + limb3: 0 + }, + u384 { + limb0: 79092487667757302597607055600, + limb1: 43308388360113732790297163903, + limb2: 1296940777786667918, + limb3: 0 + }, + u384 { + limb0: 26273449250136886068159074558, + limb1: 74675916791358452902119814635, + limb2: 3398093984575533524, + limb3: 0 + }, + u384 { + limb0: 65036275031625340673994159195, + limb1: 63223795372230839722782045244, + limb2: 2489675052801111820, + limb3: 0 + }, + u384 { + limb0: 13667107177028713141589216401, + limb1: 602664911591890314726274601, + limb2: 833344935057840329, + limb3: 0 + }, + u384 { + limb0: 56645960218468678348243845802, + limb1: 66497253290496077016813901252, + limb2: 2856966214408170694, + limb3: 0 + }, + u384 { + limb0: 61184532939185983982708035520, + limb1: 42767469348642633458327265651, + limb2: 1809139799988488587, + limb3: 0 + }, + u384 { + limb0: 13338400576134540179244293668, + limb1: 58301373582665858017939767171, + limb2: 2741644294899144854, + limb3: 0 + }, + u384 { + limb0: 47270103352486940601839584280, + limb1: 5175746842110230172380852705, + limb2: 599672453691748891, + limb3: 0 + }, + u384 { + limb0: 35297552027759706817691766139, + limb1: 39655191500243026227612598610, + limb2: 2216331741854313982, + limb3: 0 + }, + u384 { + limb0: 17875212320186363311548654991, + limb1: 21185334020317749722804444972, + limb2: 2596374824420762124, + limb3: 0 + }, + u384 { + limb0: 15984332307805144482444065446, + limb1: 65098147366412527487250645687, + limb2: 2051738427696314444, + limb3: 0 + }, + u384 { + limb0: 59579812039059266733304785902, + limb1: 23782418954352906098632188025, + limb2: 65219711793060760, + limb3: 0 + }, + u384 { + limb0: 28216310870131377002384425586, + limb1: 12118684172646856596895153407, + limb2: 2054907414897023032, + limb3: 0 + }, + u384 { + limb0: 28395275200907980325594342060, + limb1: 10001013847413231298366611374, + limb2: 1575621427164210873, + limb3: 0 + }, + u384 { + limb0: 26339084956893321836649135382, + limb1: 59014940026470862278424657288, + limb2: 3103183527301482592, + limb3: 0 + }, + u384 { + limb0: 17936136879344725596417169350, + limb1: 1613217547756887306676872930, + limb2: 1080569974513910601, + limb3: 0 + }, + u384 { + limb0: 25906692910130988364980840117, + limb1: 64767096820878181360429365258, + limb2: 1567272824731166387, + limb3: 0 + }, + u384 { + limb0: 25780075726146867095426686583, + limb1: 8253809419456850711420220104, + limb2: 243397980400682067, + limb3: 0 + }, + u384 { + limb0: 32108414088173364162492508715, + limb1: 49985410004911861301761963516, + limb2: 2944947339107047174, + limb3: 0 + }, + u384 { + limb0: 66970726671017069130982150115, + limb1: 54807866185622941830152311580, + limb2: 3299603071830027506, + limb3: 0 + } + ]; + let precomputed_miller_loop_result = Option::Some( + E12D { + w0: u384 { + limb0: 70120067809771154094591774915, + limb1: 30448853095900817748155904607, + limb2: 2849828515714745474, + limb3: 0 + }, + w1: u384 { + limb0: 52458522188678237167153603485, + limb1: 56311434203975449507229622343, + limb2: 3265742089022049431, + limb3: 0 + }, + w2: u384 { + limb0: 40900236316208118120895850178, + limb1: 7172444673174340581810165936, + limb2: 2323313173709996237, + limb3: 0 + }, + w3: u384 { + limb0: 37915623890493035955075228823, + limb1: 25431951264308140572866909007, + limb2: 1734028456245979220, + limb3: 0 + }, + w4: u384 { + limb0: 60425057246522516954735672879, + limb1: 38184567883172618942349744071, + limb2: 2928789498064410133, + limb3: 0 + }, + w5: u384 { + limb0: 24565802077741641888839340263, + limb1: 73462364613202420656048917510, + limb2: 1033193463611751598, + limb3: 0 + }, + w6: u384 { + limb0: 54516977799975612815023617455, + limb1: 71993328115488862658458759919, + limb2: 224092557866893194, + limb3: 0 + }, + w7: u384 { + limb0: 64821755387392314994700537369, + limb1: 57410456049815560189047788443, + limb2: 1095417974927586516, + limb3: 0 + }, + w8: u384 { + limb0: 77243022350655075682349106872, + limb1: 22537551735850787169740831371, + limb2: 2525197685197359492, + limb3: 0 + }, + w9: u384 { + limb0: 68407279213958656834512397767, + limb1: 38325086802402843933313123879, + limb2: 972555989198100726, + limb3: 0 + }, + w10: u384 { + limb0: 25738948019804587972913691280, + limb1: 65790824410506892975978901518, + limb2: 2757621139865735198, + limb3: 0 + }, + w11: u384 { + limb0: 29274299646138171556956845039, + limb1: 16497913285620516520285276927, + limb2: 2128914331969779571, + limb3: 0 + } + } + ); + let small_Q = Option::Some( + E12DMulQuotient { + w0: u384 { + limb0: 45254873187010240806611465714, + limb1: 36080593345581409437794603648, + limb2: 2327241760610690792, + limb3: 0 + }, + w1: u384 { + limb0: 59714655489680773379660514307, + limb1: 65190530542311876591604515340, + limb2: 2638690044343434727, + limb3: 0 + }, + w2: u384 { + limb0: 6682217225597423761655663938, + limb1: 11032815538198913139351634946, + limb2: 558033830454078175, + limb3: 0 + }, + w3: u384 { + limb0: 25534105628333122833536251668, + limb1: 20881071771212101283007561320, + limb2: 2977140964530896207, + limb3: 0 + }, + w4: u384 { + limb0: 48951590590766268372719713003, + limb1: 48678080240826505095064571938, + limb2: 2688780790088278175, + limb3: 0 + }, + w5: u384 { + limb0: 1504497477116777005253717489, + limb1: 21765174803019012998989174353, + limb2: 3087913700575924384, + limb3: 0 + }, + w6: u384 { + limb0: 33176331502780147637856540749, + limb1: 38671656250781110456449533876, + limb2: 2833140522476539065, + limb3: 0 + }, + w7: u384 { + limb0: 25430471076472061390471496723, + limb1: 11399042391001382412161554343, + limb2: 474188050987602552, + limb3: 0 + }, + w8: u384 { + limb0: 17582495801024601141058066209, + limb1: 4856325061968270277713575810, + limb2: 1284477205672371753, + limb3: 0 + }, + w9: u384 { + limb0: 12580814587829125827053722937, + limb1: 7004890288450171845331741546, + limb2: 288395494919659452, + limb3: 0 + }, + w10: u384 { + limb0: 8572961729402251527431431056, + limb1: 57959505428644257692348948960, + limb2: 1485596465508937738, + limb3: 0 + } + } + ); + + let res = multi_pairing_check_bn254_3_pairs( + pair0, + pair1, + pair2, + lambda_root, + lambda_root_inverse, + w, + Ris.span(), + big_Q, + precomputed_miller_loop_result, + small_Q + ); + assert!(res); + } + + + #[test] + fn BLS12_381_mpcheck_2P_() { + let pair0: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 17698991481913493363815727015, + limb1: 31979368164686931486190389690, + limb2: 54957181271448476712333535348, + limb3: 3205559428072680301227085178 + }, + y: u384 { + limb0: 47527168800223090793344220303, + limb1: 6909178931299266284532638599, + limb2: 49122047498789305692270346186, + limb3: 1663360759791274440830864307 + } + }, + q: G2Point { + x0: u384 { + limb0: 23964479875474008667506373899, + limb1: 62640690004295413892576842276, + limb2: 68866776681131507028223497219, + limb3: 1424671832159755201203620336 + }, + x1: u384 { + limb0: 64109460416178721573773390537, + limb1: 58508400942570211660938078684, + limb2: 44458904782594328368520027448, + limb3: 5238144068341567230320126909 + }, + y0: u384 { + limb0: 25978498274383998027544649875, + limb1: 26329169910016071012859457569, + limb2: 4714813117098033878414577332, + limb3: 635609275809482390328361862 + }, + y1: u384 { + limb0: 12440050406669527416983200822, + limb1: 77950202274996811916068755143, + limb2: 15396097300017958867485435092, + limb3: 1801677574119149339688082841 + } + } + }; + let pair1: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 17698991481913493363815727015, + limb1: 31979368164686931486190389690, + limb2: 54957181271448476712333535348, + limb3: 3205559428072680301227085178 + }, + y: u384 { + limb0: 7353227701958302163985657372, + limb1: 25026800185857210777754033271, + limb2: 50933096330300616080881963765, + limb3: 6384543022294917739755461634 + } + }, + q: G2Point { + x0: u384 { + limb0: 23964479875474008667506373899, + limb1: 62640690004295413892576842276, + limb2: 68866776681131507028223497219, + limb3: 1424671832159755201203620336 + }, + x1: u384 { + limb0: 64109460416178721573773390537, + limb1: 58508400942570211660938078684, + limb2: 44458904782594328368520027448, + limb3: 5238144068341567230320126909 + }, + y0: u384 { + limb0: 25978498274383998027544649875, + limb1: 26329169910016071012859457569, + limb2: 4714813117098033878414577332, + limb3: 635609275809482390328361862 + }, + y1: u384 { + limb0: 12440050406669527416983200822, + limb1: 77950202274996811916068755143, + limb2: 15396097300017958867485435092, + limb3: 1801677574119149339688082841 + } + } + }; + let lambda_root_inverse = E12D { + w0: u384 { + limb0: 30464272398380526589243755441, + limb1: 1554003683642249994555966188, + limb2: 1005656792815606840622138621, + limb3: 7367678630841477085429166329 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 48933903728021456635913996782, + limb1: 33956264061155113696086038342, + limb2: 74851388973414709842343605751, + limb3: 3674809738696735620020061658 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 50461767205031027348063830564, + limb1: 72306837211359778145320407882, + limb2: 50643287607039762467776601603, + limb3: 493023560794008796713682237 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 48791304822411491340804184765, + limb1: 72493244780565076081482218434, + limb2: 24931832431688570503070362036, + limb3: 5922922634381842033602401808 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 7518881208215102377453633346, + limb1: 41124727083586756824076689375, + limb2: 29696223724927014641900425675, + limb3: 3304199374073046330447022786 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 28018124304037552485657475685, + limb1: 38124394144225289868961433784, + limb2: 44020112824491758827710026689, + limb3: 7473727110192538370895986961 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }; + let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 23982359157475594515927493324, + limb1: 77147909627899902380674824549, + limb2: 9290267340572681493799196716, + limb3: 3772587960918646015082831146 + }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 30898037344705798441402384351, + limb1: 34016232003520912275155797657, + limb2: 11536713974252902685809162898, + limb3: 4275315821167546165503494796 + } + }; + let Ris: Array = array![ + E12D { + w0: u384 { + limb0: 7497918480004228331002980681, + limb1: 40583969606260611879173813704, + limb2: 60809356885430886792632350287, + limb3: 2840683449599757444006956979 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 56271924354277390094372488411, + limb1: 45275479371130134835255992407, + limb2: 7506429908351070886388830579, + limb3: 2420341273578850304886248823 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 40082923800750528864158320149, + limb1: 15924417676025130084423016310, + limb2: 23238402756283990888129218166, + limb3: 1302679309041258397493429200 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 6567895181311328263793056988, + limb1: 77138273803133047347282180471, + limb2: 48255049070286665748475223435, + limb3: 1656820819959469275116417053 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 34863740667236299516131740866, + limb1: 51965703724274326938439878742, + limb2: 32670140366842396265432118709, + limb3: 1906074076398736437297144543 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 59522661313564882340211424917, + limb1: 37487813974260626437134952118, + limb2: 58158174094558483399220070673, + limb3: 1132163503234553310928339900 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 13905818838901347696803026869, + limb1: 62795913839012380116671037040, + limb2: 28052944991523681626082910156, + limb3: 1028689488244793112551812133 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 54925124084191750465532720112, + limb1: 54695086314805728334674337034, + limb2: 72319446657096338103428412445, + limb3: 1012963170623259167347857956 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 54364724668965692710130207583, + limb1: 52157989265907462480841614264, + limb2: 39211750640512841418547319299, + limb3: 5807835248382810570210860690 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 29776722147236360787490664993, + limb1: 22692155808763139371079415859, + limb2: 48298299018964956324931547280, + limb3: 7126784674245267140194000250 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 55107745368298349040938027073, + limb1: 73551521361933274861472762415, + limb2: 537422580833031834113750371, + limb3: 3134756735227035633325809564 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 58662188399267756170136090095, + limb1: 7409799844579190629713837692, + limb2: 69543560646407220738209676153, + limb3: 2504699633202737594855670295 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 46677716286786479610387671272, + limb1: 14211535837340240916608587127, + limb2: 66260494803685817928289514614, + limb3: 4417588521668678415312631493 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 77412133184633142381199401763, + limb1: 68703814889123751702556756172, + limb2: 57854277120834268510743166932, + limb3: 2085008091164218137399832055 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 54855214934969474203734499051, + limb1: 67603007781980602711528924345, + limb2: 50369317730428681992554623417, + limb3: 6432854451630933464105937477 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 76451463076793654028765752020, + limb1: 2660370977106702572065626483, + limb2: 65963570724007697426315447829, + limb3: 6169939118856351285513722041 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 21882340392771382455596712666, + limb1: 52194789583392299759621447241, + limb2: 13851881191572048357238099149, + limb3: 3727952390710308589421894484 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 52351058654054060761899797462, + limb1: 40392836820311563452076929735, + limb2: 42617527233258442016095806052, + limb3: 6999397963475046787208896036 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 13106920665074014312163184667, + limb1: 63591309479943768526895091347, + limb2: 55415038323499977925048216825, + limb3: 3318320787905992645975687519 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 71243834845009906111066428062, + limb1: 45194593306082147995637447005, + limb2: 62876007785172941872865797214, + limb3: 7956082105524842235991244197 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 47098906406427503697714016118, + limb1: 13069820661305396706092178769, + limb2: 17032056332122262023389696392, + limb3: 6936487469894423576549836609 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 19719871446067015892552022804, + limb1: 60402897832748379279564105835, + limb2: 11736854115309160010532595914, + limb3: 981746646970600153770792179 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 40835282970632874791877020933, + limb1: 62421564826610389419516338427, + limb2: 65453410884534953346335842255, + limb3: 1683888522290271805778377012 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 63617856820945851824418121888, + limb1: 73611334663167113037169320333, + limb2: 25772850442685160307134595428, + limb3: 6974557826118992987331948702 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 13911055941605347437563637793, + limb1: 43560753440193262956171682655, + limb2: 35737653103432069256502805452, + limb3: 2202979184348803593128344749 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 25134112259433932393308740044, + limb1: 47264388346334849892016970825, + limb2: 27379816118066695766458810142, + limb3: 303678234050327700463928772 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 40685835518700999292338300435, + limb1: 76902638890199307951212767937, + limb2: 34003002340598025822909569322, + limb3: 683831528238057139653873846 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 63342315157180058836815145089, + limb1: 8047479868400476325550090634, + limb2: 50856907973656328492686619581, + limb3: 7533613885070865456447526579 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 46609778332984788843129101239, + limb1: 6683859328140560648952767411, + limb2: 75098627952012016352478815987, + limb3: 1447313205474101179893707860 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 72751933433143000053300750384, + limb1: 64775475953599317637117563792, + limb2: 3800853298900341520649867042, + limb3: 7209789463806293470879281304 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 39139308090242547323909464377, + limb1: 67511532312435856039689341587, + limb2: 6413397677528147923031283998, + limb3: 2340378655545661683714708729 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 1766574475963741373065700703, + limb1: 41041466841075053662213136113, + limb2: 73514171260963967120877683188, + limb3: 2176547274401816035387845218 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 59779019136273527139981740055, + limb1: 12488306386449417054231975483, + limb2: 75860712474252065754376030360, + limb3: 5227473993960790520985273444 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 56270581023560836988307351696, + limb1: 65164568416413553849493870482, + limb2: 30089877055661032183343907863, + limb3: 2682393966826409887608186305 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 66835195479833912988696381672, + limb1: 43127058967011054998437879812, + limb2: 53745507369073342003930188110, + limb3: 7443995813700344291810844654 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 47864219507792980312327157170, + limb1: 42543733190155393076895854578, + limb2: 74554917962248112886938371848, + limb3: 4557662347324559882593100280 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 61168937677095498258772025584, + limb1: 14010194880343950910113834976, + limb2: 67802535739704122239559556756, + limb3: 241881277641271897441934474 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 65741071578476975088515790427, + limb1: 73875064290625242548155678474, + limb2: 12634173683669099320202388557, + limb3: 6885380804901247339498634134 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 8502200142720709441009761524, + limb1: 68642654157034911713923855799, + limb2: 72081971259936222192319021364, + limb3: 6557487247694496684204816112 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 43042893515141354816414488464, + limb1: 59353047759740531524741851058, + limb2: 48320144202168997947142529683, + limb3: 2547662844461062777306623422 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 5678449658385244274686659666, + limb1: 24884464299555199557220431214, + limb2: 55786772777822920293062394347, + limb3: 7186380963816110265033152852 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 77715886351278668630871529480, + limb1: 42956937275851784384802319904, + limb2: 3358804431149772355500058721, + limb3: 4406742067669660154136058532 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 71852637783452448565055348772, + limb1: 1283505370272752276373391575, + limb2: 63676242173532386623069114335, + limb3: 277584565406389361956573855 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 1365803936080225909780661164, + limb1: 53507860670309019386024826501, + limb2: 67215025901362331875714450113, + limb3: 4754463977039032570070404746 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 74625530533711796794938928546, + limb1: 34919484352921669685262210698, + limb2: 37872928973372201462749299993, + limb3: 4303287107365225820104278899 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 23140198146434694536956914921, + limb1: 63588341597539850888436802845, + limb2: 28522260508196173969593592268, + limb3: 5224158753534557480118024104 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 37095418017362413744900307117, + limb1: 43319525064663773163220694020, + limb2: 36376929680881745470663129039, + limb3: 842302207193146993366471951 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 26622599324161453176305681458, + limb1: 18820548057527053999156933509, + limb2: 75856111345317098820423908166, + limb3: 5691805688980618902808033297 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 40860091217914219557083793161, + limb1: 64951120711184604868886549119, + limb2: 1244107615000249109235492552, + limb3: 7556663266659254360651712686 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 2286877033407084526311161293, + limb1: 20310489880515253591316227926, + limb2: 47970243264640558821823674878, + limb3: 3990866130613074930547821281 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 62669358004364586621523286749, + limb1: 69150338560081611464054140863, + limb2: 52959153550720907417648390158, + limb3: 245308644171769892980822360 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 13536072869437145879530286420, + limb1: 19871378759907127615391147221, + limb2: 31375166842777616062659836675, + limb3: 3265591476045531191379143321 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 35370447084890341622620655763, + limb1: 48718779345093682421050984485, + limb2: 63227379585621621388960197780, + limb3: 3746164113054208879410650905 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 72145700081793870075192010700, + limb1: 31103950487885282306705155812, + limb2: 58069852511469504535935630207, + limb3: 6535737843947058129313087862 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 48843673505037787945068425861, + limb1: 38811903584071542465860621686, + limb2: 12807916053648150682869553636, + limb3: 1118411052716951950574529662 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 66263340346846252781939259634, + limb1: 4889488727298657244788542623, + limb2: 51263105940594147862185227589, + limb3: 5779770524116900678105388068 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 68394024063185385712566771593, + limb1: 34148604897246310090027593457, + limb2: 36286391343076492863838102477, + limb3: 1366456029934877460379625615 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 68983384147789837501347803449, + limb1: 30105060319830175900948358320, + limb2: 25862750805887007139460373443, + limb3: 1893564065081375715114154920 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 7073863132314566869077976517, + limb1: 57516352896541872633463107083, + limb2: 1862534241902202180757076322, + limb3: 206528844349443363794023602 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 33627496359042722028730358633, + limb1: 51438970050229357666358175502, + limb2: 74237090958034946877286129716, + limb3: 7428180780046329122160442211 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 29928454070665539402025644123, + limb1: 76483567387403899510552214013, + limb2: 24378890377371706078730040666, + limb3: 4783746209881581887371354398 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 16195496698832336561778273934, + limb1: 16032256089540461409347310588, + limb2: 42230303523007211342155463075, + limb3: 980633704837426877392498142 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 41659678345335149690162975220, + limb1: 64061554545750753423782257189, + limb2: 34397890838468793666247533987, + limb3: 3232970937857641937822561057 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 49077017042223186916282861236, + limb1: 23276927334239475993055781002, + limb2: 32774124136520535379766898501, + limb3: 3933938586581782476641060250 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 72253799455797661482561072895, + limb1: 70345743831881610430759232860, + limb2: 8168215471508296005362166223, + limb3: 1810097979585239991583161992 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 42656658684967674874940475925, + limb1: 51297401743083423822791921209, + limb2: 37142859101239156781970675305, + limb3: 3166252412669836240511113274 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 2434793946880785315204205067, + limb1: 64462544352472710524649937443, + limb2: 73825580971460786069032568255, + limb3: 2383660975855200929208607748 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 11418035373273553960347752203, + limb1: 65436866146333596013256670424, + limb2: 13471305471324338652485395977, + limb3: 2671513212356779391764980606 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 11796927882882974149678377046, + limb1: 6163935651784083216141060207, + limb2: 69660758338463798944430555521, + limb3: 6483418094208332015778601333 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 24993492328255487022056067730, + limb1: 17734391195290385607953189972, + limb2: 56863597996244801128233491385, + limb3: 1137331907069951737272178034 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 39437839029561218197612625702, + limb1: 58222923685238959047977073344, + limb2: 14561095805094860904502552985, + limb3: 3863191116466017475320680746 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 16778637839539054092255486538, + limb1: 72207145551789602655024901473, + limb2: 22542996368254933566493771073, + limb3: 4393795313684879384092180508 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 58907419177660774793060435909, + limb1: 54922972101436799016290099486, + limb2: 28139948296011888057433522462, + limb3: 5286190595271663074014090672 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 38231871011397982905383525009, + limb1: 59497810503552958425301311792, + limb2: 5575411890098948641680017775, + limb3: 7754511024426254236129367311 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 16832858857177397150432816827, + limb1: 42806462935690984526310007168, + limb2: 10741259125899051698332858643, + limb3: 7109642800918380752887498133 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 27323884892015063720859169314, + limb1: 53981947512347088078454773162, + limb2: 7000337868197009868679177658, + limb3: 6942107838853545482460582873 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 71089699602854677040442449798, + limb1: 73397627102376310429698065123, + limb2: 43541306646133949046630250630, + limb3: 2273647560844703573137568393 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 45125150700403506665237725276, + limb1: 75991128517009057169130863632, + limb2: 74834405985732409937704094201, + limb3: 3713382077424318853400483526 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 52684916136363575011852743397, + limb1: 24090475082472062166342443191, + limb2: 58554058823404753924213457535, + limb3: 7199926399649771882072548713 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 25250084676076541800935903903, + limb1: 56920616401551738140904454315, + limb2: 8470849411821895908232931605, + limb3: 350927685845486809572047788 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 21959165373078955779325132360, + limb1: 21318897096029213859262274638, + limb2: 43288964376580511701570218398, + limb3: 2590166555977709367570219429 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 10792239852827333811820742653, + limb1: 60936693383863314292478235991, + limb2: 13479888887592479135340654303, + limb3: 3184950207817708111936758399 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 53244191929993517334389247663, + limb1: 29191628497807320844180955818, + limb2: 50332203905365745579398211811, + limb3: 3001770358235540994496683418 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 3369591375257330515080992311, + limb1: 6403431550723445382648064104, + limb2: 18403592434211960190251842923, + limb3: 6240691434413463809572277382 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 13130698129964583125020493318, + limb1: 27637684228539066631410775471, + limb2: 62684247691813266786039085827, + limb3: 7359700947176593784801503061 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 60608063775687112331266087377, + limb1: 3286017009485211039270538809, + limb2: 6773203557740988124631549401, + limb3: 5481453028126089481735906277 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 18112629413996208079289452330, + limb1: 47100444650370698194257605040, + limb2: 29415799487563295042674987653, + limb3: 7933701859822660379692203274 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 60203241940445225950654303761, + limb1: 21818070382814365919190969165, + limb2: 52667100778917643283088038846, + limb3: 5644855635253241839639129081 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 41083419448810514927527683029, + limb1: 51942998688150024212937520236, + limb2: 44078042299552238361722384860, + limb3: 2612090418507811710507410515 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 49562534816287943273989655721, + limb1: 51160131984593430649740607737, + limb2: 43174807235819288227159344819, + limb3: 7537564912773526876865228943 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 72123728299176915532721329782, + limb1: 12568182853073217148832060552, + limb2: 34842829586105358349538313881, + limb3: 3108432537286074700312637001 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 50048323261051447427907938690, + limb1: 45527061438273577658046841959, + limb2: 46641343389437908268716689749, + limb3: 4926743190590350747345139659 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 56208792082772709401519859920, + limb1: 7415947389336589750113765834, + limb2: 23924182032035175867300210467, + limb3: 2164086072191498542425051760 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 34963505136295837380216882060, + limb1: 66917316254695989074150116775, + limb2: 37214114961884431226489068488, + limb3: 7374846994053453818224000625 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 24533556644800329449462223113, + limb1: 64890208187573153773294577839, + limb2: 38340379170582528410859161869, + limb3: 88199560956067698641381526 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 16024652694753642793926606663, + limb1: 1083494961469054973885787624, + limb2: 58952432149419884614465610420, + limb3: 149912686141492306792342128 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 75007378417154145431366564450, + limb1: 37109878510212033466858106167, + limb2: 62945224913113976207414095219, + limb3: 3256405278266900245111217140 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 29671735175243108608140422126, + limb1: 17676741947393067908163615067, + limb2: 45530899906229655594462839880, + limb3: 1569185768820071133993497764 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 11188769952697502358259926038, + limb1: 6592933648344231052188915626, + limb2: 37345657309994107329474978989, + limb3: 4864439763504721666947416562 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 58481583506943458925272342141, + limb1: 12172139515622776360648986379, + limb2: 75180138092866669434148663550, + limb3: 385365782242241510431411275 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 20049183366428844579756316819, + limb1: 9409502070857379666683560103, + limb2: 65430079021970390343885794210, + limb3: 417098284499142202172981400 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 11110435553411333254458207246, + limb1: 40515553397259323973089709112, + limb2: 48896989580177636241890817527, + limb3: 225265352639968118653954627 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 72082168259156862074980226787, + limb1: 14918747363818877144809144546, + limb2: 32494748631161348808012012811, + limb3: 5711248575828362141000566916 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 4624837741132800394932238770, + limb1: 55608355573201753453439429441, + limb2: 18124869658692296903719985256, + limb3: 7633469602938423404473568990 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 38632861971060059031720359707, + limb1: 52999671250328570594198474375, + limb2: 61386700078932523423548686101, + limb3: 1260350990881650017750900954 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 55936724605045758493962667436, + limb1: 28261342803202447905904444978, + limb2: 76625641086225532998821972565, + limb3: 4259377710492926592341540942 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 19906745594706901525930884888, + limb1: 51820497019491152159425242639, + limb2: 13046924810578027043325222103, + limb3: 2525949163329807990275686811 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 74378389033410141135102540509, + limb1: 14600933386935686598745265708, + limb2: 19631869993298861762986034754, + limb3: 3372073926061820387857430057 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 52767410217263392823961221763, + limb1: 17037580436836546406537293793, + limb2: 44127932754020826206572727978, + limb3: 7746366521420019202338974684 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 17657636688728805199075561725, + limb1: 42131099363340117301089351259, + limb2: 4273425205724712344080860992, + limb3: 1290561120028651875191669238 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 6878208969698485218267046912, + limb1: 17477797105147574732138551748, + limb2: 50542082697179079272314449718, + limb3: 5620041213861734346346861178 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 39879208972469383616263410361, + limb1: 6312172700970726209577993005, + limb2: 64620937970644400244782543521, + limb3: 523821232743547395643776743 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 17517084264713770861336755995, + limb1: 7905945996211715613568579694, + limb2: 34875925772427167978606778993, + limb3: 5801722476251083851498054443 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 39899749606864451795861697954, + limb1: 73034100550936974164499094798, + limb2: 42453642155171307150116406458, + limb3: 6484628719320510063091951980 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 73208994685076976986932382304, + limb1: 36156818958293756332538281110, + limb2: 25670963100155774623954706320, + limb3: 7293201285671662772172893819 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 21062065718681616308350305540, + limb1: 1691332570058993411708703658, + limb2: 42902358918759649375086952898, + limb3: 57095989467639207854320268 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 30289158222292419022694977222, + limb1: 18629044046118795129762397185, + limb2: 66412615601380191751413906405, + limb3: 4874001975709757524016239690 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 5417759211245924131478756556, + limb1: 60124992473417441567619668441, + limb2: 10089532248588073300957223934, + limb3: 6654282160531048781530575896 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 24829921314272483016975642829, + limb1: 14537272601209065522991008195, + limb2: 61221577232744808430118040885, + limb3: 3551565354881646117617212355 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 4415588271795882262068980333, + limb1: 62709087046366224187836333722, + limb2: 21802393537943567294010340137, + limb3: 6306512942111661576089612808 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 5238921810711079876063080028, + limb1: 54248609178584662536716315371, + limb2: 14495366705144476138262841764, + limb3: 4938351400201832282363748307 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 72264192772211664371871805130, + limb1: 26204019497659787445507208119, + limb2: 22393749602779870717299173963, + limb3: 4051264271089520595123161942 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 64872966011287148474036788415, + limb1: 24985584361769909219328895721, + limb2: 68471650780469592621652053953, + limb3: 4923991839478366762767149261 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 22285891937414643871024388990, + limb1: 12133129447482269815839812030, + limb2: 8177381160652521428630519538, + limb3: 7675763595259263987905627804 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 4113135372405752378374934305, + limb1: 28420658585916138063111835003, + limb2: 13735467373586522042603047564, + limb3: 5521632812476800571947767714 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 38365628771138982897693246197, + limb1: 25709181985529065435195092047, + limb2: 35076921710679391133405708784, + limb3: 6284000533411627003669049295 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 6298890320735841478886369061, + limb1: 6464077572419016575735471538, + limb2: 76944376506142602620902118744, + limb3: 5121030123722826992834290423 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 2526842741490058732987603335, + limb1: 8930620108361755591415689321, + limb2: 13966401858079667797186072377, + limb3: 7429188852571474229293097439 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 57476921063119552629430694852, + limb1: 68362100520529703232900541322, + limb2: 59698776753027040444897492500, + limb3: 1733889179011978968512665897 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 10371342740759570467110415414, + limb1: 19807486364215030958930216392, + limb2: 41650794773715018184298582756, + limb3: 6482429429907531510761362139 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 1785484712530944491489782165, + limb1: 32288934872333017261999003354, + limb2: 37520199658528668717906397336, + limb3: 122503676454083361957849950 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 26950956344678547173102024553, + limb1: 31768417276600977023134184116, + limb2: 13796081090040356694286105991, + limb3: 3509251428947725832820519111 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 61817510173015084935139994998, + limb1: 63721163151781640437777016934, + limb2: 44669489986872235771087232842, + limb3: 4063205686150954069202587650 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 34325026337617946155870291333, + limb1: 72250272089772592794897414846, + limb2: 28068911211311790470611458335, + limb3: 5411056144707082692236878438 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 53703432484024555126646585348, + limb1: 61033189514557865607665865302, + limb2: 68834640179179455882841435380, + limb3: 917275963297249234728960577 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 77144930608007300227601435109, + limb1: 21935991884720141565662441595, + limb2: 20954138509308089362936452822, + limb3: 340052432109257882726360017 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 8851251205507032702654734642, + limb1: 2042120630507395861202944367, + limb2: 73578682403798640492204341317, + limb3: 7998733453082865088629404065 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 70479827737341453303191206645, + limb1: 67797620289760696053378386035, + limb2: 25590961921073199350057015771, + limb3: 1927253670545944196067626702 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 29823205087662387377965080957, + limb1: 13285173063610396091200939697, + limb2: 22677567980846291944065587995, + limb3: 1313756254379106002568825804 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 27594441594869439629066192303, + limb1: 60712485502782470835633870145, + limb2: 48904322980644597797007960259, + limb3: 6198909713490174169472424936 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 43569963169333258743336323699, + limb1: 189033747502765687716346737, + limb2: 37661051869555107974340268332, + limb3: 3823738827655743864887677784 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 51057876900311790746670403859, + limb1: 24380808901736856130700253392, + limb2: 10741179271013619096974942777, + limb3: 5253354501629297751325791562 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 61975114147634805161581140900, + limb1: 57085000499145069586992612228, + limb2: 34513159671216847610908167007, + limb3: 4250453984902508530801106344 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 56916069380020317576912306797, + limb1: 73390892651776422886360572442, + limb2: 49656839867371352700268284851, + limb3: 1897485390680672418190900789 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 1570298760127266330682890458, + limb1: 25712029659179357232125353734, + limb2: 48940892638447403328476641003, + limb3: 6427882791011479421122284245 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 75516111281275400028954134186, + limb1: 56603674490313343680131083978, + limb2: 56303268257642518893077313980, + limb3: 296634169031197251591857420 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 69210501719196244108733293876, + limb1: 20969884409095717848227933537, + limb2: 76048488113303117140927344780, + limb3: 1155156936581465038586473099 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 27525613071378144473741125116, + limb1: 50133126401756064198678253912, + limb2: 32452938324081198392259279919, + limb3: 7379426430910376014935518495 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 6023462597232260291127456680, + limb1: 64306549584657105854358912282, + limb2: 11536293758433348813374220161, + limb3: 2653200150199781014963495650 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 25525575183427182308511417215, + limb1: 24295374158708070400557361851, + limb2: 42961349494139450474589591578, + limb3: 7991440093416817486400669228 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 63493813278682915634049786844, + limb1: 67055303018704724468269086804, + limb2: 26382395694893524704100621599, + limb3: 410677916714602883034030896 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 45354105934934431510659895191, + limb1: 64447833845922990720123768256, + limb2: 41047229425211095566959954806, + limb3: 7962909436535358352239012076 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 72962109222585169305327079935, + limb1: 43990884294040455161164669840, + limb2: 56531758199778337112570610166, + limb3: 7952313024569481318026881511 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 27298774232714183745570526968, + limb1: 11669782466855114375870912639, + limb2: 54270159489507433770748308899, + limb3: 2414227043879539396553891570 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 32306958031556910089739799973, + limb1: 31396410277823606677195244967, + limb2: 79171720295929746831761119104, + limb3: 1948792868314146467271573355 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 12213920207168810381658327562, + limb1: 27688529319176447164641188396, + limb2: 60559676382864807246520260610, + limb3: 10213648075725471976090191 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 26614958383874883010143333175, + limb1: 23950865923510361274737292162, + limb2: 7846445960809555837310814180, + limb3: 2947852214439732051592400399 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 34246392694320340811795116415, + limb1: 50924917508031159837455155258, + limb2: 25801923494668052459811800584, + limb3: 6682174536212315630280497398 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 15149914444139652498804507956, + limb1: 6549581704556125767996398658, + limb2: 17736467909129198153869498224, + limb3: 3669878588108602215603361695 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 28119835562201200241431034514, + limb1: 5233372265435308019259593411, + limb2: 55553003638266581067629294624, + limb3: 701187977750552052481667305 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 1566712958944674650349249995, + limb1: 19236979974693897305799021109, + limb2: 38963349826814868171003900046, + limb3: 5795674328896960070544210924 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 65657436505119220987673960388, + limb1: 64913681971418010815232792293, + limb2: 34381988033796555169151951672, + limb3: 5334095764365266476023759209 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 74521201569607517230234921036, + limb1: 25452480403436236348998839397, + limb2: 5928563782945744043412847069, + limb3: 5634997022505406567347849353 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 59411301724429560111391314838, + limb1: 67166419870930156488604556702, + limb2: 2423234190511683679509134479, + limb3: 106399275731626447355729662 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 78505072346570529884037605054, + limb1: 6431190270790211027779983618, + limb2: 10298671362765297624625488339, + limb3: 7564656207923882043126278765 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 46410834340035269599550548334, + limb1: 75695993082862747661640400739, + limb2: 54283975403980471979026594956, + limb3: 3685472458141510668071298485 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 12878095325600517981963036331, + limb1: 27934460197400501113924511413, + limb2: 55063674465589585215741867875, + limb3: 1986572952652845287866260825 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 59029928567337405596541575417, + limb1: 33735441153028754989049472295, + limb2: 76821684712257408725901676594, + limb3: 2258980397467305854028724749 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 44807329548592294836290655903, + limb1: 16767159430277242303599928937, + limb2: 54824001527747169225399044156, + limb3: 2553611811853553494012491385 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 8060609792896077536247913032, + limb1: 46380387720326600641555457399, + limb2: 36317119868620199348791083939, + limb3: 2567119171934604841962996125 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 41961002495269479379238198104, + limb1: 31558619807355369426719447284, + limb2: 37686876405112449748363782635, + limb3: 5026447734491296602201844097 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 27433677457094113024305027865, + limb1: 7991305660363788220058961243, + limb2: 17783192447410378558677594609, + limb3: 7607954947628836712080771025 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 19855165080528492788994214059, + limb1: 78495199847832995727816490860, + limb2: 66804770393060418006763141625, + limb3: 6373529201722825466844498993 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 51231467669040087901435119688, + limb1: 53031393338195279126556314819, + limb2: 9008703445397343882596580843, + limb3: 1529848347371906988847452483 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 40994227352518370581498745626, + limb1: 68100916678187540497204466070, + limb2: 69780692628863904035099056871, + limb3: 3283796200866446392598870871 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 57380310693535682452126285673, + limb1: 5286868519984027211712353816, + limb2: 70518720991231902133743394995, + limb3: 4280586167385307604088276868 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 1430872976253740804320801066, + limb1: 51519341708301059629069496280, + limb2: 67489187407316650518358512950, + limb3: 5816590068639345830018457578 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 63226301436623853540382434354, + limb1: 31318252950413360074622265596, + limb2: 11232367559822609412684577363, + limb3: 78554052350813608211284732 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 36053410333650661139907651483, + limb1: 52599326767230638861581433195, + limb2: 2476517819350184260174501963, + limb3: 107069741635048243191499676 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 1368811292762720266076864042, + limb1: 53292511199759147158555869188, + limb2: 25220704720589914016537891947, + limb3: 2989647804644615587630707428 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 35168474399398811944160799668, + limb1: 59269747170618507123611706197, + limb2: 20947107000236738211309618627, + limb3: 7452919811130424106726325496 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 22178879233887878292565400678, + limb1: 44495822835684650372004978915, + limb2: 78178027111969643954612926021, + limb3: 7288347973776392989824430674 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 895707297283028806957518304, + limb1: 24123730051307669610505753552, + limb2: 281379300809948876726512841, + limb3: 7729232754979378735774303740 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 33333683653996107242363815400, + limb1: 41460131644503705861404601223, + limb2: 45928306646632893222553821813, + limb3: 4310984478784596886545907688 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 11793608985177534623194801187, + limb1: 37203997338561122654972799888, + limb2: 15421490092900585589631399161, + limb3: 2939179359042407866274850056 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 37646624652929957709115485696, + limb1: 70960681197635440229863651108, + limb2: 287795739688673865434183943, + limb3: 3463885854030125314656119601 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 17977345295515057878816176773, + limb1: 59430748718669869401555117966, + limb2: 18650156559230390190678071995, + limb3: 427385002416415565685927514 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 64885306698533638687231980346, + limb1: 54210981944185404901707892709, + limb2: 49281047108496737261725962551, + limb3: 7207751252320400893647346773 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 47848369105273299863261858596, + limb1: 37038680900634608371775698866, + limb2: 37879285311543357506584248207, + limb3: 1960764928052772360879108955 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 5118786500866851698074591097, + limb1: 12990522641662673929548074043, + limb2: 12137600008963579584060982227, + limb3: 6134797131537495340796664058 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 8889348092979834563556838131, + limb1: 48080078949975930161370874742, + limb2: 45085856696043183460550107129, + limb3: 4128350437971509010590660873 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 62047239136107231081231011276, + limb1: 57974392344824509966117314829, + limb2: 70185930214232561857229366630, + limb3: 1719528165582241282886726800 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 42000737583824994881637247047, + limb1: 65205414551040400437993546171, + limb2: 23765231317377794324489641130, + limb3: 2927399753900424064907285269 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 29297330990115703621245082582, + limb1: 18054319682608302118748099108, + limb2: 56825715887833442276004285524, + limb3: 276490529198464892847475664 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 35255218115312008562719367681, + limb1: 14473445497130816623083497893, + limb2: 77862210883320890623477476199, + limb3: 3400535729501159924984743815 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 73668065217437257952660455686, + limb1: 8867487797640799277258094570, + limb2: 40028563676817543062627428912, + limb3: 1966624621741580317505873088 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 67556637055618917601537497730, + limb1: 54128001349001531312030397495, + limb2: 36147959550171033778962554640, + limb3: 1268709239094870580380975021 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 9666378999164857863129742271, + limb1: 2455882461053010653282250547, + limb2: 78452493259678902753039044722, + limb3: 1499043868705141916556625736 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 73914893488763483248190226778, + limb1: 72447748282434778005921959441, + limb2: 75361078198210357766940072955, + limb3: 4334671100019075136854166229 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 24413106409685609910045944085, + limb1: 33856197522265385602553350741, + limb2: 77644007128522322261772110778, + limb3: 4096369037128655516370577750 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 46872987749672080396351477639, + limb1: 18119200729532097072662831092, + limb2: 58380494442360544350715285809, + limb3: 288592942420123302166886958 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 70911776533444272136869133374, + limb1: 52579927087416340419424761267, + limb2: 34919434348841781210440356248, + limb3: 7366941077332489062076584996 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 76469988112569915979252517027, + limb1: 26787861492876331451034279742, + limb2: 66984295869227162089400965293, + limb3: 5989828875612928751402890859 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 61732618126877058919357668644, + limb1: 42631772838098208843671143055, + limb2: 825389207364648736256307320, + limb3: 2457113556605104765644260875 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { + limb0: 36378902468482968951372525097, + limb1: 49861434204675434618228243601, + limb2: 53001884146425081109141399814, + limb3: 2253505734841750641693586833 + }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { + limb0: 59096543593051277543745577877, + limb1: 28041765586496211288861576680, + limb2: 22964874544784185565920502452, + limb3: 1569555414760356146878223964 + }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { + limb0: 42679882200336913214104695007, + limb1: 28519009524311208838070158803, + limb2: 78754616605212091718227792753, + limb3: 5412217018370679402372235415 + }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { + limb0: 16164959144843364676393346459, + limb1: 100788561637307311193247452, + limb2: 2111211154438443695660734282, + limb3: 7305779721488062054973859894 + }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 12680987278703423076123438925, + limb1: 23293622164756943708233641598, + limb2: 27312208089788812685691780294, + limb3: 7186114185634914911882880487 + }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { + limb0: 31235720079065569582360966711, + limb1: 28924209068640614739705646337, + limb2: 77080184303665049790268728465, + limb3: 4026083488533940216310772264 + }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + E12D { + w0: u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + ]; + let big_Q: Array = array![ + u384 { + limb0: 67313866167097263265130082180, + limb1: 67808119737071442596509580963, + limb2: 47059087865019787942421222430, + limb3: 3540888757416855357824192455 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 22492844499763939366167709309, + limb1: 44405723422234907726116728868, + limb2: 43336120598168831462076850220, + limb3: 633701125477887153024140111 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 58045138378803586819224144752, + limb1: 37722808775608693896360371770, + limb2: 58199104706651699956218296245, + limb3: 6593691852641782834830405955 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 24029091319220369928492506164, + limb1: 27346308728394540533187967161, + limb2: 54406553494055906374776751454, + limb3: 6251639432712304531977701908 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 43209874229534800992196001623, + limb1: 44099828400010136048375516814, + limb2: 36477903206784161552201908348, + limb3: 6332676325735594950681357074 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 32240610468846653132660797863, + limb1: 59017789824056478475593216901, + limb2: 50798300933382912249679967983, + limb3: 254833515422736145525010307 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 9446237732911282439822477299, + limb1: 41103389748969893093840371322, + limb2: 65763011719194751092218467292, + limb3: 1675622342459137521696590530 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 20134274307438334073387922242, + limb1: 74262709306725838380660430288, + limb2: 68205643196915002382681427764, + limb3: 5620618120808677135729084392 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 63898063299332473461811077006, + limb1: 72879313329505981336319860016, + limb2: 25497331272048846618554621212, + limb3: 1133881367839468789530084735 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 59268806797972117537245074393, + limb1: 37393522974549504235233768023, + limb2: 42046706459904369659214559436, + limb3: 2975893340339849661537988313 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 50150706270024617915990372029, + limb1: 855502756141810825171214022, + limb2: 8210532061284015311418559411, + limb3: 6933212656623598159204984780 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 48977970940605441373390832664, + limb1: 39697921754213515477655653237, + limb2: 19403033567433303884641423322, + limb3: 1613985473579841175080335783 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 63045354705109484875753506559, + limb1: 57930445950397793172550339852, + limb2: 77613239308401275354827601313, + limb3: 5814694116426084088760077752 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 19831653226937638425478962642, + limb1: 51671636400071809459100060275, + limb2: 62684419777138162460779328286, + limb3: 5379675726416527339424358830 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 53036994119509195302374137752, + limb1: 42691323090788994849570983741, + limb2: 39987595674110850128182518837, + limb3: 896937983305559256779502048 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 11574030230770134865678377617, + limb1: 37742338608486868267235023510, + limb2: 39964820155169702206616190093, + limb3: 5128901766228361551052981223 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 42676417522710223446011396656, + limb1: 6519579867051422701688087523, + limb2: 24677758146568011346775831815, + limb3: 5392893257374197671847776330 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 54246894266568542687168100807, + limb1: 60863224231742504500333948953, + limb2: 78737951871078659887023932474, + limb3: 3393313967116299026165298382 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 71835132745611515127186963314, + limb1: 62120368443926788904131181779, + limb2: 20700230590756463656176208402, + limb3: 6942672021678900391324011207 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 46403166896454424594048609010, + limb1: 79084426470003268055582912010, + limb2: 23686051697869845063478240510, + limb3: 5358542912816465132272952512 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 4935549920474382754338628030, + limb1: 26556011019495343133602147409, + limb2: 51106442523206240290411863688, + limb3: 3061877162644975636103210481 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 9889018073013243067267700460, + limb1: 27948063167447428031919998384, + limb2: 9809086649631165788859310142, + limb3: 2236349719953888319130047313 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 35877730812134224823861419621, + limb1: 24299518837277687682775360379, + limb2: 32853956835586221875079045994, + limb3: 5712099146734760599566079225 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 5406948143119648761834299866, + limb1: 2042541437277242141064258386, + limb2: 112295176678160523155049386, + limb3: 4240270930624858828139692751 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 45131316988093471044295008749, + limb1: 68118875026421677596604968158, + limb2: 49751831898852592127187865541, + limb3: 2632994234176395415043043365 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 36798029303426045916064809297, + limb1: 76201427739798530147519413859, + limb2: 78552685393505225686469847840, + limb3: 2835030058027513329381051994 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 58144031570106746771000856976, + limb1: 49720414501494766710866592648, + limb2: 19166908081421013789405724896, + limb3: 5700858091404132620347424762 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 42603938824793697190462595412, + limb1: 62097969838135116387531120151, + limb2: 65897478918320771046108806625, + limb3: 3156588865440516569614512987 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 77645749700152962939704662112, + limb1: 5248326610050549342461839593, + limb2: 7465140990849066931621072152, + limb3: 5923072891829953672847870727 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 63060336440304565122633225795, + limb1: 5165507377062901390892748155, + limb2: 41557682680569960441862694637, + limb3: 843425400641195459263229800 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 3372850980342656905555032408, + limb1: 47954635990500786282468314886, + limb2: 3384876192105133509044389265, + limb3: 1601737104945769799605678772 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 65382940767125361041108974079, + limb1: 12600428724374894206467416891, + limb2: 45457231152907688982111928109, + limb3: 178522834404172104372231283 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 3546807006571191450261394006, + limb1: 46180817898900323149511404010, + limb2: 41836705210254491851311436953, + limb3: 407650937662765612779129892 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 18096349812869598385639929205, + limb1: 17908594403088245631721326344, + limb2: 53712887206584442281871503108, + limb3: 7594079211718907161166594363 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 46976866673378375448497464597, + limb1: 56015170954271993227711185458, + limb2: 17141945769439194755653490394, + limb3: 5415339871906447629897733539 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 33704957732541070747704077185, + limb1: 73543524554146940998087216668, + limb2: 66232985171486857190749555849, + limb3: 4858570215957262637262319011 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 60127783765722153697333089304, + limb1: 68369608816908172362229105365, + limb2: 41832019059483564957369154349, + limb3: 493801858065001456613280566 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 68298650783930863000624139572, + limb1: 24067441398595163708547400331, + limb2: 34443584735868452533869332179, + limb3: 4396288535266173683148638674 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { + limb0: 27639595562923637280135691060, + limb1: 19583579335785117206026552912, + limb2: 10834417280812838175799340994, + limb3: 3664259712116694552683900371 + }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + ]; + + let res = multi_pairing_check_bls12_381_2_pairs( + pair0, pair1, lambda_root_inverse, w, Ris.span(), big_Q + ); + assert!(res); + } + + + #[test] + fn BLS12_381_mpcheck_3P_() { + let pair0: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 20277298058237302995262366153, + limb1: 7677240298025747033948982498, + limb2: 54874007809044705566362991655, + limb3: 20671378033963795368189141 + }, + y: u384 { + limb0: 33392086862736488763095609058, + limb1: 22905764390114047800124203373, + limb2: 54807905095272841266179123060, + limb3: 1883224426911610065539973944 + } + }, + q: G2Point { + x0: u384 { + limb0: 38541612500805761912033359241, + limb1: 56983759076163899719324080101, + limb2: 12052653947718664564493594700, + limb3: 6429212828325764830473657266 + }, + x1: u384 { + limb0: 17967780558903559319072500379, + limb1: 67375112498075029756799804065, + limb2: 43244348764220006729209916569, + limb3: 1178056762426167656731882261 + }, + y0: u384 { + limb0: 28387053467664478256535611711, + limb1: 19240590506538966005383948068, + limb2: 5746323847314798772410695208, + limb3: 4636701741918914933219605350 + }, + y1: u384 { + limb0: 49442932902126969572687559535, + limb1: 38256436071088897237562952322, + limb2: 31306291077100865092741771050, + limb3: 1982536237787033887889860729 + } + } + }; + let pair1: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 20277298058237302995262366153, + limb1: 7677240298025747033948982498, + limb2: 54874007809044705566362991655, + limb3: 20671378033963795368189141 + }, + y: u384 { + limb0: 33392086862736488763095609058, + limb1: 22905764390114047800124203373, + limb2: 54807905095272841266179123060, + limb3: 1883224426911610065539973944 + } + }, + q: G2Point { + x0: u384 { + limb0: 38541612500805761912033359241, + limb1: 56983759076163899719324080101, + limb2: 12052653947718664564493594700, + limb3: 6429212828325764830473657266 + }, + x1: u384 { + limb0: 17967780558903559319072500379, + limb1: 67375112498075029756799804065, + limb2: 43244348764220006729209916569, + limb3: 1178056762426167656731882261 + }, + y0: u384 { + limb0: 28387053467664478256535611711, + limb1: 19240590506538966005383948068, + limb2: 5746323847314798772410695208, + limb3: 4636701741918914933219605350 + }, + y1: u384 { + limb0: 49442932902126969572687559535, + limb1: 38256436071088897237562952322, + limb2: 31306291077100865092741771050, + limb3: 1982536237787033887889860729 + } + } + }; + let pair2: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 30628198221384210280224753653, + limb1: 24129938363919858093059203999, + limb2: 23880100795259238870896497797, + limb3: 6571486042428925222686550761 + }, + y: u384 { + limb0: 35220682296141665634578960731, + limb1: 64085835863535972596618932545, + limb2: 53989923015313416372505990204, + limb3: 2961679571639913983662018852 + } + }, + q: G2Point { + x0: u384 { + limb0: 38541612500805761912033359241, + limb1: 56983759076163899719324080101, + limb2: 12052653947718664564493594700, + limb3: 6429212828325764830473657266 + }, + x1: u384 { + limb0: 17967780558903559319072500379, + limb1: 67375112498075029756799804065, + limb2: 43244348764220006729209916569, + limb3: 1178056762426167656731882261 + }, + y0: u384 { + limb0: 28387053467664478256535611711, + limb1: 19240590506538966005383948068, + limb2: 5746323847314798772410695208, + limb3: 4636701741918914933219605350 + }, + y1: u384 { + limb0: 49442932902126969572687559535, + limb1: 38256436071088897237562952322, + limb2: 31306291077100865092741771050, + limb3: 1982536237787033887889860729 + } + } + }; + let lambda_root_inverse = E12D { + w0: u384 { + limb0: 48122149982192624515716077174, + limb1: 13811839106650898957860824842, + limb2: 64567853481551887556865483913, + limb3: 1800600993373331355337722274 + }, + w1: u384 { + limb0: 59597138043925042844579441409, + limb1: 6716777036568194454497689785, + limb2: 24145959310540525721036319763, + limb3: 1474702429847014088596814586 + }, + w2: u384 { + limb0: 33247601200643758829923722437, + limb1: 74021918635904342875761573929, + limb2: 65823697199241158345123523331, + limb3: 6568364484572995411942505134 + }, + w3: u384 { + limb0: 46032905755491215072078417741, + limb1: 54493927456019529748244932145, + limb2: 2726644304599587877207364447, + limb3: 2134456318040418090558531818 + }, + w4: u384 { + limb0: 37708590538625568121231768773, + limb1: 26055704791125122832608279454, + limb2: 24411439787974761451605183753, + limb3: 5748013674011098619026641492 + }, + w5: u384 { + limb0: 48065602548630988742519432808, + limb1: 29662845878882481593893485383, + limb2: 75901097609879105443870792239, + limb3: 4376661866461898283390393212 + }, + w6: u384 { + limb0: 18166029862714136025778164174, + limb1: 66041138330416714821012848890, + limb2: 76409102740280478456975282486, + limb3: 2017037492127207465686993144 + }, + w7: u384 { + limb0: 27486884880619553763450834827, + limb1: 25305922968242861891133825675, + limb2: 15249101825555166767731680821, + limb3: 4258632482202211615669668261 + }, + w8: u384 { + limb0: 31435377195208770586073360175, + limb1: 66589821079104811718402230447, + limb2: 36604066796351546117368950759, + limb3: 4280185520525317240560225087 + }, + w9: u384 { + limb0: 22330359637734056319261707184, + limb1: 60866977674715744399608840261, + limb2: 18769000792032578380919140242, + limb3: 7672985325995556332667733631 + }, + w10: u384 { + limb0: 36269981802706556750022380954, + limb1: 55388245846859014162892478774, + limb2: 34937688816530076826685025109, + limb3: 7517566740504077141728559072 + }, + w11: u384 { + limb0: 39439734454969529065167367959, + limb1: 64186879182848112328142743366, + limb2: 45858129343492288016892406832, + limb3: 3493183477816096959155367213 + } + }; + let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { + limb0: 52744034753365671505100932338, + limb1: 60135209962327042353794995623, + limb2: 36952175233945120297942894401, + limb3: 5744106253218780974360610108 + }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }; + let Ris: Array = array![ + E12D { + w0: u384 { + limb0: 52214954877828380790379924159, + limb1: 24350910975845321068323767297, + limb2: 49483547562757497397905505637, + limb3: 1768814863547606518897797754 + }, + w1: u384 { + limb0: 12233107934615791630642731181, + limb1: 2096992845229834186543654204, + limb2: 966882068830897655195934919, + limb3: 7492434944677310656250802283 + }, + w2: u384 { + limb0: 74412551914905802615894906466, + limb1: 60702427333670336885769349351, + limb2: 53298987654366657040518636432, + limb3: 2482974969120894574938936873 + }, + w3: u384 { + limb0: 57373480596121462226130225293, + limb1: 11522537395035883206485734766, + limb2: 59090221135055447915453173351, + limb3: 6656557219987101488709024982 + }, + w4: u384 { + limb0: 57721548283952800451613415641, + limb1: 15671605934569266979892295675, + limb2: 31233345108431513504896257234, + limb3: 1761552232103296679672246995 + }, + w5: u384 { + limb0: 32230965378694049563059215563, + limb1: 30991787301854358566370985530, + limb2: 61039306380656737625459989551, + limb3: 4136061271645343985984638643 + }, + w6: u384 { + limb0: 8841726453379242175257144607, + limb1: 35958959632272585461863154489, + limb2: 28168975487609113353422942367, + limb3: 7523716604116964315834226342 + }, + w7: u384 { + limb0: 49937748449289926051674215498, + limb1: 39931839255523397886981842634, + limb2: 71779583404482637259200147008, + limb3: 2561850712396490599277446708 + }, + w8: u384 { + limb0: 59069443208834128685204710004, + limb1: 28976114437974833252372763588, + limb2: 78180850818046774604283633212, + limb3: 6111350663053587612613242726 + }, + w9: u384 { + limb0: 29249472114614256408213174078, + limb1: 38499996099874945578385738350, + limb2: 7575913790092330826815773698, + limb3: 3965162283728782062445088002 + }, + w10: u384 { + limb0: 14505679437680724715947333847, + limb1: 43106747338141526178500187577, + limb2: 40819325855054804752093895095, + limb3: 6742697872451484926191197686 + }, + w11: u384 { + limb0: 55633928186634272305899064775, + limb1: 65203643687164304915849224275, + limb2: 55534452900199415029140977333, + limb3: 5668125549157484617626120934 + } + }, + E12D { + w0: u384 { + limb0: 79189063537811279287589562422, + limb1: 26139564137868605330056494549, + limb2: 59089766109898581899835557721, + limb3: 415679185868221329001335740 + }, + w1: u384 { + limb0: 68796185028051419121145307019, + limb1: 22926787156259055190900929610, + limb2: 29699050131140821752282811459, + limb3: 2640489535491818312033916818 + }, + w2: u384 { + limb0: 34607212865690386138990426278, + limb1: 5116120987655003199769705134, + limb2: 56931881873797961250713543213, + limb3: 7839885475596393846401354072 + }, + w3: u384 { + limb0: 33104142811794244783576727147, + limb1: 68608490127591349917905934880, + limb2: 56584525977712644261895265265, + limb3: 6119463074048062289944703145 + }, + w4: u384 { + limb0: 9212708841352503406183382888, + limb1: 69267668546833667661683969357, + limb2: 32077959677201410007106005161, + limb3: 4395970014629418385781338312 + }, + w5: u384 { + limb0: 62329101929408131943175864891, + limb1: 37759192171189582976900654060, + limb2: 32512355879896650149774146533, + limb3: 3283574856870693715225024558 + }, + w6: u384 { + limb0: 42502681408858783674871251726, + limb1: 12393895465325603167980327649, + limb2: 9507887612787866708929686857, + limb3: 7864699690906107197676989462 + }, + w7: u384 { + limb0: 46498428849841984557623688670, + limb1: 50394077747714444873122203714, + limb2: 44998900657678914323387765102, + limb3: 2035366623954201693560557881 + }, + w8: u384 { + limb0: 33580631300098788056999001411, + limb1: 34806511606709208128326210428, + limb2: 20769764175409718318455783696, + limb3: 914702688347236903410257017 + }, + w9: u384 { + limb0: 69813593955352458090230690013, + limb1: 74392360921145872024647570678, + limb2: 7234893686632343643169701385, + limb3: 1507899913585730017308817759 + }, + w10: u384 { + limb0: 54765550109420499970050408421, + limb1: 73094949222873523727273574382, + limb2: 34797292600226673389380136364, + limb3: 4856897516414106180413564067 + }, + w11: u384 { + limb0: 59790500691124012993902118445, + limb1: 22838619296165700532508232659, + limb2: 16747746104754944555809893218, + limb3: 4373865874694578389058693645 + } + }, + E12D { + w0: u384 { + limb0: 66441908717341040138856773814, + limb1: 29889789686248590905647315598, + limb2: 18689147941920619181228554190, + limb3: 4863011591809249241179431482 + }, + w1: u384 { + limb0: 23386905487020578892528460540, + limb1: 38430201074006997032483674785, + limb2: 36474336903798778775384992995, + limb3: 3478595413655024221854069283 + }, + w2: u384 { + limb0: 50051727607568786477967119979, + limb1: 5007105782144931508367045218, + limb2: 68638697238288788007032550422, + limb3: 2359013775205652401603147252 + }, + w3: u384 { + limb0: 54345399318595110685547821001, + limb1: 41523134664048822101540674725, + limb2: 43445586911486553843148849735, + limb3: 1872275704974742423646804746 + }, + w4: u384 { + limb0: 51905155763752060523798854726, + limb1: 49538617965284659637338859536, + limb2: 73390898550109630705861971420, + limb3: 1459447193903003090730751315 + }, + w5: u384 { + limb0: 47154056344252301536446052999, + limb1: 78977245158003385146874316552, + limb2: 25826572207699526474326137458, + limb3: 418552617057405382571734555 + }, + w6: u384 { + limb0: 66271311071399076296244887860, + limb1: 41399961090687801592656489759, + limb2: 15632345873784256735361545796, + limb3: 7344050385650526377628543286 + }, + w7: u384 { + limb0: 1921531994787369628514252816, + limb1: 39376906871442824306980869547, + limb2: 14025343445137298993355510983, + limb3: 5532806340937940021829254869 + }, + w8: u384 { + limb0: 66889553357405958777257649661, + limb1: 62744708529978589224004891315, + limb2: 76873571713145708951016071671, + limb3: 5452810206471565885989735063 + }, + w9: u384 { + limb0: 51436123725485675428862261107, + limb1: 62708651638583687937646898054, + limb2: 49515511463034687109103604801, + limb3: 5581976786144655689219278521 + }, + w10: u384 { + limb0: 20727656838282064369127072200, + limb1: 12781377261152466131087425438, + limb2: 64029902320719898980261609563, + limb3: 7209586499884711859403109708 + }, + w11: u384 { + limb0: 17466240057176014745086269181, + limb1: 70761194807545087618033693710, + limb2: 45150274904249380914003064844, + limb3: 966053453348325004969510873 + } + }, + E12D { + w0: u384 { + limb0: 75639811492628674759722163831, + limb1: 45286451870356991866458400915, + limb2: 4057659463124129714337603293, + limb3: 6326945382119644385351389060 + }, + w1: u384 { + limb0: 68757926823211723860334950179, + limb1: 53783009267798540636211365262, + limb2: 69235014168134849843900095876, + limb3: 5229788094932760977889675124 + }, + w2: u384 { + limb0: 52214742513813346826880279826, + limb1: 64378345827270781714336174899, + limb2: 8168985065894167406370016017, + limb3: 5930178814441771038961285520 + }, + w3: u384 { + limb0: 898762773001472053779266067, + limb1: 39366259697093477850672409857, + limb2: 5120837803417807931209659220, + limb3: 7724756167454488786457206995 + }, + w4: u384 { + limb0: 1313441292641362471192815666, + limb1: 17595778323609261303900144419, + limb2: 19045231475982333381251050335, + limb3: 7663457517004551521222647941 + }, + w5: u384 { + limb0: 75805393120250566584944387210, + limb1: 58746723739097159390575153206, + limb2: 79164851544131403946243375009, + limb3: 7795792869783401807774827507 + }, + w6: u384 { + limb0: 18311898184474582177028134520, + limb1: 60142112421278274008081268706, + limb2: 65533364016600439315204879932, + limb3: 4612945973031169021734599269 + }, + w7: u384 { + limb0: 12893585066549358394982248342, + limb1: 22605613531994804742289281214, + limb2: 41775071821067191500437138847, + limb3: 4508892691984557291113578465 + }, + w8: u384 { + limb0: 17637038008988651810547898507, + limb1: 21993757970178340393216684935, + limb2: 32144962066564212317981570669, + limb3: 5538781682699612595771519541 + }, + w9: u384 { + limb0: 13152400970824829620437506819, + limb1: 17639791164286134385567822170, + limb2: 2259702464083376896520530865, + limb3: 761996878042126341593913858 + }, + w10: u384 { + limb0: 42836783162522051981469613086, + limb1: 6657627838967595048257659603, + limb2: 59591844319581599695297693705, + limb3: 2780899984538627317186874744 + }, + w11: u384 { + limb0: 25124304574201511014449219305, + limb1: 21742572582051970785186062567, + limb2: 8425758445771703345617412567, + limb3: 305581101194402090545372182 + } + }, + E12D { + w0: u384 { + limb0: 68018394045584225405533036653, + limb1: 41641230506174173868168850523, + limb2: 55040064329289346595669727732, + limb3: 3989195447700822060626232375 + }, + w1: u384 { + limb0: 27930594241617398435202745187, + limb1: 65208188401417121856113043520, + limb2: 58423407362132224083199007800, + limb3: 3605760999117787947527762603 + }, + w2: u384 { + limb0: 14479359843186076299114305133, + limb1: 78424105126057575287473657624, + limb2: 62607845639603397203630240803, + limb3: 1228603715409554076563989011 + }, + w3: u384 { + limb0: 50004005353464142224381322085, + limb1: 57796888926160855116082401577, + limb2: 73573646234981826914307157545, + limb3: 7703670456163940223866857509 + }, + w4: u384 { + limb0: 59966953436002140559862949508, + limb1: 34876373639815670194269754632, + limb2: 57107098280951127406789883267, + limb3: 2858586067697881156384750399 + }, + w5: u384 { + limb0: 63955732105283094226011577183, + limb1: 54357264289589167689139391706, + limb2: 7815536376984478515847755916, + limb3: 1820318110755616012818336581 + }, + w6: u384 { + limb0: 32143931736886326720225912406, + limb1: 11016643922516512287247105819, + limb2: 52761632975588721362452863691, + limb3: 6740519993576408403600074777 + }, + w7: u384 { + limb0: 53130724664112286822477303341, + limb1: 52235366159463916313984169031, + limb2: 68065547186558685509115860865, + limb3: 6316394746165534892676985979 + }, + w8: u384 { + limb0: 9316482196567701058796406661, + limb1: 52987148010551996550277258583, + limb2: 41112306646493880897686348305, + limb3: 2012829040344524632282569956 + }, + w9: u384 { + limb0: 76744388514783644978039320909, + limb1: 56141180386714918770606505687, + limb2: 12166805094515247617342220231, + limb3: 5712391730976864469335097206 + }, + w10: u384 { + limb0: 28245557169080707504629687540, + limb1: 38743863915801800396373198508, + limb2: 21107716378700351993682643698, + limb3: 6986629751666685017764946132 + }, + w11: u384 { + limb0: 39534474494528644896221647993, + limb1: 60207600796330276478966363729, + limb2: 9538301346483301116607290307, + limb3: 2867071329916861989400501797 + } + }, + E12D { + w0: u384 { + limb0: 41128983703956499289108419392, + limb1: 54003826862893613836351511964, + limb2: 70581402794351343245588708900, + limb3: 233287777707267074866806714 + }, + w1: u384 { + limb0: 69971621506359083465310155887, + limb1: 17591158465432050191820446869, + limb2: 10811710954751198587610482653, + limb3: 7293341880879891341289981179 + }, + w2: u384 { + limb0: 68165910266524159252341262194, + limb1: 54945928113302393846136528294, + limb2: 25779585287009613695186928763, + limb3: 346525315962998947295217134 + }, + w3: u384 { + limb0: 312317280196657129476608721, + limb1: 9566927393328733972540186576, + limb2: 26921947908364428535167681393, + limb3: 5951479014139298518759707415 + }, + w4: u384 { + limb0: 2096514228951501671284040501, + limb1: 57839144590419982298571968459, + limb2: 33728394197551537670652159885, + limb3: 616235685272316063236773169 + }, + w5: u384 { + limb0: 26673507115460577071159443481, + limb1: 42656211385081551326829583938, + limb2: 16911705908580373978810832708, + limb3: 301407426523651430881177606 + }, + w6: u384 { + limb0: 14360141655386009823633907409, + limb1: 64849387575710002131874629835, + limb2: 43547522159669123639199677256, + limb3: 5310362145377327577733657601 + }, + w7: u384 { + limb0: 53800435433920152261653122635, + limb1: 44390073119772682749402077921, + limb2: 40066217124772460995473175244, + limb3: 6190622689028209912113756645 + }, + w8: u384 { + limb0: 41375486347751923160928400812, + limb1: 34580247256650857593175468488, + limb2: 22190199881689784853334745383, + limb3: 1844001592687577365067718019 + }, + w9: u384 { + limb0: 70106819595305858627078567912, + limb1: 61624000834909591852927123411, + limb2: 75285368267329201160054427113, + limb3: 5860806865138940833795484841 + }, + w10: u384 { + limb0: 63116076571008098336366293352, + limb1: 75101591045301895675859334841, + limb2: 32073668363802403907462258075, + limb3: 3129808360932292422166507521 + }, + w11: u384 { + limb0: 49261758056554022310457722917, + limb1: 43260736708979023207999513894, + limb2: 42753174615736805484108377549, + limb3: 577329734503858657853403551 + } + }, + E12D { + w0: u384 { + limb0: 14386056124557919185863632752, + limb1: 37433555961233775362867333019, + limb2: 48318663585095889627806050132, + limb3: 5932076639375670860292242223 + }, + w1: u384 { + limb0: 27823232948600477416320454655, + limb1: 68884253159044247813533843752, + limb2: 66677704993913177955271991534, + limb3: 887009059290210147410995095 + }, + w2: u384 { + limb0: 58031429204191697955473681505, + limb1: 8674792332146841309010335332, + limb2: 15853375153856206252676702150, + limb3: 4634306664691592886106542899 + }, + w3: u384 { + limb0: 47942841658950694183632592290, + limb1: 15375396307608285802962822512, + limb2: 49181031626806186923957175311, + limb3: 7748819051221049714918696379 + }, + w4: u384 { + limb0: 58708181741988446372042695179, + limb1: 17358182090351288683470192659, + limb2: 4246253369175469821811673993, + limb3: 212127463613019352377389748 + }, + w5: u384 { + limb0: 36512669097686017643340260264, + limb1: 70011459206880168717923692069, + limb2: 69005351839998280034741093508, + limb3: 3879406981011273918045175285 + }, + w6: u384 { + limb0: 26767816188059794543181325024, + limb1: 17388640928701216185540970769, + limb2: 38964115280348036314994603807, + limb3: 2805046336957611759629033876 + }, + w7: u384 { + limb0: 77959545464851257416186484287, + limb1: 9339090675982005272140476393, + limb2: 20093025145722568320046955572, + limb3: 6727896566115677805059253305 + }, + w8: u384 { + limb0: 38664934377664630318748726589, + limb1: 6490188906354261260497183907, + limb2: 1703653366848013030233931462, + limb3: 3727781303101243094012387526 + }, + w9: u384 { + limb0: 5256547879809055655460798924, + limb1: 46191986368877986493964448527, + limb2: 55481936198171515568833411670, + limb3: 7444066790192148159222607130 + }, + w10: u384 { + limb0: 58623324743318334674428858058, + limb1: 1659609903300130993636150188, + limb2: 30474445214779001017576223958, + limb3: 5045613219268525970134671641 + }, + w11: u384 { + limb0: 3414565237909735712854223751, + limb1: 40942031535469869353949008737, + limb2: 45209300002340700340955830084, + limb3: 5505812178820295914537427128 + } + }, + E12D { + w0: u384 { + limb0: 47682111937832489435521653545, + limb1: 63017915152726184276834265481, + limb2: 65145999858376587976572465449, + limb3: 314501099777216597376265135 + }, + w1: u384 { + limb0: 13596338847181098282031700270, + limb1: 78550907199336227192433358660, + limb2: 25854773033943406703520332574, + limb3: 5866385514044288538222676158 + }, + w2: u384 { + limb0: 69831091100208372822268473742, + limb1: 2858171088314425287089447840, + limb2: 79009354148971369858821701428, + limb3: 1375800271383551100367855305 + }, + w3: u384 { + limb0: 23638849829862235359216298117, + limb1: 50682611818712028587182132408, + limb2: 34802820484520406269141604022, + limb3: 1034818949453902790997681960 + }, + w4: u384 { + limb0: 56295506369141770155444235835, + limb1: 42145960165355048070346810439, + limb2: 69662974748425084313212167707, + limb3: 2311464414894301246213604211 + }, + w5: u384 { + limb0: 48739493323338737151057941929, + limb1: 2121899835970641436029901488, + limb2: 36864725684003507681909896785, + limb3: 725846581484854846033082117 + }, + w6: u384 { + limb0: 31748863835411980888776540096, + limb1: 14076965532155540650748545841, + limb2: 54866905888934158891695036916, + limb3: 5940487766327402682373067494 + }, + w7: u384 { + limb0: 29796478747112149718848525593, + limb1: 65427544184154654009932483630, + limb2: 60070149802166608832929335297, + limb3: 8015590569045203854671252868 + }, + w8: u384 { + limb0: 60066273678040152359594222165, + limb1: 55669425509434429368314937978, + limb2: 58700096735409102125254181414, + limb3: 3930169449326877047915026963 + }, + w9: u384 { + limb0: 4156978248814751836366145144, + limb1: 29331063070565119595262213801, + limb2: 25209336583177046836761254901, + limb3: 7168275760403444029626461087 + }, + w10: u384 { + limb0: 20487607042388100384085344046, + limb1: 78584441185871984458697538433, + limb2: 30608345505791697932237834975, + limb3: 649564440404127224367761355 + }, + w11: u384 { + limb0: 46931450261119885714207321298, + limb1: 26582251390781522645681468291, + limb2: 37060325759054516933488667322, + limb3: 5359889611603692670013838932 + } + }, + E12D { + w0: u384 { + limb0: 45513723007265484972428945474, + limb1: 72091135792777547612947043551, + limb2: 66814387965934937358297512018, + limb3: 7773054392986642354057624972 + }, + w1: u384 { + limb0: 22748604679726440186980437469, + limb1: 46616503368250610199540324263, + limb2: 52472413696781957546075762789, + limb3: 3859904419337493808034901193 + }, + w2: u384 { + limb0: 56680458532940592269085855129, + limb1: 65874315722282654980096760987, + limb2: 25228173009390877404192963279, + limb3: 6716667492843596414172294121 + }, + w3: u384 { + limb0: 2390269495772836748820729201, + limb1: 7328762563658638694098063822, + limb2: 29485803998680808598667318366, + limb3: 898156345315079229037267778 + }, + w4: u384 { + limb0: 17131300407118721353962237016, + limb1: 20006424665963921110514906786, + limb2: 58564720986805969671188682993, + limb3: 4758173409492671797323881737 + }, + w5: u384 { + limb0: 47316910228179225311284264337, + limb1: 17118692955465798685800292929, + limb2: 73410705618888443218448862951, + limb3: 5282569098538960360640287774 + }, + w6: u384 { + limb0: 11011499768529309909086087219, + limb1: 59681836340715747624329204742, + limb2: 51008817491480553380840173182, + limb3: 2171070110438202073478167479 + }, + w7: u384 { + limb0: 60817936510569775088664423581, + limb1: 17200626495861973188515226787, + limb2: 57085180681619905190126892805, + limb3: 79145978995386836068604702 + }, + w8: u384 { + limb0: 54950415958263773276327917873, + limb1: 27588146735975597305440651946, + limb2: 37766324145619995047929318892, + limb3: 7195639061439308131833605147 + }, + w9: u384 { + limb0: 57133687988270063430335221391, + limb1: 41047008611804868518212993115, + limb2: 53117776250056080993666976698, + limb3: 1114032017714185889409447622 + }, + w10: u384 { + limb0: 47668667078419444200474605268, + limb1: 41630153982138359311663557405, + limb2: 29499192378100943318032167242, + limb3: 4542062085023781348701186895 + }, + w11: u384 { + limb0: 51715527164392456274145987856, + limb1: 17060328013476667968607576823, + limb2: 10587370945303449320100914263, + limb3: 2271048439246868165494737063 + } + }, + E12D { + w0: u384 { + limb0: 57751581254605099381537223265, + limb1: 48371384845159706742758420375, + limb2: 25846542915641901575164306388, + limb3: 6552675925022865151832929929 + }, + w1: u384 { + limb0: 14070441487350098497281114942, + limb1: 45098145980680944455783680083, + limb2: 48060414647128995628121263219, + limb3: 5760839705020778907265637142 + }, + w2: u384 { + limb0: 57754795472868948491395837617, + limb1: 42604451426862798639782643070, + limb2: 6114946881516667545571851197, + limb3: 7718750036131172380830914190 + }, + w3: u384 { + limb0: 65385004827490384945178486783, + limb1: 35634651691125318681031519469, + limb2: 18817446457945756519515146073, + limb3: 5821531185523598147330572478 + }, + w4: u384 { + limb0: 47608824159886875016581369390, + limb1: 72035509430583257375765554257, + limb2: 48862480477650797899430238578, + limb3: 6916342048291032417498284309 + }, + w5: u384 { + limb0: 16165744863313265213602827564, + limb1: 11361547628847835038029646565, + limb2: 7239556062178077812328285766, + limb3: 3285409893884176620731107377 + }, + w6: u384 { + limb0: 48201287295308391605459624779, + limb1: 3669677829330058640591270274, + limb2: 14346618639688009284415795606, + limb3: 4578123135990968243472566481 + }, + w7: u384 { + limb0: 32895498143997419505123522037, + limb1: 33418132089911820399445345221, + limb2: 37302643523261624803655711340, + limb3: 1991372598188618861535845180 + }, + w8: u384 { + limb0: 16907385050752236269378436972, + limb1: 30281568759548199826817696166, + limb2: 62947669171591507726851207645, + limb3: 4337818907849751333877427458 + }, + w9: u384 { + limb0: 16367775258912631540255405191, + limb1: 75440033101091433150531594233, + limb2: 45395185114259908680093039859, + limb3: 4464722745056829202872244045 + }, + w10: u384 { + limb0: 41796716818794587646406934347, + limb1: 19259413428003751157583897699, + limb2: 76107963632886441877362269531, + limb3: 3459754366920274868104925987 + }, + w11: u384 { + limb0: 6445175303601124205896700230, + limb1: 24994214040297878807253499448, + limb2: 13389355069685382328581651141, + limb3: 6120211149394736599753601338 + } + }, + E12D { + w0: u384 { + limb0: 71680703975661800113364344816, + limb1: 46087270433821846950901187336, + limb2: 36696558950603586704283231607, + limb3: 432821803052202382091488971 + }, + w1: u384 { + limb0: 40304800043625671394520202697, + limb1: 32942206436629851599253479236, + limb2: 49987717010116204779957687530, + limb3: 2828132837269171076760114946 + }, + w2: u384 { + limb0: 38099692644310894243126663173, + limb1: 71995888716079764742234554078, + limb2: 66895637129502350572090730117, + limb3: 6509338387608892139025543158 + }, + w3: u384 { + limb0: 4625402574150082484962539563, + limb1: 20597976842895524267599646586, + limb2: 77655327442412243413610343105, + limb3: 2325830374369038885189556487 + }, + w4: u384 { + limb0: 49463941966140101280973633521, + limb1: 3795243622399404173936902246, + limb2: 35763771928827183762666400297, + limb3: 2014023878141235783456580072 + }, + w5: u384 { + limb0: 39878960087950701378595582261, + limb1: 28992272161291648100536201002, + limb2: 12299139930389053168870690190, + limb3: 90168700906873558242525277 + }, + w6: u384 { + limb0: 72862529372022920504945663592, + limb1: 56585413516343559580312569575, + limb2: 34546572444857355088585656001, + limb3: 5114235496297227404591651552 + }, + w7: u384 { + limb0: 36114094652115338829282701838, + limb1: 73446198937337165512270697879, + limb2: 59552211654243541143789634796, + limb3: 1158677420964276893432964541 + }, + w8: u384 { + limb0: 1918945900448168369046417038, + limb1: 18817270922266133262838067224, + limb2: 34557738502467155453857120013, + limb3: 1197992405692242490711390839 + }, + w9: u384 { + limb0: 78360781365055554844922370059, + limb1: 24659028983681756620218353835, + limb2: 63184370346666046537768736550, + limb3: 7536685986692950918449048161 + }, + w10: u384 { + limb0: 48146719739957410985928620243, + limb1: 74674211415862458914789309035, + limb2: 13977957349834414048323734751, + limb3: 7028415041793033272293225041 + }, + w11: u384 { + limb0: 6737358720184629836850931257, + limb1: 2051604751026594012338422768, + limb2: 5270057477881190146804969239, + limb3: 1839090958226802058486231684 + } + }, + E12D { + w0: u384 { + limb0: 38041362776193221738196186711, + limb1: 60366902767703425170308001175, + limb2: 12838267488532708104497604815, + limb3: 2622421804749076348836642147 + }, + w1: u384 { + limb0: 14956688061597801683999802898, + limb1: 4010805637709358723529608446, + limb2: 4141314028463125935999259252, + limb3: 2970926633604559494996667762 + }, + w2: u384 { + limb0: 61240005265399305705818778749, + limb1: 724355221226126551905668362, + limb2: 14420162082775937849411699020, + limb3: 4378894897178792653710677433 + }, + w3: u384 { + limb0: 55003805356149805541354588333, + limb1: 46726521595823934636586071943, + limb2: 60934972733946037655110654917, + limb3: 3244896434366017611972182051 + }, + w4: u384 { + limb0: 68277844636796378265915161616, + limb1: 65580742239620477834297277196, + limb2: 3319647026289577859106580771, + limb3: 2726688198154492188428029057 + }, + w5: u384 { + limb0: 73393921507548752736469296087, + limb1: 22811121522142593565842636080, + limb2: 34032900199734860616001114869, + limb3: 229784266328387026912855303 + }, + w6: u384 { + limb0: 4610978828676323051199122858, + limb1: 56891230747791421395313812898, + limb2: 30446436544818371643508242273, + limb3: 7054663763514924813144181002 + }, + w7: u384 { + limb0: 78072951419729176907667341373, + limb1: 75265791822697477567731869530, + limb2: 67048770498080824287661332058, + limb3: 6000518210074684146140791361 + }, + w8: u384 { + limb0: 15915986302215453390485665418, + limb1: 52245979726618121568219385983, + limb2: 41778515617747255426920278178, + limb3: 4509206673039629445637166056 + }, + w9: u384 { + limb0: 56732957855436492051468301409, + limb1: 27375933860605671066532806323, + limb2: 74328009738611020894888018151, + limb3: 4582577811398872879449131804 + }, + w10: u384 { + limb0: 68318439461149895375688961903, + limb1: 41214307384153488551100728421, + limb2: 14978425365348563871011195080, + limb3: 7180161417813419378051669867 + }, + w11: u384 { + limb0: 41647315550498505714083058608, + limb1: 61507733151883298774792793531, + limb2: 48278715032557208326340470132, + limb3: 695743360348699195785748352 + } + }, + E12D { + w0: u384 { + limb0: 77746328683638570584038764105, + limb1: 59034775809964743077410162715, + limb2: 37792709450296756644608977524, + limb3: 4358803792772120913541727287 + }, + w1: u384 { + limb0: 9101331438913777879731965341, + limb1: 59912027461239777351673593023, + limb2: 73969658953527411922152359833, + limb3: 4981326824796487740743642993 + }, + w2: u384 { + limb0: 67565800053659185628481303200, + limb1: 18630726010726346120102612875, + limb2: 68091629001322642429370865112, + limb3: 30284508452435662517378792 + }, + w3: u384 { + limb0: 8427057416162578569263326514, + limb1: 58314184339102905353047196303, + limb2: 7163806838927090823758978358, + limb3: 6139250290267333967069500853 + }, + w4: u384 { + limb0: 33585586846968797494373034264, + limb1: 12111058086797103904816883417, + limb2: 2455825424806916784757028273, + limb3: 868180400315611470833423690 + }, + w5: u384 { + limb0: 62210364330830082302935180154, + limb1: 72898146186839582718117846940, + limb2: 68394700340922769961976529207, + limb3: 7631145891182476579297985687 + }, + w6: u384 { + limb0: 53047418432734789820965312259, + limb1: 9196746000971995441334646025, + limb2: 32173478408437415114101966275, + limb3: 1446937214514382182436731521 + }, + w7: u384 { + limb0: 725339065126157049756770371, + limb1: 6586483124419739666055154691, + limb2: 76346262497204063971060065604, + limb3: 6921615414614905194675470385 + }, + w8: u384 { + limb0: 40034748145649323742270826003, + limb1: 76587482604803763828426944836, + limb2: 62268957479077764939288102730, + limb3: 7213168476241565460490504975 + }, + w9: u384 { + limb0: 48657722772448441424112474014, + limb1: 61588102729547132441956629392, + limb2: 7389994883183728986215925422, + limb3: 4910535276557941259232442060 + }, + w10: u384 { + limb0: 65298851150568614216519162578, + limb1: 49467203255973983495685673167, + limb2: 44322249222887498501740680498, + limb3: 2019018956041589514471014477 + }, + w11: u384 { + limb0: 55998102922265559508463310402, + limb1: 35420008962328866131799722484, + limb2: 48651309203135681048629076773, + limb3: 106158662124756177145781423 + } + }, + E12D { + w0: u384 { + limb0: 34357397546042361723066985050, + limb1: 14019958459912825101613520942, + limb2: 19256324138952164108314033225, + limb3: 5475572771725869126244924494 + }, + w1: u384 { + limb0: 30206120369611889615715870568, + limb1: 17732808770941636158516554150, + limb2: 16342424237245664166985827035, + limb3: 1560680276173453953184123676 + }, + w2: u384 { + limb0: 67410046665432458505818462888, + limb1: 33929813744495417870580134122, + limb2: 45765668324146211216295688901, + limb3: 2436577664066282582268759087 + }, + w3: u384 { + limb0: 75369533384970230691150405419, + limb1: 11486811226094189414045274684, + limb2: 7573443082846584796941597561, + limb3: 3418786362657634444568383405 + }, + w4: u384 { + limb0: 10965423657493996787853387370, + limb1: 75328410441653564392867238047, + limb2: 54219130929404720918488971724, + limb3: 1948602757852497788010417601 + }, + w5: u384 { + limb0: 51123139038936500512940081274, + limb1: 59722697938161816137618648379, + limb2: 63102412224313973076984945992, + limb3: 2716132758507054190238216369 + }, + w6: u384 { + limb0: 43637071696343052899324756509, + limb1: 38024540513437908118103787632, + limb2: 56808891479290634463637783041, + limb3: 3970016916878372670748656010 + }, + w7: u384 { + limb0: 1885411803484624797364711400, + limb1: 5441045831653811527747850982, + limb2: 4356501897230239274106869590, + limb3: 5158752987686393857805329456 + }, + w8: u384 { + limb0: 74116471751520441610307421989, + limb1: 35766681584453699933182419457, + limb2: 25506996834359698751195078478, + limb3: 7035194495513973929250270554 + }, + w9: u384 { + limb0: 59525827063156601512539775373, + limb1: 76286240537396202211512602299, + limb2: 6819051836817565268053876366, + limb3: 7141268985846966607127054027 + }, + w10: u384 { + limb0: 24592283763719955289084644035, + limb1: 29529302153053437819675987821, + limb2: 53231691231778343655665447116, + limb3: 1283974607613544367338849436 + }, + w11: u384 { + limb0: 40476049782209984056495121373, + limb1: 76633046251310573505317954647, + limb2: 52993180979231029414653985529, + limb3: 6735980913726022812782245464 + } + }, + E12D { + w0: u384 { + limb0: 44113847137040733113889666622, + limb1: 22447645325596632672647696242, + limb2: 41167423631652082480190013158, + limb3: 2788282702352800264773973273 + }, + w1: u384 { + limb0: 45766961186184178489220085583, + limb1: 36992129590522657438520036075, + limb2: 4642385162153028504084193902, + limb3: 2836266275355310186557460345 + }, + w2: u384 { + limb0: 63671566424631260649089525813, + limb1: 50585571570128492135861007191, + limb2: 9962654801249335110912271842, + limb3: 2821250820570785932489982073 + }, + w3: u384 { + limb0: 36002836268571744932437851188, + limb1: 33480744109181007241403774844, + limb2: 56982786166053180578682760371, + limb3: 7932371803094512372916734950 + }, + w4: u384 { + limb0: 18570910628782392327795669854, + limb1: 54407757044486029917845385913, + limb2: 25267395163170571905942721089, + limb3: 4299233477211835305464822895 + }, + w5: u384 { + limb0: 23880793739591030572182768555, + limb1: 49947548144180565032221439984, + limb2: 882495166696559164144097768, + limb3: 271371608725803265496654239 + }, + w6: u384 { + limb0: 17318106844270202092377318661, + limb1: 40181523502416140678126573224, + limb2: 49561178434948684980938502738, + limb3: 7841699288882428653096570068 + }, + w7: u384 { + limb0: 6935968273518254891024196761, + limb1: 55372582580277903020277873607, + limb2: 33814091104781302270852382253, + limb3: 2384348272923480872990653655 + }, + w8: u384 { + limb0: 64473213418102058422328633458, + limb1: 24189221618052837049040010791, + limb2: 79118161421690390050191513049, + limb3: 4636238654620958542737635173 + }, + w9: u384 { + limb0: 13829043222382135643562205641, + limb1: 30675561901706432533362830910, + limb2: 48773121926327168813485689009, + limb3: 843182575570078210666087077 + }, + w10: u384 { + limb0: 37755612670825614936367580616, + limb1: 40654790057453314405264623515, + limb2: 39368151248493370204563186978, + limb3: 4990190992640815003284552937 + }, + w11: u384 { + limb0: 35316656815020116712860368364, + limb1: 72442874782289274112787496070, + limb2: 51397568416139199728586474610, + limb3: 397290172412817850039249026 + } + }, + E12D { + w0: u384 { + limb0: 26155522870345639568845304480, + limb1: 44742505050558744398459898833, + limb2: 6247304064657967597922348758, + limb3: 5566543155222910397610272988 + }, + w1: u384 { + limb0: 60683236124983692904165255220, + limb1: 40346950446837033645253665076, + limb2: 2728429794346511898742662547, + limb3: 3388823908531566602108783118 + }, + w2: u384 { + limb0: 13219147304976628007975329505, + limb1: 31218318341471692715345873434, + limb2: 17262093110107257152374780944, + limb3: 1571934447961486467353896746 + }, + w3: u384 { + limb0: 26867407416842301724672459344, + limb1: 36147351351039034001100632450, + limb2: 76480373570343193911556550154, + limb3: 2727024938461340982223344232 + }, + w4: u384 { + limb0: 46493324991197364613830746901, + limb1: 73686549597069921421064584226, + limb2: 60657489200472071992085422879, + limb3: 4051861209015840821695907613 + }, + w5: u384 { + limb0: 76388343498878588341533749823, + limb1: 30540626357690840104871372282, + limb2: 53796537636470224648447538547, + limb3: 3986888884626574942242025044 + }, + w6: u384 { + limb0: 18536504340687016008229167079, + limb1: 39505454708779074517628907925, + limb2: 70379162454615935977628191878, + limb3: 2622454192285313689350818293 + }, + w7: u384 { + limb0: 45429841533105968565303616483, + limb1: 48125208456409945106319096852, + limb2: 30253757875770708189281650052, + limb3: 6852414596658998049844461704 + }, + w8: u384 { + limb0: 61586189060036303919515085149, + limb1: 78203078568027669994764370375, + limb2: 8966220126398256407826059382, + limb3: 257147163428132502704317611 + }, + w9: u384 { + limb0: 39746495154682081962546967449, + limb1: 60939897080452805608536609011, + limb2: 68921672782764248262265285306, + limb3: 2060826112395203473406880442 + }, + w10: u384 { + limb0: 19761780761417867212634980764, + limb1: 51521196045756082752873671439, + limb2: 63765009424794885650025831926, + limb3: 3908403819677827043236133943 + }, + w11: u384 { + limb0: 62324554472664443320557629231, + limb1: 53277348156538242252901450417, + limb2: 67264116661416183010115480622, + limb3: 905539548527474968791877208 + } + }, + E12D { + w0: u384 { + limb0: 35541648775209186386815865284, + limb1: 78398963959435042235732491979, + limb2: 20765623096469269668175535912, + limb3: 521099944094103289784492408 + }, + w1: u384 { + limb0: 20054491868856585662970723548, + limb1: 16573636374493341389076654991, + limb2: 15593002950148228291528540066, + limb3: 1237335233811346780686712812 + }, + w2: u384 { + limb0: 61580652594579083788488476851, + limb1: 1755158397623642855056170715, + limb2: 47097248011908829432082207387, + limb3: 6902677556276133244277880515 + }, + w3: u384 { + limb0: 67591281368764176286071639225, + limb1: 24498701717893717992977051911, + limb2: 78844728537894665234498613372, + limb3: 8039832911649382342498784934 + }, + w4: u384 { + limb0: 58007767159805720888472065671, + limb1: 7445105091164602306382944236, + limb2: 15262110741214082111723726244, + limb3: 6749833333811694471589119501 + }, + w5: u384 { + limb0: 2803749721494897715452207009, + limb1: 76978734201466022844140752735, + limb2: 27074157038680885690426458470, + limb3: 1920619442301669881016362719 + }, + w6: u384 { + limb0: 12115556651108220459243939567, + limb1: 29560781954685392697529657372, + limb2: 53156319754804750669712081044, + limb3: 7313481699629616617584563974 + }, + w7: u384 { + limb0: 27486835410167858693726170312, + limb1: 53206888728644666351577755657, + limb2: 70764901808047154354846337162, + limb3: 1253507519201054044151489962 + }, + w8: u384 { + limb0: 79018336390394955623607460549, + limb1: 50922872938164161173317267289, + limb2: 28698504900028225770704650398, + limb3: 763488478353775930730216043 + }, + w9: u384 { + limb0: 61632891675505793838444983218, + limb1: 77746447168366107089157292278, + limb2: 72113454948707315155253690096, + limb3: 2191363718436108102409325094 + }, + w10: u384 { + limb0: 18071251252965612739976685843, + limb1: 15104960572859288789266349105, + limb2: 33787023770324573227150633595, + limb3: 7599459714042249415182958803 + }, + w11: u384 { + limb0: 10306789400284138442594682168, + limb1: 68627566054857978263819388866, + limb2: 39486023519856406265110799730, + limb3: 2934881403543326278944055826 + } + }, + E12D { + w0: u384 { + limb0: 46927537564327371962024564141, + limb1: 25600979894446844503661979077, + limb2: 70869031680407820387610922294, + limb3: 4027481184525619566305843934 + }, + w1: u384 { + limb0: 49824204657962014452693849295, + limb1: 15603600654154693967312905360, + limb2: 24104420351858600458201788979, + limb3: 6703647565547391309434323036 + }, + w2: u384 { + limb0: 57003166392896714370884176166, + limb1: 63700605854095715599926763720, + limb2: 28683441083734833640504531171, + limb3: 5685404947225162700616065861 + }, + w3: u384 { + limb0: 44200113573207363980868686480, + limb1: 5892964956018792563462292254, + limb2: 25036439348596363979194003384, + limb3: 4334658736822786726662773827 + }, + w4: u384 { + limb0: 39465416966473762215043828197, + limb1: 50861448882666718517154550762, + limb2: 24993804673952138337702946611, + limb3: 3712979005487367762921563308 + }, + w5: u384 { + limb0: 352469161071884735510443745, + limb1: 1309174205748932390691885087, + limb2: 55052160936929557241240960952, + limb3: 2578211454635830330520346755 + }, + w6: u384 { + limb0: 75080080384919856389463515928, + limb1: 52285483992879161064217849637, + limb2: 47035530049372660314598695384, + limb3: 1574424058556827015989699576 + }, + w7: u384 { + limb0: 41750181396143936975852901173, + limb1: 54771845868551298768818273217, + limb2: 59741860821065528199665345238, + limb3: 6132570222655510441123583684 + }, + w8: u384 { + limb0: 49550595931032268415416458807, + limb1: 66419595082708161744325009262, + limb2: 64875002822552326134102080700, + limb3: 3031530779791249990515386322 + }, + w9: u384 { + limb0: 26274580643908558876403272238, + limb1: 65752558423700450622421567577, + limb2: 24056921405784882837229642745, + limb3: 166698481994471483178362836 + }, + w10: u384 { + limb0: 71424801163498320015193644228, + limb1: 18413929350816559844200830467, + limb2: 12553551409756240924440381594, + limb3: 5142125592634124039173387352 + }, + w11: u384 { + limb0: 42815937371022955219235100219, + limb1: 61153482513886720518022319856, + limb2: 57772776551185292568303913137, + limb3: 4704629711320095530789585902 + } + }, + E12D { + w0: u384 { + limb0: 71802884841153744648498552046, + limb1: 45327300869963746683610554506, + limb2: 26563628792531678993046016848, + limb3: 140564597983853109163181616 + }, + w1: u384 { + limb0: 6793564736408758943455313478, + limb1: 37991013894573684026123504249, + limb2: 67355011813249960449820490227, + limb3: 7955721870306169434658696295 + }, + w2: u384 { + limb0: 39838454097569760291955007269, + limb1: 67843280532586599854838508635, + limb2: 43976895257761533932669936980, + limb3: 3075352184401232564056206930 + }, + w3: u384 { + limb0: 55089953076896353741245178270, + limb1: 5571242961650751667665065582, + limb2: 69598693519096974072316178888, + limb3: 1280617805685185844132917678 + }, + w4: u384 { + limb0: 71903354419271103035283116921, + limb1: 56300668574019738118026543700, + limb2: 50791311349275111259607223718, + limb3: 2297043776150261744786052589 + }, + w5: u384 { + limb0: 35688843962754831898307776469, + limb1: 70331200015029704268390884612, + limb2: 51802234954917427121951905721, + limb3: 480806362201441940733781948 + }, + w6: u384 { + limb0: 12457559173798251060320957903, + limb1: 31774010222138247562581072204, + limb2: 31675998733133132615810633237, + limb3: 6097640214228095708827024103 + }, + w7: u384 { + limb0: 64394582396423884301546290278, + limb1: 68167891721432003974609714368, + limb2: 6344598114370446751941238271, + limb3: 3366505253742598738887822412 + }, + w8: u384 { + limb0: 63869685227006648421213317445, + limb1: 25912011461535700530299438855, + limb2: 62182299868110629371000221989, + limb3: 7662938954360403294889611148 + }, + w9: u384 { + limb0: 34315528170136750698273385552, + limb1: 10195030558458530955353305903, + limb2: 37904619768815184965633526640, + limb3: 3505231193369631359278859865 + }, + w10: u384 { + limb0: 74389178747001976857287410851, + limb1: 19866346119768644824683831873, + limb2: 45285188290953801005770740989, + limb3: 4520708735424484381220134539 + }, + w11: u384 { + limb0: 28144287329137150563969771484, + limb1: 14049546050613307302425251876, + limb2: 12188885081629775321220825542, + limb3: 2309487184636298553179023189 + } + }, + E12D { + w0: u384 { + limb0: 13615930268579087564470891540, + limb1: 74780233768685320801704428794, + limb2: 73346444906159363561567082878, + limb3: 2623078412698815438703207605 + }, + w1: u384 { + limb0: 13999066633982001969683969881, + limb1: 50843064115566845563491212622, + limb2: 18446183436952057396173060748, + limb3: 3989069665122224531873585868 + }, + w2: u384 { + limb0: 2966615187611639382179851685, + limb1: 76846970884683747194102013865, + limb2: 46883226936088320927165957950, + limb3: 1420775065643985447997717964 + }, + w3: u384 { + limb0: 47872552273478542249180635567, + limb1: 33539690669431882546035276550, + limb2: 75573518327197346936136571102, + limb3: 2385056630225230790884084641 + }, + w4: u384 { + limb0: 77076825794335139899458737189, + limb1: 27052627728513871692689133958, + limb2: 39532773800384135628229537773, + limb3: 2956027560298725236215024161 + }, + w5: u384 { + limb0: 66261854726164214859186983252, + limb1: 18514429714823490367409902579, + limb2: 44807958583193255745834954994, + limb3: 649107380510459731791386920 + }, + w6: u384 { + limb0: 15830539328792360003902349904, + limb1: 4145428427977001167932494186, + limb2: 24014784076594674631926216735, + limb3: 193745628529505709800788228 + }, + w7: u384 { + limb0: 57456265884294473254523966807, + limb1: 28514639741312184964841570364, + limb2: 77287862564315242138789286878, + limb3: 3881015047294636227275519664 + }, + w8: u384 { + limb0: 39769545094010478029522730179, + limb1: 15750089480739077588703278349, + limb2: 11906369177812283016758902692, + limb3: 4183721455460825398854853307 + }, + w9: u384 { + limb0: 41969820676217608061932762080, + limb1: 77563260779406333733743872580, + limb2: 78912611571091984964371337000, + limb3: 1901216991347786225798211164 + }, + w10: u384 { + limb0: 20996238516260439510130394261, + limb1: 10924728277164675011423910814, + limb2: 21506211625495828299448745769, + limb3: 3721134247790526660711915678 + }, + w11: u384 { + limb0: 59551022163928444821814335342, + limb1: 49310725134049816424465902752, + limb2: 60376282952371406419740518509, + limb3: 3262055675412147461013956012 + } + }, + E12D { + w0: u384 { + limb0: 23123723880238138967662870448, + limb1: 70765771344434612636938839677, + limb2: 19119097440144870807485267173, + limb3: 253279915148209020327280206 + }, + w1: u384 { + limb0: 19794425152793870182391085633, + limb1: 39068423443288061334852818409, + limb2: 64994754383365713304228875696, + limb3: 2788015935356263582451812582 + }, + w2: u384 { + limb0: 69974452451055151043889867175, + limb1: 56353414443723020714180257467, + limb2: 62672285880063945224869736268, + limb3: 1975360552532996873737347756 + }, + w3: u384 { + limb0: 37941499844835225471567387778, + limb1: 59964818530726564401000855510, + limb2: 51377389659883995475060112300, + limb3: 642368729445743812037563996 + }, + w4: u384 { + limb0: 23342054014775097053277246910, + limb1: 48064347740611268883144507090, + limb2: 79000541619896931226355177311, + limb3: 7718982619123890751918632646 + }, + w5: u384 { + limb0: 38300940333775562071472715901, + limb1: 68299075365712374393721443699, + limb2: 31439952505963157986045758805, + limb3: 2720117507730321747258908038 + }, + w6: u384 { + limb0: 73511678008494816549514452192, + limb1: 22438960150104020663064151175, + limb2: 153001794218633521030537285, + limb3: 4579661064374784126450830959 + }, + w7: u384 { + limb0: 62962276417183255555954517814, + limb1: 21334014660545120830453956426, + limb2: 39471796936324480865883150232, + limb3: 3207269226860688527472937020 + }, + w8: u384 { + limb0: 69082570074624642748666365601, + limb1: 36753248845637805019292356076, + limb2: 34925207754159136048830907444, + limb3: 7417145543194485918647301182 + }, + w9: u384 { + limb0: 70419201767620922652205615107, + limb1: 78196934326891607227489438213, + limb2: 66328416578999457998126965159, + limb3: 5032479181831042024680685326 + }, + w10: u384 { + limb0: 25753133547545759268455288559, + limb1: 12202524908973824390126333992, + limb2: 25946640306608472393241246820, + limb3: 5217612616262409480538058845 + }, + w11: u384 { + limb0: 24080691593819984498036674557, + limb1: 38257322887098410249084908636, + limb2: 1804656033739336818528610403, + limb3: 1622506598622564270064183414 + } + }, + E12D { + w0: u384 { + limb0: 15670054647531908348755307720, + limb1: 46666346003326755223989446496, + limb2: 13395045216327966023182335066, + limb3: 6610798747952094901377180583 + }, + w1: u384 { + limb0: 17490194213085311074822551632, + limb1: 31321030719535879885540412967, + limb2: 60311127212824147619491742777, + limb3: 2993652506034884611978936654 + }, + w2: u384 { + limb0: 15329449443912699734491320470, + limb1: 62598208534929210615640174520, + limb2: 76394223418730959010313002265, + limb3: 2877523102660466813450290154 + }, + w3: u384 { + limb0: 56548130956811763101214537628, + limb1: 6103144364285574871040507307, + limb2: 34234394115749682506206804350, + limb3: 7018902911572457138325374967 + }, + w4: u384 { + limb0: 64344154286316428739271958916, + limb1: 77537220717794418409741433501, + limb2: 53279020611478983292607564278, + limb3: 1086365425401585385999944637 + }, + w5: u384 { + limb0: 78068133785410952857129886634, + limb1: 69906643613063206949799165141, + limb2: 63081543401009900910328662447, + limb3: 7128170937132759997390190068 + }, + w6: u384 { + limb0: 61627001781709691096742928983, + limb1: 76382099349878621232278734608, + limb2: 52409368511945702404779114816, + limb3: 536620954474222445683099962 + }, + w7: u384 { + limb0: 32748887502623677473638956916, + limb1: 6577073611954514365069201173, + limb2: 28913331071846948079290553114, + limb3: 851649139086788501261922577 + }, + w8: u384 { + limb0: 29414808941467211674320051261, + limb1: 58663228660545960498997128323, + limb2: 34097964714094331717057509449, + limb3: 6620165996049272954795044792 + }, + w9: u384 { + limb0: 77690077182968806577357462422, + limb1: 2779128580509278545091326891, + limb2: 27208784698050296004695213880, + limb3: 6430045897816846130525480845 + }, + w10: u384 { + limb0: 16115333247839948175886876116, + limb1: 32146365307153034170982453687, + limb2: 55214986498070920239986369530, + limb3: 2470857634511151481643108997 + }, + w11: u384 { + limb0: 60531194736298408625927161167, + limb1: 44926231313538972660829882323, + limb2: 40580383751318863803820249489, + limb3: 2267521082870010554103191318 + } + }, + E12D { + w0: u384 { + limb0: 76342300704708776877622134128, + limb1: 19469356740123757583522191197, + limb2: 26525428846805228090911238727, + limb3: 2113285186773240355342851147 + }, + w1: u384 { + limb0: 56980624283002778648985938486, + limb1: 57061902140906178470783705692, + limb2: 58571994843032372002343865983, + limb3: 5331623664000187746844825050 + }, + w2: u384 { + limb0: 27259643527341300339024181645, + limb1: 37400680423727646909994536006, + limb2: 31632782021305588980746797433, + limb3: 4985113533086589066269934489 + }, + w3: u384 { + limb0: 37735219212472856427666899359, + limb1: 59263030080106804635460972312, + limb2: 22818272967073769321966332972, + limb3: 5306587933836717402456583433 + }, + w4: u384 { + limb0: 66269022446449466404307446807, + limb1: 40243734841207196790731048031, + limb2: 11275241505921055652132424123, + limb3: 7756994740486875488747396165 + }, + w5: u384 { + limb0: 69315133997940991724366170472, + limb1: 72006260695130250266403899537, + limb2: 47205348838325654592416638595, + limb3: 2204379764970331239571683038 + }, + w6: u384 { + limb0: 14472096857383302647594732696, + limb1: 29119056360985022406069362489, + limb2: 31650106181216237777644140580, + limb3: 5192405263048797168259427184 + }, + w7: u384 { + limb0: 58950073839036408115652858629, + limb1: 68170632021196744049343315318, + limb2: 60166072629850241188117709736, + limb3: 5675123334741164061871126995 + }, + w8: u384 { + limb0: 32955608414003656741769483620, + limb1: 4723741690121613853695779832, + limb2: 65134638822925815597568359181, + limb3: 7539291568614672938853559312 + }, + w9: u384 { + limb0: 56810103831721211720120002652, + limb1: 11916756456242181321105365459, + limb2: 38126136741500739123542946407, + limb3: 3659777321773582163415093940 + }, + w10: u384 { + limb0: 8048817881029944649927281535, + limb1: 34647619814038746683895585867, + limb2: 67226420499213129296837071394, + limb3: 1920537727446949441436469151 + }, + w11: u384 { + limb0: 2801101256356252972066225043, + limb1: 39938726625335622466776955087, + limb2: 68017033846014801501326067030, + limb3: 6692875601235817264448463811 + } + }, + E12D { + w0: u384 { + limb0: 59505532561800675415298491956, + limb1: 45270196094171769106023718973, + limb2: 68001118675684230173003580402, + limb3: 6981729232992436798081075381 + }, + w1: u384 { + limb0: 33471279447861568186496284349, + limb1: 16707861579307472889109563683, + limb2: 35944798274209057278960755879, + limb3: 5646731754022237192105653834 + }, + w2: u384 { + limb0: 67236708445797844873569172968, + limb1: 48996308298968372536539866959, + limb2: 32300251634453923278231661341, + limb3: 1870233171749900428533430052 + }, + w3: u384 { + limb0: 47254989195083132298309704671, + limb1: 16950742142913819557481712102, + limb2: 6369391828968012729075277970, + limb3: 4971512249115527750890369116 + }, + w4: u384 { + limb0: 49091594376730924969388959201, + limb1: 15221035889752286277409315993, + limb2: 33953914679895537664194150863, + limb3: 4880883207151516551780792694 + }, + w5: u384 { + limb0: 58753582368824354700340033862, + limb1: 25519954834534391664904889425, + limb2: 61446582190633927155203559987, + limb3: 3031571007877407800680615369 + }, + w6: u384 { + limb0: 7425663591572188577606903790, + limb1: 60031595892285702859645657379, + limb2: 45594350626035297379275420012, + limb3: 2286961428805705570095602688 + }, + w7: u384 { + limb0: 69716824033564680224405386206, + limb1: 72051540111399058050650520412, + limb2: 73721294146211047277532368988, + limb3: 7876697318946430280762332444 + }, + w8: u384 { + limb0: 33233191625993887675413725364, + limb1: 54917308335776658436950182288, + limb2: 2761893875958793424207099476, + limb3: 1076301024395984750691912343 + }, + w9: u384 { + limb0: 19447683206690103663849360077, + limb1: 40574098241857734205462534420, + limb2: 19532611106172325281422220439, + limb3: 2635632201489039574062373289 + }, + w10: u384 { + limb0: 64909819900949090622617391343, + limb1: 19135625503579207063560087207, + limb2: 58463545204538449454557093776, + limb3: 2787877714278125381214617438 + }, + w11: u384 { + limb0: 21279962117773480190656622303, + limb1: 75768779246270892179226574246, + limb2: 75904912007953642632622916435, + limb3: 2271116453824354393910510869 + } + }, + E12D { + w0: u384 { + limb0: 35073874201763923420799448963, + limb1: 24137500096835358798518194331, + limb2: 4380844109445833429022406845, + limb3: 3099868158864684621508153204 + }, + w1: u384 { + limb0: 45315739126257102995608831862, + limb1: 39022839035811317443573897690, + limb2: 4164608128946935133603407455, + limb3: 3525689797313332756382276435 + }, + w2: u384 { + limb0: 11928271989084530667107193785, + limb1: 71455175606003508009078221803, + limb2: 45640163795341997718755223013, + limb3: 805091005443538653400928161 + }, + w3: u384 { + limb0: 36665926929005753151066490261, + limb1: 38281088491266391623556963885, + limb2: 42177512147855422466599520654, + limb3: 5656037639530746168309929680 + }, + w4: u384 { + limb0: 36898236568870835874211388959, + limb1: 49287298752324657621421268577, + limb2: 9583447044617583265643417816, + limb3: 2389870374854994326599869759 + }, + w5: u384 { + limb0: 77820581684026634796259610503, + limb1: 55172371669882303340624884784, + limb2: 22975651894383627917249452558, + limb3: 5723904703823210754926556563 + }, + w6: u384 { + limb0: 22915164802918859201004217828, + limb1: 14119672263268622810731380573, + limb2: 7340185264802417165399042251, + limb3: 7105932052945122435982562789 + }, + w7: u384 { + limb0: 960822751085154870601051691, + limb1: 6285660870782393855068095507, + limb2: 40716402061585928971845019414, + limb3: 7345773689179041234896714908 + }, + w8: u384 { + limb0: 5375762898107629509153102577, + limb1: 58419196365053839174538069787, + limb2: 62880334479456650111110022593, + limb3: 3884432992273928574608731634 + }, + w9: u384 { + limb0: 13496931982988100390735648047, + limb1: 37006545992555383774360672354, + limb2: 44355784301204910094259744880, + limb3: 4256103524241170292877651822 + }, + w10: u384 { + limb0: 11993363304197972420667524741, + limb1: 61218685460631666495199120561, + limb2: 56472265831596796966204473029, + limb3: 5066789096159718888128783482 + }, + w11: u384 { + limb0: 50572124720128775075652480960, + limb1: 10549989224088425410960205954, + limb2: 75314932558884509401180082076, + limb3: 2703760771346448994215217274 + } + }, + E12D { + w0: u384 { + limb0: 35461997495693483190956640392, + limb1: 63077166798850247310134880939, + limb2: 40710130559184418601868639917, + limb3: 4308095112360676336334528352 + }, + w1: u384 { + limb0: 27216465869195659391797211214, + limb1: 12043986471386434853438787829, + limb2: 25021635185122137039496460798, + limb3: 1413380450284795459623392798 + }, + w2: u384 { + limb0: 26164311299168010488035546921, + limb1: 58722406328739882758956858064, + limb2: 14590217921448356190933340951, + limb3: 5128408776182028591762267212 + }, + w3: u384 { + limb0: 12184722639404750274405395915, + limb1: 28115179491094827660291712869, + limb2: 50196310129000789862872768838, + limb3: 3220914925786563537776218840 + }, + w4: u384 { + limb0: 52432079238495029750187275894, + limb1: 7336587945201836857456693362, + limb2: 18615066249765449298361917470, + limb3: 5274140671514496666293897083 + }, + w5: u384 { + limb0: 50595863209121894564175515066, + limb1: 71437324160899348574278926404, + limb2: 30512152686290526936378575693, + limb3: 7592236291510982514414362447 + }, + w6: u384 { + limb0: 60275061333940515317502956185, + limb1: 33974478881253360107965977074, + limb2: 39282751732605268709799299443, + limb3: 5250925333278145114059593928 + }, + w7: u384 { + limb0: 30264256039200037637320002527, + limb1: 45332093133833531846327374311, + limb2: 29045250380886133271360262833, + limb3: 7967294336233508713691583553 + }, + w8: u384 { + limb0: 42746030188401464063278092447, + limb1: 24992517341455317588988872146, + limb2: 16326196394033808083743868531, + limb3: 3314204632298868009727923232 + }, + w9: u384 { + limb0: 14069811012702121775974295823, + limb1: 62145512278581422799534565122, + limb2: 4411950758683123237036757715, + limb3: 7638448407420830715225910638 + }, + w10: u384 { + limb0: 38995152782070214450039326164, + limb1: 66328123621536404420904394896, + limb2: 3490091826362920358997302876, + limb3: 771625948025096862712541554 + }, + w11: u384 { + limb0: 10455213567635016607554080404, + limb1: 44627115831002510520015286903, + limb2: 24337978730054080936697957567, + limb3: 7470043641268549951904241468 + } + }, + E12D { + w0: u384 { + limb0: 7266069154523583084496060673, + limb1: 49225147264407253644845437385, + limb2: 44357190236841652846564577789, + limb3: 3107287392283842438316127750 + }, + w1: u384 { + limb0: 78833878176298074878019187549, + limb1: 33905540460117151162392682085, + limb2: 40073295668800205495195973885, + limb3: 2970203951517141019642727576 + }, + w2: u384 { + limb0: 13999881317601645668577221106, + limb1: 11277856565088775069554567706, + limb2: 22423233609566087805794441855, + limb3: 5017330727496458120238117855 + }, + w3: u384 { + limb0: 5982156563279621384138453558, + limb1: 15843626662139414945428727701, + limb2: 40609965610542362376876569767, + limb3: 6319695091889469159064626981 + }, + w4: u384 { + limb0: 47912594487175879281061307933, + limb1: 78365489642917121264218056436, + limb2: 67628638378480678571056348770, + limb3: 2478843564741791328702707389 + }, + w5: u384 { + limb0: 68467546787901254858914129673, + limb1: 5272736180849826184078268948, + limb2: 25911492303819433014249273347, + limb3: 5869181088073454463098221866 + }, + w6: u384 { + limb0: 23622658697936338192855788116, + limb1: 49589402059455311817157201880, + limb2: 63462994142068348853303454543, + limb3: 2144183098088275786621380502 + }, + w7: u384 { + limb0: 52870084864943385362367817883, + limb1: 32191913689976850558396353160, + limb2: 40581072144553670487728501787, + limb3: 6842102991691689399280863703 + }, + w8: u384 { + limb0: 31979457295971522732504567606, + limb1: 65195684832379470452970452652, + limb2: 54955460461337145190468416031, + limb3: 1762275410695211123262169610 + }, + w9: u384 { + limb0: 27878997548528167144664120594, + limb1: 44216570203982370095845767330, + limb2: 78275810921434657427529973196, + limb3: 1897628130849787472172083176 + }, + w10: u384 { + limb0: 75339603353866014742147616820, + limb1: 23765120103731676090603390398, + limb2: 31333105070704495944751152501, + limb3: 5566986719201498341908453581 + }, + w11: u384 { + limb0: 76935955237072636945384242238, + limb1: 57844203166370557054092106632, + limb2: 24817638441775662779811776223, + limb3: 4277060750092814093292410094 + } + }, + E12D { + w0: u384 { + limb0: 34177848210987536192826412113, + limb1: 60134367599780375750276711256, + limb2: 48973377719178524023832764841, + limb3: 5259303477067383289244555104 + }, + w1: u384 { + limb0: 15029892583234227237608033453, + limb1: 12328609792485541926106175168, + limb2: 39355234973509991166827005621, + limb3: 1680264856366657291267572342 + }, + w2: u384 { + limb0: 21318790157794149666967826577, + limb1: 59600429430746745693176787672, + limb2: 64565949554420542165992280233, + limb3: 273989557241323171937098994 + }, + w3: u384 { + limb0: 19159519936259138438733290686, + limb1: 67552146561119916195423683545, + limb2: 38136760936290281916031971486, + limb3: 3122127906163360382477880441 + }, + w4: u384 { + limb0: 55272961956310870202106418274, + limb1: 71688823613725774446461107779, + limb2: 51457714995041316721732261416, + limb3: 7473792490704400908730931213 + }, + w5: u384 { + limb0: 32077558990793018145833416863, + limb1: 7047242293543155632128294876, + limb2: 38835865724780935521452840827, + limb3: 5674991295597342421788717894 + }, + w6: u384 { + limb0: 52159450626747063199749070804, + limb1: 69149522320296897745206090083, + limb2: 63238191938883445364406557557, + limb3: 1736364404648839301102797431 + }, + w7: u384 { + limb0: 64889520898098711226710212810, + limb1: 72589029046432343444479563147, + limb2: 51178455879456711355229686116, + limb3: 465927888673905427377111257 + }, + w8: u384 { + limb0: 42780473897880616139784671756, + limb1: 35923333716008542137403846549, + limb2: 29369890550301138596220788507, + limb3: 4153345435952923332737928274 + }, + w9: u384 { + limb0: 69492894424719539672038664241, + limb1: 9532969014156938994429148691, + limb2: 73129856342858579578329214766, + limb3: 7034472471694706049957720151 + }, + w10: u384 { + limb0: 78717682662770787399255359447, + limb1: 30297963866269047040236018298, + limb2: 17514385759343809944540645940, + limb3: 7372284536451525738131826582 + }, + w11: u384 { + limb0: 47582781506720506610932556278, + limb1: 67385721790485511993547640389, + limb2: 2436155311543082140195611842, + limb3: 4573957493619589369144832312 + } + }, + E12D { + w0: u384 { + limb0: 71609310008468487631923577515, + limb1: 188026221864111973958988283, + limb2: 7096713205504266468627554280, + limb3: 7828983244439100012545658458 + }, + w1: u384 { + limb0: 20287135936872973734460116900, + limb1: 60928063059800953578215579291, + limb2: 48274497777323191649649604478, + limb3: 5409681647489604479775523831 + }, + w2: u384 { + limb0: 16681969618944087078025717049, + limb1: 50280465891034144406132026383, + limb2: 11609534257653316401936168694, + limb3: 1127197592333332185398459085 + }, + w3: u384 { + limb0: 1423574779802733816559912110, + limb1: 64436887497046501507696336280, + limb2: 14173271387474782097345124586, + limb3: 5669688949429994128842474320 + }, + w4: u384 { + limb0: 63244470979156511536960607844, + limb1: 40792538150095593974634766504, + limb2: 8710122914182019029549563687, + limb3: 7823801254551438570351094330 + }, + w5: u384 { + limb0: 65560564671251402894833100900, + limb1: 7534410844553922419900994479, + limb2: 41366623532371133672930889723, + limb3: 7576535149200475682002853069 + }, + w6: u384 { + limb0: 9031746680089716280898922967, + limb1: 19181683275647029868193392494, + limb2: 10378934109343838490939962288, + limb3: 1836880367357214818107191087 + }, + w7: u384 { + limb0: 50651503550613312226346548057, + limb1: 61011843976018724090967694541, + limb2: 44282415356815829569146137265, + limb3: 1002141766084970608216200963 + }, + w8: u384 { + limb0: 20630186532981715998670414229, + limb1: 1200659715270153165592875302, + limb2: 10620914989674394941105067839, + limb3: 6250275062226226102302290230 + }, + w9: u384 { + limb0: 78917073087799809812454480437, + limb1: 5878468459706421864446720140, + limb2: 11832914778835743897799005697, + limb3: 3472104639887844284127869275 + }, + w10: u384 { + limb0: 42281885066483301091506024896, + limb1: 10032957705690902038033421714, + limb2: 21228049003622018519848293176, + limb3: 917811746066809864951676618 + }, + w11: u384 { + limb0: 38789100107500823000148879789, + limb1: 47447922561606677621378010769, + limb2: 33409697920126834519008024572, + limb3: 6270164537129723705955409436 + } + }, + E12D { + w0: u384 { + limb0: 1475093455041953840967499029, + limb1: 32951690026147784175080040003, + limb2: 14409731982272757221493365631, + limb3: 2729042847277724663944145471 + }, + w1: u384 { + limb0: 17136527293377428186942800945, + limb1: 14320037659790418549173072786, + limb2: 79037340434253541944384256757, + limb3: 2107620862762991394325328638 + }, + w2: u384 { + limb0: 5138761337077707095165222685, + limb1: 77525901656138740214403253213, + limb2: 16604457558976648621539096670, + limb3: 2212019509009422345136107959 + }, + w3: u384 { + limb0: 9741785997786564071044887688, + limb1: 71600271498816265345069482247, + limb2: 2598573321149688498646791936, + limb3: 7802254797623881083367784164 + }, + w4: u384 { + limb0: 64334258140006587129023361992, + limb1: 15475216099440632150078333912, + limb2: 42839807769129271831004707169, + limb3: 4321752210226562306003867853 + }, + w5: u384 { + limb0: 73936852773271737482152038235, + limb1: 52568356447504598771153160580, + limb2: 62142255576814255662817090006, + limb3: 7417559709301963515970441353 + }, + w6: u384 { + limb0: 20519993223992243457350010714, + limb1: 43452784177404049706024853873, + limb2: 12688818781352682116661660738, + limb3: 3499863294895383945503012150 + }, + w7: u384 { + limb0: 75614996968173235511294605731, + limb1: 62633413803234176689257365104, + limb2: 43674082645679076901624311553, + limb3: 1265331645106053886218290033 + }, + w8: u384 { + limb0: 2610206339722103336957803009, + limb1: 5589447808914579830405052446, + limb2: 61718069345390715563043489467, + limb3: 639959345084022861450745288 + }, + w9: u384 { + limb0: 74768867611580691663398797370, + limb1: 18568978584895625786832867083, + limb2: 21481108775199607663720390666, + limb3: 6059447182704201723180035645 + }, + w10: u384 { + limb0: 65691753519750188623056075420, + limb1: 69462787566546152559246117313, + limb2: 1994879634669246506844803645, + limb3: 6660796700144198665213674250 + }, + w11: u384 { + limb0: 11076688556555752455588436503, + limb1: 61013196758073420638649298504, + limb2: 44055921580974648012732059392, + limb3: 1139505452234322161798785877 + } + }, + E12D { + w0: u384 { + limb0: 16009192715691290889140780781, + limb1: 38235226532332471821624853396, + limb2: 61075472534660748429623608259, + limb3: 3212043059050367082972602411 + }, + w1: u384 { + limb0: 31788228523818849604727806979, + limb1: 61419849414974643339934695893, + limb2: 34654359860995603397603012609, + limb3: 7565111820310104113543760938 + }, + w2: u384 { + limb0: 13711396389564516111794500736, + limb1: 44057784044974447155297491245, + limb2: 69169105266675357706023404042, + limb3: 3914102925395844867263875077 + }, + w3: u384 { + limb0: 41622147159658015373270878227, + limb1: 45650308278617962235208057349, + limb2: 31493087478880018314203300276, + limb3: 5071782031606869868795912682 + }, + w4: u384 { + limb0: 17191091705724691006770084345, + limb1: 27909003207291928034087439014, + limb2: 47430768863859796304959582056, + limb3: 774616207346555906158113554 + }, + w5: u384 { + limb0: 42289027970942033210652857244, + limb1: 67312982800688146941128329620, + limb2: 42383011265507030634502122777, + limb3: 1051176571750895827108931409 + }, + w6: u384 { + limb0: 12891917188917978211542343269, + limb1: 62586295376476373511872238535, + limb2: 15742443499307565857695702418, + limb3: 6204535458728884358798809029 + }, + w7: u384 { + limb0: 38225963263743508741762344568, + limb1: 59383396537945084580637141691, + limb2: 43661114556396680946988257119, + limb3: 7453193947180151761131704916 + }, + w8: u384 { + limb0: 50167491102928529328101963520, + limb1: 7930586737410506535810037143, + limb2: 59440804924076176537230803154, + limb3: 650208680474037312683541999 + }, + w9: u384 { + limb0: 15324300716603810243330553675, + limb1: 18045970645287744537515998834, + limb2: 10624979663784255138302232026, + limb3: 3817946324888499377333312904 + }, + w10: u384 { + limb0: 54460139318169220889818479651, + limb1: 51772236133546181610013362254, + limb2: 13384723090997704657789115285, + limb3: 4544898321701891465879390488 + }, + w11: u384 { + limb0: 2862150195826546107895156843, + limb1: 34539920791690108109700825328, + limb2: 26456832932857297583655650427, + limb3: 7063880078047161614130505666 + } + }, + E12D { + w0: u384 { + limb0: 53703495180845440652702809208, + limb1: 75835089699978495990493313818, + limb2: 23403931507727809339462780398, + limb3: 4954906207097814129904981633 + }, + w1: u384 { + limb0: 39611071585329060866806207458, + limb1: 21232525126510965407310104742, + limb2: 27368206948765706859368624657, + limb3: 4309811814008967204826958224 + }, + w2: u384 { + limb0: 24673130582053899937618499613, + limb1: 30005404550259269857661482827, + limb2: 48545281047435677349779697042, + limb3: 7233793565388772120127160146 + }, + w3: u384 { + limb0: 29292275365907784584476606967, + limb1: 48310318296212660948720055262, + limb2: 56493193581509276183753759016, + limb3: 297784254250731439266451750 + }, + w4: u384 { + limb0: 78796155882746626277395433986, + limb1: 78916444382989595435815549466, + limb2: 1009588873705788642845112150, + limb3: 6653003877716104889852061049 + }, + w5: u384 { + limb0: 37996236872191490482401914278, + limb1: 30321707410654421604497245478, + limb2: 19919463892121241818488145614, + limb3: 5609237572791351381833591369 + }, + w6: u384 { + limb0: 36494834967294724314800049492, + limb1: 21255309902293927043226164472, + limb2: 8366475256264607197750703916, + limb3: 7900763635766891328534078588 + }, + w7: u384 { + limb0: 60640457433824122088396368378, + limb1: 67588824229540600905519717653, + limb2: 11657564742440969358781503049, + limb3: 2628213742221370960690535953 + }, + w8: u384 { + limb0: 64532863368940240486222854588, + limb1: 57061398715863067192120284089, + limb2: 73298234537533771012346115165, + limb3: 7904504380760694474796577604 + }, + w9: u384 { + limb0: 15404432487701007650281132242, + limb1: 12750604967260630594251587491, + limb2: 68370207137694865617070648698, + limb3: 3988930313939780062426064933 + }, + w10: u384 { + limb0: 37053246769347087940054990192, + limb1: 8490495279906530155946798356, + limb2: 20768539784073507717024667441, + limb3: 6780292820334704172307590599 + }, + w11: u384 { + limb0: 68782862602309021898651818839, + limb1: 75211295809618631102729943285, + limb2: 19190795748024448016744863629, + limb3: 6729041037337836024574012540 + } + }, + E12D { + w0: u384 { + limb0: 75200439366115517927614999362, + limb1: 12211285457386285851962648532, + limb2: 71230377290320076564533948302, + limb3: 1842530552287834401758737434 + }, + w1: u384 { + limb0: 54823382225241257030753742853, + limb1: 26629199475260612630065946816, + limb2: 6256021758285589230376594981, + limb3: 164856598144749094394733124 + }, + w2: u384 { + limb0: 34833787277281448992457420386, + limb1: 12722773254558309930220626699, + limb2: 60421093680285458438587707447, + limb3: 3642164799748134712725059089 + }, + w3: u384 { + limb0: 39898230292691540833620148160, + limb1: 3189876677665130375069182345, + limb2: 71758008584164176574687603402, + limb3: 4841801092307149318371004238 + }, + w4: u384 { + limb0: 73777230219367786776120792137, + limb1: 40572130201436511650690965400, + limb2: 75421490693894319186814091076, + limb3: 6964332680201022543181724135 + }, + w5: u384 { + limb0: 31857149252099249202432453478, + limb1: 56981544657792454262405409965, + limb2: 406945899794075721463253366, + limb3: 4574473257795949566892859351 + }, + w6: u384 { + limb0: 50106185691556195939893284368, + limb1: 60171879971804372749325548257, + limb2: 23974098117486903187180526225, + limb3: 4399006114186752614405774638 + }, + w7: u384 { + limb0: 64352967973316458849635745254, + limb1: 56989467603984298524951487622, + limb2: 8113601363411731790666266993, + limb3: 7351589166635258238771150310 + }, + w8: u384 { + limb0: 10224706307554281635918171088, + limb1: 13686534688103344296898802126, + limb2: 73519778788823301878981522498, + limb3: 7352330878356179717216457041 + }, + w9: u384 { + limb0: 10319214545092961462928160692, + limb1: 65257585449921041077166019371, + limb2: 36701566999742486380590254342, + limb3: 2356259873945086893975540518 + }, + w10: u384 { + limb0: 56341808367007663270200990128, + limb1: 70480282578098549424408965247, + limb2: 31846761565598619878194081530, + limb3: 2257542640361628985266833201 + }, + w11: u384 { + limb0: 62024221890049052102458071325, + limb1: 75302415500805181368680906046, + limb2: 78310961191129028048555019699, + limb3: 5012197039368349348331056811 + } + }, + E12D { + w0: u384 { + limb0: 27975486056453767763237762033, + limb1: 64548321719143942285382892298, + limb2: 62385618657765292063495731548, + limb3: 6380596040342919573726355250 + }, + w1: u384 { + limb0: 43786436415812525397530992751, + limb1: 58218258864637106349242400363, + limb2: 74099639867896002629612626734, + limb3: 871829110941421937844976013 + }, + w2: u384 { + limb0: 26416770047821190016189462732, + limb1: 23800396676374693626570778494, + limb2: 32391952994338288851400965562, + limb3: 270205427343637956306773869 + }, + w3: u384 { + limb0: 40589394024688171595873317345, + limb1: 28943327551714670286864084062, + limb2: 12013177630720471540247043377, + limb3: 2610366400948223176794342176 + }, + w4: u384 { + limb0: 79153562874708595149076591028, + limb1: 78126304076004598246279338089, + limb2: 78092846251414048803127333978, + limb3: 3816231433389921181810670546 + }, + w5: u384 { + limb0: 20148347256029523023524908126, + limb1: 30101687368937724189947817453, + limb2: 39182313770829365106798178045, + limb3: 456957972488747677064044684 + }, + w6: u384 { + limb0: 8866387694129525260278821142, + limb1: 52239098140015773842982379855, + limb2: 44374682443259666202334244220, + limb3: 5682487117413800348625853823 + }, + w7: u384 { + limb0: 71645436505468891885379275750, + limb1: 24237504013422484544627749411, + limb2: 56388117344855171907416622467, + limb3: 2805036404412355374067707054 + }, + w8: u384 { + limb0: 3625738982220444247769596327, + limb1: 76531939794028661694780396742, + limb2: 4075945051940424670655619763, + limb3: 5252951907767090651632575402 + }, + w9: u384 { + limb0: 2471697946742720985646085004, + limb1: 26221921707592168708557459975, + limb2: 54676272260089358220628204033, + limb3: 1897709195066396373903495162 + }, + w10: u384 { + limb0: 54840797555162383244855909871, + limb1: 70040766224616509979463987664, + limb2: 42692467008660938711560945139, + limb3: 2964085231377740921472387855 + }, + w11: u384 { + limb0: 16771121101195939794505897861, + limb1: 71810577199735293253167590592, + limb2: 31403560309446092222754147605, + limb3: 1401406076176672181773477683 + } + }, + E12D { + w0: u384 { + limb0: 19272525586190620509327748580, + limb1: 28453147239925574592245488637, + limb2: 54937478406450451089979879516, + limb3: 4002690416848808274330837474 + }, + w1: u384 { + limb0: 51293943965707227947621557797, + limb1: 12079325551818934420108420575, + limb2: 70952408441824072833428666049, + limb3: 6472742224643898028658456651 + }, + w2: u384 { + limb0: 13115158859080608512337886553, + limb1: 13724796564392098121332853179, + limb2: 5242260373911223681265913281, + limb3: 1683286905133151857860500662 + }, + w3: u384 { + limb0: 21753243776588036679038434178, + limb1: 78403637035491652894584534600, + limb2: 3927458229648378441975258753, + limb3: 6903475663344791268849501910 + }, + w4: u384 { + limb0: 25045489635536984801277549093, + limb1: 66110420818690965152948179658, + limb2: 25549692919313805716730436474, + limb3: 1369064298924366798313451574 + }, + w5: u384 { + limb0: 60271679202855522456377866077, + limb1: 37599899636790098546258025589, + limb2: 24158839871564008525638734172, + limb3: 3373162296540506876163229225 + }, + w6: u384 { + limb0: 38525846609418784825901567343, + limb1: 59635887180725288651344176692, + limb2: 33771991978540320219590890531, + limb3: 1667804035676854435640678262 + }, + w7: u384 { + limb0: 57151073887139419757756496920, + limb1: 68405349593346511294629303548, + limb2: 45766651320196168499841694340, + limb3: 5769762388922684781972786242 + }, + w8: u384 { + limb0: 54781662841243835595413769758, + limb1: 66838489122861981502922978761, + limb2: 61108131179360184613013101420, + limb3: 1218568002710247560982087496 + }, + w9: u384 { + limb0: 32338119434695193631827563946, + limb1: 21778768939778749667962591931, + limb2: 45449014389152096879391967709, + limb3: 6657006552101750986011548667 + }, + w10: u384 { + limb0: 76148333584325413483252558848, + limb1: 29761193006646463671078119249, + limb2: 29958418137166759708323587878, + limb3: 7608262207328910424358499143 + }, + w11: u384 { + limb0: 76897246446417463413869675748, + limb1: 73828161885817632502191348027, + limb2: 77944175795964849945182170380, + limb3: 6330490430095141328859939987 + } + }, + E12D { + w0: u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }, + w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }, + ]; + let big_Q: Array = array![ + u384 { + limb0: 33707295071193036003176823708, + limb1: 5199369757582187165527189569, + limb2: 7591155773905872358076047653, + limb3: 6218467033461999474203918126 + }, + u384 { + limb0: 8263194380544977773276653913, + limb1: 20748852233990255666048778688, + limb2: 29775185211760367833221779267, + limb3: 7535326778048697473725776981 + }, + u384 { + limb0: 43798461523356443294302064972, + limb1: 8958629766631627215905755700, + limb2: 63248493829751103335591300256, + limb3: 6875342114467599101332613788 + }, + u384 { + limb0: 29668278770276253502203319525, + limb1: 76992586766080284315605979470, + limb2: 30052471202789753005844996745, + limb3: 4935718563900317899257101458 + }, + u384 { + limb0: 32734849991744755785939758764, + limb1: 67820097084946902663330532482, + limb2: 68696170992217325269372139897, + limb3: 3336845532554055011789063122 + }, + u384 { + limb0: 63956796600584145606713483704, + limb1: 22738666411155774182648293628, + limb2: 28463977883366789917686268157, + limb3: 2583556554658360796979064768 + }, + u384 { + limb0: 13011794310664316945569886376, + limb1: 46203979052043771344579138693, + limb2: 7340267505579804147551892067, + limb3: 2590146087407709072194356718 + }, + u384 { + limb0: 74373049435865400389298291235, + limb1: 65066409196695057652307832834, + limb2: 2065631956519021850420247818, + limb3: 5620865029298987641087761312 + }, + u384 { + limb0: 17367564396029356262265298626, + limb1: 45428036079191215034435435848, + limb2: 54952634840583792468436427996, + limb3: 1343023120313629003372290725 + }, + u384 { + limb0: 38048732406490613881040294111, + limb1: 64273890689196566425926917105, + limb2: 77652192052268195243547398162, + limb3: 2787615079028991832795039641 + }, + u384 { + limb0: 61708415031164294156461661728, + limb1: 65665188034100109535941637693, + limb2: 36957615689003624272485295296, + limb3: 4007330349131909511981480491 + }, + u384 { + limb0: 26478582946264995770382062480, + limb1: 63290355685434309661288459964, + limb2: 7253553674254734346481188232, + limb3: 3642123270064929521610754744 + }, + u384 { + limb0: 14261427245845379986273130119, + limb1: 43633041897903517593837574970, + limb2: 24591556151135390333436201880, + limb3: 5560834399406154531834160685 + }, + u384 { + limb0: 50592333128671712154663161937, + limb1: 63000851746460430500423806069, + limb2: 76710657360618300050839992782, + limb3: 1016885226060348348982207588 + }, + u384 { + limb0: 43781638043264324146981240657, + limb1: 67452305091659340287732156472, + limb2: 20667222434693402467815546433, + limb3: 7282904148681564957647567565 + }, + u384 { + limb0: 38020588545773623047529653454, + limb1: 65507907573898744462738931158, + limb2: 68958976490814272499656291719, + limb3: 1631123887280063784450977422 + }, + u384 { + limb0: 6757862921488931676553442890, + limb1: 71863753504588149779969927914, + limb2: 77911581213022792131397988932, + limb3: 46478534903116960536961569 + }, + u384 { + limb0: 40228715288896031760595267924, + limb1: 16302384233110545450226341260, + limb2: 17219181409872194758920390199, + limb3: 1469036687566426513359194110 + }, + u384 { + limb0: 71999236751892910128013414867, + limb1: 56662940468431382525737443151, + limb2: 42124044118499134780886859653, + limb3: 2329388947703131203626182096 + }, + u384 { + limb0: 2002621855516744760865285903, + limb1: 19961555449960120174111838109, + limb2: 46853975413975609417048629266, + limb3: 6576646329476455251833847522 + }, + u384 { + limb0: 36777592193503283104901568721, + limb1: 50563783254920806407957753381, + limb2: 37232857842950188798854938102, + limb3: 1387160708327331129025418765 + }, + u384 { + limb0: 77122280783672135744616731259, + limb1: 11439087843766176239299375461, + limb2: 54078731184307427409957667785, + limb3: 6519628019758455965500384167 + }, + u384 { + limb0: 13776174440175210641088741351, + limb1: 24900965882631712082341602096, + limb2: 26161971323714012914543779007, + limb3: 1927425123922035191135455693 + }, + u384 { + limb0: 46460036009043557566542711964, + limb1: 11243183294630219675370695176, + limb2: 78591363858698685642755374248, + limb3: 175959349643069402552085840 + }, + u384 { + limb0: 64517620370497869687965477469, + limb1: 20088789474484525382483358767, + limb2: 23723498419784901623177759769, + limb3: 3127383014426701203389914618 + }, + u384 { + limb0: 55606768232269222536596805711, + limb1: 53722566356957180171751730025, + limb2: 19483076216517066976831777539, + limb3: 6856033170018824320005855610 + }, + u384 { + limb0: 3207256880123943977623867517, + limb1: 47182201961149617142427369800, + limb2: 4899001116454332725089754688, + limb3: 7936380339399677221242857284 + }, + u384 { + limb0: 75771264284226618608254430066, + limb1: 36445182225669100400232156478, + limb2: 57305698384030035130444843339, + limb3: 2872193653443031367671910224 + }, + u384 { + limb0: 7195215063161619639506320752, + limb1: 34309992781357165515421822090, + limb2: 25207594984306530476770047227, + limb3: 2165722785001169945304258766 + }, + u384 { + limb0: 38261817231795971639772661819, + limb1: 76566323799995602326180780059, + limb2: 75986866753822444905574798794, + limb3: 6461814922539063106050764779 + }, + u384 { + limb0: 55876846054218552500847810125, + limb1: 37046720721765296766873477801, + limb2: 21874393064653960657383503926, + limb3: 5762923729993782625226866693 + }, + u384 { + limb0: 6522629381296734436139692102, + limb1: 41754993984304241858447008491, + limb2: 56411814765443143456634183423, + limb3: 7963263160263476144932609354 + }, + u384 { + limb0: 22711881152159703391001392246, + limb1: 32268921336212569281863303348, + limb2: 65879670573367644894178796503, + limb3: 6114810800798299698935278322 + }, + u384 { + limb0: 71130879352514394501695459209, + limb1: 75111906436197655362408363645, + limb2: 74727319416074439256440562624, + limb3: 6027090488001296179343024542 + }, + u384 { + limb0: 47666848369612676374356771459, + limb1: 77513369830537451244179635641, + limb2: 11020135223189090574766238252, + limb3: 1993029317956597957117360142 + }, + u384 { + limb0: 13037715684212883627761554107, + limb1: 42200858049065241928446075500, + limb2: 1832556192344148995189952046, + limb3: 3318165230794428213753888267 + }, + u384 { + limb0: 71497271056834856556273019164, + limb1: 58576490525912866405852062316, + limb2: 14838793460048692918843018350, + limb3: 4272806292604767384915821982 + }, + u384 { + limb0: 68785304340933354040454908950, + limb1: 44939496532382431587729992505, + limb2: 56851675393218511018155158418, + limb3: 3085850630706323197371197859 + }, + u384 { + limb0: 67524106318407384109864712513, + limb1: 51337157730878529806427877531, + limb2: 41624691612379136212675684594, + limb3: 6315972008468282421853648739 + }, + u384 { + limb0: 39979212744301496115656678169, + limb1: 21472810349400406958355475687, + limb2: 54242344102200938553658304188, + limb3: 4123570625394474177330666654 + }, + u384 { + limb0: 11730534001125797401720708100, + limb1: 68904375059450335478196404709, + limb2: 64806427053817126696697741848, + limb3: 1683504053511974029017205528 + }, + u384 { + limb0: 49676313973102855312392056200, + limb1: 27148322471485827123924088427, + limb2: 76904679864740921083441062684, + limb3: 6461100046378470105688362786 + }, + u384 { + limb0: 29531292162877388050403662063, + limb1: 3762953998538744526767004041, + limb2: 33029405660946903974498153516, + limb3: 581594928787690309473761235 + }, + u384 { + limb0: 21508988237359548088065409590, + limb1: 1943542277516001579682776420, + limb2: 37519184215476002466533174110, + limb3: 4993282446873132482503052556 + }, + u384 { + limb0: 63109112213820336678689829449, + limb1: 5054507031691652562530059160, + limb2: 68298823162348262613637442843, + limb3: 6570503513609726218004365515 + }, + u384 { + limb0: 13894240474896613501239191508, + limb1: 68047528230180996475351261362, + limb2: 74223138778193090861571455160, + limb3: 2151167866973096314925411435 + }, + u384 { + limb0: 23760546602621415903110227774, + limb1: 65676966448413412836374176940, + limb2: 56574110495668777565166915001, + limb3: 3494976603437663743565339821 + }, + u384 { + limb0: 36231106568122330365114566961, + limb1: 19564351389970943844369206114, + limb2: 14102505992127863240007586748, + limb3: 1596847546426145524239875613 + }, + u384 { + limb0: 58515354155918159051128460665, + limb1: 70497608229336430550087475965, + limb2: 68655660461357567412789877093, + limb3: 1797893824660780669509356895 + }, + u384 { + limb0: 42267534732595802015407901745, + limb1: 6164736543645362044450572396, + limb2: 45061753224194208528778793920, + limb3: 6962677467382122772923136024 + }, + u384 { + limb0: 13773765899860451945700663760, + limb1: 61592112545105090970073885816, + limb2: 1719339664781112398601788562, + limb3: 7667253757014566369387390837 + }, + u384 { + limb0: 51899899035487054885708586602, + limb1: 47358834788722804441535001120, + limb2: 56334561021502578114273575666, + limb3: 3651250416217598449571382745 + }, + u384 { + limb0: 77448986254738975386944522508, + limb1: 36424554476297070059861896, + limb2: 56599225653794233867129317955, + limb3: 4594892910364111174424611709 + }, + u384 { + limb0: 55465146578693167927050584940, + limb1: 78652575095868016710898126747, + limb2: 47000029434737774455397287601, + limb3: 569608892642476402101109287 + }, + u384 { + limb0: 65177622965511252332183388101, + limb1: 19720968845510819941132329610, + limb2: 60886912117745920474524456226, + limb3: 1459573969976414469229357300 + }, + u384 { + limb0: 20724687920474870737042805051, + limb1: 65918921781181423855449326546, + limb2: 59248191781051720041229803734, + limb3: 37868865838950105504419691 + }, + u384 { + limb0: 60223869963446119642950923384, + limb1: 25169458280140399890256953202, + limb2: 58872490857892004887584366944, + limb3: 7413956532185535501968931712 + }, + u384 { + limb0: 18248305154360674004159055415, + limb1: 3414989897258464136278367456, + limb2: 10329915053754488275046094845, + limb3: 1268546979348667003506802515 + }, + u384 { + limb0: 3201521585154244681813369207, + limb1: 13416396137234817603541182208, + limb2: 10604528746239859427855551431, + limb3: 2992160077377107162891714045 + }, + u384 { + limb0: 66229791542264209052359793859, + limb1: 52956886134287361297027793344, + limb2: 65883662711825651043250984908, + limb3: 3981180771940819322346516683 + }, + u384 { + limb0: 25165616599786785472637435249, + limb1: 26000727693864162976047520710, + limb2: 17335272835919682539508269993, + limb3: 7599520268875961247232660139 + }, + u384 { + limb0: 7975695230443807089907657647, + limb1: 2954055491087829237994413870, + limb2: 4973861021480028840161979834, + limb3: 1297281065662278318599137602 + }, + u384 { + limb0: 38696388216829870385681424181, + limb1: 24347872154528361667595620291, + limb2: 53520799943812528695257472677, + limb3: 7482540800448693804269334294 + }, + u384 { + limb0: 31574135125177404485475362519, + limb1: 35705149073822940322913196822, + limb2: 7790857639214773878676223904, + limb3: 3729099887253554013655751660 + }, + u384 { + limb0: 54889492884912390490960762596, + limb1: 43431718493399956899991086400, + limb2: 11700529447206838133884773211, + limb3: 6288005691944775372313988696 + }, + u384 { + limb0: 50668775187456433987045400396, + limb1: 18342861400670245385355768901, + limb2: 45470169273021774492830523644, + limb3: 5502724961278045700707753771 + }, + u384 { + limb0: 35799783067057995886873890393, + limb1: 12175694632305446027889932633, + limb2: 42615809985078358553565443377, + limb3: 2158422640954676203443308791 + }, + u384 { + limb0: 36041636409545706180125684746, + limb1: 33352751511569196716314507329, + limb2: 48980996840964530580480887258, + limb3: 3654025549074701230114511421 + }, + u384 { + limb0: 22843811972901565513189230183, + limb1: 40215543663057203802143771308, + limb2: 39398819049133651548819885136, + limb3: 6936135361451930924531867730 + }, + u384 { + limb0: 59395937215322539197886932615, + limb1: 41898885952816660344524118186, + limb2: 4300936413086555752440486340, + limb3: 3243501947282876835547347615 + }, + u384 { + limb0: 8405656678456337327492045924, + limb1: 4228130662749627202144865743, + limb2: 70403807953378353981964393009, + limb3: 3260882398692717952368175821 + }, + u384 { + limb0: 62124702497377294478661812549, + limb1: 26950063599386542541543605587, + limb2: 43897328038671142716428489375, + limb3: 6708412187571946298445452728 + }, + u384 { + limb0: 25078321837487410826472160072, + limb1: 52608385241678777776668436106, + limb2: 10698857664614959966794592368, + limb3: 7770707191686869622692251606 + }, + u384 { + limb0: 34793561975780364670393246730, + limb1: 21565399564202478274953702760, + limb2: 63656715752124876282223475798, + limb3: 967803521125158171152316761 + }, + u384 { + limb0: 31747288775210009680775259035, + limb1: 47849957326341793745378467854, + limb2: 47866586327514678744930908017, + limb3: 809819564359165304573909993 + }, + u384 { + limb0: 78950416024306780321488303635, + limb1: 29112039826309401868480963742, + limb2: 12384512589181871782145507395, + limb3: 6992287214753872264922756260 + }, + u384 { + limb0: 1415893987106893328466101302, + limb1: 46438196365154215103551234516, + limb2: 30026003912781196628898921684, + limb3: 338878088428400574270914905 + }, + u384 { + limb0: 78863513509557158893757679236, + limb1: 43628647364277149196093150296, + limb2: 19334142370567581206097185455, + limb3: 2448138871067838643238705096 + }, + u384 { + limb0: 47640188680635346721175074410, + limb1: 28078513550705761387417836087, + limb2: 38174886801032625426457616195, + limb3: 5622742974119749569137240878 + }, + u384 { + limb0: 51704186500815200118596756601, + limb1: 50203558462885260143015092097, + limb2: 51166528456043055036125419352, + limb3: 852707267898660472496407880 + }, + u384 { + limb0: 14790283330848790478692813995, + limb1: 14402243897101753219414184407, + limb2: 65535668179556123206012072464, + limb3: 6518957362517660768622001935 + }, + u384 { + limb0: 1068236585326475004969870286, + limb1: 35768607846176115198038059987, + limb2: 32695897198974525206662881043, + limb3: 4636932564281040280985029313 + }, + u384 { + limb0: 19128517797734574173179472508, + limb1: 21809163998454124036554735724, + limb2: 7479765923803487106674338271, + limb3: 142644103491453750260374412 + }, + u384 { + limb0: 35658171361662668903004505737, + limb1: 53150328476328181940311837336, + limb2: 37948312293607606731180940443, + limb3: 4923793131026964531299670524 + }, + u384 { + limb0: 454895512888907756800740431, + limb1: 60078473849805271417589545622, + limb2: 45809828540916427090953900815, + limb3: 5904628000474786347613291223 + }, + u384 { + limb0: 72335835447139680480463774529, + limb1: 26266222599503982361699409643, + limb2: 40489060554453026467360965215, + limb3: 1531859998879303414357625158 + }, + u384 { + limb0: 23390900736685579785281340270, + limb1: 59886144806553841500922492419, + limb2: 6520537869680993235019009837, + limb3: 3847842253207285373648248080 + }, + u384 { + limb0: 76250439406903508563709762187, + limb1: 52254891709418617977207602324, + limb2: 34811637424672914104767580022, + limb3: 4288774062274553530893971006 + }, + u384 { + limb0: 22185659702739055003098597102, + limb1: 68846968431420088798648825049, + limb2: 29121504037553226821977271241, + limb3: 2993326588830279157753362732 + }, + u384 { + limb0: 65049911051262675096832752893, + limb1: 40737080018970066914700410229, + limb2: 61237057508167408850580509754, + limb3: 915206035901727537097204562 + }, + u384 { + limb0: 49231233529089066164271525686, + limb1: 73449169748506424748697880840, + limb2: 39123906277795000434512306670, + limb3: 4293475709956568759771761807 + }, + u384 { + limb0: 13086649392626352923553145628, + limb1: 20342050110988038403199834880, + limb2: 77879027159606005823160727854, + limb3: 33123527640508946337730810 + }, + u384 { + limb0: 12325038534705571503839591051, + limb1: 65459208135201508751820346316, + limb2: 62754752210837951011555219649, + limb3: 1897035312332748910238214472 + }, + u384 { + limb0: 75123253966875306324831123704, + limb1: 21732120188298669563051621275, + limb2: 40763669413520924415169360109, + limb3: 1468387638969031234584482728 + }, + u384 { + limb0: 23176979449469943463949591192, + limb1: 21773769983329356188298055098, + limb2: 22935850144020423323698035027, + limb3: 5464977347066813137967008326 + }, + u384 { + limb0: 18258872523385099236932732224, + limb1: 52746783639506911690196906608, + limb2: 43854088177633373162867457759, + limb3: 5078393623376479197324954575 + }, + u384 { + limb0: 16574117382932085716942356872, + limb1: 52278781351315512839505139719, + limb2: 10040942399140963417230988428, + limb3: 141614435457266229309303771 + }, + u384 { + limb0: 5882980103010134736668027680, + limb1: 48858997411240495596339007677, + limb2: 68619870337073211768303572723, + limb3: 4291330013528514985223679362 + }, + u384 { + limb0: 31538371128443934129891947575, + limb1: 72072521753901032292825329651, + limb2: 21710096531125006158227356997, + limb3: 4628927915247649637835617212 + }, + u384 { + limb0: 14842794672534533306118606392, + limb1: 50719150366600439851269161095, + limb2: 52254072475001197805764357036, + limb3: 4700342699286187615785891363 + }, + u384 { + limb0: 61915119716255981943681652282, + limb1: 29299589836524457200675293649, + limb2: 35386481299097862894881266365, + limb3: 7358820980345879461758225904 + }, + u384 { + limb0: 60901048053384145628939406129, + limb1: 78985886238684073504439632289, + limb2: 64405934068917670159010554181, + limb3: 2903671619978470397548445194 + }, + u384 { + limb0: 74400433451666076471378829551, + limb1: 51399226820944152203379295381, + limb2: 14014882151930086426473460483, + limb3: 6992776143659032564032098178 + }, + u384 { + limb0: 67727870441241552326677116413, + limb1: 57172613817900934247669118691, + limb2: 67428382818005618827210456696, + limb3: 1589694297745990420817898082 + }, + u384 { + limb0: 31097836038893561114007541753, + limb1: 66805513048651795856100147120, + limb2: 5018757102769153666773945517, + limb3: 4414497623932175460714827351 + } + ]; + let precomputed_miller_loop_result: Option = Option::None; + let small_Q: Option = Option::None; + + let res = multi_pairing_check_bls12_381_3_pairs( + pair0, + pair1, + pair2, + lambda_root_inverse, + w, + Ris.span(), + big_Q, + precomputed_miller_loop_result, + small_Q + ); + assert!(res); + } + + + #[test] + fn BLS12_381_mpcheck_3P_with_extra_m() { + let pair0: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 46164028826172057095539398809, + limb1: 78516152899629461289231432233, + limb2: 15311406573886285877080089036, + limb3: 4505548555533370889761633126 + }, + y: u384 { + limb0: 26914231438457811559890804866, + limb1: 39411023791708027153662507815, + limb2: 6228199425316964486637443349, + limb3: 181315879364188138902198558 + } + }, + q: G2Point { + x0: u384 { + limb0: 66706246138174142029795620024, + limb1: 51026624140015287828800763368, + limb2: 294746233582345164413391974, + limb3: 5489324272240431089939655898 + }, + x1: u384 { + limb0: 44005600040166524264237583185, + limb1: 21190655662803238079661613112, + limb2: 64603371932858519236619130054, + limb3: 2419469292022855053340868574 + }, + y0: u384 { + limb0: 34485926465807547929308629298, + limb1: 46064511439230569456927716121, + limb2: 77444208979828093704668963213, + limb3: 2985649465635817490334603467 + }, + y1: u384 { + limb0: 33190508341823316920077647085, + limb1: 24903805419245184166961959906, + limb2: 71985341056536387872729801961, + limb3: 8002284376083999674771800785 + } + } + }; + let pair1: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 46164028826172057095539398809, + limb1: 78516152899629461289231432233, + limb2: 15311406573886285877080089036, + limb3: 4505548555533370889761633126 + }, + y: u384 { + limb0: 26914231438457811559890804866, + limb1: 39411023791708027153662507815, + limb2: 6228199425316964486637443349, + limb3: 181315879364188138902198558 + } + }, + q: G2Point { + x0: u384 { + limb0: 66706246138174142029795620024, + limb1: 51026624140015287828800763368, + limb2: 294746233582345164413391974, + limb3: 5489324272240431089939655898 + }, + x1: u384 { + limb0: 44005600040166524264237583185, + limb1: 21190655662803238079661613112, + limb2: 64603371932858519236619130054, + limb3: 2419469292022855053340868574 + }, + y0: u384 { + limb0: 34485926465807547929308629298, + limb1: 46064511439230569456927716121, + limb2: 77444208979828093704668963213, + limb3: 2985649465635817490334603467 + }, + y1: u384 { + limb0: 33190508341823316920077647085, + limb1: 24903805419245184166961959906, + limb2: 71985341056536387872729801961, + limb3: 8002284376083999674771800785 + } + } + }; + let pair2: G1G2Pair = G1G2Pair { + p: G1Point { + x: u384 { + limb0: 46164028826172057095539398809, + limb1: 78516152899629461289231432233, + limb2: 15311406573886285877080089036, + limb3: 4505548555533370889761633126 + }, + y: u384 { + limb0: 26914231438457811559890804866, + limb1: 39411023791708027153662507815, + limb2: 6228199425316964486637443349, + limb3: 181315879364188138902198558 + } + }, + q: G2Point { + x0: u384 { + limb0: 66706246138174142029795620024, + limb1: 51026624140015287828800763368, + limb2: 294746233582345164413391974, + limb3: 5489324272240431089939655898 + }, + x1: u384 { + limb0: 44005600040166524264237583185, + limb1: 21190655662803238079661613112, + limb2: 64603371932858519236619130054, + limb3: 2419469292022855053340868574 + }, + y0: u384 { + limb0: 34485926465807547929308629298, + limb1: 46064511439230569456927716121, + limb2: 77444208979828093704668963213, + limb3: 2985649465635817490334603467 + }, + y1: u384 { + limb0: 33190508341823316920077647085, + limb1: 24903805419245184166961959906, + limb2: 71985341056536387872729801961, + limb3: 8002284376083999674771800785 + } + } + }; + let lambda_root_inverse = E12D { + w0: u384 { + limb0: 21599149074543025816286016111, + limb1: 14913182674137668003960766178, + limb2: 12922578993209940596956304773, + limb3: 477444267294274015529904746 + }, + w1: u384 { + limb0: 65924762775601667963529760512, + limb1: 42070368303630121480368200595, + limb2: 69185260236469250767480795285, + limb3: 1901602128420096338411063602 + }, + w2: u384 { + limb0: 32057609957228461990529593523, + limb1: 65262301735976391611936715197, + limb2: 1018156600021586334939161815, + limb3: 7389658486019408845480144920 + }, + w3: u384 { + limb0: 26287745393824079109851962759, + limb1: 16052552502726503891520972769, + limb2: 57858239480706790446732038913, + limb3: 6653520090057209380582129678 + }, + w4: u384 { + limb0: 45574412994640812982780902777, + limb1: 6741644531195093036716991033, + limb2: 12536229485691128310127661841, + limb3: 5783701402573572382758706022 + }, + w5: u384 { + limb0: 42939746742201458300012596981, + limb1: 33767682560687934746745137768, + limb2: 19988374599340948605687346092, + limb3: 2169716118949443190685509727 + }, + w6: u384 { + limb0: 61485242234850211322994168302, + limb1: 4078145068252624259500120143, + limb2: 43635343132667563505837383814, + limb3: 5426294705537290461047114928 + }, + w7: u384 { + limb0: 9385764078420929823378354657, + limb1: 639065776726481896978556051, + limb2: 45393015688663546221450050292, + limb3: 593996831115482018797330939 + }, + w8: u384 { + limb0: 71913083128454182686102465718, + limb1: 46172154429419813593257557970, + limb2: 69597109407229156968477931584, + limb3: 4775931735370067548477106504 + }, + w9: u384 { + limb0: 59941041982870604061123155591, + limb1: 32098159218446930701972423544, + limb2: 49122774965958692742669209705, + limb3: 6112316347075481305858545939 + }, + w10: u384 { + limb0: 23330492957451762441502418824, + limb1: 55122380166859329505228079556, + limb2: 75782017207071348131955032481, + limb3: 2958211808024608861350414465 + }, + w11: u384 { + limb0: 46831093645577271278342813414, + limb1: 32467476400874002662866105673, + limb2: 58856887298120332962428917478, + limb3: 4138899630846410934748191387 + } + }; + let w: MillerLoopResultScalingFactor = MillerLoopResultScalingFactor { + w0: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, + w8: u384 { + limb0: 50851581739078226504102456833, + limb1: 76794771648737505181142480307, + limb2: 67987596902004947676335960488, + limb3: 5980965866070865328491811884 + }, + w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + }; + let Ris: Array = array![ + E12D { + w0: u384 { + limb0: 55551890384015112582675504207, + limb1: 41470587804742706277087710637, + limb2: 13885333631471685320104778884, + limb3: 23465211185629680562429424 + }, + w1: u384 { + limb0: 68979072478476897283076817678, + limb1: 31982324010423946847857411778, + limb2: 37379341935026045162622224071, + limb3: 1536748628213934543534364580 + }, + w2: u384 { + limb0: 70960911776559796844982966041, + limb1: 29141289414225503534240172102, + limb2: 47506853885420923007449028239, + limb3: 7184417433948076565258529720 + }, + w3: u384 { + limb0: 32609210083251278481114572852, + limb1: 62617859724882212318892389968, + limb2: 4385341315452070481399914181, + limb3: 6779281562677383990493767565 + }, + w4: u384 { + limb0: 58624737945732424524625184019, + limb1: 8166619553401252380578242527, + limb2: 76930874809197339267043208385, + limb3: 7217196144190602393140899380 + }, + w5: u384 { + limb0: 60319189833060164382152761168, + limb1: 63390385132657983066896617525, + limb2: 5569850371802179785774132942, + limb3: 5458399967635920764853055447 + }, + w6: u384 { + limb0: 10593843023037775590629058054, + limb1: 66833559086149299435293172386, + limb2: 30066955961995306642097168787, + limb3: 5056571565004937450815302411 + }, + w7: u384 { + limb0: 66370596386214475685632859596, + limb1: 74538991554597180438509734977, + limb2: 50555412903548226889709032286, + limb3: 3018195496430201487466728748 + }, + w8: u384 { + limb0: 55218476388824788773363674479, + limb1: 36808200588263604481144844247, + limb2: 78897953656447732997536656357, + limb3: 2487560311494669712291782861 + }, + w9: u384 { + limb0: 4227297199347826491038934645, + limb1: 23566516515398484141846472379, + limb2: 34284295562962500170870114881, + limb3: 4301091132896834919823923091 + }, + w10: u384 { + limb0: 65318465821371005872271933860, + limb1: 14303677719132451213158490192, + limb2: 74773229739789547046374773244, + limb3: 4613594041779659324243067389 + }, + w11: u384 { + limb0: 61892478306968145257892987265, + limb1: 59803886407782812087859135717, + limb2: 72435160990251561765361678552, + limb3: 4020277444214547893748737470 + } + }, + E12D { + w0: u384 { + limb0: 43310756977030255711692153296, + limb1: 78747578364554476990253789303, + limb2: 41815214057361836632331903146, + limb3: 1480504796218099342242467863 + }, + w1: u384 { + limb0: 43799561548670358939824260679, + limb1: 9222723929158981853115544953, + limb2: 30438929983707590556356560988, + limb3: 1282123048244463140172235345 + }, + w2: u384 { + limb0: 69712122002612940979189598987, + limb1: 34278595882077397993738132438, + limb2: 66136870509912486108692670851, + limb3: 840016574785736771960417256 + }, + w3: u384 { + limb0: 77705994895090782635703846375, + limb1: 77804532194995677319555564542, + limb2: 32718759117173985876581896921, + limb3: 2562884292306213809223471415 + }, + w4: u384 { + limb0: 66916127399691550712569299695, + limb1: 27438643317539849554041493470, + limb2: 3406948967757946871356159412, + limb3: 371448269014386364174881050 + }, + w5: u384 { + limb0: 48396892688442237580292107929, + limb1: 39853736824655862467786959690, + limb2: 12540600042252169371052604826, + limb3: 1011867101615873602592027830 + }, + w6: u384 { + limb0: 56363108782726060916584486280, + limb1: 24680852237107843165067198037, + limb2: 11211711093780791616839641723, + limb3: 7162286288672809627198158679 + }, + w7: u384 { + limb0: 47940869028770684985942696958, + limb1: 38363570945771646036200176975, + limb2: 33628272437741214678694934197, + limb3: 6474366828194087528624585090 + }, + w8: u384 { + limb0: 77311788873820044616597614044, + limb1: 52202889723868718727437614575, + limb2: 20229394007486132046167846694, + limb3: 927949404884235387833202675 + }, + w9: u384 { + limb0: 9258347646855864901595054910, + limb1: 26904358451801238871927601452, + limb2: 22132495077634850566584481882, + limb3: 6152089730606223773604972294 + }, + w10: u384 { + limb0: 10140096225652211275381859242, + limb1: 61673460635972317005942685140, + limb2: 40872659958961953272672075393, + limb3: 7247398590142950848285665832 + }, + w11: u384 { + limb0: 4144377313589076673111075230, + limb1: 55244147537935880591456649510, + limb2: 69814408608073941881500748888, + limb3: 4218105318301582252681504198 + } + }, + E12D { + w0: u384 { + limb0: 69869462611646971205539329515, + limb1: 41236351589576024830098842778, + limb2: 24033278914138795804911795100, + limb3: 2696335213908605990885356621 + }, + w1: u384 { + limb0: 68634743123935023043153951827, + limb1: 39414628769159105666753871281, + limb2: 36435650987284663027212403486, + limb3: 2670701407853534575045954314 + }, + w2: u384 { + limb0: 5533821458122946235561521742, + limb1: 16179705974249509389329242098, + limb2: 6324471013118056920239514116, + limb3: 3462518698365813187377103626 + }, + w3: u384 { + limb0: 24582986778565436633583733654, + limb1: 42547882416870377982972981903, + limb2: 64904089934839507824338007616, + limb3: 790678640131974565618344280 + }, + w4: u384 { + limb0: 60084858218834316598365377875, + limb1: 73236239962267374535329135876, + limb2: 5893010260859501405024421787, + limb3: 3469210257671022932593049322 + }, + w5: u384 { + limb0: 65107877314810646669597152735, + limb1: 20852509488138615755905686107, + limb2: 78837462289624025803631676125, + limb3: 4011189143441269142478506401 + }, + w6: u384 { + limb0: 3452181044012289361180595668, + limb1: 13626978008901710887258113720, + limb2: 37354815876769019999140238032, + limb3: 1256422059459450744758396800 + }, + w7: u384 { + limb0: 69630509410972003197349236515, + limb1: 10082696324788256094444189260, + limb2: 17963313642796854721308674086, + limb3: 7843065422835867324403503142 + }, + w8: u384 { + limb0: 8345166596866180338486411626, + limb1: 20902595877470005805564853665, + limb2: 52707513530855898476137627592, + limb3: 5404522096136107764408697124 + }, + w9: u384 { + limb0: 62420331716382248735233219884, + limb1: 52836259903088101598554211350, + limb2: 16595917470280203018283427855, + limb3: 7304764522433358294459509129 + }, + w10: u384 { + limb0: 20280894948581930570848713028, + limb1: 34316568092901180388277696230, + limb2: 55293203335105696627109433112, + limb3: 4662139108405351436412245050 + }, + w11: u384 { + limb0: 17357877509895608810305071031, + limb1: 47624670427967015921436830639, + limb2: 61406206705359870737943840919, + limb3: 608454948159292304652604569 + } + }, + E12D { + w0: u384 { + limb0: 28246023959479098186457565496, + limb1: 23427207791316471700594522616, + limb2: 12784820149270829195860413258, + limb3: 2335576304391399053950375922 + }, + w1: u384 { + limb0: 23940077790584245696410628767, + limb1: 31113670393446881594462243761, + limb2: 70380109435653784412317202859, + limb3: 5124260856240529244399909390 + }, + w2: u384 { + limb0: 71347643561448263150765182175, + limb1: 73256501450138718392670790000, + limb2: 3531685065245398556913330885, + limb3: 4131786668585489615867208723 + }, + w3: u384 { + limb0: 68475589223995268194974447005, + limb1: 53000633061388698145676173046, + limb2: 25789907553364535470561632829, + limb3: 2740429993099275209136805214 + }, + w4: u384 { + limb0: 41380555493079796598861663190, + limb1: 13111834487705221533687421350, + limb2: 19742116857159440253806925780, + limb3: 4678623280216702536521305373 + }, + w5: u384 { + limb0: 32406858111991582176576839041, + limb1: 18273089419490269535702955314, + limb2: 67573845316947201242578012251, + limb3: 1129662232715777617675816169 + }, + w6: u384 { + limb0: 69781214824480326467778147251, + limb1: 58042037385845809273013519886, + limb2: 51940246485156659784373108162, + limb3: 6433137011279288540196468287 + }, + w7: u384 { + limb0: 16796579547288587367827196399, + limb1: 29624648927645944512035271625, + limb2: 51579066960863412713727085437, + limb3: 1391557080304291664375480115 + }, + w8: u384 { + limb0: 49013452280709698150943360690, + limb1: 74439199489067204992042737626, + limb2: 34888683550554482091113560899, + limb3: 172936440719343305815497387 + }, + w9: u384 { + limb0: 25393639348147570969889754661, + limb1: 74417204666329520495812975504, + limb2: 15162579446394391753791393715, + limb3: 107172950790544369443519393 + }, + w10: u384 { + limb0: 53310301375990056472002892892, + limb1: 64128086100212457455713396, + limb2: 28131977692085293233357927617, + limb3: 2715793383872810463311151204 + }, + w11: u384 { + limb0: 75979839064241691200886604736, + limb1: 11365996622643380564416285882, + limb2: 54329869855204784402289519400, + limb3: 6451953875903310637380237535 + } + }, + E12D { + w0: u384 { + limb0: 43294389284576012983616756730, + limb1: 73689311515475416401231251187, + limb2: 2123435022605240938621588030, + limb3: 7768952992236968404438004057 + }, + w1: u384 { + limb0: 63288298152818126109024972975, + limb1: 75957138393998094342270503718, + limb2: 53634556664726421293080911330, + limb3: 4130583113291792511760011889 + }, + w2: u384 { + limb0: 50207454927943816454477987018, + limb1: 15140499900119229581352568383, + limb2: 27528090377609782104490240707, + limb3: 4431899624406005604087052978 + }, + w3: u384 { + limb0: 51366510917343863254007203934, + limb1: 42587115137430536488147429815, + limb2: 51273368689905500550116192539, + limb3: 7388105792663063190289579768 + }, + w4: u384 { + limb0: 58934413016481505748969065412, + limb1: 15846632081207512018647438987, + limb2: 65972713626425318964437875268, + limb3: 5076820754480888567088079876 + }, + w5: u384 { + limb0: 15516019932577566330721469899, + limb1: 23301143712994155099803960583, + limb2: 24555578302002288971344761254, + limb3: 1863362445885505333352500585 + }, + w6: u384 { + limb0: 33303521897166047626481951799, + limb1: 63038923951220599413310246852, + limb2: 51480534018731208495654213585, + limb3: 3017397305007568855643515469 + }, + w7: u384 { + limb0: 70915155307911520598598463192, + limb1: 31439723606392264515815301800, + limb2: 7562646648167876790666101301, + limb3: 3508690018025001802329659977 + }, + w8: u384 { + limb0: 2567123669740793310782962136, + limb1: 60649910497427635107666794256, + limb2: 73989587413361040848351548761, + limb3: 2500703201572219550361119252 + }, + w9: u384 { + limb0: 41533085995543153283428042755, + limb1: 20893742315286992890906055812, + limb2: 44475357747708486725341646388, + limb3: 2019374610019797105037003728 + }, + w10: u384 { + limb0: 29680390544570792752981629424, + limb1: 76787629640143177373606254788, + limb2: 48612491657994622249856774932, + limb3: 7052041972430414553051373753 + }, + w11: u384 { + limb0: 7083369043658024429201736389, + limb1: 17630003708629677694527835937, + limb2: 16220129489260574600300740596, + limb3: 3595653968267493351572052998 + } + }, + E12D { + w0: u384 { + limb0: 62325598626123513778702308870, + limb1: 42754396883256045197820864319, + limb2: 66397934839795356582404948652, + limb3: 5268880783410950716975106767 + }, + w1: u384 { + limb0: 75224693988486153919839415579, + limb1: 70947518842150664658786830641, + limb2: 71310628887340311559562528568, + limb3: 6039397302558626685971793332 + }, + w2: u384 { + limb0: 67325376365013262430336043044, + limb1: 63845539847175054333201683879, + limb2: 74619685292032367176441115450, + limb3: 7156378182315918112820772091 + }, + w3: u384 { + limb0: 49421794743824236969531521867, + limb1: 69172208453571798538932760616, + limb2: 59025420793766544887997814809, + limb3: 2850074600736273105467643741 + }, + w4: u384 { + limb0: 43317044784123583964735798148, + limb1: 6241649487641305452280649340, + limb2: 737541254443599233913857863, + limb3: 7187620458121420609772840331 + }, + w5: u384 { + limb0: 10042090124905814452977687385, + limb1: 31514628607999243922018570435, + limb2: 35531099200695076902609717293, + limb3: 3445444462083704202202139743 + }, + w6: u384 { + limb0: 69829300794990480844893703396, + limb1: 56968771771952924339789069480, + limb2: 1571102441916045592446520260, + limb3: 7408349178031590717980430954 + }, + w7: u384 { + limb0: 36868119405802774087662803354, + limb1: 58367718474065556098831657590, + limb2: 61114400175648534188907514890, + limb3: 5406940942331575257155923858 + }, + w8: u384 { + limb0: 17445586401693323095008976221, + limb1: 19041467686741151861117097751, + limb2: 77103549839750374117439696226, + limb3: 4496435514806834246703817642 + }, + w9: u384 { + limb0: 66852795626625273733621630774, + limb1: 61199844556874371691194279332, + limb2: 76106917758246315744376358507, + limb3: 5559417429501515302306418128 + }, + w10: u384 { + limb0: 55587361238554959041641384622, + limb1: 77311749284830792125334611361, + limb2: 65548150684840262694942695801, + limb3: 1670722845860497875594171319 + }, + w11: u384 { + limb0: 6264022021519597805633375138, + limb1: 14829890235850576511817709971, + limb2: 54244224615686603414006633344, + limb3: 3688286251757699090106993479 + } + }, + E12D { + w0: u384 { + limb0: 49795978255832318404762916540, + limb1: 1292077410486801806671860270, + limb2: 55746585915209596792792257692, + limb3: 6025180775364525541190084091 + }, + w1: u384 { + limb0: 16190914236405208724399111813, + limb1: 624615301009793205704771533, + limb2: 17540700064876876878547722867, + limb3: 792283732014084193875606862 + }, + w2: u384 { + limb0: 22468716851157309579016605386, + limb1: 59729739653334302413671546294, + limb2: 41165677430184396444795004508, + limb3: 29156782549462532384202795 + }, + w3: u384 { + limb0: 34874493156091705033721349888, + limb1: 43150854718574157137690158725, + limb2: 38642721991084314098129311900, + limb3: 4977613181415311170759072901 + }, + w4: u384 { + limb0: 55227082123109939041814820377, + limb1: 43442035780560397383299905835, + limb2: 75031731154060074554028188969, + limb3: 5395302614525015591629307884 + }, + w5: u384 { + limb0: 35475562330854016622894927413, + limb1: 25736618428567434221913470064, + limb2: 21857395487101556088990153233, + limb3: 4719121668860995579698576705 + }, + w6: u384 { + limb0: 42548072665811134267696387374, + limb1: 51428851418480613562753150776, + limb2: 9712294818214378964454780, + limb3: 2258269624267603507006832340 + }, + w7: u384 { + limb0: 3378169107774532971426288530, + limb1: 3315178491074827002563871039, + limb2: 40338932132504230396810505203, + limb3: 2551367089126905993965275470 + }, + w8: u384 { + limb0: 73227062742009195635087020918, + limb1: 18837698059373889567115320129, + limb2: 77065874741017839436021943216, + limb3: 455308890462079386292458225 + }, + w9: u384 { + limb0: 12843177641584664530535265502, + limb1: 30353563595915137090813652215, + limb2: 54365719849923818924619218603, + limb3: 1742879348574233017973090393 + }, + w10: u384 { + limb0: 38159834039941214701492438062, + limb1: 48790071538859399480466746728, + limb2: 49564540829362592569515782209, + limb3: 7010741740335615441692412625 + }, + w11: u384 { + limb0: 40455810684113015320409837783, + limb1: 61350054393491161413386094483, + limb2: 24832067956486730158259644105, + limb3: 4895891587061826040497859283 + } + }, + E12D { + w0: u384 { + limb0: 40157614892540952029857429300, + limb1: 60240815390313661619703797546, + limb2: 25134591518984095047449852758, + limb3: 3278475304188714181559288605 + }, + w1: u384 { + limb0: 166787227776436442439176968, + limb1: 72135022905342112579854182085, + limb2: 23603012546012118757764212111, + limb3: 3233054667934664103597093813 + }, + w2: u384 { + limb0: 1656829583603956770400556335, + limb1: 43167075045176219831878064277, + limb2: 35763331389853686007052207411, + limb3: 8007005370371803615869427918 + }, + w3: u384 { + limb0: 55895481277702146307396663438, + limb1: 25892949680558282538840687818, + limb2: 33161170988034895368740402364, + limb3: 1481683861614976874857291014 + }, + w4: u384 { + limb0: 50977766388571007928387272126, + limb1: 23594445089025917524405203895, + limb2: 45431546781656555842290922669, + limb3: 249024304623231397630524523 + }, + w5: u384 { + limb0: 59371401344263468119256106414, + limb1: 71849267447895935590052755300, + limb2: 24105984568840264587892158598, + limb3: 6739747190888432148077546547 + }, + w6: u384 { + limb0: 21952220941945854611250098703, + limb1: 55718896843387723499868931365, + limb2: 19822803513901061056114182302, + limb3: 4812738021674675926276719257 + }, + w7: u384 { + limb0: 12159299396248347172067978831, + limb1: 23629823407336160128834897800, + limb2: 42059052979780452168092701143, + limb3: 5019551906198815251971284042 + }, + w8: u384 { + limb0: 8957844903299705440583607192, + limb1: 17558323590832012239526316107, + limb2: 33029718156081465899444234569, + limb3: 4197106445226324431160952718 + }, + w9: u384 { + limb0: 23876497086334708043060161757, + limb1: 28056441160140665836589288527, + limb2: 27027677307172990598987010530, + limb3: 3200112577417907612707614969 + }, + w10: u384 { + limb0: 19386009754016754551289998941, + limb1: 70770241569649052399743969793, + limb2: 38495892964756006487811147551, + limb3: 2570557457014135412270440288 + }, + w11: u384 { + limb0: 60783148133961974596429230023, + limb1: 19035464049826663464436706058, + limb2: 61224006291701401895482158819, + limb3: 643712556150216836837268652 + } + }, + E12D { + w0: u384 { + limb0: 78515442158600497240333880145, + limb1: 61799591179024890568774247460, + limb2: 78491391820484231574447185774, + limb3: 556474611959760932573430344 + }, + w1: u384 { + limb0: 14207370055659778650033178649, + limb1: 34124118184457062750561164534, + limb2: 42860815182581778051627026537, + limb3: 4773090609100489491540994208 + }, + w2: u384 { + limb0: 37738125978119549869498359656, + limb1: 53490118917389393054683657914, + limb2: 27135887205051485696142605619, + limb3: 2638398106019965233577701206 + }, + w3: u384 { + limb0: 45145801395148846130763962459, + limb1: 60042673808229663282661727735, + limb2: 49944886802614656355828739820, + limb3: 14238098317508727609402937 + }, + w4: u384 { + limb0: 18445827392149086305413890307, + limb1: 41175152153646053890831661627, + limb2: 29034199964701408989659951797, + limb3: 4104258648053719299075327922 + }, + w5: u384 { + limb0: 44439082709306027642975751089, + limb1: 27627086154435910721527886797, + limb2: 3540789602297368256224482549, + limb3: 5079650502453690728317130849 + }, + w6: u384 { + limb0: 24036883690702760343260964727, + limb1: 20065410680579763501687625390, + limb2: 30412011559382515806021755650, + limb3: 1078702160487992037153385413 + }, + w7: u384 { + limb0: 11883713576913321429579521455, + limb1: 20239259218187361020999183501, + limb2: 33240266370463253483418391148, + limb3: 5292275654083695367646289402 + }, + w8: u384 { + limb0: 48484567123224210143937343892, + limb1: 25663964558547663264197970678, + limb2: 2927944064011649221794126248, + limb3: 7214788992214411612360863623 + }, + w9: u384 { + limb0: 41237358863176770478375746155, + limb1: 5002453284678469884070840031, + limb2: 72102365204850806637124376462, + limb3: 5778144611184623305828892766 + }, + w10: u384 { + limb0: 74395976729596386468433184390, + limb1: 10893603473548552220809848105, + limb2: 52110923889196796851301372570, + limb3: 2525654889581844690558091041 + }, + w11: u384 { + limb0: 15091912786100227853942144707, + limb1: 51623778907124927762330160244, + limb2: 48985627152883161194519927066, + limb3: 7070390860464665399976815545 + } + }, + E12D { + w0: u384 { + limb0: 26491527895367761298050446545, + limb1: 21480026189761068791789312216, + limb2: 58753254430875140474099024753, + limb3: 5128835447831156459273870780 + }, + w1: u384 { + limb0: 10082046523148480712106864862, + limb1: 29643700832380956337133423955, + limb2: 74917635053166039579492293108, + limb3: 2928470065382526703224258531 + }, + w2: u384 { + limb0: 43584201811925999335424227805, + limb1: 19315721136752312493095176910, + limb2: 48394584975491355410162167272, + limb3: 1585355195581132053260665644 + }, + w3: u384 { + limb0: 15481464159270008095265416255, + limb1: 45377924012226152329995387868, + limb2: 33948243875456180797554858448, + limb3: 3980821706171516860850711841 + }, + w4: u384 { + limb0: 3678989047368326821794942652, + limb1: 69561454951176171479196693829, + limb2: 27716947192644886377584878658, + limb3: 6348655112550540202951842737 + }, + w5: u384 { + limb0: 71645518688868430586572915365, + limb1: 4556474833412717313795403533, + limb2: 58234248112232433289415289713, + limb3: 1246466648394078095887820519 + }, + w6: u384 { + limb0: 43029007313233299334182509360, + limb1: 35913984637188882767566501618, + limb2: 62671122993930841998171797356, + limb3: 4936087908415907935782185071 + }, + w7: u384 { + limb0: 38191775053436003348416723861, + limb1: 33243666765466920492640581700, + limb2: 42124688230995938108823016422, + limb3: 4280647495039296239464187861 + }, + w8: u384 { + limb0: 21708965794629056989026741847, + limb1: 6028340831661799078755700248, + limb2: 7513477873076696109621188280, + limb3: 81770513398189447511927097 + }, + w9: u384 { + limb0: 11044722199501618558356041630, + limb1: 48061152404514634808600040107, + limb2: 53354157452089189729349094364, + limb3: 4708995135119834591011267360 + }, + w10: u384 { + limb0: 24109048996948485626357763361, + limb1: 52836134396325805215861773269, + limb2: 41528430740455237452019728365, + limb3: 1786902147697720596956694282 + }, + w11: u384 { + limb0: 42577598493025407924188146178, + limb1: 77765853213964166984110028592, + limb2: 12893443818256983072686505568, + limb3: 3637587834293028543663458953 + } + }, + E12D { + w0: u384 { + limb0: 715222696763263440229894959, + limb1: 51418874553868025951737066368, + limb2: 50085686635861071066494384346, + limb3: 6530663613838425633368715696 + }, + w1: u384 { + limb0: 16655383324739936701971928545, + limb1: 77905306632729035521312787219, + limb2: 9399001120304617167472290197, + limb3: 7202611181570110411536131414 + }, + w2: u384 { + limb0: 57892299425631890177070949886, + limb1: 44189410553453270007424964289, + limb2: 13872017458878349600583259732, + limb3: 778030261194070213664180691 + }, + w3: u384 { + limb0: 16635184172875795915764022032, + limb1: 68948946702373047792879438397, + limb2: 59949758006197443406972607376, + limb3: 343596858841361466988507018 + }, + w4: u384 { + limb0: 33199961207860387378806800904, + limb1: 58598269787952376760654006474, + limb2: 63503474019093835266183114363, + limb3: 7398807247179215954248020795 + }, + w5: u384 { + limb0: 58281069730975792280978682384, + limb1: 42240837057451850126194430103, + limb2: 50342696766813054870173954253, + limb3: 5794087393558084638706724976 + }, + w6: u384 { + limb0: 70823071034184330453692865547, + limb1: 8355402979510069351085243808, + limb2: 57248824017950949027005634259, + limb3: 7544345789579026123364071767 + }, + w7: u384 { + limb0: 11668025346903088532823013667, + limb1: 54637985959286117371819132927, + limb2: 78430592703563807859233511105, + limb3: 3025412529965597632497780720 + }, + w8: u384 { + limb0: 1686630383057797341549426705, + limb1: 78161914533273793091222883516, + limb2: 5151034252902338142858367094, + limb3: 4200739862180232551250462776 + }, + w9: u384 { + limb0: 12730732405513206468232864492, + limb1: 3979652914203408452567536792, + limb2: 12977431936693259632549031112, + limb3: 1723457213775311733646773262 + }, + w10: u384 { + limb0: 31937525953933500110003544557, + limb1: 3254087577743577327289170583, + limb2: 14848890763961557536505786762, + limb3: 6644424279842588647708925945 + }, + w11: u384 { + limb0: 14179545530125846840535840199, + limb1: 63295896686450046775655903245, + limb2: 76098730173812985948160694489, + limb3: 1914388273278993754237954109 + } + }, + E12D { + w0: u384 { + limb0: 37951681122369020061762376709, + limb1: 33870401357432580926981669223, + limb2: 32855151388678982578729596111, + limb3: 748649506214628406207784518 + }, + w1: u384 { + limb0: 31218961843301573817409337931, + limb1: 59405239736081571089748173639, + limb2: 666223567830607741115381901, + limb3: 5784753077855898640643106671 + }, + w2: u384 { + limb0: 55525867040973303597797337138, + limb1: 31401415038590588292454973374, + limb2: 17816725986876472372433726829, + limb3: 5587352710135071203649357550 + }, + w3: u384 { + limb0: 29544913281277408949119652292, + limb1: 74271580522311292265671559741, + limb2: 12818305384031363558347638781, + limb3: 6081088231476563646296050932 + }, + w4: u384 { + limb0: 77297862208059656008230564, + limb1: 66720667173609200781416596502, + limb2: 70210398645827206784683961219, + limb3: 4495988364298442323447699013 + }, + w5: u384 { + limb0: 52847352102767921975397563554, + limb1: 51318414693357031239434890409, + limb2: 47909702303804476944801024524, + limb3: 6651259839842620711052914304 + }, + w6: u384 { + limb0: 9069292205043784623677831751, + limb1: 75021278819652057330805673335, + limb2: 14541455950505843454832039009, + limb3: 486151998117856884583435263 + }, + w7: u384 { + limb0: 25263031774261624724843422593, + limb1: 21705518025211239744433677164, + limb2: 44317682063541186805158316098, + limb3: 1801459822784940100281202356 + }, + w8: u384 { + limb0: 34136219706149743366278195577, + limb1: 5093679514863974800722297980, + limb2: 63313638099937023799500329567, + limb3: 7955937566541586628862809856 + }, + w9: u384 { + limb0: 26525949773307810614611042741, + limb1: 44105583861753705410230434573, + limb2: 36075416581390901860597319453, + limb3: 2182950887600346528164938589 + }, + w10: u384 { + limb0: 22284814604906091077957713225, + limb1: 60064045259975281684915613587, + limb2: 62399872078640764617482310163, + limb3: 5250426041192531724756033686 + }, + w11: u384 { + limb0: 38276781776990183090156280811, + limb1: 68621945829837205669960078950, + limb2: 25089748101605631172178164184, + limb3: 3751338717446222610690976942 + } + }, + E12D { + w0: u384 { + limb0: 32454164549454095908251210320, + limb1: 33726271841575147668533402645, + limb2: 22928272580734454729517512042, + limb3: 1791487324212884363029077694 + }, + w1: u384 { + limb0: 60663261531755053141936341909, + limb1: 75286993233020847320565160629, + limb2: 11210192649825764282880720196, + limb3: 2998398050077976258504603821 + }, + w2: u384 { + limb0: 66441287214120139236856109535, + limb1: 23886906097728837583171660433, + limb2: 77182904370366054928116081857, + limb3: 1864231791009782894091997364 + }, + w3: u384 { + limb0: 62363665380516202347487872197, + limb1: 76309482240425405081155606889, + limb2: 49877403419565085662312621838, + limb3: 6100946237525621759191480427 + }, + w4: u384 { + limb0: 66731977117470711143693088936, + limb1: 2042032843092615573642789183, + limb2: 78567746256107369684884831273, + limb3: 2966049088521279153199048596 + }, + w5: u384 { + limb0: 63508948505942868378997083265, + limb1: 10170893901323330880510151210, + limb2: 45234906594626632992776971031, + limb3: 2164845130789285521238721430 + }, + w6: u384 { + limb0: 44486146976546537717881212623, + limb1: 67146073215278838105162157222, + limb2: 7473850920891318785639968846, + limb3: 4546324577832497351881006574 + }, + w7: u384 { + limb0: 73625348617297478017238879153, + limb1: 19481164833684006339999371372, + limb2: 23534968178482499430161686321, + limb3: 4978733676446542978011033009 + }, + w8: u384 { + limb0: 4881007349498492059126780432, + limb1: 45767716813539781083752547281, + limb2: 24650566489414305920517552703, + limb3: 968070167924101847189614034 + }, + w9: u384 { + limb0: 42363308006390181871313603000, + limb1: 77222281834964844497671665680, + limb2: 74946465664553572441244048394, + limb3: 2411021528480899786187120373 + }, + w10: u384 { + limb0: 14070649256694857670030274117, + limb1: 11703042724689032136700691598, + limb2: 12903539344632042337156327487, + limb3: 87792464293426789973388348 + }, + w11: u384 { + limb0: 23643581444500882798810403361, + limb1: 24880079330027809833821947199, + limb2: 42848587516302986544386765579, + limb3: 4259916021707302310435223144 + } + }, + E12D { + w0: u384 { + limb0: 26087600176343761805605971721, + limb1: 61568684509065120614245676085, + limb2: 50118194861132161353004729530, + limb3: 1638972153784667039809743928 + }, + w1: u384 { + limb0: 77545131898208962435832127969, + limb1: 2751027089264127584862303261, + limb2: 55744201022537263307587123711, + limb3: 1742446343494100887457748174 + }, + w2: u384 { + limb0: 7930864070694620110647403750, + limb1: 50061279947038068372250183168, + limb2: 31212857875969990097657340230, + limb3: 709946957919705986619476154 + }, + w3: u384 { + limb0: 37709661277133802253337967212, + limb1: 26217785767965673970078997786, + limb2: 9514812149014519679662814948, + limb3: 6285051805278595763396174018 + }, + w4: u384 { + limb0: 51641832165795500318866521716, + limb1: 42610356012817044983949435954, + limb2: 77336104830717804476524270199, + limb3: 818510061267433513084771451 + }, + w5: u384 { + limb0: 17997309956318790693865984837, + limb1: 70239888258635268434021797299, + limb2: 46689245723225960657761662447, + limb3: 7725645970733375961760348788 + }, + w6: u384 { + limb0: 3443835051794797127210260976, + limb1: 73703753243775357241275379980, + limb2: 42480918270152302438051318038, + limb3: 5702508016048871442029545884 + }, + w7: u384 { + limb0: 8429983330346261203402409728, + limb1: 50279922996245028983646904437, + limb2: 20371509110803251970222286818, + limb3: 6870787031507122494202331342 + }, + w8: u384 { + limb0: 72973016373085285981360350549, + limb1: 36771110646799831262718662793, + limb2: 72760777661406583509528086723, + limb3: 5924709320126045892811033739 + }, + w9: u384 { + limb0: 15885845809942854607092410575, + limb1: 37914631409996688989326098516, + limb2: 15650960383840514164668042888, + limb3: 110117178090141844552340977 + }, + w10: u384 { + limb0: 4306106756705854537734541107, + limb1: 15880589211139047104503142226, + limb2: 74771696350221995833814033715, + limb3: 7000021199819003301223528608 + }, + w11: u384 { + limb0: 28646080633473390738072937927, + limb1: 54781284486134730697242838236, + limb2: 41835767148481176413771678872, + limb3: 344189787408852331831859890 + } + }, + E12D { + w0: u384 { + limb0: 68688628222755485264962271777, + limb1: 4038006270311171662962998385, + limb2: 27157576641433482103655054185, + limb3: 4681250315288948715637025968 + }, + w1: u384 { + limb0: 64526068720272884332811612566, + limb1: 46736016649624618321636028171, + limb2: 39109057761080799837754303335, + limb3: 1984158448723655014422006772 + }, + w2: u384 { + limb0: 41538401004759271765883427722, + limb1: 8482582374367274728657606521, + limb2: 4548058574177088420449738966, + limb3: 6260395424082287924878154450 + }, + w3: u384 { + limb0: 53695638098160835969840635669, + limb1: 12820736437080996098941080813, + limb2: 29211216519813868744174008571, + limb3: 5760379462335021125783773427 + }, + w4: u384 { + limb0: 22315735354157305044967293090, + limb1: 28777559492434138115216227055, + limb2: 35908988720880465212615419999, + limb3: 2248359913203827532489591518 + }, + w5: u384 { + limb0: 621184578532088794723765706, + limb1: 44804530085905583334407248969, + limb2: 40368556381043914339085487713, + limb3: 5762529009221077469548555056 + }, + w6: u384 { + limb0: 17998889077525390719493270266, + limb1: 33585713367935891447722404971, + limb2: 67246544842371633901113194669, + limb3: 1228509018066921505885547745 + }, + w7: u384 { + limb0: 735905692109885351983011873, + limb1: 55955933200349037370247414262, + limb2: 35344048254810077700600088224, + limb3: 6761485929831806625741461497 + }, + w8: u384 { + limb0: 52883509520003475897775561852, + limb1: 71503667993217135241563116174, + limb2: 52172052847273775816447353568, + limb3: 2652180063325488348731833809 + }, + w9: u384 { + limb0: 29391773933052257788872225049, + limb1: 55683342290996487934388524160, + limb2: 41454395806697833014449868051, + limb3: 3650054861926190682501034032 + }, + w10: u384 { + limb0: 27544702478925629214152839111, + limb1: 31685133058986178175900640614, + limb2: 16741150708423348897126830911, + limb3: 7061788275089433126370031265 + }, + w11: u384 { + limb0: 48082129033659961305449064667, + limb1: 33653542776309767024265709445, + limb2: 2920085709736368019002396461, + limb3: 6937624264603019041932846505 + } + }, + E12D { + w0: u384 { + limb0: 26147105824648914768603362470, + limb1: 39885158496004819672712824860, + limb2: 18373066563726170032946004939, + limb3: 6166273817174382921334849484 + }, + w1: u384 { + limb0: 1420200967338653764362073702, + limb1: 23567956795025377100587435883, + limb2: 74582134097483071254466104739, + limb3: 127915595708026081272699108 + }, + w2: u384 { + limb0: 15684522104122536141231413926, + limb1: 18924187580110934898000626288, + limb2: 65131966592464538077993566762, + limb3: 3181793856421533613534892748 + }, + w3: u384 { + limb0: 78571100647608997222224153481, + limb1: 58080910244897025958553542569, + limb2: 46991966793162966797215889200, + limb3: 5418157286894887757208900272 + }, + w4: u384 { + limb0: 42728288685105896890845139905, + limb1: 28841641554293968222170985781, + limb2: 75893015057272746975831171647, + limb3: 7740234816481698292034916294 + }, + w5: u384 { + limb0: 31896875215421262767745894524, + limb1: 1639484329928070948614395319, + limb2: 56910915264531743881311752814, + limb3: 4628914104612856414066334019 + }, + w6: u384 { + limb0: 13293837137952442158949781109, + limb1: 15790074396236322185851672285, + limb2: 43339635160100607962967764771, + limb3: 3375819760776639887827602533 + }, + w7: u384 { + limb0: 17669424054708272382485164497, + limb1: 53107999463431827671514694510, + limb2: 893129532160226115841114864, + limb3: 276522312456274773494797331 + }, + w8: u384 { + limb0: 74557508418464780631767305784, + limb1: 69876999724750349952511590527, + limb2: 64658487598064048680838629338, + limb3: 4375792412987767261275598249 + }, + w9: u384 { + limb0: 6910346736764810618755738674, + limb1: 26369017169715739388291790314, + limb2: 74199116584013023708067470224, + limb3: 4626876276351176797926260970 + }, + w10: u384 { + limb0: 3043503268490211168679958343, + limb1: 45159636801529583514958126585, + limb2: 17923147316400389707091366862, + limb3: 1062934081199886894429367695 + }, + w11: u384 { + limb0: 7543768694380183291108302930, + limb1: 63380411273407306067275330866, + limb2: 1570858148987428470401847158, + limb3: 3041225867223766276040742323 + } + }, + E12D { + w0: u384 { + limb0: 66958171674532480954374583038, + limb1: 29428512998524564800173587880, + limb2: 42009475678846489082115133347, + limb3: 5544407623038347712586223795 + }, + w1: u384 { + limb0: 35315986245290164251369467772, + limb1: 31033779680366589328542759950, + limb2: 22992360423392025352712827222, + limb3: 2286501034882908866091125175 + }, + w2: u384 { + limb0: 37500258487898734499460303979, + limb1: 54790523024245392741065653454, + limb2: 6579444153491262887025713306, + limb3: 3573940560048564912583864811 + }, + w3: u384 { + limb0: 58268727317901958559615005581, + limb1: 40700010240783414960059243280, + limb2: 51350539962244995498583316797, + limb3: 1321630647874662380262037837 + }, + w4: u384 { + limb0: 37448125254749250905896577091, + limb1: 45129242277988520773259192847, + limb2: 34816347586873815572332674291, + limb3: 6864278595448009741159680833 + }, + w5: u384 { + limb0: 34092907310991817364745799899, + limb1: 52470849057386610689338852176, + limb2: 20444016706654977528745119536, + limb3: 809361192762281806346124406 + }, + w6: u384 { + limb0: 5374635462032677490318315953, + limb1: 42763734440521071222118264282, + limb2: 9088475000698245410555006720, + limb3: 2827736312519658765847941793 + }, + w7: u384 { + limb0: 66722030014190719875158314311, + limb1: 44652478725433788375402450280, + limb2: 23444547776442185296248129225, + limb3: 2760665252078349969434920058 + }, + w8: u384 { + limb0: 25434619005628392900227727471, + limb1: 57790532719826514683926506365, + limb2: 66052247852553531285351925120, + limb3: 2082524813864455464740033815 + }, + w9: u384 { + limb0: 36898122186159342167449097633, + limb1: 43836454051531086716694682900, + limb2: 50299380054008102900106207906, + limb3: 7426480434851883085335783037 + }, + w10: u384 { + limb0: 37389294610435860443160255546, + limb1: 13243533792622677094662428511, + limb2: 40496237260661251989420830334, + limb3: 6485418074440723524102598449 + }, + w11: u384 { + limb0: 41318274616371439193115208254, + limb1: 28491485573467471028231801245, + limb2: 39571068615259232553310380586, + limb3: 1114711673095358793661955039 + } + }, + E12D { + w0: u384 { + limb0: 61198205515730636314719133508, + limb1: 8287831091909690360749828124, + limb2: 65869347042747373701594165013, + limb3: 7663770062173982630498573852 + }, + w1: u384 { + limb0: 35903047057207622391471004225, + limb1: 13908801577824930320376046736, + limb2: 33333332020512901607425202021, + limb3: 4969394413835134111161269733 + }, + w2: u384 { + limb0: 47546748544061263930347145270, + limb1: 63184465041002346989020714106, + limb2: 53144153740699494864624098311, + limb3: 7357466787098237583317825860 + }, + w3: u384 { + limb0: 8119291056984104928581408533, + limb1: 77340958802372250390850836328, + limb2: 7619775146132754961571744827, + limb3: 3935493069603811903540741103 + }, + w4: u384 { + limb0: 15096171412772659894608685547, + limb1: 73123207823396920284716055162, + limb2: 8968224705300191522557384000, + limb3: 5221645979629761758817526601 + }, + w5: u384 { + limb0: 557149871337477560754235622, + limb1: 22445635980851603171384159499, + limb2: 12271547441480279629691856505, + limb3: 4673610022125336162714061416 + }, + w6: u384 { + limb0: 74491052024012387203106353583, + limb1: 65071945826536518666056535539, + limb2: 71324759955748833140731634342, + limb3: 2316678019279855041363615670 + }, + w7: u384 { + limb0: 11241934129943292532237992143, + limb1: 62244329471605373121012507209, + limb2: 34942348279475996938915171560, + limb3: 2657873406946474872855440030 + }, + w8: u384 { + limb0: 49190162436002673248804724668, + limb1: 26904223270540611929452351558, + limb2: 73502186398962208329444820005, + limb3: 612369755339256499889363271 + }, + w9: u384 { + limb0: 61763253994798931142005738202, + limb1: 45702677751545246538467781746, + limb2: 23724556830486916020154162410, + limb3: 2989883472255148796228017177 + }, + w10: u384 { + limb0: 10333049529978385523791640675, + limb1: 34254943564143414406353006048, + limb2: 61976684220473926023887815655, + limb3: 4348095797484177969291618273 + }, + w11: u384 { + limb0: 4462086442175212848761815438, + limb1: 51846142269537693373806945671, + limb2: 29294762206290108318978929612, + limb3: 7848066529088415087696276944 + } + }, + E12D { + w0: u384 { + limb0: 67767833030119298470247477256, + limb1: 11928633786522080096604602424, + limb2: 156455704759125654650429944, + limb3: 5625415850319761646580362142 + }, + w1: u384 { + limb0: 4551259850183789255887781504, + limb1: 41435975901149714832493147091, + limb2: 60776065506700153763908553994, + limb3: 1457737593956397434211284258 + }, + w2: u384 { + limb0: 14405706759510619018636268629, + limb1: 76434084588540017148197700944, + limb2: 13648054328807492713591757692, + limb3: 1568934651676585712471120989 + }, + w3: u384 { + limb0: 12833747120323744701358363334, + limb1: 65254916221351685050813598699, + limb2: 74893429874992923027254696680, + limb3: 625930680329869566440219120 + }, + w4: u384 { + limb0: 4878149316405432827359036992, + limb1: 70061410534953640776284699241, + limb2: 53704840976285055213825207165, + limb3: 2857669919122560716353241620 + }, + w5: u384 { + limb0: 15950365080571324195242669454, + limb1: 21462347194876693236804693672, + limb2: 60896403196878772733613150468, + limb3: 197801889742870555683589318 + }, + w6: u384 { + limb0: 72254851119059625677247943680, + limb1: 54175569744518597294126493374, + limb2: 15296475442854631820624741305, + limb3: 2153400724437996050472836226 + }, + w7: u384 { + limb0: 29802812339499986272108578805, + limb1: 72497763610617887871180225149, + limb2: 11196319039280177372056321898, + limb3: 3156634836946610640626202351 + }, + w8: u384 { + limb0: 9899780006141460862270736918, + limb1: 32374550689232608971189058134, + limb2: 27920907312940207004750031864, + limb3: 2987166004776682437593474988 + }, + w9: u384 { + limb0: 71212746098134053740140183404, + limb1: 2948292017925697513513386104, + limb2: 49438179688430476931154401731, + limb3: 6365738424667514948499634932 + }, + w10: u384 { + limb0: 26586454298657046762490991260, + limb1: 57816514020930459252528495300, + limb2: 21601894995649423310867106245, + limb3: 7394107602973599672864407579 + }, + w11: u384 { + limb0: 29390066227503344494893316683, + limb1: 40259493819050111400244556339, + limb2: 38313093621851856277595601659, + limb3: 296016781547426781977972365 + } + }, + E12D { + w0: u384 { + limb0: 49684007435819693785233951954, + limb1: 24994890284631705112732986772, + limb2: 11178920178834911372286857555, + limb3: 1080773827240787089470783667 + }, + w1: u384 { + limb0: 35421493905920852275327356035, + limb1: 24257811220465456369148971186, + limb2: 52233037100363608972391910294, + limb3: 4438250661367529763467599996 + }, + w2: u384 { + limb0: 75196746677627623836575774647, + limb1: 76777288405129555315402694325, + limb2: 36850534995030943827689777624, + limb3: 4720057328371991136195179840 + }, + w3: u384 { + limb0: 23709426508659605916827441101, + limb1: 65646396695053902369972238936, + limb2: 46730387645887465655392788371, + limb3: 6146560458568441974079282997 + }, + w4: u384 { + limb0: 44307552026189089203348482660, + limb1: 46868046424570978144444879393, + limb2: 61601387462267942967376820894, + limb3: 7001161331728094582015482244 + }, + w5: u384 { + limb0: 50175833408981971332065504561, + limb1: 38049343476890141652715097470, + limb2: 56371521255236399914061960731, + limb3: 4973406040837912061437450024 + }, + w6: u384 { + limb0: 61567353891293911930611343775, + limb1: 21051849437429259217906898557, + limb2: 28314492792122093027901843704, + limb3: 5595536415079337882100319924 + }, + w7: u384 { + limb0: 70171870825237465160567554235, + limb1: 4057854048510899852354048523, + limb2: 28819882262471111831653360329, + limb3: 5100919240637492341116129483 + }, + w8: u384 { + limb0: 20898406201708435198940504697, + limb1: 44997433439045440594289954510, + limb2: 35934098256725060807672035228, + limb3: 6226684560198475710655501631 + }, + w9: u384 { + limb0: 276843909638022537534637303, + limb1: 77112948530837357168806334558, + limb2: 75802343630691367429947236767, + limb3: 7758015155730504800555040131 + }, + w10: u384 { + limb0: 40137625929835386653868849214, + limb1: 39630795855424544333822143509, + limb2: 68605331026779158978741261899, + limb3: 848005489472977813999169408 + }, + w11: u384 { + limb0: 8149371532262065452517892246, + limb1: 16781712259466971609869208839, + limb2: 53130430811590851392480604499, + limb3: 2529780148474308801123262501 + } + }, + E12D { + w0: u384 { + limb0: 52122390121728237534866436207, + limb1: 52233621779230132882425344037, + limb2: 57270709865522750755688945653, + limb3: 7516734498341179815993516522 + }, + w1: u384 { + limb0: 65904056926542972020767411392, + limb1: 60442148741744919853712180164, + limb2: 78848555117447525600150903596, + limb3: 6522694048282312622659572284 + }, + w2: u384 { + limb0: 9269765014419378256578140269, + limb1: 74764607667966178001525299739, + limb2: 10838766791894161663211459710, + limb3: 5328092435307094322945567519 + }, + w3: u384 { + limb0: 71775080763549866784123586303, + limb1: 28028418595597769918047106585, + limb2: 56602112667437197966000099514, + limb3: 4032292653433049983041970028 + }, + w4: u384 { + limb0: 38743807818659108643882709735, + limb1: 9027877081559456531946197018, + limb2: 24374496343979634443705348490, + limb3: 5050442392654038599102429201 + }, + w5: u384 { + limb0: 50183067302149943543809720115, + limb1: 68045262000768077870595079174, + limb2: 67098733677684890034261554167, + limb3: 2941528952562143827922620265 + }, + w6: u384 { + limb0: 23798303603255506620537921739, + limb1: 21388725732440252869849064308, + limb2: 22366940516416114871775914404, + limb3: 1057059814938072364444868759 + }, + w7: u384 { + limb0: 39076904802838663366929927951, + limb1: 986768663189492905579304735, + limb2: 51860090852393723354732452487, + limb3: 2109791058197884958820760832 + }, + w8: u384 { + limb0: 4348127455044949005899412292, + limb1: 36753301719059475526314283652, + limb2: 20230058625539556076028860084, + limb3: 37677699334652742598470367 + }, + w9: u384 { + limb0: 3159426434067300180466983246, + limb1: 48439298554465196053915289249, + limb2: 35528452124903824999371026415, + limb3: 6757301092838065320167403360 + }, + w10: u384 { + limb0: 58809840435666374401110326471, + limb1: 28640856446419745958137672010, + limb2: 349792119883583738547981315, + limb3: 2388595187282767276427564832 + }, + w11: u384 { + limb0: 27985451168743572267197944159, + limb1: 24783213327767550391483314271, + limb2: 42621612474746019278550358899, + limb3: 5139694010363476115002287604 + } + }, + E12D { + w0: u384 { + limb0: 59253336788720211284549887938, + limb1: 10863160706747234498303630129, + limb2: 65692563938115810967798652645, + limb3: 7891526490068919553041256910 + }, + w1: u384 { + limb0: 72165410904708892736071875568, + limb1: 75791495274505905940881425449, + limb2: 12856212043547547387005806286, + limb3: 3023855229726700463392669529 + }, + w2: u384 { + limb0: 46471720148455689756841815312, + limb1: 40895538227953969195051721815, + limb2: 11557357127522027671048177078, + limb3: 5944523181131867722591472028 + }, + w3: u384 { + limb0: 48778879130230816362962198157, + limb1: 51763625684551427921184036186, + limb2: 73369601224639367844247198441, + limb3: 7874389294250338189561707175 + }, + w4: u384 { + limb0: 49344688041441771203237974828, + limb1: 38714570121412209075612856454, + limb2: 46013026787289388522472543658, + limb3: 332572232968905424978401687 + }, + w5: u384 { + limb0: 10792842971253119472956589812, + limb1: 17437333446818983483171953051, + limb2: 67955908596600117660805137307, + limb3: 4146623113242006100583617733 + }, + w6: u384 { + limb0: 72860675552602659763384117384, + limb1: 62287106817341073270022909401, + limb2: 45489510905891823743241297139, + limb3: 7248299011343295282149254112 + }, + w7: u384 { + limb0: 4186478648928078515673990261, + limb1: 28878274442022427556048318598, + limb2: 61505230300495848652620024767, + limb3: 7182993363571628446025594238 + }, + w8: u384 { + limb0: 7708752342698683884685038617, + limb1: 2568998712593284490726879916, + limb2: 10792764331727944108177002072, + limb3: 4009168142957402544795461153 + }, + w9: u384 { + limb0: 44273072593144184752102419201, + limb1: 17886133575240193846871235684, + limb2: 63246824311301607664724706446, + limb3: 5441693155395810329426574701 + }, + w10: u384 { + limb0: 59749293319817336627153096837, + limb1: 24342592627261919747439338202, + limb2: 13130564968918276907128847152, + limb3: 7679428876321980752236274485 + }, + w11: u384 { + limb0: 71788300624846469507742215321, + limb1: 51754554046683334487132752785, + limb2: 47412444382808487372864448264, + limb3: 2247478284024276021222730352 + } + }, + E12D { + w0: u384 { + limb0: 46084523657660051596557760029, + limb1: 55392647820799603964075789127, + limb2: 17506451662475401014921869767, + limb3: 826239386791274076662221206 + }, + w1: u384 { + limb0: 40924178257565323555740299737, + limb1: 54669350769231718098838690966, + limb2: 18440391160120209418947475969, + limb3: 2229274706171510230557015648 + }, + w2: u384 { + limb0: 20055715049665678544041175553, + limb1: 30268467424322382009813829804, + limb2: 67882533472556871897292384741, + limb3: 859671638210149197466974248 + }, + w3: u384 { + limb0: 64404736884263719976755542954, + limb1: 19633243702920570125519578832, + limb2: 41246723402993714545234296526, + limb3: 2764150976798541964618523985 + }, + w4: u384 { + limb0: 26407239457036522942149083752, + limb1: 38502212768433813343562436790, + limb2: 73113523663331128512556172883, + limb3: 3801653843830678380426810823 + }, + w5: u384 { + limb0: 60840641098577628745139889208, + limb1: 22033248953992766067077862476, + limb2: 78265481224297112124460011977, + limb3: 1934037868714664600821181588 + }, + w6: u384 { + limb0: 8239483626893013374876866566, + limb1: 10160382759558000983786437048, + limb2: 48488267518826937338547995391, + limb3: 889987033041396642964099577 + }, + w7: u384 { + limb0: 18603765687361814301893337681, + limb1: 2487165499407411038386082197, + limb2: 35531135767901694981874736223, + limb3: 634620392623605057633890464 + }, + w8: u384 { + limb0: 68334730367745951427696004321, + limb1: 19224465045422908743679245495, + limb2: 29730345263375591701625658117, + limb3: 2430187602506340432733895006 + }, + w9: u384 { + limb0: 3208314820144083798173807858, + limb1: 41612401291230521669074042859, + limb2: 39507080187308851520880789250, + limb3: 2034892411681621576219624059 + }, + w10: u384 { + limb0: 45908695908152295861845651324, + limb1: 66340405952413218716460282293, + limb2: 51088859552852909869715682036, + limb3: 3211261950063107050705471407 + }, + w11: u384 { + limb0: 47800929095989484330444828830, + limb1: 38736698426299606244109782262, + limb2: 74791732110536034845136433879, + limb3: 7949361588242852555866233284 + } + }, + E12D { + w0: u384 { + limb0: 29005239797627814549172169919, + limb1: 9111188029914859290219840255, + limb2: 21989746052944179817891836388, + limb3: 3045788086544404306755703435 + }, + w1: u384 { + limb0: 1921124946496148430917740996, + limb1: 2266770928241552506623809314, + limb2: 68594638122971359222500681980, + limb3: 7524399532334314369335491816 + }, + w2: u384 { + limb0: 51379094117330469621914363602, + limb1: 61930034036860164730868688050, + limb2: 75471626971006983238195584576, + limb3: 2805161505596036113247596727 + }, + w3: u384 { + limb0: 32360614572551376092295364102, + limb1: 77020480272659421683188715519, + limb2: 67032217337683265440263746393, + limb3: 6735794689841117234647641136 + }, + w4: u384 { + limb0: 37924348404839238491135708888, + limb1: 54747635588107413448752117041, + limb2: 2712053032762603211635337398, + limb3: 4966982925339606333675553752 + }, + w5: u384 { + limb0: 74462235444182821791913572926, + limb1: 38852173100909099511014787261, + limb2: 21462066541847397692585687159, + limb3: 2170406062284678595404212240 + }, + w6: u384 { + limb0: 75332236358023851272659055053, + limb1: 10414690723844421342717895952, + limb2: 63858291745776002812784108184, + limb3: 1538563866384944685367257592 + }, + w7: u384 { + limb0: 44274473038801616906699818855, + limb1: 10329245828577238225398238602, + limb2: 38904762847114454099005432368, + limb3: 4830855839138621679352416589 + }, + w8: u384 { + limb0: 62337786040466446163850336643, + limb1: 32283622710326571719553248278, + limb2: 53296925454126985355504771393, + limb3: 1609998442482784063326788845 + }, + w9: u384 { + limb0: 44025067788750862263465827476, + limb1: 31321366779995892965645933897, + limb2: 8643231085976627640983746759, + limb3: 6884955857582804386851221537 + }, + w10: u384 { + limb0: 64774476950557180688544768803, + limb1: 64398180318573203484473674698, + limb2: 49558120750741577986552743818, + limb3: 1584261642544850634074989210 + }, + w11: u384 { + limb0: 8421124595608006576474138520, + limb1: 23817852647943724870911921234, + limb2: 75236661852133792960944704096, + limb3: 4488753094215302710942827118 + } + }, + E12D { + w0: u384 { + limb0: 38613144843298431974496670953, + limb1: 39689628392476896387104823264, + limb2: 62966409112658600895726697231, + limb3: 6973872446663726788240618809 + }, + w1: u384 { + limb0: 59231715409269001014275326293, + limb1: 25875918937050998300789179256, + limb2: 22247364077956004458477947783, + limb3: 1682142142108192265135467686 + }, + w2: u384 { + limb0: 7096768080217696881988318623, + limb1: 8801544728635358433643724556, + limb2: 12901156684389112934754724571, + limb3: 296188471135906033969442244 + }, + w3: u384 { + limb0: 54176125692502637875293786757, + limb1: 18651596147842002521230471095, + limb2: 14524115438414056416808506055, + limb3: 7163177864845786669506646136 + }, + w4: u384 { + limb0: 42473401520135703942055892514, + limb1: 6931903221092960582100474037, + limb2: 13744765312285317605559453066, + limb3: 3965322988128742099822650850 + }, + w5: u384 { + limb0: 6950959819495339199184022197, + limb1: 8082260263663898308353180303, + limb2: 36777501155599382058073134024, + limb3: 5926231051147362388938563538 + }, + w6: u384 { + limb0: 62518679229835766897836684257, + limb1: 14066982711886617027602062066, + limb2: 75790238176540533991607832891, + limb3: 308369201162003429601630689 + }, + w7: u384 { + limb0: 59491028276936681827444298455, + limb1: 16983641412361092929726922937, + limb2: 16568165994837451579651854842, + limb3: 7961156388501364989376801929 + }, + w8: u384 { + limb0: 122689682979248600195111143, + limb1: 20694569386610311555946897781, + limb2: 19855767229002199726101556137, + limb3: 2064748822670551435696747299 + }, + w9: u384 { + limb0: 68609396155695115712712710000, + limb1: 28415675364565494090349572281, + limb2: 47817375346332968601054629508, + limb3: 4159122935400191853934640701 + }, + w10: u384 { + limb0: 43377501394265365382014196201, + limb1: 34979000892747873044162301319, + limb2: 18881642383939648476846108265, + limb3: 7076182049792307451271686438 + }, + w11: u384 { + limb0: 8025203543212123419751303084, + limb1: 477542372647518347998301517, + limb2: 5410784988474489667021580516, + limb3: 4828962494348318306797182285 + } + }, + E12D { + w0: u384 { + limb0: 18130692902915682060931464636, + limb1: 49818228478975182713826410965, + limb2: 73164376581989435238230470588, + limb3: 667914589200441176206425386 + }, + w1: u384 { + limb0: 4863591723733523657766426057, + limb1: 64587009561015879687771960252, + limb2: 72094686498742021281899795405, + limb3: 5564802715027231981071479414 + }, + w2: u384 { + limb0: 9486496540668985887819625381, + limb1: 9663482827196312936950813664, + limb2: 72204782067677980710183991845, + limb3: 4241460798355074864653520170 + }, + w3: u384 { + limb0: 15630003128918925831790989141, + limb1: 38866979124800192628416877554, + limb2: 31594050963765282859901390653, + limb3: 7927107095045985086907716558 + }, + w4: u384 { + limb0: 77693541425777148131330837320, + limb1: 23574755565219323683800330804, + limb2: 36305881985603725814976723580, + limb3: 5906895384555055284588752056 + }, + w5: u384 { + limb0: 74000005915497163361091572219, + limb1: 66566778289590270990072536423, + limb2: 56282388491236379676874475686, + limb3: 1565859810434525804783225779 + }, + w6: u384 { + limb0: 33384904501939231440173676408, + limb1: 46087568818865334573379516241, + limb2: 37039509127968849253553078531, + limb3: 1071491264945055686934075000 + }, + w7: u384 { + limb0: 44337093383156559959377175976, + limb1: 52067962358426109955310323276, + limb2: 61950897840217533400487257763, + limb3: 6015746609677257686184267999 + }, + w8: u384 { + limb0: 27408057754600122378135900926, + limb1: 22860013992800141056920812060, + limb2: 4670838824078181391504217779, + limb3: 4032198170334282188225190352 + }, + w9: u384 { + limb0: 473908811462045405200621713, + limb1: 49749920655884688430199600140, + limb2: 425725624644379541408259211, + limb3: 5071276412414304890947457843 + }, + w10: u384 { + limb0: 12541675068907108161427716433, + limb1: 58833843887271031891094255614, + limb2: 72715497606514039577442222034, + limb3: 4159264347107183412009521534 + }, + w11: u384 { + limb0: 70287793613652959957293205365, + limb1: 24731870836682322262906176206, + limb2: 46092271968741487412571746251, + limb3: 2390193756247753331780155522 + } + }, + E12D { + w0: u384 { + limb0: 71953689951662040675183022858, + limb1: 41781130779535022991826378356, + limb2: 59610035703055569306212268525, + limb3: 6509984503709117377338786728 + }, + w1: u384 { + limb0: 2630264887509427649787055050, + limb1: 53501872986764576915988604009, + limb2: 22547387182641844896784684438, + limb3: 6847525537092177831423315725 + }, + w2: u384 { + limb0: 13439183508205399194433398212, + limb1: 33798646520973418409714742353, + limb2: 2544632576760870354015541479, + limb3: 5973516234975826528565108041 + }, + w3: u384 { + limb0: 77729532222075749571490413218, + limb1: 14726697888090706047740626120, + limb2: 41998487062873424374986404961, + limb3: 5225001416025664691723270382 + }, + w4: u384 { + limb0: 52737276107283272433286084536, + limb1: 57897871149585397008159600346, + limb2: 22790425520051068543426930778, + limb3: 5881954528267675738453620716 + }, + w5: u384 { + limb0: 1335468372333312550553643265, + limb1: 25100207169000849583969754080, + limb2: 57961484522211263384105407774, + limb3: 4737120101943089809967213626 + }, + w6: u384 { + limb0: 38705964714843700832313925805, + limb1: 59768312662038536414016684715, + limb2: 41586162407913650815620456072, + limb3: 7476939347005104727761009496 + }, + w7: u384 { + limb0: 19154754797050139038813289456, + limb1: 29632172321710236831151252407, + limb2: 42855860322974689600614960786, + limb3: 4947371361674595203331654171 + }, + w8: u384 { + limb0: 29414317457527089637413862822, + limb1: 22286077437432834622069131701, + limb2: 16416638731416399542236368873, + limb3: 615864625679654348553056247 + }, + w9: u384 { + limb0: 57500466506733029818217662586, + limb1: 67421751256980104318576001847, + limb2: 41872890034018547064545557438, + limb3: 559848382354868154269143998 + }, w10: u384 { - limb0: 2110355068890583876202054811, - limb1: 63544648620814937191502145023, - limb2: 52461418914407353591420570576, - limb3: 5071967606850665785237814411 + limb0: 9410848952630598083696490340, + limb1: 37538859442528175964436420484, + limb2: 11490009787612908266684713937, + limb3: 4120465888853163279136088942 }, w11: u384 { - limb0: 6466038276924785647613740078, - limb1: 654721196547687510076267922, - limb2: 26867384535714860562038692590, - limb3: 1519707236837187467345943876 + limb0: 41000212950950954183373272422, + limb1: 65347600379333999076925417657, + limb2: 69917537192835328071604543728, + limb3: 3345569104583096626294770428 } }, E12D { w0: u384 { - limb0: 1515422408291494499140180389, - limb1: 26881504131746886304963547130, - limb2: 35579426828982227064334095011, - limb3: 2429089957929653594131223205 + limb0: 50025436495033782400790830540, + limb1: 56053165754482033181244001022, + limb2: 1364824798227934285117177226, + limb3: 3751560113253307793487109154 }, w1: u384 { - limb0: 2598371823996993237877538949, - limb1: 10483305527742057534419298733, - limb2: 16011073070418285303812191285, - limb3: 77549461914407626757645231 + limb0: 331383691379789454821902044, + limb1: 45290011832484444459368342752, + limb2: 5228827679028741505021567519, + limb3: 180400211979001092374555815 }, w2: u384 { - limb0: 25023107182136422639272075249, - limb1: 58714801877343076747695962834, - limb2: 75433949288816341597362155636, - limb3: 6057318332236371528205846942 + limb0: 50720018120563706371518357454, + limb1: 57311207902138904644103734135, + limb2: 29509751288985830754634741420, + limb3: 344983194330944028240084034 }, w3: u384 { - limb0: 38893481992578922676278042366, - limb1: 56709368456536082820236773826, - limb2: 31255267384131869883417487212, - limb3: 2322056255571867855036991447 + limb0: 27239888082498248340221840174, + limb1: 23152817082766545044205911986, + limb2: 13835442602190570115395145244, + limb3: 2344563180795109371781093624 }, w4: u384 { - limb0: 70916126603936594328222001634, - limb1: 45128245156601949602678963514, - limb2: 39348030662542387215532479323, - limb3: 361240651661388876032849101 + limb0: 29075645975666613600645545953, + limb1: 12403506429072348977455675110, + limb2: 55691486996821090167121827466, + limb3: 4849107243238519435185815563 }, w5: u384 { - limb0: 44970829201484500677529782751, - limb1: 30142373541026938699934455383, - limb2: 23853886329695399432281817753, - limb3: 2404990963781908894245587688 + limb0: 13323725495532850364164246942, + limb1: 40912961523757518685958738855, + limb2: 8931811611620699840334108749, + limb3: 5375749638564951206709819710 }, w6: u384 { - limb0: 48040443192889853201044986062, - limb1: 72227383064919108461494807091, - limb2: 44758870170949410786766701338, - limb3: 5367568523249416789587566480 + limb0: 71566829935635717430136197291, + limb1: 74257002584868892071623871470, + limb2: 29582825085636841889019872489, + limb3: 6588240648613843568960350476 }, w7: u384 { - limb0: 38306343753389523852653182874, - limb1: 10629681553646850653001961432, - limb2: 74049607956024737007797526458, - limb3: 5643451158502616618097275887 + limb0: 42274026522969748735826000296, + limb1: 44313461400497806616800641263, + limb2: 46211746586388328043189927051, + limb3: 3753417065781985504274412959 }, w8: u384 { - limb0: 7499366557152482509304971928, - limb1: 62157897747491921392657922241, - limb2: 61054784653211476390824910477, - limb3: 5148006654998788324479879810 + limb0: 28449746981688777154966409590, + limb1: 44383404916661537006799756295, + limb2: 74798530056268687029587750746, + limb3: 6350405079690157591346331796 }, w9: u384 { - limb0: 62455843320535355283007046476, - limb1: 58541587198082217011588666475, - limb2: 40726640763016614803625871488, - limb3: 7738860838721855932645057295 + limb0: 47291499690891997456530194247, + limb1: 69722092839532956254106493709, + limb2: 12997214201454016665636494311, + limb3: 5899800726268960658636986456 }, w10: u384 { - limb0: 51006237051493207690947058323, - limb1: 56962258699878830184327314827, - limb2: 18146412156813058731019373362, - limb3: 1628136217396741498544050623 + limb0: 25599111578730296458967920576, + limb1: 66246366515815321367423802718, + limb2: 37086604078626386253110976769, + limb3: 8006033397234369942493375360 }, w11: u384 { - limb0: 9616725003775229757261075158, - limb1: 78315948330563683639028918771, - limb2: 17779580880337931547787459164, - limb3: 5592095616022891479260080646 + limb0: 45296932398893059974399770128, + limb1: 23281212188453650534397770050, + limb2: 29193372741122903783017223305, + limb3: 1396556358439931051227878789 } }, E12D { w0: u384 { - limb0: 26676020789573800045734086037, - limb1: 54326555103573627461171054096, - limb2: 29945768180122264085178942104, - limb3: 4889722068637483000614352593 + limb0: 5535188464779891393593801915, + limb1: 33622254020096821541474461609, + limb2: 3714323634717943863538401216, + limb3: 7656006747822525814280860658 }, w1: u384 { - limb0: 43341851847940731715147319886, - limb1: 654891825674330162842039702, - limb2: 16653400791577688842094724670, - limb3: 7603212545624297146054659593 + limb0: 21536140635401963205665822664, + limb1: 28063520063367262482895113183, + limb2: 64722029884940420223959890991, + limb3: 4256362638816975279476871637 }, w2: u384 { - limb0: 66501727245675904478633443628, - limb1: 8727377607130925817263407291, - limb2: 76571762558543054906425174399, - limb3: 3844890845979035964228569857 + limb0: 7395322118809553860293401018, + limb1: 32022437538592853639005867278, + limb2: 67666463513480243111147046435, + limb3: 7076735670440484263533396693 }, w3: u384 { - limb0: 35291657741234949247683969111, - limb1: 17579717053835454335434486872, - limb2: 11887034255794489554150042683, - limb3: 4548634160481869052879536785 + limb0: 53423097123315689958490760258, + limb1: 59216344576876378929519756527, + limb2: 29518342000307058200853755246, + limb3: 5868324077719793964777311009 }, w4: u384 { - limb0: 12692375788307452049510740658, - limb1: 63349021946851004622853687964, - limb2: 52832393337060659851505976393, - limb3: 1598956108424033561604793454 + limb0: 75196553061337109965627347391, + limb1: 13437804519640449336854539111, + limb2: 40649331398509339043266876638, + limb3: 7541164239753867095510457067 }, w5: u384 { - limb0: 48089637914529651150085353797, - limb1: 78447298462575788826760330833, - limb2: 63939095355041495202238832679, - limb3: 2856274144218596945318503984 + limb0: 43615648728494910578645842218, + limb1: 8335101035268430396837661443, + limb2: 7305737372025478930899582343, + limb3: 3209929247680893672342678864 }, w6: u384 { - limb0: 61328800493958917879065231621, - limb1: 122164314611507845896148517, - limb2: 8143652774853710336967943187, - limb3: 7682307439414263045068690136 + limb0: 29342872942325255112362504665, + limb1: 36658041400603135597123107653, + limb2: 11245867431302645975225729069, + limb3: 5630607037252753841095805185 }, w7: u384 { - limb0: 78025379674106647583293168313, - limb1: 55762868362271686085902462317, - limb2: 63469371059154718817957284571, - limb3: 942120059900740233799769492 + limb0: 27700335417052722295543090771, + limb1: 76480243609377376489392205638, + limb2: 59544563637228444631814024807, + limb3: 6140065683200620583311945151 }, w8: u384 { - limb0: 73183527673455129822701174406, - limb1: 49101979576554781122258348551, - limb2: 74045820079266408958944907706, - limb3: 6179859478408549895398505012 + limb0: 40295105875545812548540286731, + limb1: 30810080696240762934191299247, + limb2: 69501269590067657522424376396, + limb3: 1918563349306471013726485950 }, w9: u384 { - limb0: 13263808564084202868215826943, - limb1: 18535160973621620960342122218, - limb2: 17626664739226345034858735454, - limb3: 1689836150288080065671343507 + limb0: 54551765197791981685371084011, + limb1: 40857585154357485234169112244, + limb2: 20769305800216678785569458335, + limb3: 5485744056472011097637331379 }, w10: u384 { - limb0: 10566298989535852592827089287, - limb1: 43174703036376428843377921920, - limb2: 56855000327171835891300533654, - limb3: 4742776787066798535901182645 + limb0: 57716990061484058217402384516, + limb1: 63109232758265206998165126472, + limb2: 29212170160372830329566883474, + limb3: 7566340385413032534096498106 }, w11: u384 { - limb0: 28551841599759426837930681273, - limb1: 25950942975977229388070890282, - limb2: 33469451255846111027207941925, - limb3: 6907314357593909386367826284 + limb0: 24212947088347459398840587938, + limb1: 11101033311683115247954894405, + limb2: 25412463297302840439163592156, + limb3: 6518369572560733424094800575 } }, E12D { w0: u384 { - limb0: 68278616498697173058697984016, - limb1: 21823264568912069215376571677, - limb2: 35644407064288652361008188546, - limb3: 4478078765208446194746154146 + limb0: 73603617515576478713072729279, + limb1: 36371050459891469867680330296, + limb2: 65683491536870711235800212605, + limb3: 3226645838987236063950059203 }, w1: u384 { - limb0: 9481879378068646271757581535, - limb1: 1596437690599175043178340587, - limb2: 44572051772517242535705606526, - limb3: 2366047187350630473758210803 + limb0: 74311563597750746267969200781, + limb1: 36990605557081358638841766599, + limb2: 22918147103444402673308077882, + limb3: 5060864830552924266587097886 }, w2: u384 { - limb0: 61636455577238637003922721949, - limb1: 68784211530589028387532914287, - limb2: 9643879155735199641931789120, - limb3: 2624590791636514526932936087 + limb0: 67349020184285988583766488151, + limb1: 1561127107644601134457343078, + limb2: 74985031668719190397261034171, + limb3: 2888870090603991912032110564 }, w3: u384 { - limb0: 17778134665325778672969836279, - limb1: 38546281676211553859846618605, - limb2: 14931499078271987772785586039, - limb3: 15912678969016577963609492 + limb0: 43502541094552958627834899766, + limb1: 66596586823583944546650166921, + limb2: 71022662069147283619761339452, + limb3: 5001057056773747594116285460 }, w4: u384 { - limb0: 43745057942498922841871520558, - limb1: 49308587460883390650252276393, - limb2: 22133751830040267771008177761, - limb3: 3105029787562812623578189208 + limb0: 78863897257961785456964866524, + limb1: 75538717646298473608956941100, + limb2: 56759964416531180551973629863, + limb3: 3398204188928536265032411092 }, w5: u384 { - limb0: 35556567373737797202665573234, - limb1: 15182302289187661337547023303, - limb2: 14772410892446170076725083460, - limb3: 3837034969664150102400873372 + limb0: 5927467600732058891662384132, + limb1: 47030073961690950915116684277, + limb2: 43565364627558672182640948599, + limb3: 6601657893060399593960075690 }, w6: u384 { - limb0: 50130230794840060679478605315, - limb1: 36263030849825201633226306943, - limb2: 38345518755936492606111477502, - limb3: 7005423448696561299357019421 + limb0: 15030853427967391485358209576, + limb1: 8461137501260443887073616419, + limb2: 70903830667004581319692853976, + limb3: 4539472789705394841175821593 }, w7: u384 { - limb0: 56941697924071517226631973972, - limb1: 62724510152536915280573859726, - limb2: 14329329401185368957602756859, - limb3: 3423812832982958465204300549 + limb0: 67854989376458092046925407947, + limb1: 11124895848033588306850684059, + limb2: 13188436081434813352861673032, + limb3: 4320307387748441542462400400 }, w8: u384 { - limb0: 16785623732943358047424740415, - limb1: 31354706281715892970600321134, - limb2: 12359935279972428304125051318, - limb3: 7746171371333996581071252951 + limb0: 52843110463658527073564388058, + limb1: 36842417946259474220137712789, + limb2: 22275748398539977497247761101, + limb3: 6535663066271662012299285976 }, w9: u384 { - limb0: 40228073830528212078075864509, - limb1: 59507062887839039274698866386, - limb2: 59976099467909278443851940994, - limb3: 2992967258078189661313198350 + limb0: 49206372269382951544602546555, + limb1: 6682948615451691111889278165, + limb2: 3297704778510675269082182081, + limb3: 7849764951470684186050049602 }, w10: u384 { - limb0: 11473948496779551508315418804, - limb1: 71449205457395397810367220571, - limb2: 71523207358980728954051554404, - limb3: 3808467632916323506992673199 + limb0: 7816512651676711358505534329, + limb1: 35514693292227541468796644375, + limb2: 34651346012416775198094778771, + limb3: 4642464460617516990103708690 }, w11: u384 { - limb0: 71401381892974575842985741520, - limb1: 132209397265073590826702931, - limb2: 33335967108603259873167305747, - limb3: 763439560879484449186655521 + limb0: 36252935321478364400815546641, + limb1: 74674503447162767006689460306, + limb2: 78390054979562224119343720908, + limb3: 6711056385465833797992272286 } }, E12D { w0: u384 { - limb0: 7253756396699112239454847670, - limb1: 70504758864288340777836478499, - limb2: 72610714501807974455419257628, - limb3: 1966900730719664192926615415 + limb0: 529635492682913499822323271, + limb1: 9140128344881313105841997965, + limb2: 45331578027885432230223180092, + limb3: 5127529838708781293864441310 }, w1: u384 { - limb0: 6249977323682070396435305113, - limb1: 51563579960753381499491560890, - limb2: 1136232410559345273659422220, - limb3: 4283016267913293307826084195 + limb0: 23568132925983400702788242717, + limb1: 45579278568075563415472373783, + limb2: 71096093530991627143283538940, + limb3: 6425525750143647470868153312 }, w2: u384 { - limb0: 22321389437600295534727957402, - limb1: 71834390517167297664784943042, - limb2: 37367179595629625910981504947, - limb3: 6647477518750101862223246422 + limb0: 18495234590788988181049906639, + limb1: 11742754519477865275885600858, + limb2: 77452210997369041523545184565, + limb3: 1470156907685850353568357071 }, w3: u384 { - limb0: 29488184160352817614030807522, - limb1: 40185846835972001070424829469, - limb2: 65012074698016449698553219724, - limb3: 1517097084540444459999536370 + limb0: 78247757639794502171328849496, + limb1: 30869804924454689260187488253, + limb2: 70838651596782755106842218803, + limb3: 3581985933659626947650461821 }, w4: u384 { - limb0: 69022153661800187500691046517, - limb1: 69736697304054229035014944969, - limb2: 49124680053978908640473157051, - limb3: 927954175355822249372826705 + limb0: 47747541192409499446167420353, + limb1: 11246900932546318317234658842, + limb2: 25782106700945100047357842968, + limb3: 928060662771081325157871820 }, w5: u384 { - limb0: 39510390310555696193881318503, - limb1: 52374876747420173369397017940, - limb2: 6996176266501460980052102002, - limb3: 1558130045365243721169627882 + limb0: 46190453839555045296906671195, + limb1: 54902512333659474843209039207, + limb2: 27241959719633629341772221170, + limb3: 4101499474855421082329534199 }, w6: u384 { - limb0: 64215911362694998568335083690, - limb1: 56130401842214612742457130547, - limb2: 3444242534487407379180486014, - limb3: 3749552274299891700288305496 + limb0: 71710980269978685769627119110, + limb1: 50708498122180023371805503705, + limb2: 20013151411475877452481385762, + limb3: 5701355747847780981816659604 }, w7: u384 { - limb0: 4523789640880530054330904391, - limb1: 22100493145651830579463492015, - limb2: 62214901156524661205033018866, - limb3: 1618845946509134306201330327 + limb0: 37869933159027549741328453919, + limb1: 41132485972384139789334201851, + limb2: 35194757353895117939301887860, + limb3: 1254209885158518540248807595 }, w8: u384 { - limb0: 14947201157154190077805104871, - limb1: 24133059556691674529746527173, - limb2: 2468814392072626578802188259, - limb3: 1249729572774657215451263023 + limb0: 68626597782451585181722586490, + limb1: 14555819200143377701313326243, + limb2: 18644825559285391330270275950, + limb3: 6580878327940065372910187077 }, w9: u384 { - limb0: 13324048214513626914174652783, - limb1: 33777095068570131619074485646, - limb2: 19523836150202202373712357652, - limb3: 6204972790614098631674819257 + limb0: 49308466763780671668081493027, + limb1: 29508658340047818311120012222, + limb2: 8783107302818719409163475398, + limb3: 3534213394817630711314865881 }, w10: u384 { - limb0: 69409432349715565354242200063, - limb1: 32383884110465145347450062843, - limb2: 46744434698348495368972556531, - limb3: 6709506675866611173832296502 + limb0: 34661920743480798402388921828, + limb1: 49561654954198347954661741535, + limb2: 33254153825227599412644473190, + limb3: 6164567673776993114199657740 }, w11: u384 { - limb0: 30036853381441680778007958202, - limb1: 69657059783096336505466496457, - limb2: 27107016047783966006678811675, - limb3: 4523710429301562522258942174 + limb0: 23042329154447372240733737002, + limb1: 1609431290661052700801929655, + limb2: 64015579751174240339758173040, + limb3: 5521653780203180270574718952 } }, E12D { w0: u384 { - limb0: 30313982374002436795890927001, - limb1: 9160779999740510878762320706, - limb2: 75665848970306348934578592228, - limb3: 2431185712532808982289080356 + limb0: 60400736682123003322532353448, + limb1: 70146125655571030735294458955, + limb2: 72153716448531280145924461463, + limb3: 1425595414750359960720667492 }, w1: u384 { - limb0: 53279697289034142981301992964, - limb1: 57639595970949961773583598869, - limb2: 62525594151561842705837427724, - limb3: 7641867489629460670622488339 + limb0: 5504666276404523721567773375, + limb1: 29239572493140791832576608530, + limb2: 41819612230806046955596973643, + limb3: 3037140150302680843623685645 }, w2: u384 { - limb0: 46224702720346933810061553174, - limb1: 14910372217962859685497828043, - limb2: 2846313569531805719380064190, - limb3: 2982297405136726324061552551 + limb0: 9604937435701358649925887783, + limb1: 27341448018845483023863346373, + limb2: 46246826845856263790713333890, + limb3: 4450491029985898534775149145 }, w3: u384 { - limb0: 60929495328768349303008032439, - limb1: 14049521977743494456381564799, - limb2: 22136524996260427868754109537, - limb3: 3780247084024855622187282921 + limb0: 23494103463480940658738452482, + limb1: 31886357648644438511026988569, + limb2: 51898977653384660302483789954, + limb3: 6667904336838645141099108786 }, w4: u384 { - limb0: 36792485623398716308712989930, - limb1: 66937293794907094663136875805, - limb2: 32094212840955043963675226674, - limb3: 1983148144382313747085064912 + limb0: 65119886799208393796729268177, + limb1: 10238051895222683829159541452, + limb2: 10394124224970362148246701163, + limb3: 3362467034169462796467857680 }, w5: u384 { - limb0: 36875607390670517938131180961, - limb1: 35263114335970429903662651760, - limb2: 15593213684965005339038661703, - limb3: 2335508893302535661811222379 + limb0: 16392441433501734489299398685, + limb1: 47434956139751495967428396518, + limb2: 17112212729687897697308027743, + limb3: 3436622593366643746674599803 }, w6: u384 { - limb0: 51551566883050387027846651785, - limb1: 78564704562152796884315778096, - limb2: 62985322048388668402987185544, - limb3: 6360835330745174219444198847 + limb0: 74942217118452793698627479916, + limb1: 11262729983286994718382770111, + limb2: 5952091898510986228773102577, + limb3: 5611195259311108146560086531 }, w7: u384 { - limb0: 11802041683301050880230566259, - limb1: 17287659376412747998928217030, - limb2: 11343058319875782118468121033, - limb3: 3459504893936297035037695106 + limb0: 44078946736601705289520889596, + limb1: 47425422761067998306953270781, + limb2: 5042640714131025148536000405, + limb3: 5104297259107320120234704560 }, w8: u384 { - limb0: 43281010612589020216082119875, - limb1: 69552697870170532647602060211, - limb2: 53783620899902095228017997023, - limb3: 8035850190838661047098094161 + limb0: 28379621043696673513465432743, + limb1: 73534841537337333002757205117, + limb2: 36238187659279292175991005697, + limb3: 2993306833441249927138321604 }, w9: u384 { - limb0: 76657865975937231352003035170, - limb1: 14720847910731525207327716143, - limb2: 38379091160926083483595163319, - limb3: 4446359766543034277358474490 + limb0: 16522219944549727349974774471, + limb1: 48634964898848623993630470531, + limb2: 6201992892381231440531912638, + limb3: 6310416026152343126209615374 }, w10: u384 { - limb0: 45994489605221488235288652083, - limb1: 73889360118647068467194829180, - limb2: 8743134093479810776376687529, - limb3: 4159311433982146882766322411 + limb0: 58142199485378114737400092805, + limb1: 52580324323407264351468248962, + limb2: 22612575535727121394883751384, + limb3: 7970678319886525764129929494 }, w11: u384 { - limb0: 52232940596020739290789120681, - limb1: 57164271756752526539725448629, - limb2: 24350544183207679459176309283, - limb3: 1975024619368681485034500 + limb0: 17933896555501232789993123920, + limb1: 59454903759942027884809192638, + limb2: 46505590202378355041562195922, + limb3: 4930478679259075201276046055 } }, E12D { - w0: u384 { limb0: 1, limb1: 0, limb2: 0, limb3: 0 }, - w1: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w2: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w3: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w4: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w5: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w6: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w7: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w8: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w9: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w10: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 }, - w11: u384 { limb0: 0, limb1: 0, limb2: 0, limb3: 0 } + w0: u384 { + limb0: 19896428184129969693966853220, + limb1: 72019075876862140311050183530, + limb2: 33497000228523971746548823944, + limb3: 4418415768329897487795453950 + }, + w1: u384 { + limb0: 25804606930735857431119319525, + limb1: 65247925369547906002247385862, + limb2: 4982103700582848741409069018, + limb3: 7045979596921520966232474128 + }, + w2: u384 { + limb0: 2210476925695322846658557053, + limb1: 11340823722884866615899694397, + limb2: 42275957594546363246596960668, + limb3: 4767188304394981757784190099 + }, + w3: u384 { + limb0: 76965558714999022549831993043, + limb1: 17457146562569855391232473520, + limb2: 40720317378400247533549043987, + limb3: 4978000255519378286736633504 + }, + w4: u384 { + limb0: 63589365101823534200743857165, + limb1: 8358258414358091444744906577, + limb2: 10951861850170863126971537746, + limb3: 4426982945094383872678793170 + }, + w5: u384 { + limb0: 15653643491412793990798010821, + limb1: 67779918516944091704380022011, + limb2: 22004607171876804075605871966, + limb3: 446356988717240261963546322 + }, + w6: u384 { + limb0: 58511131011018522324504182837, + limb1: 44348420483496105306572613447, + limb2: 10955816422481341827704829005, + limb3: 7837312102892315272172486870 + }, + w7: u384 { + limb0: 20174727421804404709710725542, + limb1: 78065903121222482881297224176, + limb2: 5074771952755280534782374716, + limb3: 8007217396159568887944032859 + }, + w8: u384 { + limb0: 45136048351208572810912610305, + limb1: 34550369038102422495543388223, + limb2: 44282204521355245256543592923, + limb3: 2922395186524780692374563867 + }, + w9: u384 { + limb0: 76318682893225714708261184867, + limb1: 54331243741685636131940830919, + limb2: 43101445796206203806813755232, + limb3: 7045215303312358361879357909 + }, + w10: u384 { + limb0: 12318009166177469395146589895, + limb1: 42707445155875445863804813642, + limb2: 59194342808527345083492987556, + limb3: 5929270006715837766007660601 + }, + w11: u384 { + limb0: 62080794074215870049609885926, + limb1: 9886551245618757308190943283, + limb2: 4207239135774013424694838814, + limb3: 2815344931309463383726692917 + } + }, + E12D { + w0: u384 { + limb0: 58474426075318510691383569546, + limb1: 72227343671472057132097140009, + limb2: 24447912224695271267914790048, + limb3: 3680167823556871559422384211 + }, + w1: u384 { + limb0: 35010451867306309532372999863, + limb1: 30012156453115169120190722928, + limb2: 72646481552069355281233550075, + limb3: 3373059626441795833299052767 + }, + w2: u384 { + limb0: 5943857540809475705412414543, + limb1: 3955173262014551520895499974, + limb2: 43675309805212156511438150588, + limb3: 6846675283516527095892274217 + }, + w3: u384 { + limb0: 57492057346012417705604240234, + limb1: 42324194024360350794417293704, + limb2: 33974886728963901955811011438, + limb3: 1065255062154004368564239382 + }, + w4: u384 { + limb0: 17859289263203782979605446630, + limb1: 8039295243210167039281486735, + limb2: 32514202108390361016563816339, + limb3: 4770171388622664711907123579 + }, + w5: u384 { + limb0: 61310205245644218154535446581, + limb1: 48245186017201917677336819877, + limb2: 32191540032567324011641142706, + limb3: 5896501045477925662762510568 + }, + w6: u384 { + limb0: 20957006584285127864009373225, + limb1: 41277306456486377358505967123, + limb2: 47208797879826748497469134200, + limb3: 2862455017568528811755285398 + }, + w7: u384 { + limb0: 4610864829601100274787274326, + limb1: 43972446358384108121224661894, + limb2: 22367824039200022427561447516, + limb3: 2885383900070014214456777649 + }, + w8: u384 { + limb0: 34114355818873562042121001462, + limb1: 14521659551924426307345199612, + limb2: 17059467943413119354564602914, + limb3: 3071304341065389305184111193 + }, + w9: u384 { + limb0: 64276810546229373268901062286, + limb1: 15977263445233963484932691022, + limb2: 45849270007113092827631280485, + limb3: 3148059244322704147716777122 + }, + w10: u384 { + limb0: 2288542335834227442373693562, + limb1: 66859615748619688439639982126, + limb2: 20392922371415774797704878957, + limb3: 1196566350448394324252393142 + }, + w11: u384 { + limb0: 38392585105165470885412908202, + limb1: 23871511780223054048351598717, + limb2: 31102276078421477410767695240, + limb3: 2686367957321028363249268516 + } + }, + E12D { + w0: u384 { + limb0: 50929566766253990650867641851, + limb1: 7342971174546289233489208529, + limb2: 70429501029223340765075309856, + limb3: 7868468374505908752982839433 + }, + w1: u384 { + limb0: 50826584481114834660765981494, + limb1: 52817593549562651977201586525, + limb2: 2167895625539290385754059952, + limb3: 3033149717832623456863444122 + }, + w2: u384 { + limb0: 41407130413712349772653001500, + limb1: 76848989852906183380050354692, + limb2: 28453331052419209300003912327, + limb3: 6692149431270872510397563732 + }, + w3: u384 { + limb0: 845956740269719387415695990, + limb1: 73680105290427719788611163729, + limb2: 962074671456234941195206968, + limb3: 313432122286003388853379873 + }, + w4: u384 { + limb0: 11465310255678858565571245053, + limb1: 4110761320706833099181928605, + limb2: 48250183208946881185339838392, + limb3: 452937788036026728052298818 + }, + w5: u384 { + limb0: 41118691191450241003995647990, + limb1: 48415668808229494250479418079, + limb2: 45760568558325391726094962190, + limb3: 71422872293065749638199694 + }, + w6: u384 { + limb0: 71585178702386431948762076353, + limb1: 76501593252643156147931944408, + limb2: 44929387760161833313778464911, + limb3: 7523247624931653203824909276 + }, + w7: u384 { + limb0: 72631290406215721898237780340, + limb1: 62984846821576991130085032492, + limb2: 17076644057101747607873591579, + limb3: 2260826489400842519691038331 + }, + w8: u384 { + limb0: 20074354279279193990922988536, + limb1: 56559109084006022024870707059, + limb2: 26097807154382460763375463526, + limb3: 5004540520764128758105890636 + }, + w9: u384 { + limb0: 42788630598306309479190960847, + limb1: 31904106537013166065138055810, + limb2: 65611486644270248825208632528, + limb3: 6303908546218436531168515627 + }, + w10: u384 { + limb0: 62729639155752001485358990628, + limb1: 18005360032890892337737076863, + limb2: 59863498188553182903712122063, + limb3: 1293054880655663172510199380 + }, + w11: u384 { + limb0: 18414016128378613256618557548, + limb1: 213659016898471307497220892, + limb2: 13646572484004226678891724699, + limb3: 2210596024308822716018761082 + } + }, + E12D { + w0: u384 { + limb0: 73862315003726622624778414915, + limb1: 79187469086995217437677409431, + limb2: 65226831290647792117579411407, + limb3: 3212028233728423851870598339 + }, + w1: u384 { + limb0: 58666317150309649043740712324, + limb1: 73494803234594358371782186348, + limb2: 3290461960597597702505061067, + limb3: 5897221999416465052555198942 + }, + w2: u384 { + limb0: 56482206499762763046048901003, + limb1: 14417705827039120039873417584, + limb2: 64545329472666028940607928945, + limb3: 189630453744811287975235359 + }, + w3: u384 { + limb0: 37328839824761219260459682287, + limb1: 22766394669745855167005222639, + limb2: 8635455805875552148524205589, + limb3: 812411423488561591668204069 + }, + w4: u384 { + limb0: 23104079076808053334150010107, + limb1: 35020991664460710539017155654, + limb2: 1449829290462568021354665439, + limb3: 5056291037293476095295814909 + }, + w5: u384 { + limb0: 42577439077094577653899862475, + limb1: 5935339305607883776976203307, + limb2: 17623908148791347665394850756, + limb3: 3458777584437902261305610381 + }, + w6: u384 { + limb0: 78431701494381100768473193900, + limb1: 40177669263737921693684541172, + limb2: 34462869445869949889328621481, + limb3: 7043625553575128043027798470 + }, + w7: u384 { + limb0: 52011162344735237160170817346, + limb1: 55631774593422885801543513177, + limb2: 53481422492683236687226990985, + limb3: 3673636337270615070254947760 + }, + w8: u384 { + limb0: 15726681973764488421580328815, + limb1: 2738405085987712327277001638, + limb2: 66816591559651581332082458251, + limb3: 6930281872800270103446896326 + }, + w9: u384 { + limb0: 27966269427535309998368586654, + limb1: 757820022673635403121922637, + limb2: 14221004112269772880141329774, + limb3: 1322388913982832797313596196 + }, + w10: u384 { + limb0: 54567404932796881081275423135, + limb1: 21468478512457000741880431522, + limb2: 26688277706650939723025519284, + limb3: 7335815691375114737825463065 + }, + w11: u384 { + limb0: 45409454071140811856672799198, + limb1: 67805133236272452039608586315, + limb2: 23808720139453748418727976507, + limb3: 4886145910519355139920028821 + } }, ]; - let big_Q: Array = array![ u384 { - limb0: 55683074567170890530467766099, - limb1: 13003126245817453893696741217, - limb2: 32093553955156659895720849380, - limb3: 6382484485362664487302176471 + limb0: 50848591218503790127660706204, + limb1: 33300300513509751645186757329, + limb2: 59881858358351946954491061563, + limb3: 3478072357008902882002192158 + }, + u384 { + limb0: 45149910499813646089446558557, + limb1: 25593098878703023174629147058, + limb2: 56784324521355750432772763383, + limb3: 328519461807377150418474578 + }, + u384 { + limb0: 78337312724570033874319021247, + limb1: 30971041560325597405940216697, + limb2: 75837344869164196345422484881, + limb3: 435299829746231398477406632 + }, + u384 { + limb0: 905085026059816509263813395, + limb1: 18144001150226239373244324141, + limb2: 58652052549306377017508081062, + limb3: 3309357534362281944829545025 + }, + u384 { + limb0: 48434937533171854502173435331, + limb1: 37729969034944032331523263288, + limb2: 75872773878377553410606432096, + limb3: 4452498731086957590223928088 + }, + u384 { + limb0: 46430798745570631853810159431, + limb1: 65414445552828627782493417367, + limb2: 7350957500228951675305514199, + limb3: 1346467708432284181808298998 + }, + u384 { + limb0: 58936974413086940932327776296, + limb1: 32710883803930750880939412058, + limb2: 50023710226038974513948345163, + limb3: 770155885914008469502908009 + }, + u384 { + limb0: 75612957703939040273904754593, + limb1: 76184958175357221382244762008, + limb2: 10738176511609307048470966041, + limb3: 1629964995045172377377858659 + }, + u384 { + limb0: 34693911426870237190733434667, + limb1: 14968318297386093007401315613, + limb2: 59046621117620609224215718084, + limb3: 1636746864413836976178167713 + }, + u384 { + limb0: 6095138008268550862504735560, + limb1: 15996283756348389602059248699, + limb2: 24668266770762708415848078749, + limb3: 6003266447074509481706136793 + }, + u384 { + limb0: 63599586774928673335893129282, + limb1: 28564376599442073207174412568, + limb2: 30211315743162913212683646155, + limb3: 5985289252605126539304343547 + }, + u384 { + limb0: 74136442889258210343739634545, + limb1: 69717073144193304438675450777, + limb2: 16533580577963355731071736509, + limb3: 7122964127057532266616888529 + }, + u384 { + limb0: 69862397629651154493329165731, + limb1: 32867006652467205893006355864, + limb2: 15252804366372623969566321694, + limb3: 2584339185295351706328621431 + }, + u384 { + limb0: 31660239569242354175853193007, + limb1: 73372742222680206345700714980, + limb2: 27281135484835937191893402846, + limb3: 731181622580138071930660531 + }, + u384 { + limb0: 36366525611306153796897181934, + limb1: 53940789864821648440511042289, + limb2: 13540507179427483033277624728, + limb3: 214129096610239657259159477 + }, + u384 { + limb0: 48399668972583294637565814114, + limb1: 71991467163451764253267506198, + limb2: 68836958627756340485030256111, + limb3: 5432420212906307847938149736 + }, + u384 { + limb0: 58197318237086980399973855490, + limb1: 15564852897173545464128884465, + limb2: 27677230845749613517546737595, + limb3: 2216748474936322475997044281 + }, + u384 { + limb0: 6691819456223571553422112565, + limb1: 6255300847972373443065873495, + limb2: 47715220728858603814989092079, + limb3: 6087010699924687334124923306 + }, + u384 { + limb0: 53979296948241840789404657715, + limb1: 24883834275245729754851901668, + limb2: 6487399944929266369909428904, + limb3: 4569381471364070419963987774 + }, + u384 { + limb0: 5126676067340302132165683079, + limb1: 52556277599080268114224487976, + limb2: 25643807890605307446340272618, + limb3: 3429220121240157884798166536 + }, + u384 { + limb0: 53860003832015249660762161200, + limb1: 4243629322628745821529323679, + limb2: 20980128877982267466457251894, + limb3: 2554103517901704443336813696 + }, + u384 { + limb0: 77799790206407845379248169170, + limb1: 45535564650596027301700278455, + limb2: 76974605471415651696392295, + limb3: 4785229068771710621399720836 + }, + u384 { + limb0: 49269413753025752875014708962, + limb1: 63852443213811953749718304577, + limb2: 71192564793268255224154490230, + limb3: 4385705217079624860136210441 + }, + u384 { + limb0: 58884532969983468556915073114, + limb1: 2233871434989874947987941038, + limb2: 45968267041739609616273517343, + limb3: 380396722782897435851551774 + }, + u384 { + limb0: 25045470477140877885689471036, + limb1: 25303418097245597692598631996, + limb2: 61072794792846653096718900835, + limb3: 2591854127289187281126591035 + }, + u384 { + limb0: 21609657408324669231886721916, + limb1: 28870259395272556345550346450, + limb2: 63300487734051506305252242667, + limb3: 7693596417268554876510058980 + }, + u384 { + limb0: 71432227184901965107342347688, + limb1: 66573870192668177746290180110, + limb2: 27927897935903555849664596093, + limb3: 1416898915171632666278843800 + }, + u384 { + limb0: 26285774277803086344016243412, + limb1: 17226098981068172451302339280, + limb2: 46150702919013737321158895752, + limb3: 1625333033062725961417817981 + }, + u384 { + limb0: 62056492817400195961409581190, + limb1: 49208955941037629276415561202, + limb2: 57249623739339768138427738555, + limb3: 2395866100457148897047943203 + }, + u384 { + limb0: 51060460761604568508904956170, + limb1: 69713898721420817228351751293, + limb2: 58557474854606578780210105194, + limb3: 6935503786251123719701977184 + }, + u384 { + limb0: 7496522152588516541907299328, + limb1: 42073729199495395912793163548, + limb2: 51489121445932896505606429263, + limb3: 6439741476435619441514785563 + }, + u384 { + limb0: 50927366493602481621755741986, + limb1: 62920148606928830784917229817, + limb2: 56357488857301643480294287749, + limb3: 6024866638903043886769064230 + }, + u384 { + limb0: 31557856670578867428493776260, + limb1: 16079451990110719974318247332, + limb2: 46202162924890525447147227746, + limb3: 3788447782826893728028978747 + }, + u384 { + limb0: 45621933018126367109325517786, + limb1: 17847737890324912658636939010, + limb2: 755190573424306412853968306, + limb3: 201934309832516811474721054 + }, + u384 { + limb0: 56018485313379320742589331992, + limb1: 26200362303861838921593211499, + limb2: 5612653003154154643076586203, + limb3: 7036799271156801379624744533 + }, + u384 { + limb0: 1106317441075204221886280753, + limb1: 12111476353301356809351505340, + limb2: 57727077234701255660572573058, + limb3: 934535806737324254238890841 }, u384 { - limb0: 61620510785249350948093343004, - limb1: 38170867933589613589461767789, - limb2: 67408744474663005808486393056, - limb3: 5260507771716122002557470991 + limb0: 69869356810295547266914549557, + limb1: 24209385839176147152492750420, + limb2: 51996036318163536796243120301, + limb3: 4805105137038383349037749590 }, u384 { - limb0: 2662414886368126162855161410, - limb1: 70309282171476516759349793783, - limb2: 41165966909305672227290159608, - limb3: 1100781517721145682008678884 + limb0: 36071521074586771638947308244, + limb1: 26609890274125994353226893937, + limb2: 32576493728903996943479672532, + limb3: 7997366560269536881505729561 }, u384 { - limb0: 58450497707869723825468717189, - limb1: 17602092361223639956535264401, - limb2: 27167757388142945045271762246, - limb3: 7119296961067910733131448368 + limb0: 63850758308329972836308044400, + limb1: 65726790455984395236296620515, + limb2: 76976379813956005124555568191, + limb3: 6546693017342327243646433544 }, u384 { - limb0: 66140567273802510450774789057, - limb1: 189490802926929410353138960, - limb2: 9718262947915746568850744328, - limb3: 7131586065650899676418120414 + limb0: 28854611686074945942879726484, + limb1: 61842866270096810712215265367, + limb2: 30791925846310635214583074051, + limb3: 4658598527420583582208846917 }, u384 { - limb0: 33378508780183168781704851814, - limb1: 11458480595805093706243697853, - limb2: 27534994264445443965313902104, - limb3: 4135482856450214766538131821 + limb0: 1815018165261190733628781764, + limb1: 10939702924792183732541616010, + limb2: 3095367949241191566519515555, + limb3: 5348743545891402689855994768 }, u384 { - limb0: 59810893803936129244878606117, - limb1: 57014787188678484803102293025, - limb2: 36629044800306439916339855347, - limb3: 300170239480708293309425831 + limb0: 11301450182502923408807621120, + limb1: 51171147175303406993064181459, + limb2: 75479634305238615477911839027, + limb3: 1505745098486885990035604573 }, u384 { - limb0: 57186237160230255438543914746, - limb1: 7738127788685229708502441695, - limb2: 58803740274404064292574630519, - limb3: 5738302890695267263899644420 + limb0: 29560695436527501252076713215, + limb1: 43096415227250657457471763776, + limb2: 33799363771644868040459483601, + limb3: 2332691975874233951726716025 }, u384 { - limb0: 77228717098802226904308869009, - limb1: 11791110445821691865663965878, - limb2: 42245282083984713406040756152, - limb3: 7583913570776598878056094778 + limb0: 18498681571918146152514571708, + limb1: 529497615202552185365630706, + limb2: 44583240586203385749031729696, + limb3: 4381480606503586721761582723 }, u384 { - limb0: 55998645132505047551216838697, - limb1: 2935599733918793806013663377, - limb2: 46096580441339165735774805567, - limb3: 4079409801349431206202602160 + limb0: 15885060239837556650609928689, + limb1: 40601719867169502945348519535, + limb2: 33262607749317291426667412115, + limb3: 5534066296294224924193612845 }, u384 { - limb0: 10191684696180335449991178316, - limb1: 12087022546959584305574907517, - limb2: 68336839579871971926772484914, - limb3: 933408707193220123280566315 + limb0: 66794424705394755288831695933, + limb1: 13624370672401583200147059862, + limb2: 63283138238094537864731823373, + limb3: 4058159309946931291418999790 }, u384 { - limb0: 635561197001599210564805668, - limb1: 44204892419683602105020854990, - limb2: 25680207707320555629327857974, - limb3: 5260425931953729224816715932 + limb0: 17181692225649253924507483753, + limb1: 22646119254933326432479295038, + limb2: 10118082480159737639804227930, + limb3: 541714957542680507579838693 }, u384 { - limb0: 67517288737812355048840825323, - limb1: 76904402095207389195098282085, - limb2: 59340638627809615504935888042, - limb3: 7481369713545846422841147887 + limb0: 40843054972818260556362677428, + limb1: 63030659768754711770640929218, + limb2: 35033218936054815224576227140, + limb3: 2699418033193976524733758051 }, u384 { - limb0: 3690778328491623994140168582, - limb1: 11768425612033169647233962604, - limb2: 77242928998611007271168012885, - limb3: 5211048849952418613019342768 + limb0: 44688782205701325389777004643, + limb1: 70598173706125223492654976283, + limb2: 40855111185173151238687906451, + limb3: 1734749909126470518202462663 }, u384 { - limb0: 35774909208067984908316300704, - limb1: 53192211446842238278114299535, - limb2: 4392909734284800525779149933, - limb3: 2632675428134960761111256990 + limb0: 54869777429763818301906206525, + limb1: 77911220255518450329166918726, + limb2: 59403570378982150032711577390, + limb3: 2992385740906820152667662265 }, u384 { - limb0: 9155239118057520635752057923, - limb1: 77369047288148257567439559994, - limb2: 51544572709992347502313936020, - limb3: 3462404528198375560314407581 + limb0: 12200795712502645101203113626, + limb1: 64430167494505986702334323333, + limb2: 20558803733589721284824182764, + limb3: 240902896052630684733938214 }, u384 { - limb0: 3516365459668831248069363385, - limb1: 28336748901572323378247344703, - limb2: 19719623273698569570035269246, - limb3: 3678254676081028377823740607 + limb0: 68966066449706429436619108871, + limb1: 71371760416243319388573099161, + limb2: 40286123087349457492875219568, + limb3: 383790739984449400506374579 }, u384 { - limb0: 51476969237436690380858028938, - limb1: 35931324701552345389232059225, - limb2: 3260636306209861237768230667, - limb3: 5357640784739957968697559045 + limb0: 59681188555126276152471092338, + limb1: 75460350543202341105674833049, + limb2: 37000478738839454601794228661, + limb3: 5045534079643848380350525538 }, u384 { - limb0: 11032554257083305059765201892, - limb1: 38005603764800904604981500991, - limb2: 3582162869648669668676381391, - limb3: 2964856537156930933191149020 + limb0: 38640392440588770877546360326, + limb1: 62149716087877301518061499925, + limb2: 17090070042906891288354114353, + limb3: 1196957235668441931641964909 }, u384 { - limb0: 69020111136413332152183955652, - limb1: 46427318915997885554191573052, - limb2: 76081172191166897920163232544, - limb3: 7391795104615804788789055547 + limb0: 12861211556752680571293702598, + limb1: 12013829019855837941479379533, + limb2: 1589081540267222610175804142, + limb3: 5216131356047758763843239461 }, u384 { - limb0: 76859485915392823385527176588, - limb1: 33499157517907160305567318635, - limb2: 53090654256232791775602770542, - limb3: 2732817802648083871536378058 + limb0: 73996747292827500893005063545, + limb1: 13666435406006914150564848940, + limb2: 71395937566656134796739352843, + limb3: 395704555325385599152970369 }, u384 { - limb0: 14371120269093727333982035901, - limb1: 77099819409979264170496403186, - limb2: 70512853698802111533925617933, - limb3: 7670028770109918402487073876 + limb0: 371893839433529425023631420, + limb1: 43023638300769650132177778257, + limb2: 6466965966602571201911348403, + limb3: 3437352142372294254224295993 }, u384 { - limb0: 44508027576280049429472625806, - limb1: 27607605753322029811328421925, - limb2: 77758819331138683804874824939, - limb3: 7688565116175187138958913144 + limb0: 73012650696453719207468285444, + limb1: 71607795248500992286806900307, + limb2: 53992428473754751600678181720, + limb3: 3570637165392869426034902863 }, u384 { - limb0: 58005637016758641299990383248, - limb1: 1384746671475149271983487729, - limb2: 76009378973218886582271833245, - limb3: 2184592764962787212133885432 + limb0: 49787653407292739137193481585, + limb1: 47730506753117940474118975055, + limb2: 5338564104425137715045128672, + limb3: 870893568542747125543815135 }, u384 { - limb0: 46344913257019365175535114828, - limb1: 53447154852998337426309422641, - limb2: 38254385626530740832322981152, - limb3: 1655353301364652249121831985 + limb0: 65139986840649196745820954060, + limb1: 52133338591617220569123360384, + limb2: 30545237548378815153152048858, + limb3: 3410933440903779684852173203 }, u384 { - limb0: 46737895140035930282717118457, - limb1: 8971407314650267312373526144, - limb2: 17077357284326046518007261532, - limb3: 662483837346668632991263553 + limb0: 35218877248603855275605927764, + limb1: 29318886275105700290568588613, + limb2: 39415775191327715459672289529, + limb3: 6876202135511940638905394580 }, u384 { - limb0: 9498336668133780900712280866, - limb1: 8379169137523978412261404082, - limb2: 63071676681950370775419356847, - limb3: 3777143484598678270304206875 + limb0: 29202108974354971051609015011, + limb1: 70612468846257986480736865006, + limb2: 65011402514646904518895508875, + limb3: 7767030287731131219223525737 }, u384 { - limb0: 48307219758474171332780486835, - limb1: 30238777837995855680345977622, - limb2: 13852601768157773947913368037, - limb3: 6439433742569282515756828120 + limb0: 32449118708903519000261851178, + limb1: 54004308818618407472864621217, + limb2: 50647320578191894258335343904, + limb3: 7669067272389707353971940090 }, u384 { - limb0: 51243733462296271464705677460, - limb1: 18614769384509923697508324939, - limb2: 71988564040935557971085402196, - limb3: 7947624156004643168807817783 + limb0: 11268861921102275619646673469, + limb1: 38207088347430061066970701661, + limb2: 78741831751244242454401935262, + limb3: 4837795521715067268083749323 }, u384 { - limb0: 25348089656856432394389818662, - limb1: 16357568627384069407440766242, - limb2: 63064542748393309106989793497, - limb3: 5341294298410474634087980736 + limb0: 14732493923934662887136940029, + limb1: 59412109374865008011605361934, + limb2: 26720078875526714437229788628, + limb3: 3138512453039842935480125711 }, u384 { - limb0: 11103047419772007592422530118, - limb1: 12671478251486468295952728354, - limb2: 18322218277773105831747473705, - limb3: 7801948430637459259338842495 + limb0: 77384574659442018540116292243, + limb1: 47408473762079671272530739796, + limb2: 65431238619286606487961588886, + limb3: 4540440529042015928567350867 }, u384 { - limb0: 42540791174124037548826304352, - limb1: 48349045709756312114212857119, - limb2: 27735572718245366034925907146, - limb3: 7294419207696838499248578631 + limb0: 48394055976120189819911621912, + limb1: 28751879056483813076794407340, + limb2: 24167026289006762071056996487, + limb3: 5497709617609981326349127707 }, u384 { - limb0: 33277880406397457546445969063, - limb1: 65475377420221259561218186424, - limb2: 55799341152449767699033888189, - limb3: 2786094200657537994757104174 + limb0: 15097471135690332296722638635, + limb1: 29943984092378792500704949372, + limb2: 54784195576180964440699702944, + limb3: 7388743676734362618390921753 }, u384 { - limb0: 15633997254504193491645892469, - limb1: 54035664201781268528037614816, - limb2: 10810289857324517221976226600, - limb3: 1236889175269126229362721318 + limb0: 27625308386814362853538022955, + limb1: 40437360071140893531826862587, + limb2: 76970977894551473275873992941, + limb3: 6797370757264210995343475842 }, u384 { - limb0: 24464596344232166655304891010, - limb1: 50384310658049587336952626463, - limb2: 75159861726205649906681730437, - limb3: 2001711830596335686970428171 + limb0: 37930982645730731842554090539, + limb1: 60222869428072209328253716873, + limb2: 40719858147738032442892366364, + limb3: 2237038887631310346903606124 }, u384 { - limb0: 74910278056671874034299850181, - limb1: 5947691995818028144347879111, - limb2: 22770347461875783628998625509, - limb3: 6574905478979170046078247343 + limb0: 63321875962236589186188856429, + limb1: 36732587147680876098167535284, + limb2: 2733430763264217979223028647, + limb3: 808430459605994168071335411 }, u384 { - limb0: 13300826856148199800701215816, - limb1: 62192525612646598619862469105, - limb2: 46819584876603596229627550857, - limb3: 1517885512500806912813221942 + limb0: 71831900095021218157501581082, + limb1: 19970044980870019330716099402, + limb2: 8053895909776625788797231233, + limb3: 4900610197097265265828865692 }, u384 { - limb0: 13525658364382044141085661357, - limb1: 34202059466144204991276820484, - limb2: 42139504581972483137372380208, - limb3: 3993582122245343909871350117 + limb0: 35780689284827607052758447469, + limb1: 47548387858248603891266943369, + limb2: 64910514200909961575105001513, + limb3: 1479727303846331451915677654 }, u384 { - limb0: 41818169360717375736958256703, - limb1: 27569101426412420760512103850, - limb2: 10707116133251317775582992072, - limb3: 3999987060717900259565215683 + limb0: 42540139168196203738802699577, + limb1: 69238694532406663653059222069, + limb2: 63186314354357358962780969419, + limb3: 2226466648191380395832687850 }, u384 { - limb0: 53761493391472075088913496380, - limb1: 35634854568438384030484485382, - limb2: 15081584474973425093373066636, - limb3: 7550684786347618230662904323 + limb0: 10375267708283530006058334001, + limb1: 19966646096486130401530426832, + limb2: 44528500660539901297409954, + limb3: 4575880771389190740841347876 }, u384 { - limb0: 3904871756683687918611215638, - limb1: 65835654121216021898884720516, - limb2: 15473244964349572711679005653, - limb3: 5853802088009115593197968855 + limb0: 31098662281859805559058742703, + limb1: 12560499172608148955028582356, + limb2: 78684677588203347860244419329, + limb3: 7251846420931516709734716095 }, u384 { - limb0: 32888818177334600014552450907, - limb1: 1928474633018633964521930002, - limb2: 40879728696591314246210114676, - limb3: 1007203642935178001682689921 + limb0: 78663537485117692588753720036, + limb1: 45390602908039260232146696176, + limb2: 59320525889890305399470916560, + limb3: 2716407404930435103394696830 }, u384 { - limb0: 44955523209526421511681112720, - limb1: 61908914773357655828040480154, - limb2: 41006643815706929316603619631, - limb3: 7032818150543007084448946649 + limb0: 21256717043896896856082103085, + limb1: 64708795728779310890321045473, + limb2: 29318735452216070247699842793, + limb3: 1063784333939110028895783687 }, u384 { - limb0: 11260064088538391647005759052, - limb1: 10697977032426043885137632830, - limb2: 8795269165102701768510258352, - limb3: 2667606342870471001280254839 + limb0: 54104774950967906460519063059, + limb1: 16152324943097495300490422817, + limb2: 59398800430410003718807013966, + limb3: 6909339783806492233493384114 }, u384 { - limb0: 72840647191822953410131247387, - limb1: 64340672262263282138448181117, - limb2: 31764579307507742460608453843, - limb3: 1570897225693296431523646254 + limb0: 14841784590049381612330262762, + limb1: 34387538726891966651321097557, + limb2: 70092905650044751947138135879, + limb3: 7106450714503190967019040884 }, u384 { - limb0: 2876332608052102182683626103, - limb1: 43824618477127195752088224737, - limb2: 39300130184758559407645056391, - limb3: 3568563516003572304537915337 + limb0: 36802933855446996599884722814, + limb1: 67369016275017000047227874008, + limb2: 14022691644233414233418942853, + limb3: 2115003854731440617084225112 }, u384 { - limb0: 23955956684085388853645404897, - limb1: 26051584475177458057000753011, - limb2: 22116082953775875032676864602, - limb3: 1796757020354786118563353384 + limb0: 78673058680881417832548052506, + limb1: 22494547807872583688911085583, + limb2: 9466788489362944263149186509, + limb3: 2673480332193954480187531302 }, u384 { - limb0: 68660974040232534213553368647, - limb1: 9756859075804926965729314741, - limb2: 77117366599283816888873405243, - limb3: 3265539071241983815220920128 + limb0: 37980293752762547792619192347, + limb1: 59436060467281447087748110709, + limb2: 38049786386273225488691699859, + limb3: 1878901932434152155697932083 }, u384 { - limb0: 31495810935529504794066096131, - limb1: 27343949268920211293105730240, - limb2: 29200366391739347306051397398, - limb3: 3670249793795491557387618942 + limb0: 76935168453607961049784283461, + limb1: 32458229989041996262484172975, + limb2: 18507021566244318766639078578, + limb3: 2126747668600382929710747285 }, u384 { - limb0: 67290510299232506555521789900, - limb1: 5746543112543803445929323288, - limb2: 20842924473307218051818174966, - limb3: 5630767393147373984926606293 + limb0: 18569510738606551181573240884, + limb1: 92045762668037923749403352, + limb2: 23345655754198335561743674217, + limb3: 7591484736774360713414440721 }, u384 { - limb0: 10300251587796961685691924075, - limb1: 75813913423698599550789298350, - limb2: 60471828251122582438942836428, - limb3: 5802723275688466320369050177 + limb0: 22534516446536233417647232707, + limb1: 9064596280913222333697506223, + limb2: 9151306915005771967451093524, + limb3: 1907027493218582014250162529 }, u384 { - limb0: 32514104955374898823579514696, - limb1: 41557351713094739909172181164, - limb2: 26542939389382737591947052153, - limb3: 4730200352847598148171149925 + limb0: 72226609431471957985414581346, + limb1: 60036785586109994421864634310, + limb2: 55289773984631661672744624084, + limb3: 1665096021955908811489550271 }, u384 { - limb0: 56792651689481821771962232108, - limb1: 54670186944046213617570206861, - limb2: 36130420766062580517097870922, - limb3: 6018635284493537580836633149 + limb0: 17456341243261832248249498284, + limb1: 23061406085218814072033552518, + limb2: 57478424045822151705434248229, + limb3: 7502385415423388811763396890 }, u384 { - limb0: 49585438928797928078048108759, - limb1: 74953788009846986702833133875, - limb2: 3145897378713319937323980742, - limb3: 1190384527223748265953307221 + limb0: 71647304041332725347676183393, + limb1: 7585042489069129368288688716, + limb2: 54695779307056858504127206679, + limb3: 4427379122351702965891331298 }, u384 { - limb0: 60680740073768528014133504802, - limb1: 36305911318343178790175039185, - limb2: 6397587971897042375378355570, - limb3: 4810774212503223466791357712 + limb0: 11851488463339375950452775465, + limb1: 78648311350969049358127201073, + limb2: 23279624817102952692946225880, + limb3: 1385391622312853701752284902 }, u384 { - limb0: 57015604990968794183794202106, - limb1: 41349997202925989660618922671, - limb2: 48596031209420526140967108538, - limb3: 6640592875344388692681982366 + limb0: 57905476394307217504433048479, + limb1: 28040118009078435905591426353, + limb2: 20247383739567403672571853738, + limb3: 643762238539226399466502077 }, u384 { - limb0: 61069040350590510714781704529, - limb1: 47455528078038686760974776462, - limb2: 60807966628902510536236247395, - limb3: 4208391977703170337166264744 + limb0: 2562592204589208057999233535, + limb1: 33041735342573318143289826405, + limb2: 66983482332849207745737955248, + limb3: 362798288423486807751293324 }, u384 { - limb0: 52291729723104886985567502483, - limb1: 15590218908908335660696193611, - limb2: 21851663547847073716348734086, - limb3: 8008199232504007206287859929 + limb0: 22655814544158979724510403423, + limb1: 45594510865753595936112650919, + limb2: 36874522533268778121800178045, + limb3: 556612262038597944762009441 }, u384 { - limb0: 15165997076067659146868472217, - limb1: 37771068248340616112164118063, - limb2: 66537050621836262258771100793, - limb3: 7333420320474003752942730112 + limb0: 2582238449503416587289523000, + limb1: 59999256863739242210109958498, + limb2: 55274696718792424221271754126, + limb3: 7436830584459878740325641932 }, u384 { - limb0: 5748880251485322871544448184, - limb1: 63270948363136285526395884866, - limb2: 73578536409831207346257807038, - limb3: 5927122365796442385654991271 + limb0: 67489594787577149459890860870, + limb1: 14082670983731002255452901363, + limb2: 4692472851494478381064327680, + limb3: 5016051137327557093267018465 }, u384 { - limb0: 71839625709277749312313963179, - limb1: 35436386871400532739351674738, - limb2: 24828226581940467823789643004, - limb3: 1282166791824881313994761197 + limb0: 76883286253931793651192604225, + limb1: 48027048607229179815861112398, + limb2: 27555864998914046000040903737, + limb3: 7038535119670479259662585895 }, u384 { - limb0: 49917196494974489818403771837, - limb1: 6029282619991710418960381709, - limb2: 10497800450992660453307314011, - limb3: 5752785392564826386124291170 + limb0: 40123329898425568298084919585, + limb1: 9438917688203115811245567556, + limb2: 26763118857149100557742240932, + limb3: 4594462259142155493519204169 }, u384 { - limb0: 46431663698655318537923542239, - limb1: 15299197478561367669573033226, - limb2: 35017762804290628974226497152, - limb3: 6181407583979605090362823913 + limb0: 9524172092616483812403819571, + limb1: 46365404981600670837369666963, + limb2: 40313103415394832227995236414, + limb3: 6062678675960482627132552384 }, u384 { - limb0: 66674402772042579604504742842, - limb1: 32831850090670893137858987950, - limb2: 8294536627078175318274707256, - limb3: 560593288270128345153060743 + limb0: 49456015267070059072146948422, + limb1: 32267024806682780427542121764, + limb2: 11080400371095934117393092278, + limb3: 5972976948764162479980374329 }, u384 { - limb0: 16126177137026492103497213484, - limb1: 66415921667201665230370040859, - limb2: 17784281949261329357663068837, - limb3: 287343617115281520732205230 + limb0: 6065184557625710987611045142, + limb1: 60623227719027452533398655870, + limb2: 14268357583297227890390924341, + limb3: 5598485540349127346592274300 }, u384 { - limb0: 7495749905775475760064644489, - limb1: 41806875767841576398222554291, - limb2: 36104601549605675719312247319, - limb3: 1204663670060136226890098794 + limb0: 58103682833887660092023198080, + limb1: 30172185082184835980749064706, + limb2: 57816141514708678011828128351, + limb3: 6332095794250238222742536601 }, u384 { - limb0: 40502199588936256435121114067, - limb1: 24340410873511501940266476507, - limb2: 15254175014914140232381982016, - limb3: 7299943330799852790907991098 + limb0: 24069310553607490564225446975, + limb1: 78691700850187365955156448467, + limb2: 8961038119991251971410425013, + limb3: 3097574703154722114726442034 }, u384 { - limb0: 76147536576121200279736420230, - limb1: 50307812519132381075361626184, - limb2: 19287396010639064049743997369, - limb3: 844942279720022247779797440 + limb0: 24448483816436450376359868121, + limb1: 60642763978707855161122089645, + limb2: 66283550652534893974391098430, + limb3: 7063116352111874986124584221 }, u384 { - limb0: 21196057518215077206155052537, - limb1: 70261057410882233640831025185, - limb2: 3514990121369214781182224018, - limb3: 5369104474233537158155974287 + limb0: 77279251447215809411573624228, + limb1: 65777922275235356804180742325, + limb2: 51445136103728244344043928366, + limb3: 6159977024285170554208303277 }, u384 { - limb0: 40196375826184218787247389737, - limb1: 42886078694693641487629007415, - limb2: 2690179773658680161914196045, - limb3: 6147871695297965206382091739 + limb0: 52934248079907744079885189665, + limb1: 450976718073969134848793178, + limb2: 20069042441203711168829172706, + limb3: 5246624921124178055997902458 } ]; - let precomputed_miller_loop_result: Option = Option::None; - let small_Q: Option = Option::None; + let precomputed_miller_loop_result = Option::Some( + E12D { + w0: u384 { + limb0: 12889953025643058015645302840, + limb1: 76445589533688656566592339156, + limb2: 16166445895633936737205759217, + limb3: 7639526489913685118945448920 + }, + w1: u384 { + limb0: 7239529199396189426393270844, + limb1: 25047427631715549348167832833, + limb2: 54993045922525114280097561294, + limb3: 877348618581063686427472151 + }, + w2: u384 { + limb0: 8268335213854148747320346851, + limb1: 52308927268369756954434997805, + limb2: 46660182237117176106810551362, + limb3: 2518726936621561949074736542 + }, + w3: u384 { + limb0: 224184167777154067932500451, + limb1: 32741846656418358177533823280, + limb2: 41651045344613819822255016286, + limb3: 4156715069652439360686217822 + }, + w4: u384 { + limb0: 44554996749395066466110190315, + limb1: 46900354779543414328410168211, + limb2: 37026869212876759390655587462, + limb3: 1025749336444290373707881539 + }, + w5: u384 { + limb0: 61856380050569994543361112763, + limb1: 29721094782051780816975372788, + limb2: 37838613035182016920484759276, + limb3: 4030335797336866590591056094 + }, + w6: u384 { + limb0: 10941821065034524217235048821, + limb1: 23434368096005721740179402996, + limb2: 13225043034835751410161437812, + limb3: 7914310382134534488755180975 + }, + w7: u384 { + limb0: 17332971138997523143458509153, + limb1: 74158486480466389807473465841, + limb2: 54193709453698682568595830365, + limb3: 6532609241374821919651735346 + }, + w8: u384 { + limb0: 51987577349850807575393889730, + limb1: 56743271846775859499497193601, + limb2: 35964383805751824362620915582, + limb3: 4899968376167694353247565375 + }, + w9: u384 { + limb0: 75314204384263861958005153400, + limb1: 38874113251459228077728634376, + limb2: 75990846099145994589920136906, + limb3: 7566909280784024063534563778 + }, + w10: u384 { + limb0: 51603311697292158261468703058, + limb1: 6861087616175187031653152452, + limb2: 28389180576697834151955558750, + limb3: 238795474809238808154079116 + }, + w11: u384 { + limb0: 70492467913421109791421160334, + limb1: 30482951034978800322782178722, + limb2: 1507489579041818946484840011, + limb3: 4914682319583636842126898151 + } + } + ); + let small_Q = Option::Some( + E12DMulQuotient { + w0: u384 { + limb0: 486651497884820652943332174, + limb1: 60757298520102311890861675504, + limb2: 76746404796501151506174171932, + limb3: 3813701581817208479877570693 + }, + w1: u384 { + limb0: 18033774255709574045698309371, + limb1: 31021767732231577074411325278, + limb2: 75832844229804681767109302990, + limb3: 7145638291645307296582683594 + }, + w2: u384 { + limb0: 25676050709673906239607998936, + limb1: 78379729837352495916352579555, + limb2: 8379203647522210528633328497, + limb3: 5664035738374122248564695962 + }, + w3: u384 { + limb0: 2028556707395942098356676697, + limb1: 40147309648139493643903838567, + limb2: 46006880129800350615183629756, + limb3: 2199316174326101817289598794 + }, + w4: u384 { + limb0: 25120587688350099257951825267, + limb1: 65868971805270020529856929681, + limb2: 6992422026330872042519201979, + limb3: 1566878165885474682203647098 + }, + w5: u384 { + limb0: 67049787088566539298173471097, + limb1: 73329704237813795062982725696, + limb2: 15742200551124943413274805498, + limb3: 572324107456154526536712392 + }, + w6: u384 { + limb0: 48279360972097658072358061486, + limb1: 10800747539606121220862989371, + limb2: 17833636436684655617896197723, + limb3: 5816145801739752283602113425 + }, + w7: u384 { + limb0: 61558932129418187153192927659, + limb1: 16532407173106348835579755202, + limb2: 31636912661821976491278925939, + limb3: 7105303161345992120739208216 + }, + w8: u384 { + limb0: 43225002812584718988831636734, + limb1: 73767892424736431383228299704, + limb2: 47776600680908011215261118066, + limb3: 5611514542291395275232312226 + }, + w9: u384 { + limb0: 69227727233410799570696624587, + limb1: 41861409287477665065648795112, + limb2: 31993728162629294215662501141, + limb3: 1097945481076493031030685836 + }, + w10: u384 { + limb0: 34450650842729123818636529180, + limb1: 14543231745762050272492834263, + limb2: 62994521766094866181865399797, + limb3: 4939884616000555973955848251 + } + } + ); let res = multi_pairing_check_bls12_381_3_pairs( pair0, diff --git a/tools/starknet_cli.py b/tools/starknet_cli.py index d9b60bb12..2223efc7f 100644 --- a/tools/starknet_cli.py +++ b/tools/starknet_cli.py @@ -36,7 +36,7 @@ class MultiPairingCheck2PairsInput: Ris: list[structs.E12D] = None big_Q: structs.u384Array = None - def to_cairo1_test(self): + def to_cairo1_test(self, test_name: str = None): n_pairs = 2 input_code = "" @@ -52,12 +52,21 @@ def to_cairo1_test(self): if self.curve_id == CurveID.BLS12_381: struct_list.remove(self.lambda_root) - struct_names = [struct.name + ('.span()' if struct.name == "Ris" else '') for struct in struct_list] + struct_names = [ + struct.name + (".span()" if struct.name == "Ris" else "") + for struct in struct_list + ] for struct in struct_list: input_code += struct.serialize() + + test_name = ( + test_name + if test_name + else f"{CurveID(self.curve_id).name}_mpcheck_{n_pairs}P" + ) code = f""" #[test] - fn test_{CurveID(self.curve_id).name}_mpcheck_{n_pairs}P() {{ + fn {test_name}() {{ {input_code} let res = multi_pairing_check_{self.curve_id.name.lower()}_{n_pairs}_pairs({', '.join(struct_names)}); assert!(res); @@ -72,7 +81,7 @@ class MultiPairingCheck3PairsInput(MultiPairingCheck2PairsInput): precomputed_miller_loop_result: structs.E12D | None = None small_Q: structs.E12DMulQuotient | None = None - def to_cairo1_test(self): + def to_cairo1_test(self, test_name: str = None): n_pairs = 3 input_code = "" @@ -91,12 +100,25 @@ def to_cairo1_test(self): if self.curve_id == CurveID.BLS12_381: struct_list.remove(self.lambda_root) - struct_names = [struct.name + ('.span()' if struct.name == "Ris" else '') for struct in struct_list] + struct_names = [ + struct.name + (".span()" if struct.name == "Ris" else "") + for struct in struct_list + ] for struct in struct_list: - input_code += struct.serialize() + if struct.name in ["precomputed_miller_loop_result", "small_Q"]: + input_code += struct.serialize(is_option=True) + else: + input_code += struct.serialize() + + test_name = ( + test_name + if test_name + else f"{CurveID(self.curve_id).name}_mpcheck_{n_pairs}P" + ) + code = f""" #[test] - fn test_{CurveID(self.curve_id).name}_mpcheck_{n_pairs}P() {{ + fn {test_name}() {{ {input_code} let res = multi_pairing_check_{self.curve_id.name.lower()}_{n_pairs}_pairs({', '.join(struct_names)}); assert!(res); @@ -152,31 +174,41 @@ def multi_pairing_check_calldata( for pair in pairs: p_q_input.extend(pair.to_pyfelt_list()) mpcheck_circuit.write_p_and_q(p_q_input) - _, lambda_root, scaling_factor, scaling_factor_sparsity = ( + _, lambda_root, lambda_root_inverse, scaling_factor, scaling_factor_sparsity = ( mpcheck_circuit.multi_pairing_check(len(pairs), M) ) relations = mpcheck_circuit.accumulate_poly_instructions[0] print(relations.n) print(len(relations.Ris)) - n_relations_with_ci = relations.n - 1 if extra_pair is not None else relations.n init_hash = f"MPCHECK_{curve_id.name}_{len(pairs)}P" - print(f"init_hash : {init_hash}") + # print(f"init_hash : {init_hash}") hasher = CairoPoseidonTranscript( init_hash=int.from_bytes(init_hash.encode(), byteorder="big") ) - print(f"s0 init : {hasher.s0}") + # print(f"s0 init : {hasher.s0}") # Hash Inputs for i, pair in enumerate(pairs): hasher.hash_limbs_multi(pair.to_pyfelt_list()) print(f"s0 after pair {i} : {hasher.s0}") - hasher.hash_limbs_multi(lambda_root) - print(f"s0 after lambda root : {hasher.s0}") + if curve_id == CurveID.BN254: + hasher.hash_limbs_multi(lambda_root) + + hasher.hash_limbs_multi(lambda_root_inverse) + # print(f"s0 after lambda root : {hasher.s0}") hasher.hash_limbs_multi(scaling_factor, sparsity=scaling_factor_sparsity) - print(f"s0 after scaling factor : {hasher.s0}") + # print(f"s0 after scaling factor : {hasher.s0}") # Hash Ri's to derive c0 - for i, Ri in enumerate(relations.Ris): + passed_Ris = ( + relations.Ris if curve_id == CurveID.BLS12_381 else relations.Ris[1:] + ) # Skip first Ri for BN254 as it known to be one (lambda_root*lambda_root_inverse) result + passed_Ris = ( + passed_Ris if extra_pair is None else passed_Ris[:-1] + ) # Skip last Ri if extra pair is provided as it is known to be 1. + n_relations_with_ci = len(passed_Ris) + (1 if curve_id == CurveID.BN254 else 0) + print(f"len(passed_Ris) : {len(passed_Ris)}") + for i, Ri in enumerate(passed_Ris): # assert Ri_sparsity == None, f"R{i} is not sparse, got {Ri_sparsity}" hasher.hash_limbs_multi(Ri) c0 = hasher.s1 @@ -186,13 +218,12 @@ def multi_pairing_check_calldata( field = mpcheck_circuit.field cis = [field(c0)] - print(f"n_relations_with_ci : {n_relations_with_ci}") for i in range(n_relations_with_ci - 1): cis.append(cis[-1] * cis[-1]) - print(f"c_{i+1} : {io.int_to_u384(cis[-1])}") - + # print(f"c_{i+1} : {io.int_to_u384(cis[-1])}") assert len(cis) == n_relations_with_ci, f"Wrong number of cis, got {len(cis)}" - print(f"len(cis) : {len(cis)}, last ci : {cis[-1].value} {io.int_to_u384(cis[-1])}") + + # print(f"len(cis) : {len(cis)}, last ci : {cis[-1].value} {io.int_to_u384(cis[-1])}") # Compute Big Q : sum(ci*Qi) for i in [0, n - 2] big_Q_expected_len = get_max_Q_degree(curve_id.value, len(pairs)) + 1 big_Q = Polynomial([field.zero()]) @@ -203,7 +234,7 @@ def multi_pairing_check_calldata( big_Q_expected_len - len(big_Q_coeffs) ) assert len(big_Q_coeffs) == big_Q_expected_len - print(f"big_Q_coeffs : {io.int_to_u384(big_Q_coeffs[0])}") + # print(f"big_Q_coeffs : {io.int_to_u384(big_Q_coeffs[0])}") hasher.hash_limbs_multi(big_Q_coeffs) z = hasher.s0 print(f"z : {z}") @@ -223,12 +254,13 @@ def multi_pairing_check_calldata( P_irr = get_irreducible_poly(curve_id.value, 12) big_Q_of_z = big_Q.evaluate(z) P_of_z = P_irr.evaluate(z) - print(f"big_Q_of_z : {io.int_to_u384(big_Q_of_z)}") - print(f"P_of_z : {io.int_to_u384(P_of_z)}") + # print(f"big_Q_of_z : {io.int_to_u384(big_Q_of_z)}") + # print(f"P_of_z : {io.int_to_u384(P_of_z)}") assert lhs == big_Q_of_z * P_of_z - print(len(relations.Ris)) + # print(len(relations.Ris)) if extra_pair is not None: - small_Q = relations.Qis[-1] + small_Q = relations.Qis[-1].get_coeffs() + small_Q = small_Q + [field.zero()] * (11 - len(small_Q)) else: small_Q = None @@ -245,7 +277,7 @@ def multi_pairing_check_calldata( pair1=pairs_structs[1], lambda_root=structs.E12D(name="lambda_root", elmts=lambda_root), lambda_root_inverse=structs.E12D( - name="lambda_root_inverse", elmts=lambda_root + name="lambda_root_inverse", elmts=lambda_root_inverse ), w=structs.MillerLoopResultScalingFactor( name="w", @@ -259,7 +291,7 @@ def multi_pairing_check_calldata( name="Ris", elmts=[ structs.E12D(name=f"R{i}", elmts=[ri.felt for ri in Ri]) - for i, Ri in enumerate(relations.Ris) + for i, Ri in enumerate(passed_Ris) ], ), big_Q=structs.u384Array(name="big_Q", elmts=big_Q_coeffs), @@ -272,7 +304,7 @@ def multi_pairing_check_calldata( pair2=pairs_structs[2], lambda_root=structs.E12D(name="lambda_root", elmts=lambda_root), lambda_root_inverse=structs.E12D( - name="lambda_root_inverse", elmts=lambda_root + name="lambda_root_inverse", elmts=lambda_root_inverse ), w=structs.MillerLoopResultScalingFactor( name="w", @@ -286,7 +318,7 @@ def multi_pairing_check_calldata( name="Ris", elmts=[ structs.E12D(name=f"R{i}", elmts=[ri.felt for ri in Ri]) - for i, Ri in enumerate(relations.Ris) + for i, Ri in enumerate(passed_Ris) ], ), big_Q=structs.u384Array(name="big_Q", elmts=big_Q_coeffs), @@ -299,13 +331,37 @@ def multi_pairing_check_calldata( if __name__ == "__main__": import random + import subprocess random.seed(0) - pairs, extra_pair = get_pairing_check_input( - CurveID.BLS12_381, 2, include_m=False, return_pairs=True - ) - input = multi_pairing_check_calldata(pairs, extra_pair) - # print(input.to_cairo1_test()) + curve_ids = [CurveID.BN254, CurveID.BLS12_381] + params = [(2, False), (3, False), (3, True)] + include_m = False - with open("output.txt", "w") as f: - f.write(input.to_cairo1_test()) + test_header = """ +#[cfg(test)] +mod pairing_tests { + use garaga::pairing::{ + G1G2Pair, G1Point, G2Point, E12D, MillerLoopResultScalingFactor, E12DDefinitions, + multi_pairing_check_bn254_2_pairs, multi_pairing_check_bn254_3_pairs, + multi_pairing_check_bls12_381_3_pairs, multi_pairing_check_bls12_381_2_pairs, u384, Option, + E12DMulQuotient + }; +""" + with open("src/cairo/src/tests/pairing_tests.cairo", "w") as f: + f.write(test_header) + for curve_id in curve_ids: + for n_pairs, include_m in params: + print(f"\n\ncurve_id: {curve_id}, n_pairs: {n_pairs}") + pairs, extra_pair = get_pairing_check_input( + curve_id, n_pairs, include_m=include_m, return_pairs=True + ) + input = multi_pairing_check_calldata(pairs, extra_pair) + f.write( + input.to_cairo1_test( + test_name=f"{curve_id.name}_mpcheck_{n_pairs}P_{'with_extra_m' if include_m else ''}" + ) + ) + f.write("\n") # Add some spacing between tests + f.write("}") + subprocess.run(["scarb", "fmt"], check=True, cwd="src/cairo/src")