CpuConstraintPoly

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "starkware/solidity/verifier/cpu/layout6/CpuConstraintPoly.sol": {
      "content": "/*
  Copyright 2019-2023 StarkWare Industries Ltd.

  Licensed under the Apache License, Version 2.0 (the "License").
  You may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  https://www.starkware.co/open-source-license/

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions
  and limitations under the License.
*/
// ---------- The following code was auto-generated. PLEASE DO NOT EDIT. ----------
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

contract CpuConstraintPoly {
    // The Memory map during the execution of this contract is as follows:
    // [0x0, 0x20) - periodic_column/pedersen/points/x.
    // [0x20, 0x40) - periodic_column/pedersen/points/y.
    // [0x40, 0x60) - periodic_column/ecdsa/generator_points/x.
    // [0x60, 0x80) - periodic_column/ecdsa/generator_points/y.
    // [0x80, 0xa0) - periodic_column/poseidon/poseidon/full_round_key0.
    // [0xa0, 0xc0) - periodic_column/poseidon/poseidon/full_round_key1.
    // [0xc0, 0xe0) - periodic_column/poseidon/poseidon/full_round_key2.
    // [0xe0, 0x100) - periodic_column/poseidon/poseidon/partial_round_key0.
    // [0x100, 0x120) - periodic_column/poseidon/poseidon/partial_round_key1.
    // [0x120, 0x140) - trace_length.
    // [0x140, 0x160) - offset_size.
    // [0x160, 0x180) - half_offset_size.
    // [0x180, 0x1a0) - initial_ap.
    // [0x1a0, 0x1c0) - initial_pc.
    // [0x1c0, 0x1e0) - final_ap.
    // [0x1e0, 0x200) - final_pc.
    // [0x200, 0x220) - memory/multi_column_perm/perm/interaction_elm.
    // [0x220, 0x240) - memory/multi_column_perm/hash_interaction_elm0.
    // [0x240, 0x260) - memory/multi_column_perm/perm/public_memory_prod.
    // [0x260, 0x280) - range_check16/perm/interaction_elm.
    // [0x280, 0x2a0) - range_check16/perm/public_memory_prod.
    // [0x2a0, 0x2c0) - range_check_min.
    // [0x2c0, 0x2e0) - range_check_max.
    // [0x2e0, 0x300) - diluted_check/permutation/interaction_elm.
    // [0x300, 0x320) - diluted_check/permutation/public_memory_prod.
    // [0x320, 0x340) - diluted_check/first_elm.
    // [0x340, 0x360) - diluted_check/interaction_z.
    // [0x360, 0x380) - diluted_check/interaction_alpha.
    // [0x380, 0x3a0) - diluted_check/final_cum_val.
    // [0x3a0, 0x3c0) - pedersen/shift_point.x.
    // [0x3c0, 0x3e0) - pedersen/shift_point.y.
    // [0x3e0, 0x400) - initial_pedersen_addr.
    // [0x400, 0x420) - initial_range_check_addr.
    // [0x420, 0x440) - ecdsa/sig_config.alpha.
    // [0x440, 0x460) - ecdsa/sig_config.shift_point.x.
    // [0x460, 0x480) - ecdsa/sig_config.shift_point.y.
    // [0x480, 0x4a0) - ecdsa/sig_config.beta.
    // [0x4a0, 0x4c0) - initial_ecdsa_addr.
    // [0x4c0, 0x4e0) - initial_bitwise_addr.
    // [0x4e0, 0x500) - initial_ec_op_addr.
    // [0x500, 0x520) - ec_op/curve_config.alpha.
    // [0x520, 0x540) - initial_poseidon_addr.
    // [0x540, 0x560) - trace_generator.
    // [0x560, 0x580) - oods_point.
    // [0x580, 0x640) - interaction_elements.
    // [0x640, 0x660) - composition_alpha.
    // [0x660, 0x2840) - oods_values.
    // ----------------------- end of input data - -------------------------
    // [0x2840, 0x2860) - intermediate_value/cpu/decode/opcode_range_check/bit_0.
    // [0x2860, 0x2880) - intermediate_value/cpu/decode/opcode_range_check/bit_2.
    // [0x2880, 0x28a0) - intermediate_value/cpu/decode/opcode_range_check/bit_4.
    // [0x28a0, 0x28c0) - intermediate_value/cpu/decode/opcode_range_check/bit_3.
    // [0x28c0, 0x28e0) - intermediate_value/cpu/decode/flag_op1_base_op0_0.
    // [0x28e0, 0x2900) - intermediate_value/cpu/decode/opcode_range_check/bit_5.
    // [0x2900, 0x2920) - intermediate_value/cpu/decode/opcode_range_check/bit_6.
    // [0x2920, 0x2940) - intermediate_value/cpu/decode/opcode_range_check/bit_9.
    // [0x2940, 0x2960) - intermediate_value/cpu/decode/flag_res_op1_0.
    // [0x2960, 0x2980) - intermediate_value/cpu/decode/opcode_range_check/bit_7.
    // [0x2980, 0x29a0) - intermediate_value/cpu/decode/opcode_range_check/bit_8.
    // [0x29a0, 0x29c0) - intermediate_value/cpu/decode/flag_pc_update_regular_0.
    // [0x29c0, 0x29e0) - intermediate_value/cpu/decode/opcode_range_check/bit_12.
    // [0x29e0, 0x2a00) - intermediate_value/cpu/decode/opcode_range_check/bit_13.
    // [0x2a00, 0x2a20) - intermediate_value/cpu/decode/fp_update_regular_0.
    // [0x2a20, 0x2a40) - intermediate_value/cpu/decode/opcode_range_check/bit_1.
    // [0x2a40, 0x2a60) - intermediate_value/npc_reg_0.
    // [0x2a60, 0x2a80) - intermediate_value/cpu/decode/opcode_range_check/bit_10.
    // [0x2a80, 0x2aa0) - intermediate_value/cpu/decode/opcode_range_check/bit_11.
    // [0x2aa0, 0x2ac0) - intermediate_value/cpu/decode/opcode_range_check/bit_14.
    // [0x2ac0, 0x2ae0) - intermediate_value/memory/address_diff_0.
    // [0x2ae0, 0x2b00) - intermediate_value/range_check16/diff_0.
    // [0x2b00, 0x2b20) - intermediate_value/pedersen/hash0/ec_subset_sum/bit_0.
    // [0x2b20, 0x2b40) - intermediate_value/pedersen/hash0/ec_subset_sum/bit_neg_0.
    // [0x2b40, 0x2b60) - intermediate_value/range_check_builtin/value0_0.
    // [0x2b60, 0x2b80) - intermediate_value/range_check_builtin/value1_0.
    // [0x2b80, 0x2ba0) - intermediate_value/range_check_builtin/value2_0.
    // [0x2ba0, 0x2bc0) - intermediate_value/range_check_builtin/value3_0.
    // [0x2bc0, 0x2be0) - intermediate_value/range_check_builtin/value4_0.
    // [0x2be0, 0x2c00) - intermediate_value/range_check_builtin/value5_0.
    // [0x2c00, 0x2c20) - intermediate_value/range_check_builtin/value6_0.
    // [0x2c20, 0x2c40) - intermediate_value/range_check_builtin/value7_0.
    // [0x2c40, 0x2c60) - intermediate_value/ecdsa/signature0/doubling_key/x_squared.
    // [0x2c60, 0x2c80) - intermediate_value/ecdsa/signature0/exponentiate_generator/bit_0.
    // [0x2c80, 0x2ca0) - intermediate_value/ecdsa/signature0/exponentiate_generator/bit_neg_0.
    // [0x2ca0, 0x2cc0) - intermediate_value/ecdsa/signature0/exponentiate_key/bit_0.
    // [0x2cc0, 0x2ce0) - intermediate_value/ecdsa/signature0/exponentiate_key/bit_neg_0.
    // [0x2ce0, 0x2d00) - intermediate_value/bitwise/sum_var_0_0.
    // [0x2d00, 0x2d20) - intermediate_value/bitwise/sum_var_8_0.
    // [0x2d20, 0x2d40) - intermediate_value/ec_op/doubling_q/x_squared_0.
    // [0x2d40, 0x2d60) - intermediate_value/ec_op/ec_subset_sum/bit_0.
    // [0x2d60, 0x2d80) - intermediate_value/ec_op/ec_subset_sum/bit_neg_0.
    // [0x2d80, 0x2da0) - intermediate_value/poseidon/poseidon/full_rounds_state0_cubed_0.
    // [0x2da0, 0x2dc0) - intermediate_value/poseidon/poseidon/full_rounds_state1_cubed_0.
    // [0x2dc0, 0x2de0) - intermediate_value/poseidon/poseidon/full_rounds_state2_cubed_0.
    // [0x2de0, 0x2e00) - intermediate_value/poseidon/poseidon/full_rounds_state0_cubed_7.
    // [0x2e00, 0x2e20) - intermediate_value/poseidon/poseidon/full_rounds_state1_cubed_7.
    // [0x2e20, 0x2e40) - intermediate_value/poseidon/poseidon/full_rounds_state2_cubed_7.
    // [0x2e40, 0x2e60) - intermediate_value/poseidon/poseidon/full_rounds_state0_cubed_3.
    // [0x2e60, 0x2e80) - intermediate_value/poseidon/poseidon/full_rounds_state1_cubed_3.
    // [0x2e80, 0x2ea0) - intermediate_value/poseidon/poseidon/full_rounds_state2_cubed_3.
    // [0x2ea0, 0x2ec0) - intermediate_value/poseidon/poseidon/partial_rounds_state0_cubed_0.
    // [0x2ec0, 0x2ee0) - intermediate_value/poseidon/poseidon/partial_rounds_state0_cubed_1.
    // [0x2ee0, 0x2f00) - intermediate_value/poseidon/poseidon/partial_rounds_state0_cubed_2.
    // [0x2f00, 0x2f20) - intermediate_value/poseidon/poseidon/partial_rounds_state1_cubed_0.
    // [0x2f20, 0x2f40) - intermediate_value/poseidon/poseidon/partial_rounds_state1_cubed_1.
    // [0x2f40, 0x2f60) - intermediate_value/poseidon/poseidon/partial_rounds_state1_cubed_2.
    // [0x2f60, 0x2f80) - intermediate_value/poseidon/poseidon/partial_rounds_state1_cubed_19.
    // [0x2f80, 0x2fa0) - intermediate_value/poseidon/poseidon/partial_rounds_state1_cubed_20.
    // [0x2fa0, 0x2fc0) - intermediate_value/poseidon/poseidon/partial_rounds_state1_cubed_21.
    // [0x2fc0, 0x3680) - expmods.
    // [0x3680, 0x3b40) - domains.
    // [0x3b40, 0x3e80) - denominator_invs.
    // [0x3e80, 0x41c0) - denominators.
    // [0x41c0, 0x4280) - expmod_context.

    fallback() external {
        uint256 res;
        assembly {
            let PRIME := 0x800000000000011000000000000000000000000000000000000000000000001
            // Copy input from calldata to memory.
            calldatacopy(0x0, 0x0, /*Input data size*/ 0x2840)
            let point := /*oods_point*/ mload(0x560)
            function expmod(base, exponent, modulus) -> result {
              let p := /*expmod_context*/ 0x41c0
              mstore(p, 0x20)                 // Length of Base.
              mstore(add(p, 0x20), 0x20)      // Length of Exponent.
              mstore(add(p, 0x40), 0x20)      // Length of Modulus.
              mstore(add(p, 0x60), base)      // Base.
              mstore(add(p, 0x80), exponent)  // Exponent.
              mstore(add(p, 0xa0), modulus)   // Modulus.
              // Call modexp precompile.
              if iszero(staticcall(not(0), 0x05, p, 0xc0, p, 0x20)) {
                revert(0, 0)
              }
              result := mload(p)
            }
            {
              // Prepare expmods for denominators and numerators.

              // expmods[0] = point^(trace_length / 32768).
              mstore(0x2fc0, expmod(point, div(/*trace_length*/ mload(0x120), 32768), PRIME))

              // expmods[1] = point^(trace_length / 16384).
              mstore(0x2fe0, mulmod(
                /*point^(trace_length / 32768)*/ mload(0x2fc0),
                /*point^(trace_length / 32768)*/ mload(0x2fc0),
                PRIME))

              // expmods[2] = point^(trace_length / 1024).
              mstore(0x3000, expmod(point, div(/*trace_length*/ mload(0x120), 1024), PRIME))

              // expmods[3] = point^(trace_length / 512).
              mstore(0x3020, mulmod(
                /*point^(trace_length / 1024)*/ mload(0x3000),
                /*point^(trace_length / 1024)*/ mload(0x3000),
                PRIME))

              // expmods[4] = point^(trace_length / 256).
              mstore(0x3040, mulmod(
                /*point^(trace_length / 512)*/ mload(0x3020),
                /*point^(trace_length / 512)*/ mload(0x3020),
                PRIME))

              // expmods[5] = point^(trace_length / 128).
              mstore(0x3060, mulmod(
                /*point^(trace_length / 256)*/ mload(0x3040),
                /*point^(trace_length / 256)*/ mload(0x3040),
                PRIME))

              // expmods[6] = point^(trace_length / 64).
              mstore(0x3080, mulmod(
                /*point^(trace_length / 128)*/ mload(0x3060),
                /*point^(trace_length / 128)*/ mload(0x3060),
                PRIME))

              // expmods[7] = point^(trace_length / 16).
              mstore(0x30a0, expmod(point, div(/*trace_length*/ mload(0x120), 16), PRIME))

              // expmods[8] = point^(trace_length / 8).
              mstore(0x30c0, mulmod(
                /*point^(trace_length / 16)*/ mload(0x30a0),
                /*point^(trace_length / 16)*/ mload(0x30a0),
                PRIME))

              // expmods[9] = point^(trace_length / 4).
              mstore(0x30e0, mulmod(
                /*point^(trace_length / 8)*/ mload(0x30c0),
                /*point^(trace_length / 8)*/ mload(0x30c0),
                PRIME))

              // expmods[10] = point^(trace_length / 2).
              mstore(0x3100, mulmod(
                /*point^(trace_length / 4)*/ mload(0x30e0),
                /*point^(trace_length / 4)*/ mload(0x30e0),
                PRIME))

              // expmods[11] = point^trace_length.
              mstore(0x3120, mulmod(
                /*point^(trace_length / 2)*/ mload(0x3100),
                /*point^(trace_length / 2)*/ mload(0x3100),
                PRIME))

              // expmods[12] = trace_generator^(trace_length / 64).
              mstore(0x3140, expmod(/*trace_generator*/ mload(0x540), div(/*trace_length*/ mload(0x120), 64), PRIME))

              // expmods[13] = trace_generator^(trace_length / 32).
              mstore(0x3160, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                PRIME))

              // expmods[14] = trace_generator^(3 * trace_length / 64).
              mstore(0x3180, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                PRIME))

              // expmods[15] = trace_generator^(trace_length / 16).
              mstore(0x31a0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(3 * trace_length / 64)*/ mload(0x3180),
                PRIME))

              // expmods[16] = trace_generator^(5 * trace_length / 64).
              mstore(0x31c0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(trace_length / 16)*/ mload(0x31a0),
                PRIME))

              // expmods[17] = trace_generator^(3 * trace_length / 32).
              mstore(0x31e0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(5 * trace_length / 64)*/ mload(0x31c0),
                PRIME))

              // expmods[18] = trace_generator^(7 * trace_length / 64).
              mstore(0x3200, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(3 * trace_length / 32)*/ mload(0x31e0),
                PRIME))

              // expmods[19] = trace_generator^(trace_length / 8).
              mstore(0x3220, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(7 * trace_length / 64)*/ mload(0x3200),
                PRIME))

              // expmods[20] = trace_generator^(9 * trace_length / 64).
              mstore(0x3240, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(trace_length / 8)*/ mload(0x3220),
                PRIME))

              // expmods[21] = trace_generator^(5 * trace_length / 32).
              mstore(0x3260, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(9 * trace_length / 64)*/ mload(0x3240),
                PRIME))

              // expmods[22] = trace_generator^(11 * trace_length / 64).
              mstore(0x3280, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(5 * trace_length / 32)*/ mload(0x3260),
                PRIME))

              // expmods[23] = trace_generator^(3 * trace_length / 16).
              mstore(0x32a0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(11 * trace_length / 64)*/ mload(0x3280),
                PRIME))

              // expmods[24] = trace_generator^(13 * trace_length / 64).
              mstore(0x32c0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(3 * trace_length / 16)*/ mload(0x32a0),
                PRIME))

              // expmods[25] = trace_generator^(7 * trace_length / 32).
              mstore(0x32e0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(13 * trace_length / 64)*/ mload(0x32c0),
                PRIME))

              // expmods[26] = trace_generator^(15 * trace_length / 64).
              mstore(0x3300, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(7 * trace_length / 32)*/ mload(0x32e0),
                PRIME))

              // expmods[27] = trace_generator^(trace_length / 2).
              mstore(0x3320, expmod(/*trace_generator*/ mload(0x540), div(/*trace_length*/ mload(0x120), 2), PRIME))

              // expmods[28] = trace_generator^(19 * trace_length / 32).
              mstore(0x3340, mulmod(
                /*trace_generator^(3 * trace_length / 32)*/ mload(0x31e0),
                /*trace_generator^(trace_length / 2)*/ mload(0x3320),
                PRIME))

              // expmods[29] = trace_generator^(5 * trace_length / 8).
              mstore(0x3360, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(19 * trace_length / 32)*/ mload(0x3340),
                PRIME))

              // expmods[30] = trace_generator^(21 * trace_length / 32).
              mstore(0x3380, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(5 * trace_length / 8)*/ mload(0x3360),
                PRIME))

              // expmods[31] = trace_generator^(11 * trace_length / 16).
              mstore(0x33a0, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(21 * trace_length / 32)*/ mload(0x3380),
                PRIME))

              // expmods[32] = trace_generator^(23 * trace_length / 32).
              mstore(0x33c0, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(11 * trace_length / 16)*/ mload(0x33a0),
                PRIME))

              // expmods[33] = trace_generator^(3 * trace_length / 4).
              mstore(0x33e0, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(23 * trace_length / 32)*/ mload(0x33c0),
                PRIME))

              // expmods[34] = trace_generator^(25 * trace_length / 32).
              mstore(0x3400, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(3 * trace_length / 4)*/ mload(0x33e0),
                PRIME))

              // expmods[35] = trace_generator^(13 * trace_length / 16).
              mstore(0x3420, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(25 * trace_length / 32)*/ mload(0x3400),
                PRIME))

              // expmods[36] = trace_generator^(27 * trace_length / 32).
              mstore(0x3440, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(13 * trace_length / 16)*/ mload(0x3420),
                PRIME))

              // expmods[37] = trace_generator^(7 * trace_length / 8).
              mstore(0x3460, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(27 * trace_length / 32)*/ mload(0x3440),
                PRIME))

              // expmods[38] = trace_generator^(29 * trace_length / 32).
              mstore(0x3480, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(7 * trace_length / 8)*/ mload(0x3460),
                PRIME))

              // expmods[39] = trace_generator^(15 * trace_length / 16).
              mstore(0x34a0, mulmod(
                /*trace_generator^(trace_length / 32)*/ mload(0x3160),
                /*trace_generator^(29 * trace_length / 32)*/ mload(0x3480),
                PRIME))

              // expmods[40] = trace_generator^(61 * trace_length / 64).
              mstore(0x34c0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(15 * trace_length / 16)*/ mload(0x34a0),
                PRIME))

              // expmods[41] = trace_generator^(31 * trace_length / 32).
              mstore(0x34e0, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(61 * trace_length / 64)*/ mload(0x34c0),
                PRIME))

              // expmods[42] = trace_generator^(251 * trace_length / 256).
              mstore(0x3500, expmod(/*trace_generator*/ mload(0x540), div(mul(251, /*trace_length*/ mload(0x120)), 256), PRIME))

              // expmods[43] = trace_generator^(63 * trace_length / 64).
              mstore(0x3520, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(31 * trace_length / 32)*/ mload(0x34e0),
                PRIME))

              // expmods[44] = trace_generator^(255 * trace_length / 256).
              mstore(0x3540, mulmod(
                /*trace_generator^(trace_length / 64)*/ mload(0x3140),
                /*trace_generator^(251 * trace_length / 256)*/ mload(0x3500),
                PRIME))

              // expmods[45] = trace_generator^(trace_length - 16).
              mstore(0x3560, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 16), PRIME))

              // expmods[46] = trace_generator^(trace_length - 2).
              mstore(0x3580, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 2), PRIME))

              // expmods[47] = trace_generator^(trace_length - 4).
              mstore(0x35a0, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 4), PRIME))

              // expmods[48] = trace_generator^(trace_length - 8).
              mstore(0x35c0, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 8), PRIME))

              // expmods[49] = trace_generator^(trace_length - 512).
              mstore(0x35e0, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 512), PRIME))

              // expmods[50] = trace_generator^(trace_length - 256).
              mstore(0x3600, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 256), PRIME))

              // expmods[51] = trace_generator^(trace_length - 32768).
              mstore(0x3620, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 32768), PRIME))

              // expmods[52] = trace_generator^(trace_length - 1024).
              mstore(0x3640, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 1024), PRIME))

              // expmods[53] = trace_generator^(trace_length - 16384).
              mstore(0x3660, expmod(/*trace_generator*/ mload(0x540), sub(/*trace_length*/ mload(0x120), 16384), PRIME))

            }

            {
              // Compute domains.

              // Denominator for constraints: 'cpu/decode/opcode_range_check/bit', 'pedersen/hash0/ec_subset_sum/booleanity_test', 'pedersen/hash0/ec_subset_sum/add_points/slope', 'pedersen/hash0/ec_subset_sum/add_points/x', 'pedersen/hash0/ec_subset_sum/add_points/y', 'pedersen/hash0/ec_subset_sum/copy_point/x', 'pedersen/hash0/ec_subset_sum/copy_point/y'.
              // domains[0] = point^trace_length - 1.
              mstore(0x3680,
                     addmod(/*point^trace_length*/ mload(0x3120), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'memory/multi_column_perm/perm/step0', 'memory/diff_is_bit', 'memory/is_func'.
              // domains[1] = point^(trace_length / 2) - 1.
              mstore(0x36a0,
                     addmod(/*point^(trace_length / 2)*/ mload(0x3100), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'range_check16/perm/step0', 'range_check16/diff_is_bit'.
              // domains[2] = point^(trace_length / 4) - 1.
              mstore(0x36c0,
                     addmod(/*point^(trace_length / 4)*/ mload(0x30e0), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'public_memory_addr_zero', 'public_memory_value_zero', 'diluted_check/permutation/step0', 'diluted_check/step', 'poseidon/poseidon/partial_rounds_state0_squaring', 'poseidon/poseidon/partial_round0'.
              // domains[3] = point^(trace_length / 8) - 1.
              mstore(0x36e0,
                     addmod(/*point^(trace_length / 8)*/ mload(0x30c0), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'cpu/decode/opcode_range_check/zero'.
              // Numerator for constraints: 'cpu/decode/opcode_range_check/bit'.
              // domains[4] = point^(trace_length / 16) - trace_generator^(15 * trace_length / 16).
              mstore(0x3700,
                     addmod(
                       /*point^(trace_length / 16)*/ mload(0x30a0),
                       sub(PRIME, /*trace_generator^(15 * trace_length / 16)*/ mload(0x34a0)),
                       PRIME))

              // Denominator for constraints: 'cpu/decode/opcode_range_check_input', 'cpu/decode/flag_op1_base_op0_bit', 'cpu/decode/flag_res_op1_bit', 'cpu/decode/flag_pc_update_regular_bit', 'cpu/decode/fp_update_regular_bit', 'cpu/operands/mem_dst_addr', 'cpu/operands/mem0_addr', 'cpu/operands/mem1_addr', 'cpu/operands/ops_mul', 'cpu/operands/res', 'cpu/update_registers/update_pc/tmp0', 'cpu/update_registers/update_pc/tmp1', 'cpu/update_registers/update_pc/pc_cond_negative', 'cpu/update_registers/update_pc/pc_cond_positive', 'cpu/update_registers/update_ap/ap_update', 'cpu/update_registers/update_fp/fp_update', 'cpu/opcodes/call/push_fp', 'cpu/opcodes/call/push_pc', 'cpu/opcodes/call/off0', 'cpu/opcodes/call/off1', 'cpu/opcodes/call/flags', 'cpu/opcodes/ret/off0', 'cpu/opcodes/ret/off2', 'cpu/opcodes/ret/flags', 'cpu/opcodes/assert_eq/assert_eq', 'poseidon/poseidon/partial_rounds_state1_squaring', 'poseidon/poseidon/partial_round1'.
              // domains[5] = point^(trace_length / 16) - 1.
              mstore(0x3720,
                     addmod(/*point^(trace_length / 16)*/ mload(0x30a0), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'ecdsa/signature0/doubling_key/slope', 'ecdsa/signature0/doubling_key/x', 'ecdsa/signature0/doubling_key/y', 'ecdsa/signature0/exponentiate_key/booleanity_test', 'ecdsa/signature0/exponentiate_key/add_points/slope', 'ecdsa/signature0/exponentiate_key/add_points/x', 'ecdsa/signature0/exponentiate_key/add_points/y', 'ecdsa/signature0/exponentiate_key/add_points/x_diff_inv', 'ecdsa/signature0/exponentiate_key/copy_point/x', 'ecdsa/signature0/exponentiate_key/copy_point/y', 'ec_op/doubling_q/slope', 'ec_op/doubling_q/x', 'ec_op/doubling_q/y', 'ec_op/ec_subset_sum/booleanity_test', 'ec_op/ec_subset_sum/add_points/slope', 'ec_op/ec_subset_sum/add_points/x', 'ec_op/ec_subset_sum/add_points/y', 'ec_op/ec_subset_sum/add_points/x_diff_inv', 'ec_op/ec_subset_sum/copy_point/x', 'ec_op/ec_subset_sum/copy_point/y', 'poseidon/poseidon/full_rounds_state0_squaring', 'poseidon/poseidon/full_rounds_state1_squaring', 'poseidon/poseidon/full_rounds_state2_squaring', 'poseidon/poseidon/full_round0', 'poseidon/poseidon/full_round1', 'poseidon/poseidon/full_round2'.
              // domains[6] = point^(trace_length / 64) - 1.
              mstore(0x3740,
                     addmod(/*point^(trace_length / 64)*/ mload(0x3080), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_generator/booleanity_test', 'ecdsa/signature0/exponentiate_generator/add_points/slope', 'ecdsa/signature0/exponentiate_generator/add_points/x', 'ecdsa/signature0/exponentiate_generator/add_points/y', 'ecdsa/signature0/exponentiate_generator/add_points/x_diff_inv', 'ecdsa/signature0/exponentiate_generator/copy_point/x', 'ecdsa/signature0/exponentiate_generator/copy_point/y'.
              // domains[7] = point^(trace_length / 128) - 1.
              mstore(0x3760,
                     addmod(/*point^(trace_length / 128)*/ mload(0x3060), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'pedersen/hash0/ec_subset_sum/bit_unpacking/last_one_is_zero', 'pedersen/hash0/ec_subset_sum/bit_unpacking/zeroes_between_ones0', 'pedersen/hash0/ec_subset_sum/bit_unpacking/cumulative_bit192', 'pedersen/hash0/ec_subset_sum/bit_unpacking/zeroes_between_ones192', 'pedersen/hash0/ec_subset_sum/bit_unpacking/cumulative_bit196', 'pedersen/hash0/ec_subset_sum/bit_unpacking/zeroes_between_ones196', 'pedersen/hash0/copy_point/x', 'pedersen/hash0/copy_point/y', 'range_check_builtin/value', 'range_check_builtin/addr_step', 'bitwise/step_var_pool_addr', 'bitwise/partition', 'poseidon/param_0/addr_input_output_step', 'poseidon/param_1/addr_input_output_step', 'poseidon/param_2/addr_input_output_step'.
              // domains[8] = point^(trace_length / 256) - 1.
              mstore(0x3780,
                     addmod(/*point^(trace_length / 256)*/ mload(0x3040), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'pedersen/hash0/ec_subset_sum/zeros_tail'.
              // Numerator for constraints: 'pedersen/hash0/ec_subset_sum/booleanity_test', 'pedersen/hash0/ec_subset_sum/add_points/slope', 'pedersen/hash0/ec_subset_sum/add_points/x', 'pedersen/hash0/ec_subset_sum/add_points/y', 'pedersen/hash0/ec_subset_sum/copy_point/x', 'pedersen/hash0/ec_subset_sum/copy_point/y'.
              // domains[9] = point^(trace_length / 256) - trace_generator^(255 * trace_length / 256).
              mstore(0x37a0,
                     addmod(
                       /*point^(trace_length / 256)*/ mload(0x3040),
                       sub(PRIME, /*trace_generator^(255 * trace_length / 256)*/ mload(0x3540)),
                       PRIME))

              // Denominator for constraints: 'pedersen/hash0/ec_subset_sum/bit_extraction_end'.
              // domains[10] = point^(trace_length / 256) - trace_generator^(63 * trace_length / 64).
              mstore(0x37c0,
                     addmod(
                       /*point^(trace_length / 256)*/ mload(0x3040),
                       sub(PRIME, /*trace_generator^(63 * trace_length / 64)*/ mload(0x3520)),
                       PRIME))

              // Numerator for constraints: 'poseidon/poseidon/full_round0', 'poseidon/poseidon/full_round1', 'poseidon/poseidon/full_round2'.
              // domains[11] = point^(trace_length / 256) - trace_generator^(3 * trace_length / 4).
              mstore(0x37e0,
                     addmod(
                       /*point^(trace_length / 256)*/ mload(0x3040),
                       sub(PRIME, /*trace_generator^(3 * trace_length / 4)*/ mload(0x33e0)),
                       PRIME))

              // Numerator for constraints: 'pedersen/hash0/copy_point/x', 'pedersen/hash0/copy_point/y'.
              // domains[12] = point^(trace_length / 512) - trace_generator^(trace_length / 2).
              mstore(0x3800,
                     addmod(
                       /*point^(trace_length / 512)*/ mload(0x3020),
                       sub(PRIME, /*trace_generator^(trace_length / 2)*/ mload(0x3320)),
                       PRIME))

              // Denominator for constraints: 'pedersen/hash0/init/x', 'pedersen/hash0/init/y', 'pedersen/input0_value0', 'pedersen/input0_addr', 'pedersen/input1_value0', 'pedersen/input1_addr', 'pedersen/output_value0', 'pedersen/output_addr', 'poseidon/poseidon/add_first_round_key0', 'poseidon/poseidon/add_first_round_key1', 'poseidon/poseidon/add_first_round_key2', 'poseidon/poseidon/last_full_round0', 'poseidon/poseidon/last_full_round1', 'poseidon/poseidon/last_full_round2', 'poseidon/poseidon/copy_partial_rounds0_i0', 'poseidon/poseidon/copy_partial_rounds0_i1', 'poseidon/poseidon/copy_partial_rounds0_i2', 'poseidon/poseidon/margin_full_to_partial0', 'poseidon/poseidon/margin_full_to_partial1', 'poseidon/poseidon/margin_full_to_partial2', 'poseidon/poseidon/margin_partial_to_full0', 'poseidon/poseidon/margin_partial_to_full1', 'poseidon/poseidon/margin_partial_to_full2'.
              // domains[13] = point^(trace_length / 512) - 1.
              mstore(0x3820,
                     addmod(/*point^(trace_length / 512)*/ mload(0x3020), sub(PRIME, 1), PRIME))

              // domains[14] = point^(trace_length / 512) - trace_generator^(31 * trace_length / 32).
              mstore(0x3840,
                     addmod(
                       /*point^(trace_length / 512)*/ mload(0x3020),
                       sub(PRIME, /*trace_generator^(31 * trace_length / 32)*/ mload(0x34e0)),
                       PRIME))

              // Numerator for constraints: 'poseidon/poseidon/partial_rounds_state1_squaring'.
              // domains[15] = (point^(trace_length / 512) - trace_generator^(11 * trace_length / 16)) * (point^(trace_length / 512) - trace_generator^(23 * trace_length / 32)) * (point^(trace_length / 512) - trace_generator^(3 * trace_length / 4)) * (point^(trace_length / 512) - trace_generator^(25 * trace_length / 32)) * (point^(trace_length / 512) - trace_generator^(13 * trace_length / 16)) * (point^(trace_length / 512) - trace_generator^(27 * trace_length / 32)) * (point^(trace_length / 512) - trace_generator^(7 * trace_length / 8)) * (point^(trace_length / 512) - trace_generator^(29 * trace_length / 32)) * (point^(trace_length / 512) - trace_generator^(15 * trace_length / 16)) * domain14.
              {
                let domain := mulmod(
                    mulmod(
                      mulmod(
                        addmod(
                          /*point^(trace_length / 512)*/ mload(0x3020),
                          sub(PRIME, /*trace_generator^(11 * trace_length / 16)*/ mload(0x33a0)),
                          PRIME),
                        addmod(
                          /*point^(trace_length / 512)*/ mload(0x3020),
                          sub(PRIME, /*trace_generator^(23 * trace_length / 32)*/ mload(0x33c0)),
                          PRIME),
                        PRIME),
                      addmod(
                        /*point^(trace_length / 512)*/ mload(0x3020),
                        sub(PRIME, /*trace_generator^(3 * trace_length / 4)*/ mload(0x33e0)),
                        PRIME),
                      PRIME),
                    addmod(
                      /*point^(trace_length / 512)*/ mload(0x3020),
                      sub(PRIME, /*trace_generator^(25 * trace_length / 32)*/ mload(0x3400)),
                      PRIME),
                    PRIME)
                domain := mulmod(
                  domain,
                  mulmod(
                    mulmod(
                      mulmod(
                        addmod(
                          /*point^(trace_length / 512)*/ mload(0x3020),
                          sub(PRIME, /*trace_generator^(13 * trace_length / 16)*/ mload(0x3420)),
                          PRIME),
                        addmod(
                          /*point^(trace_length / 512)*/ mload(0x3020),
                          sub(PRIME, /*trace_generator^(27 * trace_length / 32)*/ mload(0x3440)),
                          PRIME),
                        PRIME),
                      addmod(
                        /*point^(trace_length / 512)*/ mload(0x3020),
                        sub(PRIME, /*trace_generator^(7 * trace_length / 8)*/ mload(0x3460)),
                        PRIME),
                      PRIME),
                    addmod(
                      /*point^(trace_length / 512)*/ mload(0x3020),
                      sub(PRIME, /*trace_generator^(29 * trace_length / 32)*/ mload(0x3480)),
                      PRIME),
                    PRIME),
                  PRIME)
                domain := mulmod(
                  domain,
                  mulmod(
                    addmod(
                      /*point^(trace_length / 512)*/ mload(0x3020),
                      sub(PRIME, /*trace_generator^(15 * trace_length / 16)*/ mload(0x34a0)),
                      PRIME),
                    /*domains[14]*/ mload(0x3840),
                    PRIME),
                  PRIME)
                mstore(0x3860, domain)
              }

              // Numerator for constraints: 'poseidon/poseidon/partial_round0'.
              // domains[16] = (point^(trace_length / 512) - trace_generator^(61 * trace_length / 64)) * (point^(trace_length / 512) - trace_generator^(63 * trace_length / 64)) * domain14.
              mstore(0x3880,
                     mulmod(
                       mulmod(
                         addmod(
                           /*point^(trace_length / 512)*/ mload(0x3020),
                           sub(PRIME, /*trace_generator^(61 * trace_length / 64)*/ mload(0x34c0)),
                           PRIME),
                         addmod(
                           /*point^(trace_length / 512)*/ mload(0x3020),
                           sub(PRIME, /*trace_generator^(63 * trace_length / 64)*/ mload(0x3520)),
                           PRIME),
                         PRIME),
                       /*domains[14]*/ mload(0x3840),
                       PRIME))

              // Numerator for constraints: 'poseidon/poseidon/partial_round1'.
              // domains[17] = (point^(trace_length / 512) - trace_generator^(19 * trace_length / 32)) * (point^(trace_length / 512) - trace_generator^(5 * trace_length / 8)) * (point^(trace_length / 512) - trace_generator^(21 * trace_length / 32)) * domain15.
              mstore(0x38a0,
                     mulmod(
                       mulmod(
                         mulmod(
                           addmod(
                             /*point^(trace_length / 512)*/ mload(0x3020),
                             sub(PRIME, /*trace_generator^(19 * trace_length / 32)*/ mload(0x3340)),
                             PRIME),
                           addmod(
                             /*point^(trace_length / 512)*/ mload(0x3020),
                             sub(PRIME, /*trace_generator^(5 * trace_length / 8)*/ mload(0x3360)),
                             PRIME),
                           PRIME),
                         addmod(
                           /*point^(trace_length / 512)*/ mload(0x3020),
                           sub(PRIME, /*trace_generator^(21 * trace_length / 32)*/ mload(0x3380)),
                           PRIME),
                         PRIME),
                       /*domains[15]*/ mload(0x3860),
                       PRIME))

              // Numerator for constraints: 'bitwise/step_var_pool_addr'.
              // domains[18] = point^(trace_length / 1024) - trace_generator^(3 * trace_length / 4).
              mstore(0x38c0,
                     addmod(
                       /*point^(trace_length / 1024)*/ mload(0x3000),
                       sub(PRIME, /*trace_generator^(3 * trace_length / 4)*/ mload(0x33e0)),
                       PRIME))

              // Denominator for constraints: 'bitwise/x_or_y_addr', 'bitwise/next_var_pool_addr', 'bitwise/or_is_and_plus_xor', 'bitwise/unique_unpacking192', 'bitwise/unique_unpacking193', 'bitwise/unique_unpacking194', 'bitwise/unique_unpacking195'.
              // domains[19] = point^(trace_length / 1024) - 1.
              mstore(0x38e0,
                     addmod(/*point^(trace_length / 1024)*/ mload(0x3000), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'bitwise/addition_is_xor_with_and'.
              // domains[20] = (point^(trace_length / 1024) - trace_generator^(trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(trace_length / 32)) * (point^(trace_length / 1024) - trace_generator^(3 * trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(trace_length / 16)) * (point^(trace_length / 1024) - trace_generator^(5 * trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(3 * trace_length / 32)) * (point^(trace_length / 1024) - trace_generator^(7 * trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(trace_length / 8)) * (point^(trace_length / 1024) - trace_generator^(9 * trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(5 * trace_length / 32)) * (point^(trace_length / 1024) - trace_generator^(11 * trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(3 * trace_length / 16)) * (point^(trace_length / 1024) - trace_generator^(13 * trace_length / 64)) * (point^(trace_length / 1024) - trace_generator^(7 * trace_length / 32)) * (point^(trace_length / 1024) - trace_generator^(15 * trace_length / 64)) * domain19.
              {
                let domain := mulmod(
                    mulmod(
                      mulmod(
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(trace_length / 64)*/ mload(0x3140)),
                          PRIME),
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(trace_length / 32)*/ mload(0x3160)),
                          PRIME),
                        PRIME),
                      addmod(
                        /*point^(trace_length / 1024)*/ mload(0x3000),
                        sub(PRIME, /*trace_generator^(3 * trace_length / 64)*/ mload(0x3180)),
                        PRIME),
                      PRIME),
                    addmod(
                      /*point^(trace_length / 1024)*/ mload(0x3000),
                      sub(PRIME, /*trace_generator^(trace_length / 16)*/ mload(0x31a0)),
                      PRIME),
                    PRIME)
                domain := mulmod(
                  domain,
                  mulmod(
                    mulmod(
                      mulmod(
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(5 * trace_length / 64)*/ mload(0x31c0)),
                          PRIME),
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(3 * trace_length / 32)*/ mload(0x31e0)),
                          PRIME),
                        PRIME),
                      addmod(
                        /*point^(trace_length / 1024)*/ mload(0x3000),
                        sub(PRIME, /*trace_generator^(7 * trace_length / 64)*/ mload(0x3200)),
                        PRIME),
                      PRIME),
                    addmod(
                      /*point^(trace_length / 1024)*/ mload(0x3000),
                      sub(PRIME, /*trace_generator^(trace_length / 8)*/ mload(0x3220)),
                      PRIME),
                    PRIME),
                  PRIME)
                domain := mulmod(
                  domain,
                  mulmod(
                    mulmod(
                      mulmod(
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(9 * trace_length / 64)*/ mload(0x3240)),
                          PRIME),
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(5 * trace_length / 32)*/ mload(0x3260)),
                          PRIME),
                        PRIME),
                      addmod(
                        /*point^(trace_length / 1024)*/ mload(0x3000),
                        sub(PRIME, /*trace_generator^(11 * trace_length / 64)*/ mload(0x3280)),
                        PRIME),
                      PRIME),
                    addmod(
                      /*point^(trace_length / 1024)*/ mload(0x3000),
                      sub(PRIME, /*trace_generator^(3 * trace_length / 16)*/ mload(0x32a0)),
                      PRIME),
                    PRIME),
                  PRIME)
                domain := mulmod(
                  domain,
                  mulmod(
                    mulmod(
                      mulmod(
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(13 * trace_length / 64)*/ mload(0x32c0)),
                          PRIME),
                        addmod(
                          /*point^(trace_length / 1024)*/ mload(0x3000),
                          sub(PRIME, /*trace_generator^(7 * trace_length / 32)*/ mload(0x32e0)),
                          PRIME),
                        PRIME),
                      addmod(
                        /*point^(trace_length / 1024)*/ mload(0x3000),
                        sub(PRIME, /*trace_generator^(15 * trace_length / 64)*/ mload(0x3300)),
                        PRIME),
                      PRIME),
                    /*domains[19]*/ mload(0x38e0),
                    PRIME),
                  PRIME)
                mstore(0x3900, domain)
              }

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_key/zeros_tail', 'ec_op/ec_subset_sum/zeros_tail'.
              // Numerator for constraints: 'ecdsa/signature0/doubling_key/slope', 'ecdsa/signature0/doubling_key/x', 'ecdsa/signature0/doubling_key/y', 'ecdsa/signature0/exponentiate_key/booleanity_test', 'ecdsa/signature0/exponentiate_key/add_points/slope', 'ecdsa/signature0/exponentiate_key/add_points/x', 'ecdsa/signature0/exponentiate_key/add_points/y', 'ecdsa/signature0/exponentiate_key/add_points/x_diff_inv', 'ecdsa/signature0/exponentiate_key/copy_point/x', 'ecdsa/signature0/exponentiate_key/copy_point/y', 'ec_op/doubling_q/slope', 'ec_op/doubling_q/x', 'ec_op/doubling_q/y', 'ec_op/ec_subset_sum/booleanity_test', 'ec_op/ec_subset_sum/add_points/slope', 'ec_op/ec_subset_sum/add_points/x', 'ec_op/ec_subset_sum/add_points/y', 'ec_op/ec_subset_sum/add_points/x_diff_inv', 'ec_op/ec_subset_sum/copy_point/x', 'ec_op/ec_subset_sum/copy_point/y'.
              // domains[21] = point^(trace_length / 16384) - trace_generator^(255 * trace_length / 256).
              mstore(0x3920,
                     addmod(
                       /*point^(trace_length / 16384)*/ mload(0x2fe0),
                       sub(PRIME, /*trace_generator^(255 * trace_length / 256)*/ mload(0x3540)),
                       PRIME))

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_key/bit_extraction_end'.
              // domains[22] = point^(trace_length / 16384) - trace_generator^(251 * trace_length / 256).
              mstore(0x3940,
                     addmod(
                       /*point^(trace_length / 16384)*/ mload(0x2fe0),
                       sub(PRIME, /*trace_generator^(251 * trace_length / 256)*/ mload(0x3500)),
                       PRIME))

              // Denominator for constraints: 'ecdsa/signature0/init_key/x', 'ecdsa/signature0/init_key/y', 'ecdsa/signature0/r_and_w_nonzero', 'ec_op/p_x_addr', 'ec_op/p_y_addr', 'ec_op/q_x_addr', 'ec_op/q_y_addr', 'ec_op/m_addr', 'ec_op/r_x_addr', 'ec_op/r_y_addr', 'ec_op/get_q_x', 'ec_op/get_q_y', 'ec_op/ec_subset_sum/bit_unpacking/last_one_is_zero', 'ec_op/ec_subset_sum/bit_unpacking/zeroes_between_ones0', 'ec_op/ec_subset_sum/bit_unpacking/cumulative_bit192', 'ec_op/ec_subset_sum/bit_unpacking/zeroes_between_ones192', 'ec_op/ec_subset_sum/bit_unpacking/cumulative_bit196', 'ec_op/ec_subset_sum/bit_unpacking/zeroes_between_ones196', 'ec_op/get_m', 'ec_op/get_p_x', 'ec_op/get_p_y', 'ec_op/set_r_x', 'ec_op/set_r_y'.
              // domains[23] = point^(trace_length / 16384) - 1.
              mstore(0x3960,
                     addmod(/*point^(trace_length / 16384)*/ mload(0x2fe0), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'ec_op/ec_subset_sum/bit_extraction_end'.
              // domains[24] = point^(trace_length / 16384) - trace_generator^(63 * trace_length / 64).
              mstore(0x3980,
                     addmod(
                       /*point^(trace_length / 16384)*/ mload(0x2fe0),
                       sub(PRIME, /*trace_generator^(63 * trace_length / 64)*/ mload(0x3520)),
                       PRIME))

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_generator/zeros_tail'.
              // Numerator for constraints: 'ecdsa/signature0/exponentiate_generator/booleanity_test', 'ecdsa/signature0/exponentiate_generator/add_points/slope', 'ecdsa/signature0/exponentiate_generator/add_points/x', 'ecdsa/signature0/exponentiate_generator/add_points/y', 'ecdsa/signature0/exponentiate_generator/add_points/x_diff_inv', 'ecdsa/signature0/exponentiate_generator/copy_point/x', 'ecdsa/signature0/exponentiate_generator/copy_point/y'.
              // domains[25] = point^(trace_length / 32768) - trace_generator^(255 * trace_length / 256).
              mstore(0x39a0,
                     addmod(
                       /*point^(trace_length / 32768)*/ mload(0x2fc0),
                       sub(PRIME, /*trace_generator^(255 * trace_length / 256)*/ mload(0x3540)),
                       PRIME))

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_generator/bit_extraction_end'.
              // domains[26] = point^(trace_length / 32768) - trace_generator^(251 * trace_length / 256).
              mstore(0x39c0,
                     addmod(
                       /*point^(trace_length / 32768)*/ mload(0x2fc0),
                       sub(PRIME, /*trace_generator^(251 * trace_length / 256)*/ mload(0x3500)),
                       PRIME))

              // Denominator for constraints: 'ecdsa/signature0/init_gen/x', 'ecdsa/signature0/init_gen/y', 'ecdsa/signature0/add_results/slope', 'ecdsa/signature0/add_results/x', 'ecdsa/signature0/add_results/y', 'ecdsa/signature0/add_results/x_diff_inv', 'ecdsa/signature0/extract_r/slope', 'ecdsa/signature0/extract_r/x', 'ecdsa/signature0/extract_r/x_diff_inv', 'ecdsa/signature0/z_nonzero', 'ecdsa/signature0/q_on_curve/x_squared', 'ecdsa/signature0/q_on_curve/on_curve', 'ecdsa/message_addr', 'ecdsa/pubkey_addr', 'ecdsa/message_value0', 'ecdsa/pubkey_value0'.
              // domains[27] = point^(trace_length / 32768) - 1.
              mstore(0x39e0,
                     addmod(/*point^(trace_length / 32768)*/ mload(0x2fc0), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'final_ap', 'final_fp', 'final_pc'.
              // Numerator for constraints: 'cpu/update_registers/update_pc/tmp0', 'cpu/update_registers/update_pc/tmp1', 'cpu/update_registers/update_pc/pc_cond_negative', 'cpu/update_registers/update_pc/pc_cond_positive', 'cpu/update_registers/update_ap/ap_update', 'cpu/update_registers/update_fp/fp_update'.
              // domains[28] = point - trace_generator^(trace_length - 16).
              mstore(0x3a00,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 16)*/ mload(0x3560)), PRIME))

              // Denominator for constraints: 'initial_ap', 'initial_fp', 'initial_pc', 'memory/multi_column_perm/perm/init0', 'memory/initial_addr', 'range_check16/perm/init0', 'range_check16/minimum', 'diluted_check/permutation/init0', 'diluted_check/init', 'diluted_check/first_element', 'pedersen/init_addr', 'range_check_builtin/init_addr', 'ecdsa/init_addr', 'bitwise/init_var_pool_addr', 'ec_op/init_addr', 'poseidon/param_0/init_input_output_addr', 'poseidon/param_1/init_input_output_addr', 'poseidon/param_2/init_input_output_addr'.
              // domains[29] = point - 1.
              mstore(0x3a20,
                     addmod(point, sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'memory/multi_column_perm/perm/last'.
              // Numerator for constraints: 'memory/multi_column_perm/perm/step0', 'memory/diff_is_bit', 'memory/is_func'.
              // domains[30] = point - trace_generator^(trace_length - 2).
              mstore(0x3a40,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 2)*/ mload(0x3580)), PRIME))

              // Denominator for constraints: 'range_check16/perm/last', 'range_check16/maximum'.
              // Numerator for constraints: 'range_check16/perm/step0', 'range_check16/diff_is_bit'.
              // domains[31] = point - trace_generator^(trace_length - 4).
              mstore(0x3a60,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 4)*/ mload(0x35a0)), PRIME))

              // Denominator for constraints: 'diluted_check/permutation/last', 'diluted_check/last'.
              // Numerator for constraints: 'diluted_check/permutation/step0', 'diluted_check/step'.
              // domains[32] = point - trace_generator^(trace_length - 8).
              mstore(0x3a80,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 8)*/ mload(0x35c0)), PRIME))

              // Numerator for constraints: 'pedersen/input0_addr'.
              // domains[33] = point - trace_generator^(trace_length - 512).
              mstore(0x3aa0,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 512)*/ mload(0x35e0)), PRIME))

              // Numerator for constraints: 'range_check_builtin/addr_step', 'poseidon/param_0/addr_input_output_step', 'poseidon/param_1/addr_input_output_step', 'poseidon/param_2/addr_input_output_step'.
              // domains[34] = point - trace_generator^(trace_length - 256).
              mstore(0x3ac0,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 256)*/ mload(0x3600)), PRIME))

              // Numerator for constraints: 'ecdsa/pubkey_addr'.
              // domains[35] = point - trace_generator^(trace_length - 32768).
              mstore(0x3ae0,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 32768)*/ mload(0x3620)), PRIME))

              // Numerator for constraints: 'bitwise/next_var_pool_addr'.
              // domains[36] = point - trace_generator^(trace_length - 1024).
              mstore(0x3b00,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 1024)*/ mload(0x3640)), PRIME))

              // Numerator for constraints: 'ec_op/p_x_addr'.
              // domains[37] = point - trace_generator^(trace_length - 16384).
              mstore(0x3b20,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 16384)*/ mload(0x3660)), PRIME))

            }

            {
              // Prepare denominators for batch inverse.

              // denominators[0] = domains[0].
              mstore(0x3e80, /*domains[0]*/ mload(0x3680))

              // denominators[1] = domains[4].
              mstore(0x3ea0, /*domains[4]*/ mload(0x3700))

              // denominators[2] = domains[5].
              mstore(0x3ec0, /*domains[5]*/ mload(0x3720))

              // denominators[3] = domains[28].
              mstore(0x3ee0, /*domains[28]*/ mload(0x3a00))

              // denominators[4] = domains[29].
              mstore(0x3f00, /*domains[29]*/ mload(0x3a20))

              // denominators[5] = domains[1].
              mstore(0x3f20, /*domains[1]*/ mload(0x36a0))

              // denominators[6] = domains[30].
              mstore(0x3f40, /*domains[30]*/ mload(0x3a40))

              // denominators[7] = domains[3].
              mstore(0x3f60, /*domains[3]*/ mload(0x36e0))

              // denominators[8] = domains[2].
              mstore(0x3f80, /*domains[2]*/ mload(0x36c0))

              // denominators[9] = domains[31].
              mstore(0x3fa0, /*domains[31]*/ mload(0x3a60))

              // denominators[10] = domains[32].
              mstore(0x3fc0, /*domains[32]*/ mload(0x3a80))

              // denominators[11] = domains[8].
              mstore(0x3fe0, /*domains[8]*/ mload(0x3780))

              // denominators[12] = domains[9].
              mstore(0x4000, /*domains[9]*/ mload(0x37a0))

              // denominators[13] = domains[10].
              mstore(0x4020, /*domains[10]*/ mload(0x37c0))

              // denominators[14] = domains[13].
              mstore(0x4040, /*domains[13]*/ mload(0x3820))

              // denominators[15] = domains[6].
              mstore(0x4060, /*domains[6]*/ mload(0x3740))

              // denominators[16] = domains[21].
              mstore(0x4080, /*domains[21]*/ mload(0x3920))

              // denominators[17] = domains[7].
              mstore(0x40a0, /*domains[7]*/ mload(0x3760))

              // denominators[18] = domains[25].
              mstore(0x40c0, /*domains[25]*/ mload(0x39a0))

              // denominators[19] = domains[26].
              mstore(0x40e0, /*domains[26]*/ mload(0x39c0))

              // denominators[20] = domains[22].
              mstore(0x4100, /*domains[22]*/ mload(0x3940))

              // denominators[21] = domains[27].
              mstore(0x4120, /*domains[27]*/ mload(0x39e0))

              // denominators[22] = domains[23].
              mstore(0x4140, /*domains[23]*/ mload(0x3960))

              // denominators[23] = domains[19].
              mstore(0x4160, /*domains[19]*/ mload(0x38e0))

              // denominators[24] = domains[20].
              mstore(0x4180, /*domains[20]*/ mload(0x3900))

              // denominators[25] = domains[24].
              mstore(0x41a0, /*domains[24]*/ mload(0x3980))

            }

            {
              // Compute the inverses of the denominators into denominatorInvs using batch inverse.

              // Start by computing the cumulative product.
              // Let (d_0, d_1, d_2, ..., d_{n-1}) be the values in denominators. After this loop
              // denominatorInvs will be (1, d_0, d_0 * d_1, ...) and prod will contain the value of
              // d_0 * ... * d_{n-1}.
              // Compute the offset between the partialProducts array and the input values array.
              let productsToValuesOffset := 0x340
              let prod := 1
              let partialProductEndPtr := 0x3e80
              for { let partialProductPtr := 0x3b40 }
                  lt(partialProductPtr, partialProductEndPtr)
                  { partialProductPtr := add(partialProductPtr, 0x20) } {
                  mstore(partialProductPtr, prod)
                  // prod *= d_{i}.
                  prod := mulmod(prod,
                                 mload(add(partialProductPtr, productsToValuesOffset)),
                                 PRIME)
              }

              let firstPartialProductPtr := 0x3b40
              // Compute the inverse of the product.
              let prodInv := expmod(prod, sub(PRIME, 2), PRIME)

              if eq(prodInv, 0) {
                  // Solidity generates reverts with reason that look as follows:
                  // 1. 4 bytes with the constant 0x08c379a0 (== Keccak256(b'Error(string)')[:4]).
                  // 2. 32 bytes offset bytes (always 0x20 as far as i can tell).
                  // 3. 32 bytes with the length of the revert reason.
                  // 4. Revert reason string.

                  mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
                  mstore(0x4, 0x20)
                  mstore(0x24, 0x1e)
                  mstore(0x44, "Batch inverse product is zero.")
                  revert(0, 0x62)
              }

              // Compute the inverses.
              // Loop over denominator_invs in reverse order.
              // currentPartialProductPtr is initialized to one past the end.
              let currentPartialProductPtr := 0x3e80
              for { } gt(currentPartialProductPtr, firstPartialProductPtr) { } {
                  currentPartialProductPtr := sub(currentPartialProductPtr, 0x20)
                  // Store 1/d_{i} = (d_0 * ... * d_{i-1}) * 1/(d_0 * ... * d_{i}).
                  mstore(currentPartialProductPtr,
                         mulmod(mload(currentPartialProductPtr), prodInv, PRIME))
                  // Update prodInv to be 1/(d_0 * ... * d_{i-1}) by multiplying by d_i.
                  prodInv := mulmod(prodInv,
                                     mload(add(currentPartialProductPtr, productsToValuesOffset)),
                                     PRIME)
              }
            }

            {
              // Compute the result of the composition polynomial.

              {
              // cpu/decode/opcode_range_check/bit_0 = column0_row0 - (column0_row1 + column0_row1).
              let val := addmod(
                /*column0_row0*/ mload(0x660),
                sub(
                  PRIME,
                  addmod(/*column0_row1*/ mload(0x680), /*column0_row1*/ mload(0x680), PRIME)),
                PRIME)
              mstore(0x2840, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_2 = column0_row2 - (column0_row3 + column0_row3).
              let val := addmod(
                /*column0_row2*/ mload(0x6a0),
                sub(
                  PRIME,
                  addmod(/*column0_row3*/ mload(0x6c0), /*column0_row3*/ mload(0x6c0), PRIME)),
                PRIME)
              mstore(0x2860, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_4 = column0_row4 - (column0_row5 + column0_row5).
              let val := addmod(
                /*column0_row4*/ mload(0x6e0),
                sub(
                  PRIME,
                  addmod(/*column0_row5*/ mload(0x700), /*column0_row5*/ mload(0x700), PRIME)),
                PRIME)
              mstore(0x2880, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_3 = column0_row3 - (column0_row4 + column0_row4).
              let val := addmod(
                /*column0_row3*/ mload(0x6c0),
                sub(
                  PRIME,
                  addmod(/*column0_row4*/ mload(0x6e0), /*column0_row4*/ mload(0x6e0), PRIME)),
                PRIME)
              mstore(0x28a0, val)
              }


              {
              // cpu/decode/flag_op1_base_op0_0 = 1 - (cpu__decode__opcode_range_check__bit_2 + cpu__decode__opcode_range_check__bit_4 + cpu__decode__opcode_range_check__bit_3).
              let val := addmod(
                1,
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_2*/ mload(0x2860),
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_4*/ mload(0x2880),
                      PRIME),
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_3*/ mload(0x28a0),
                    PRIME)),
                PRIME)
              mstore(0x28c0, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_5 = column0_row5 - (column0_row6 + column0_row6).
              let val := addmod(
                /*column0_row5*/ mload(0x700),
                sub(
                  PRIME,
                  addmod(/*column0_row6*/ mload(0x720), /*column0_row6*/ mload(0x720), PRIME)),
                PRIME)
              mstore(0x28e0, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_6 = column0_row6 - (column0_row7 + column0_row7).
              let val := addmod(
                /*column0_row6*/ mload(0x720),
                sub(
                  PRIME,
                  addmod(/*column0_row7*/ mload(0x740), /*column0_row7*/ mload(0x740), PRIME)),
                PRIME)
              mstore(0x2900, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_9 = column0_row9 - (column0_row10 + column0_row10).
              let val := addmod(
                /*column0_row9*/ mload(0x780),
                sub(
                  PRIME,
                  addmod(/*column0_row10*/ mload(0x7a0), /*column0_row10*/ mload(0x7a0), PRIME)),
                PRIME)
              mstore(0x2920, val)
              }


              {
              // cpu/decode/flag_res_o

Tags:
Factory|addr:0x2c9726b081305f314a74d570f0fed8dd9fab01a1|verified:true|block:23531474|tx:0xc80915c688ee557b8719f3867dd8bc1dc788bfccc2fd924b2a85b964fe5d92d2|first_check:1759913551

Submitted on: 2025-10-08 10:52:31

Comments

Log in to comment.

No comments yet.