// Copyright Supranational LLC // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 #if defined(__GNUC__) || defined(__clang__) # define FR_T(vec_t, ...) fr_t{(vec_t){__VA_ARGS__}} #else # define FR_T(vec_t, ...) fr_t{vec_t{__VA_ARGS__}} #endif const fr_t group_gen = FR_T(vec256, 0x1b0d0ef99fffffe6u, 0xeaba68a3a32a913fu, 0x47d8eb76d8dd0689u, 0x15d0085520f5bbc3u ); const fr_t group_gen_inverse = FR_T(vec256, 0xd745397409999999u, 0xb4ada7d483c3efa8u, 0xc49ca2f8e57f3161u, 0x162a3754ac156cb3u ); const int S = 28; const fr_t forward_roots_of_unity[S + 1] = { FR_T(vec256, 0xac96341c4ffffffbu, 0x36fc76959f60cd29u, 0x666ea36f7879462eu, 0x0e0a77c19a07df2fu ), FR_T(vec256, 0x974bc177a0000006u, 0xf13771b2da58a367u, 0x51e1a2470908122eu, 0x2259d6b14729c0fau ), FR_T(vec256, 0x7f753d979edcef8bu, 0x5f3f172cb1479120u, 0x8db1627974096c6eu, 0x2b377b3539c108cfu ), FR_T(vec256, 0xf8ad4ae2b5ad7c3fu, 0x2d60c6ff83cb85beu, 0xd976fd2b5d9429f7u, 0x24407ce73f9ad9a9u ), FR_T(vec256, 0xf4b67d7c742f8f03u, 0x681b2ddc63d068ccu, 0x8ce5bcef1bfb576au, 0x167c2951d2b63cfeu ), FR_T(vec256, 0x2214f7b1bf574c64u, 0x28f9232ff7317df2u, 0xe57584a8b0ad75cdu, 0x2b81fb59dc176d03u ), FR_T(vec256, 0x8e9003e5818f61bfu, 0x8c9bbf349bf8fec2u, 0x53dceecd3f01534eu, 0x2690966be529aa3cu ), FR_T(vec256, 0x0a79c43026817bb1u, 0x7bb2cc7c99537df0u, 0xb6ca27d50241e6deu, 0x007ab33f3632f04cu ), FR_T(vec256, 0xa2afb83f83a24accu, 0x92f255d9525d536eu, 0x5e7566080286dd19u, 0x187bb1a6c52d2549u ), FR_T(vec256, 0x9c533be722a423deu, 0x642a9d127cdf6e0du, 0x0dbc7546409ac005u, 0x00f04c8db23d5082u ), FR_T(vec256, 0x1ef4b3b4280c1184u, 0xcf7ad4c2ae5e2a2cu, 0xb8063b6cc5a36518u, 0x2348c4b965dfc08cu ), FR_T(vec256, 0x48e72189ae4fcfb2u, 0x0a03fb3c8df85a07u, 0xff4d8a35ea9b2e0au, 0x28a98c2ecd9c1d77u ), FR_T(vec256, 0x1dd4522fb3ecdbd3u, 0x68222a93d055f3adu, 0xbe9c7d66b3d555e8u, 0x1b92f6b86194f846u ), FR_T(vec256, 0x894cdcbe79a04ed6u, 0x956cde6a44d30787u, 0x59a1b62bd7dbc15fu, 0x12ebe4109a806f4eu ), FR_T(vec256, 0xba13a0c74d05eab8u, 0x2e015d6311ab3116u, 0xb503922c8ca5a05au, 0x06be15d7fee394dau ), FR_T(vec256, 0x804ef7055bfdb854u, 0x7aa76b7140ceeaf2u, 0xfcc95a68b2fe89cbu, 0x1d461c35f1c406c7u ), FR_T(vec256, 0x47b3e75939397433u, 0x6d3a3a920d1c24d1u, 0xa134125174f75f43u, 0x1b821f01ee6ad556u ), FR_T(vec256, 0xda05b8d81204dc7cu, 0x48322ae606308d41u, 0x35358e27849e892cu, 0x040fcafbd62dd592u ), FR_T(vec256, 0x2566c62f09700b84u, 0x33183a76a0bf8660u, 0xd9398f59575058f1u, 0x056d2ece39d1cd34u ), FR_T(vec256, 0x049ea3b7e6a27a36u, 0xefebe603053edbbcu, 0x8424b45a3ace9ed4u, 0x287c8390a688795eu ), FR_T(vec256, 0xda32d465aa8d931au, 0x2669f68561808f9cu, 0x247bab46e4c8b085u, 0x0d3b668781d6021au ), FR_T(vec256, 0x27ea2192f5322f3cu, 0xb11884e9658fe9a7u, 0x3a8623bca053c069u, 0x128ff3f025e139a6u ), FR_T(vec256, 0x9b8e226ebcef1af2u, 0x9e45f1abdf406b60u, 0x538dd257d5a7bb3du, 0x0a3893037882a3bcu ), FR_T(vec256, 0x6e482404c09e9100u, 0x0d7591c7590025b2u, 0xa40227793a5ebe11u, 0x0164a6c3c1a94ca8u ), FR_T(vec256, 0xc722bd69d84fd030u, 0x600e4a26cf52162cu, 0xfb727ed745f3a7e9u, 0x1652a7b269fb275cu ), FR_T(vec256, 0x400efaff575c07e2u, 0x552373494b8f9ac5u, 0xaa79abed81e7ad37u, 0x1ac6e5b8084d2e39u ), FR_T(vec256, 0xa0a29422c98a20feu, 0x73d462ca65935c9du, 0xe1ba4a6ed44582f7u, 0x28fc14c00c3a82b6u ), FR_T(vec256, 0x8759641480890267u, 0x4a3a78b5e4c00349u, 0x49004fdd52a6b17eu, 0x284517dd65e6ea12u ), FR_T(vec256, 0x636e735580d13d9cu, 0xa22bf3742445ffd6u, 0x56452ac01eb203d8u, 0x1860ef942963f9e7u ), }; const fr_t inverse_roots_of_unity[S + 1] = { FR_T(vec256, 0xac96341c4ffffffbu, 0x36fc76959f60cd29u, 0x666ea36f7879462eu, 0x0e0a77c19a07df2fu ), FR_T(vec256, 0x974bc177a0000006u, 0xf13771b2da58a367u, 0x51e1a2470908122eu, 0x2259d6b14729c0fau ), FR_T(vec256, 0xc46cb7fc51231076u, 0xc8f4d11bc871df70u, 0x2a9ee33d0d77ebeeu, 0x052cd33da770975au ), FR_T(vec256, 0x3207cbdddda29e9bu, 0x77ca35a6262fbefcu, 0x3d7e07dfb059de38u, 0x12a91d5f32bd1157u ), FR_T(vec256, 0x302fa787a5d2b60eu, 0x80cc914fb54036b7u, 0x4f65c0b3d235eb3bu, 0x0adb12085108a15eu ), FR_T(vec256, 0x283ae711001fcfb4u, 0x05ead253feb4f32au, 0xcbc338abfa1144cau, 0x300e4c10db78fc8eu ), FR_T(vec256, 0x91c0d6fac5757884u, 0xa782859be6bf4559u, 0xc3ce14edb987f6cdu, 0x0be9c8c56d591f67u ), FR_T(vec256, 0x8ee513b2d38119f0u, 0x87ee89f46bab8280u, 0x7fab75cbc4cc2cf4u, 0x1bef2752d8704b2cu ), FR_T(vec256, 0x9bf52a88a5a90b53u, 0x39ccb835523899e2u, 0x6a3cc4193be1b610u, 0x134c2780ccac2b38u ), FR_T(vec256, 0x7e1bb7c18adb9263u, 0x082782771c1e4a45u, 0xc3b2b36da915deb6u, 0x0b9db5e6ee822f9au ), FR_T(vec256, 0x9a42b93a4388ee4fu, 0x16c835b156abb91eu, 0x5fcd5d77a3b49b70u, 0x1d24a254e5e81852u ), FR_T(vec256, 0xa2be1e2a36fa814fu, 0xe25ec7610dd79739u, 0xd0725623d6cafca5u, 0x068d1538c117d364u ), FR_T(vec256, 0x422d9ca46c9fc2d9u, 0xec33febb4b73a08du, 0x69366b9ee4da54b6u, 0x2b22e3d430dc6b9fu ), FR_T(vec256, 0xf2fe10e92ba9466au, 0x77a9e3c167af44ceu, 0x723cad05841b37c9u, 0x1768636eb0a2cbb1u ), FR_T(vec256, 0xea9351a4708c94cau, 0xac912ec7a5f17c35u, 0x920b769623d9760au, 0x2c3adf7c6cf0bc39u ), FR_T(vec256, 0x39635a33503045fau, 0x4f4b5b8d30d9f86eu, 0xefba9fb03979eba3u, 0x2d4d2d2da7cd1545u ), FR_T(vec256, 0x489362b650573894u, 0x0a19b79043d35763u, 0xda6a5ff6bbc04fa8u, 0x2f6a7c2881855e62u ), FR_T(vec256, 0x8c193fa18da73c33u, 0x478e6f456d0221bau, 0x6817e7a3329bae82u, 0x041fd6a3eba7a65eu ), FR_T(vec256, 0x645bee0013cbc9c3u, 0xa81ac5011d4ad1a7u, 0x100ef5edb54ea975u, 0x04d3bb8bdad08cddu ), FR_T(vec256, 0x1f296f022886e2a5u, 0x550e4e0b1e34eb1cu, 0xdf87a2c1b4688775u, 0x2707e80c3ba99c65u ), FR_T(vec256, 0x29a730286ed9e349u, 0x1ff90914d9689b7fu, 0x24bbb6ac251e133cu, 0x022d75746283dfd6u ), FR_T(vec256, 0x169b4cbac88809a8u, 0x457d00f867e4fbe3u, 0x6801ddc2b96932b3u, 0x048e0c9a914e975bu ), FR_T(vec256, 0xd8bb95832fb90b14u, 0xb02515b9a0c38601u, 0x5e77f76e182c7fb7u, 0x2d000c05d8c1deb4u ), FR_T(vec256, 0x0b095acdf50e3d58u, 0x52ef5716a99eae65u, 0x9b8665251b9421f0u, 0x23c1ca181e965c85u ), FR_T(vec256, 0x667f0e72d8e96c48u, 0x94109e0f4948a4fau, 0xf8504de3afe7d786u, 0x2cd33fae85a4f030u ), FR_T(vec256, 0x5fde22a0a60bd4deu, 0xc2222a37273daee6u, 0x577b5a278e437749u, 0x0e8a14abae1d702fu ), FR_T(vec256, 0xf90ad83d70784d69u, 0xc98f396490089c33u, 0x538bf7a46a63be44u, 0x1f2fab5ccf5c3c58u ), FR_T(vec256, 0x9b4579552c80552bu, 0x5821ebc4e04e7089u, 0x052c529f2f55cc8du, 0x2d2ec8708e3fa253u ), FR_T(vec256, 0x89bcc016584bb683u, 0xe8d9887f0164a50cu, 0x755e95cb795eda3du, 0x0f572b871323b130u ), }; const fr_t domain_size_inverse[S + 1] = { FR_T(vec256, 0xac96341c4ffffffbu, 0x36fc76959f60cd29u, 0x666ea36f7879462eu, 0x0e0a77c19a07df2fu ), FR_T(vec256, 0x783c14d81ffffffeu, 0xaf982f6f0c8d1eddu, 0x8f5f7492fcfd4f45u, 0x1f37631a3d9cbfacu ), FR_T(vec256, 0xbc1e0a6c0fffffffu, 0xd7cc17b786468f6eu, 0x47afba497e7ea7a2u, 0x0f9bb18d1ece5fd6u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x2000000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x1000000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0800000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0400000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0200000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0100000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0080000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0040000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0020000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0010000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0008000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0004000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0002000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0001000000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000800000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000400000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000200000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000100000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000080000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000040000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000020000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000010000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000008000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000004000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000002000000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000001000000000u ), }; #undef FR_T