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/layout2/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) - trace_length.
    // [0xa0, 0xc0) - offset_size.
    // [0xc0, 0xe0) - half_offset_size.
    // [0xe0, 0x100) - initial_ap.
    // [0x100, 0x120) - initial_pc.
    // [0x120, 0x140) - final_ap.
    // [0x140, 0x160) - final_pc.
    // [0x160, 0x180) - memory/multi_column_perm/perm/interaction_elm.
    // [0x180, 0x1a0) - memory/multi_column_perm/hash_interaction_elm0.
    // [0x1a0, 0x1c0) - memory/multi_column_perm/perm/public_memory_prod.
    // [0x1c0, 0x1e0) - range_check16/perm/interaction_elm.
    // [0x1e0, 0x200) - range_check16/perm/public_memory_prod.
    // [0x200, 0x220) - range_check_min.
    // [0x220, 0x240) - range_check_max.
    // [0x240, 0x260) - pedersen/shift_point.x.
    // [0x260, 0x280) - pedersen/shift_point.y.
    // [0x280, 0x2a0) - initial_pedersen_addr.
    // [0x2a0, 0x2c0) - initial_range_check_addr.
    // [0x2c0, 0x2e0) - ecdsa/sig_config.alpha.
    // [0x2e0, 0x300) - ecdsa/sig_config.shift_point.x.
    // [0x300, 0x320) - ecdsa/sig_config.shift_point.y.
    // [0x320, 0x340) - ecdsa/sig_config.beta.
    // [0x340, 0x360) - initial_ecdsa_addr.
    // [0x360, 0x380) - trace_generator.
    // [0x380, 0x3a0) - oods_point.
    // [0x3a0, 0x400) - interaction_elements.
    // [0x400, 0x420) - composition_alpha.
    // [0x420, 0x1420) - oods_values.
    // ----------------------- end of input data - -------------------------
    // [0x1420, 0x1440) - intermediate_value/cpu/decode/opcode_range_check/bit_0.
    // [0x1440, 0x1460) - intermediate_value/cpu/decode/opcode_range_check/bit_2.
    // [0x1460, 0x1480) - intermediate_value/cpu/decode/opcode_range_check/bit_4.
    // [0x1480, 0x14a0) - intermediate_value/cpu/decode/opcode_range_check/bit_3.
    // [0x14a0, 0x14c0) - intermediate_value/cpu/decode/flag_op1_base_op0_0.
    // [0x14c0, 0x14e0) - intermediate_value/cpu/decode/opcode_range_check/bit_5.
    // [0x14e0, 0x1500) - intermediate_value/cpu/decode/opcode_range_check/bit_6.
    // [0x1500, 0x1520) - intermediate_value/cpu/decode/opcode_range_check/bit_9.
    // [0x1520, 0x1540) - intermediate_value/cpu/decode/flag_res_op1_0.
    // [0x1540, 0x1560) - intermediate_value/cpu/decode/opcode_range_check/bit_7.
    // [0x1560, 0x1580) - intermediate_value/cpu/decode/opcode_range_check/bit_8.
    // [0x1580, 0x15a0) - intermediate_value/cpu/decode/flag_pc_update_regular_0.
    // [0x15a0, 0x15c0) - intermediate_value/cpu/decode/opcode_range_check/bit_12.
    // [0x15c0, 0x15e0) - intermediate_value/cpu/decode/opcode_range_check/bit_13.
    // [0x15e0, 0x1600) - intermediate_value/cpu/decode/fp_update_regular_0.
    // [0x1600, 0x1620) - intermediate_value/cpu/decode/opcode_range_check/bit_1.
    // [0x1620, 0x1640) - intermediate_value/npc_reg_0.
    // [0x1640, 0x1660) - intermediate_value/cpu/decode/opcode_range_check/bit_10.
    // [0x1660, 0x1680) - intermediate_value/cpu/decode/opcode_range_check/bit_11.
    // [0x1680, 0x16a0) - intermediate_value/cpu/decode/opcode_range_check/bit_14.
    // [0x16a0, 0x16c0) - intermediate_value/memory/address_diff_0.
    // [0x16c0, 0x16e0) - intermediate_value/range_check16/diff_0.
    // [0x16e0, 0x1700) - intermediate_value/pedersen/hash0/ec_subset_sum/bit_0.
    // [0x1700, 0x1720) - intermediate_value/pedersen/hash0/ec_subset_sum/bit_neg_0.
    // [0x1720, 0x1740) - intermediate_value/range_check_builtin/value0_0.
    // [0x1740, 0x1760) - intermediate_value/range_check_builtin/value1_0.
    // [0x1760, 0x1780) - intermediate_value/range_check_builtin/value2_0.
    // [0x1780, 0x17a0) - intermediate_value/range_check_builtin/value3_0.
    // [0x17a0, 0x17c0) - intermediate_value/range_check_builtin/value4_0.
    // [0x17c0, 0x17e0) - intermediate_value/range_check_builtin/value5_0.
    // [0x17e0, 0x1800) - intermediate_value/range_check_builtin/value6_0.
    // [0x1800, 0x1820) - intermediate_value/range_check_builtin/value7_0.
    // [0x1820, 0x1840) - intermediate_value/ecdsa/signature0/doubling_key/x_squared.
    // [0x1840, 0x1860) - intermediate_value/ecdsa/signature0/exponentiate_generator/bit_0.
    // [0x1860, 0x1880) - intermediate_value/ecdsa/signature0/exponentiate_generator/bit_neg_0.
    // [0x1880, 0x18a0) - intermediate_value/ecdsa/signature0/exponentiate_key/bit_0.
    // [0x18a0, 0x18c0) - intermediate_value/ecdsa/signature0/exponentiate_key/bit_neg_0.
    // [0x18c0, 0x1b80) - expmods.
    // [0x1b80, 0x1ec0) - domains.
    // [0x1ec0, 0x2180) - denominator_invs.
    // [0x2180, 0x2440) - denominators.
    // [0x2440, 0x2500) - expmod_context.

    fallback() external {
        uint256 res;
        assembly {
            let PRIME := 0x800000000000011000000000000000000000000000000000000000000000001
            // Copy input from calldata to memory.
            calldatacopy(0x0, 0x0, /*Input data size*/ 0x1420)
            let point := /*oods_point*/ mload(0x380)
            function expmod(base, exponent, modulus) -> result {
              let p := /*expmod_context*/ 0x2440
              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(0x18c0, expmod(point, div(/*trace_length*/ mload(0x80), 32768), PRIME))

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

              // expmods[2] = point^(trace_length / 512).
              mstore(0x1900, expmod(point, div(/*trace_length*/ mload(0x80), 512), PRIME))

              // expmods[3] = point^(trace_length / 256).
              mstore(0x1920, mulmod(
                /*point^(trace_length / 512)*/ mload(0x1900),
                /*point^(trace_length / 512)*/ mload(0x1900),
                PRIME))

              // expmods[4] = point^(trace_length / 128).
              mstore(0x1940, mulmod(
                /*point^(trace_length / 256)*/ mload(0x1920),
                /*point^(trace_length / 256)*/ mload(0x1920),
                PRIME))

              // expmods[5] = point^(trace_length / 64).
              mstore(0x1960, mulmod(
                /*point^(trace_length / 128)*/ mload(0x1940),
                /*point^(trace_length / 128)*/ mload(0x1940),
                PRIME))

              // expmods[6] = point^(trace_length / 16).
              mstore(0x1980, expmod(point, div(/*trace_length*/ mload(0x80), 16), PRIME))

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

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

              // expmods[9] = point^(trace_length / 2).
              mstore(0x19e0, mulmod(
                /*point^(trace_length / 4)*/ mload(0x19c0),
                /*point^(trace_length / 4)*/ mload(0x19c0),
                PRIME))

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

              // expmods[11] = trace_generator^(trace_length / 2).
              mstore(0x1a20, expmod(/*trace_generator*/ mload(0x360), div(/*trace_length*/ mload(0x80), 2), PRIME))

              // expmods[12] = trace_generator^(15 * trace_length / 16).
              mstore(0x1a40, expmod(/*trace_generator*/ mload(0x360), div(mul(15, /*trace_length*/ mload(0x80)), 16), PRIME))

              // expmods[13] = trace_generator^(251 * trace_length / 256).
              mstore(0x1a60, expmod(/*trace_generator*/ mload(0x360), div(mul(251, /*trace_length*/ mload(0x80)), 256), PRIME))

              // expmods[14] = trace_generator^(63 * trace_length / 64).
              mstore(0x1a80, expmod(/*trace_generator*/ mload(0x360), div(mul(63, /*trace_length*/ mload(0x80)), 64), PRIME))

              // expmods[15] = trace_generator^(255 * trace_length / 256).
              mstore(0x1aa0, expmod(/*trace_generator*/ mload(0x360), div(mul(255, /*trace_length*/ mload(0x80)), 256), PRIME))

              // expmods[16] = trace_generator^(trace_length - 16).
              mstore(0x1ac0, expmod(/*trace_generator*/ mload(0x360), sub(/*trace_length*/ mload(0x80), 16), PRIME))

              // expmods[17] = trace_generator^(trace_length - 2).
              mstore(0x1ae0, expmod(/*trace_generator*/ mload(0x360), sub(/*trace_length*/ mload(0x80), 2), PRIME))

              // expmods[18] = trace_generator^(trace_length - 4).
              mstore(0x1b00, expmod(/*trace_generator*/ mload(0x360), sub(/*trace_length*/ mload(0x80), 4), PRIME))

              // expmods[19] = trace_generator^(trace_length - 512).
              mstore(0x1b20, expmod(/*trace_generator*/ mload(0x360), sub(/*trace_length*/ mload(0x80), 512), PRIME))

              // expmods[20] = trace_generator^(trace_length - 256).
              mstore(0x1b40, expmod(/*trace_generator*/ mload(0x360), sub(/*trace_length*/ mload(0x80), 256), PRIME))

              // expmods[21] = trace_generator^(trace_length - 32768).
              mstore(0x1b60, expmod(/*trace_generator*/ mload(0x360), sub(/*trace_length*/ mload(0x80), 32768), 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(0x1b80,
                     addmod(/*point^trace_length*/ mload(0x1a00), 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(0x1ba0,
                     addmod(/*point^(trace_length / 2)*/ mload(0x19e0), sub(PRIME, 1), PRIME))

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

              // Denominator for constraints: 'public_memory_addr_zero', 'public_memory_value_zero'.
              // domains[3] = point^(trace_length / 8) - 1.
              mstore(0x1be0,
                     addmod(/*point^(trace_length / 8)*/ mload(0x19a0), 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(0x1c00,
                     addmod(
                       /*point^(trace_length / 16)*/ mload(0x1980),
                       sub(PRIME, /*trace_generator^(15 * trace_length / 16)*/ mload(0x1a40)),
                       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'.
              // domains[5] = point^(trace_length / 16) - 1.
              mstore(0x1c20,
                     addmod(/*point^(trace_length / 16)*/ mload(0x1980), 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'.
              // domains[6] = point^(trace_length / 64) - 1.
              mstore(0x1c40,
                     addmod(/*point^(trace_length / 64)*/ mload(0x1960), 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(0x1c60,
                     addmod(/*point^(trace_length / 128)*/ mload(0x1940), 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'.
              // domains[8] = point^(trace_length / 256) - 1.
              mstore(0x1c80,
                     addmod(/*point^(trace_length / 256)*/ mload(0x1920), 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(0x1ca0,
                     addmod(
                       /*point^(trace_length / 256)*/ mload(0x1920),
                       sub(PRIME, /*trace_generator^(255 * trace_length / 256)*/ mload(0x1aa0)),
                       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(0x1cc0,
                     addmod(
                       /*point^(trace_length / 256)*/ mload(0x1920),
                       sub(PRIME, /*trace_generator^(63 * trace_length / 64)*/ mload(0x1a80)),
                       PRIME))

              // Numerator for constraints: 'pedersen/hash0/copy_point/x', 'pedersen/hash0/copy_point/y'.
              // domains[11] = point^(trace_length / 512) - trace_generator^(trace_length / 2).
              mstore(0x1ce0,
                     addmod(
                       /*point^(trace_length / 512)*/ mload(0x1900),
                       sub(PRIME, /*trace_generator^(trace_length / 2)*/ mload(0x1a20)),
                       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'.
              // domains[12] = point^(trace_length / 512) - 1.
              mstore(0x1d00,
                     addmod(/*point^(trace_length / 512)*/ mload(0x1900), sub(PRIME, 1), PRIME))

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_key/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'.
              // domains[13] = point^(trace_length / 16384) - trace_generator^(255 * trace_length / 256).
              mstore(0x1d20,
                     addmod(
                       /*point^(trace_length / 16384)*/ mload(0x18e0),
                       sub(PRIME, /*trace_generator^(255 * trace_length / 256)*/ mload(0x1aa0)),
                       PRIME))

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

              // Denominator for constraints: 'ecdsa/signature0/init_key/x', 'ecdsa/signature0/init_key/y', 'ecdsa/signature0/r_and_w_nonzero'.
              // domains[15] = point^(trace_length / 16384) - 1.
              mstore(0x1d60,
                     addmod(/*point^(trace_length / 16384)*/ mload(0x18e0), sub(PRIME, 1), 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[16] = point^(trace_length / 32768) - trace_generator^(255 * trace_length / 256).
              mstore(0x1d80,
                     addmod(
                       /*point^(trace_length / 32768)*/ mload(0x18c0),
                       sub(PRIME, /*trace_generator^(255 * trace_length / 256)*/ mload(0x1aa0)),
                       PRIME))

              // Denominator for constraints: 'ecdsa/signature0/exponentiate_generator/bit_extraction_end'.
              // domains[17] = point^(trace_length / 32768) - trace_generator^(251 * trace_length / 256).
              mstore(0x1da0,
                     addmod(
                       /*point^(trace_length / 32768)*/ mload(0x18c0),
                       sub(PRIME, /*trace_generator^(251 * trace_length / 256)*/ mload(0x1a60)),
                       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[18] = point^(trace_length / 32768) - 1.
              mstore(0x1dc0,
                     addmod(/*point^(trace_length / 32768)*/ mload(0x18c0), 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[19] = point - trace_generator^(trace_length - 16).
              mstore(0x1de0,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 16)*/ mload(0x1ac0)), 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', 'pedersen/init_addr', 'range_check_builtin/init_addr', 'ecdsa/init_addr'.
              // domains[20] = point - 1.
              mstore(0x1e00,
                     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[21] = point - trace_generator^(trace_length - 2).
              mstore(0x1e20,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 2)*/ mload(0x1ae0)), PRIME))

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

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

              // Numerator for constraints: 'range_check_builtin/addr_step'.
              // domains[24] = point - trace_generator^(trace_length - 256).
              mstore(0x1e80,
                     addmod(point, sub(PRIME, /*trace_generator^(trace_length - 256)*/ mload(0x1b40)), PRIME))

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

            }

            {
              // Prepare denominators for batch inverse.

              // denominators[0] = domains[0].
              mstore(0x2180, /*domains[0]*/ mload(0x1b80))

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

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

              // denominators[3] = domains[19].
              mstore(0x21e0, /*domains[19]*/ mload(0x1de0))

              // denominators[4] = domains[20].
              mstore(0x2200, /*domains[20]*/ mload(0x1e00))

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

              // denominators[6] = domains[21].
              mstore(0x2240, /*domains[21]*/ mload(0x1e20))

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

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

              // denominators[9] = domains[22].
              mstore(0x22a0, /*domains[22]*/ mload(0x1e40))

              // denominators[10] = domains[8].
              mstore(0x22c0, /*domains[8]*/ mload(0x1c80))

              // denominators[11] = domains[9].
              mstore(0x22e0, /*domains[9]*/ mload(0x1ca0))

              // denominators[12] = domains[10].
              mstore(0x2300, /*domains[10]*/ mload(0x1cc0))

              // denominators[13] = domains[12].
              mstore(0x2320, /*domains[12]*/ mload(0x1d00))

              // denominators[14] = domains[6].
              mstore(0x2340, /*domains[6]*/ mload(0x1c40))

              // denominators[15] = domains[13].
              mstore(0x2360, /*domains[13]*/ mload(0x1d20))

              // denominators[16] = domains[7].
              mstore(0x2380, /*domains[7]*/ mload(0x1c60))

              // denominators[17] = domains[16].
              mstore(0x23a0, /*domains[16]*/ mload(0x1d80))

              // denominators[18] = domains[17].
              mstore(0x23c0, /*domains[17]*/ mload(0x1da0))

              // denominators[19] = domains[14].
              mstore(0x23e0, /*domains[14]*/ mload(0x1d40))

              // denominators[20] = domains[18].
              mstore(0x2400, /*domains[18]*/ mload(0x1dc0))

              // denominators[21] = domains[15].
              mstore(0x2420, /*domains[15]*/ mload(0x1d60))

            }

            {
              // 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 := 0x2c0
              let prod := 1
              let partialProductEndPtr := 0x2180
              for { let partialProductPtr := 0x1ec0 }
                  lt(partialProductPtr, partialProductEndPtr)
                  { partialProductPtr := add(partialProductPtr, 0x20) } {
                  mstore(partialProductPtr, prod)
                  // prod *= d_{i}.
                  prod := mulmod(prod,
                                 mload(add(partialProductPtr, productsToValuesOffset)),
                                 PRIME)
              }

              let firstPartialProductPtr := 0x1ec0
              // 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 := 0x2180
              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(0x420),
                sub(
                  PRIME,
                  addmod(/*column0_row1*/ mload(0x440), /*column0_row1*/ mload(0x440), PRIME)),
                PRIME)
              mstore(0x1420, val)
              }


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


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


              {
              // cpu/decode/opcode_range_check/bit_3 = column0_row3 - (column0_row4 + column0_row4).
              let val := addmod(
                /*column0_row3*/ mload(0x480),
                sub(
                  PRIME,
                  addmod(/*column0_row4*/ mload(0x4a0), /*column0_row4*/ mload(0x4a0), PRIME)),
                PRIME)
              mstore(0x1480, 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(0x1440),
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_4*/ mload(0x1460),
                      PRIME),
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_3*/ mload(0x1480),
                    PRIME)),
                PRIME)
              mstore(0x14a0, val)
              }


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


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


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


              {
              // cpu/decode/flag_res_op1_0 = 1 - (cpu__decode__opcode_range_check__bit_5 + cpu__decode__opcode_range_check__bit_6 + cpu__decode__opcode_range_check__bit_9).
              let val := addmod(
                1,
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_5*/ mload(0x14c0),
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_6*/ mload(0x14e0),
                      PRIME),
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_9*/ mload(0x1500),
                    PRIME)),
                PRIME)
              mstore(0x1520, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_7 = column0_row7 - (column0_row8 + column0_row8).
              let val := addmod(
                /*column0_row7*/ mload(0x500),
                sub(
                  PRIME,
                  addmod(/*column0_row8*/ mload(0x520), /*column0_row8*/ mload(0x520), PRIME)),
                PRIME)
              mstore(0x1540, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_8 = column0_row8 - (column0_row9 + column0_row9).
              let val := addmod(
                /*column0_row8*/ mload(0x520),
                sub(
                  PRIME,
                  addmod(/*column0_row9*/ mload(0x540), /*column0_row9*/ mload(0x540), PRIME)),
                PRIME)
              mstore(0x1560, val)
              }


              {
              // cpu/decode/flag_pc_update_regular_0 = 1 - (cpu__decode__opcode_range_check__bit_7 + cpu__decode__opcode_range_check__bit_8 + cpu__decode__opcode_range_check__bit_9).
              let val := addmod(
                1,
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_7*/ mload(0x1540),
                      /*intermediate_value/cpu/decode/opcode_range_check/bit_8*/ mload(0x1560),
                      PRIME),
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_9*/ mload(0x1500),
                    PRIME)),
                PRIME)
              mstore(0x1580, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_12 = column0_row12 - (column0_row13 + column0_row13).
              let val := addmod(
                /*column0_row12*/ mload(0x5a0),
                sub(
                  PRIME,
                  addmod(/*column0_row13*/ mload(0x5c0), /*column0_row13*/ mload(0x5c0), PRIME)),
                PRIME)
              mstore(0x15a0, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_13 = column0_row13 - (column0_row14 + column0_row14).
              let val := addmod(
                /*column0_row13*/ mload(0x5c0),
                sub(
                  PRIME,
                  addmod(/*column0_row14*/ mload(0x5e0), /*column0_row14*/ mload(0x5e0), PRIME)),
                PRIME)
              mstore(0x15c0, val)
              }


              {
              // cpu/decode/fp_update_regular_0 = 1 - (cpu__decode__opcode_range_check__bit_12 + cpu__decode__opcode_range_check__bit_13).
              let val := addmod(
                1,
                sub(
                  PRIME,
                  addmod(
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_12*/ mload(0x15a0),
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_13*/ mload(0x15c0),
                    PRIME)),
                PRIME)
              mstore(0x15e0, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_1 = column0_row1 - (column0_row2 + column0_row2).
              let val := addmod(
                /*column0_row1*/ mload(0x440),
                sub(
                  PRIME,
                  addmod(/*column0_row2*/ mload(0x460), /*column0_row2*/ mload(0x460), PRIME)),
                PRIME)
              mstore(0x1600, val)
              }


              {
              // npc_reg_0 = column5_row0 + cpu__decode__opcode_range_check__bit_2 + 1.
              let val := addmod(
                addmod(
                  /*column5_row0*/ mload(0x8a0),
                  /*intermediate_value/cpu/decode/opcode_range_check/bit_2*/ mload(0x1440),
                  PRIME),
                1,
                PRIME)
              mstore(0x1620, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_10 = column0_row10 - (column0_row11 + column0_row11).
              let val := addmod(
                /*column0_row10*/ mload(0x560),
                sub(
                  PRIME,
                  addmod(/*column0_row11*/ mload(0x580), /*column0_row11*/ mload(0x580), PRIME)),
                PRIME)
              mstore(0x1640, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_11 = column0_row11 - (column0_row12 + column0_row12).
              let val := addmod(
                /*column0_row11*/ mload(0x580),
                sub(
                  PRIME,
                  addmod(/*column0_row12*/ mload(0x5a0), /*column0_row12*/ mload(0x5a0), PRIME)),
                PRIME)
              mstore(0x1660, val)
              }


              {
              // cpu/decode/opcode_range_check/bit_14 = column0_row14 - (column0_row15 + column0_row15).
              let val := addmod(
                /*column0_row14*/ mload(0x5e0),
                sub(
                  PRIME,
                  addmod(/*column0_row15*/ mload(0x600), /*column0_row15*/ mload(0x600), PRIME)),
                PRIME)
              mstore(0x1680, val)
              }


              {
              // memory/address_diff_0 = column6_row2 - column6_row0.
              let val := addmod(/*column6_row2*/ mload(0xc20), sub(PRIME, /*column6_row0*/ mload(0xbe0)), PRIME)
              mstore(0x16a0, val)
              }


              {
              // range_check16/diff_0 = column7_row6 - column7_row2.
              let val := addmod(/*column7_row6*/ mload(0xd20), sub(PRIME, /*column7_row2*/ mload(0xca0)), PRIME)
              mstore(0x16c0, val)
              }


              {
              // pedersen/hash0/ec_subset_sum/bit_0 = column3_row0 - (column3_row1 + column3_row1).
              let val := addmod(
                /*column3_row0*/ mload(0x740),
                sub(
                  PRIME,
                  addmod(/*column3_row1*/ mload(0x760), /*column3_row1*/ mload(0x760), PRIME)),
                PRIME)
              mstore(0x16e0, val)
              }


              {
              // pedersen/hash0/ec_subset_sum/bit_neg_0 = 1 - pedersen__hash0__ec_subset_sum__bit_0.
              let val := addmod(
                1,
                sub(PRIME, /*intermediate_value/pedersen/hash0/ec_subset_sum/bit_0*/ mload(0x16e0)),
                PRIME)
              mstore(0x1700, val)
              }


              {
              // range_check_builtin/value0_0 = column7_row12.
              let val := /*column7_row12*/ mload(0xdc0)
              mstore(0x1720, val)
              }


              {
              // range_check_builtin/value1_0 = range_check_builtin__value0_0 * offset_size + column7_row44.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value0_0*/ mload(0x1720),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row44*/ mload(0xec0),
                PRIME)
              mstore(0x1740, val)
              }


              {
              // range_check_builtin/value2_0 = range_check_builtin__value1_0 * offset_size + column7_row76.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value1_0*/ mload(0x1740),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row76*/ mload(0xf60),
                PRIME)
              mstore(0x1760, val)
              }


              {
              // range_check_builtin/value3_0 = range_check_builtin__value2_0 * offset_size + column7_row108.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value2_0*/ mload(0x1760),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row108*/ mload(0xfe0),
                PRIME)
              mstore(0x1780, val)
              }


              {
              // range_check_builtin/value4_0 = range_check_builtin__value3_0 * offset_size + column7_row140.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value3_0*/ mload(0x1780),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row140*/ mload(0x1020),
                PRIME)
              mstore(0x17a0, val)
              }


              {
              // range_check_builtin/value5_0 = range_check_builtin__value4_0 * offset_size + column7_row172.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value4_0*/ mload(0x17a0),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row172*/ mload(0x1040),
                PRIME)
              mstore(0x17c0, val)
              }


              {
              // range_check_builtin/value6_0 = range_check_builtin__value5_0 * offset_size + column7_row204.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value5_0*/ mload(0x17c0),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row204*/ mload(0x1060),
                PRIME)
              mstore(0x17e0, val)
              }


              {
              // range_check_builtin/value7_0 = range_check_builtin__value6_0 * offset_size + column7_row236.
              let val := addmod(
                mulmod(
                  /*intermediate_value/range_check_builtin/value6_0*/ mload(0x17e0),
                  /*offset_size*/ mload(0xa0),
                  PRIME),
                /*column7_row236*/ mload(0x1080),
                PRIME)
              mstore(0x1800, val)
              }


              {
              // ecdsa/signature0/doubling_key/x_squared = column7_row7 * column7_row7.
              let val := mulmod(/*column7_row7*/ mload(0xd40), /*column7_row7*/ mload(0xd40), PRIME)
              mstore(0x1820, val)
              }


              {
              // ecdsa/signature0/exponentiate_generator/bit_0 = column8_row32 - (column8_row160 + column8_row160).
              let val := addmod(
                /*column8_row32*/ mload(0x1240),
                sub(
                  PRIME,
                  addmod(/*column8_row160*/ mload(0x12e0), /*column8_row160*/ mload(0x12e0), PRIME)),
                PRIME)
              mstore(0x1840, val)
              }


              {
              // ecdsa/signature0/exponentiate_generator/bit_neg_0 = 1 - ecdsa__signature0__exponentiate_generator__bit_0.
              let val := addmod(
                1,
                sub(
                  PRIME,
                  /*intermediate_value/ecdsa/signature0/exponentiate_generator/bit_0*/ mload(0x1840)),
                PRIME)
              mstore(0x1860, val)
              }


              {
              // ecdsa/signature0/exponentiate_key/bit_0 = column7_row15 - (column7_row79 + column7_row79).
              let val := addmod(
                /*column7_row15*/ mload(0xe00),
                sub(
                  PRIME,
                  addmod(/*column7_row79*/ mload(0xf80), /*column7_row79*/ mload(0xf80), PRIME)),
                PRIME)
              mstore(0x1880, val)
              }


              {
              // ecdsa/signature0/exponentiate_key/bit_neg_0 = 1 - ecdsa__signature0__exponentiate_key__bit_0.
              let val := addmod(
                1,
                sub(
                  PRIME,
                  /*intermediate_value/ecdsa/signature0/exponentiate_key/bit_0*/ mload(0x1880)),
                PRIME)
              mstore(0x18a0, val)
              }


              let composition_alpha_pow := 1
              let composition_alpha := /*composition_alpha*/ mload(0x400)
              {
              // Constraint expression for cpu/decode/opcode_range_check/bit: cpu__decode__opcode_range_check__bit_0 * cpu__decode__opcode_range_check__bit_0 - cpu__decode__opcode_range_check__bit_0.
              let val := addmod(
                mulmod(
                  /*intermediate_value/cpu/decode/opcode_range_check/bit_0*/ mload(0x1420),
                  /*intermediate_value/cpu/decode/opcode_range_check/bit_0*/ mload(0x1420),
                  PRIME),
                sub(PRIME, /*intermediate_value/cpu/decode/opcode_range_check/bit_0*/ mload(0x1420)),
                PRIME)

              // Numerator: point^(trace_length / 16) - trace_generator^(15 * trace_length / 16).
              // val *= domains[4].
              val := mulmod(val, /*domains[4]*/ mload(0x1c00), PRIME)
              // Denominator: point^trace_length - 1.
              // val *= denominator_invs[0].
              val := mulmod(val, /*denominator_invs[0]*/ mload(0x1ec0), PRIME)

              // res += val * alpha ** 0.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/decode/opcode_range_check/zero: column0_row0.
              let val := /*column0_row0*/ mload(0x420)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - trace_generator^(15 * trace_length / 16).
              // val *= denominator_invs[1].
              val := mulmod(val, /*denominator_invs[1]*/ mload(0x1ee0), PRIME)

              // res += val * alpha ** 1.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/decode/opcode_range_check_input: column5_row1 - (((column0_row0 * offset_size + column7_row4) * offset_size + column7_row8) * offset_size + column7_row0).
              let val := addmod(
                /*column5_row1*/ mload(0x8c0),
                sub(
                  PRIME,
                  addmod(
                    mulmod(
                      addmod(
                        mulmod(
                          addmod(
                            mulmod(/*column0_row0*/ mload(0x420), /*offset_size*/ mload(0xa0), PRIME),
                            /*column7_row4*/ mload(0xce0),
                            PRIME),
                          /*offset_size*/ mload(0xa0),
                          PRIME),
                        /*column7_row8*/ mload(0xd60),
                        PRIME),
                      /*offset_size*/ mload(0xa0),
                      PRIME),
                    /*column7_row0*/ mload(0xc60),
                    PRIME)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 2.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/decode/flag_op1_base_op0_bit: cpu__decode__flag_op1_base_op0_0 * cpu__decode__flag_op1_base_op0_0 - cpu__decode__flag_op1_base_op0_0.
              let val := addmod(
                mulmod(
                  /*intermediate_value/cpu/decode/flag_op1_base_op0_0*/ mload(0x14a0),
                  /*intermediate_value/cpu/decode/flag_op1_base_op0_0*/ mload(0x14a0),
                  PRIME),
                sub(PRIME, /*intermediate_value/cpu/decode/flag_op1_base_op0_0*/ mload(0x14a0)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 3.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/decode/flag_res_op1_bit: cpu__decode__flag_res_op1_0 * cpu__decode__flag_res_op1_0 - cpu__decode__flag_res_op1_0.
              let val := addmod(
                mulmod(
                  /*intermediate_value/cpu/decode/flag_res_op1_0*/ mload(0x1520),
                  /*intermediate_value/cpu/decode/flag_res_op1_0*/ mload(0x1520),
                  PRIME),
                sub(PRIME, /*intermediate_value/cpu/decode/flag_res_op1_0*/ mload(0x1520)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 4.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/decode/flag_pc_update_regular_bit: cpu__decode__flag_pc_update_regular_0 * cpu__decode__flag_pc_update_regular_0 - cpu__decode__flag_pc_update_regular_0.
              let val := addmod(
                mulmod(
                  /*intermediate_value/cpu/decode/flag_pc_update_regular_0*/ mload(0x1580),
                  /*intermediate_value/cpu/decode/flag_pc_update_regular_0*/ mload(0x1580),
                  PRIME),
                sub(PRIME, /*intermediate_value/cpu/decode/flag_pc_update_regular_0*/ mload(0x1580)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 5.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/decode/fp_update_regular_bit: cpu__decode__fp_update_regular_0 * cpu__decode__fp_update_regular_0 - cpu__decode__fp_update_regular_0.
              let val := addmod(
                mulmod(
                  /*intermediate_value/cpu/decode/fp_update_regular_0*/ mload(0x15e0),
                  /*intermediate_value/cpu/decode/fp_update_regular_0*/ mload(0x15e0),
                  PRIME),
                sub(PRIME, /*intermediate_value/cpu/decode/fp_update_regular_0*/ mload(0x15e0)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 6.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/operands/mem_dst_addr: column5_row8 + half_offset_size - (cpu__decode__opcode_range_check__bit_0 * column7_row9 + (1 - cpu__decode__opcode_range_check__bit_0) * column7_row1 + column7_row0).
              let val := addmod(
                addmod(/*column5_row8*/ mload(0x9a0), /*half_offset_size*/ mload(0xc0), PRIME),
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      mulmod(
                        /*intermediate_value/cpu/decode/opcode_range_check/bit_0*/ mload(0x1420),
                        /*column7_row9*/ mload(0xd80),
                        PRIME),
                      mulmod(
                        addmod(
                          1,
                          sub(PRIME, /*intermediate_value/cpu/decode/opcode_range_check/bit_0*/ mload(0x1420)),
                          PRIME),
                        /*column7_row1*/ mload(0xc80),
                        PRIME),
                      PRIME),
                    /*column7_row0*/ mload(0xc60),
                    PRIME)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 7.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/operands/mem0_addr: column5_row4 + half_offset_size - (cpu__decode__opcode_range_check__bit_1 * column7_row9 + (1 - cpu__decode__opcode_range_check__bit_1) * column7_row1 + column7_row8).
              let val := addmod(
                addmod(/*column5_row4*/ mload(0x920), /*half_offset_size*/ mload(0xc0), PRIME),
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      mulmod(
                        /*intermediate_value/cpu/decode/opcode_range_check/bit_1*/ mload(0x1600),
                        /*column7_row9*/ mload(0xd80),
                        PRIME),
                      mulmod(
                        addmod(
                          1,
                          sub(PRIME, /*intermediate_value/cpu/decode/opcode_range_check/bit_1*/ mload(0x1600)),
                          PRIME),
                        /*column7_row1*/ mload(0xc80),
                        PRIME),
                      PRIME),
                    /*column7_row8*/ mload(0xd60),
                    PRIME)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 8.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/operands/mem1_addr: column5_row12 + half_offset_size - (cpu__decode__opcode_range_check__bit_2 * column5_row0 + cpu__decode__opcode_range_check__bit_4 * column7_row1 + cpu__decode__opcode_range_check__bit_3 * column7_row9 + cpu__decode__flag_op1_base_op0_0 * column5_row5 + column7_row4).
              let val := addmod(
                addmod(/*column5_row12*/ mload(0x9e0), /*half_offset_size*/ mload(0xc0), PRIME),
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      addmod(
                        addmod(
                          mulmod(
                            /*intermediate_value/cpu/decode/opcode_range_check/bit_2*/ mload(0x1440),
                            /*column5_row0*/ mload(0x8a0),
                            PRIME),
                          mulmod(
                            /*intermediate_value/cpu/decode/opcode_range_check/bit_4*/ mload(0x1460),
                            /*column7_row1*/ mload(0xc80),
                            PRIME),
                          PRIME),
                        mulmod(
                          /*intermediate_value/cpu/decode/opcode_range_check/bit_3*/ mload(0x1480),
                          /*column7_row9*/ mload(0xd80),
                          PRIME),
                        PRIME),
                      mulmod(
                        /*intermediate_value/cpu/decode/flag_op1_base_op0_0*/ mload(0x14a0),
                        /*column5_row5*/ mload(0x940),
                        PRIME),
                      PRIME),
                    /*column7_row4*/ mload(0xce0),
                    PRIME)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 9.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/operands/ops_mul: column7_row5 - column5_row5 * column5_row13.
              let val := addmod(
                /*column7_row5*/ mload(0xd00),
                sub(
                  PRIME,
                  mulmod(/*column5_row5*/ mload(0x940), /*column5_row13*/ mload(0xa00), PRIME)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 10.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/operands/res: (1 - cpu__decode__opcode_range_check__bit_9) * column7_row13 - (cpu__decode__opcode_range_check__bit_5 * (column5_row5 + column5_row13) + cpu__decode__opcode_range_check__bit_6 * column7_row5 + cpu__decode__flag_res_op1_0 * column5_row13).
              let val := addmod(
                mulmod(
                  addmod(
                    1,
                    sub(PRIME, /*intermediate_value/cpu/decode/opcode_range_check/bit_9*/ mload(0x1500)),
                    PRIME),
                  /*column7_row13*/ mload(0xde0),
                  PRIME),
                sub(
                  PRIME,
                  addmod(
                    addmod(
                      mulmod(
                        /*intermediate_value/cpu/decode/opcode_range_check/bit_5*/ mload(0x14c0),
                        addmod(/*column5_row5*/ mload(0x940), /*column5_row13*/ mload(0xa00), PRIME),
                        PRIME),
                      mulmod(
                        /*intermediate_value/cpu/decode/opcode_range_check/bit_6*/ mload(0x14e0),
                        /*column7_row5*/ mload(0xd00),
                        PRIME),
                      PRIME),
                    mulmod(
                      /*intermediate_value/cpu/decode/flag_res_op1_0*/ mload(0x1520),
                      /*column5_row13*/ mload(0xa00),
                      PRIME),
                    PRIME)),
                PRIME)

              // Numerator: 1.
              // val *= 1.
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 11.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/update_registers/update_pc/tmp0: column7_row3 - cpu__decode__opcode_range_check__bit_9 * column5_row9.
              let val := addmod(
                /*column7_row3*/ mload(0xcc0),
                sub(
                  PRIME,
                  mulmod(
                    /*intermediate_value/cpu/decode/opcode_range_check/bit_9*/ mload(0x1500),
                    /*column5_row9*/ mload(0x9c0),
                    PRIME)),
                PRIME)

              // Numerator: point - trace_generator^(trace_length - 16).
              // val *= domains[19].
              val := mulmod(val, /*domains[19]*/ mload(0x1de0), PRIME)
              // Denominator: point^(trace_length / 16) - 1.
              // val *= denominator_invs[2].
              val := mulmod(val, /*denominator_invs[2]*/ mload(0x1f00), PRIME)

              // res += val * alpha ** 12.
              res := addmod(res, mulmod(val, composition_alpha_pow, PRIME), PRIME)
              composition_alpha_pow := mulmod(composition_alpha_pow, composition_alpha, PRIME)
              }

              {
              // Constraint expression for cpu/update_reg

Tags:
Factory|addr:0x3e727f44fd2c92bd960aab86daacd1a831b16eba|verified:true|block:23531473|tx:0x530961aaa38afc7c165cd4e15df92f710f4da654c450b8ea30010594161927a5|first_check:1759913543

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

Comments

Log in to comment.

No comments yet.