// 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, 0xa1a55e68ffffffedu, 0x74c2a54b4f4982f3u, 0xfffffffffffffffdu, 0x3fffffffffffffffu ); const fr_t group_gen_inverse = FR_T(vec256, 0x0a7e7c3e99999999u, 0xb83c0a9bfa6b6a89u, 0xccccccccccccccccu, 0x0cccccccccccccccu ); const int S = 32; const fr_t forward_roots_of_unity[S + 1] = { FR_T(vec256, 0x34786d38fffffffdu, 0x992c350be41914adu, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x64b4c3b400000004u, 0x891a63f02533e46eu, 0x0000000000000000u, 0x0000000000000000u ), FR_T(vec256, 0xe9d5e76214debe82u, 0x75357d63b194b8fau, 0x4cc6bf531a870fb9u, 0x1e575782826fd45cu ), FR_T(vec256, 0x6d7f787664374374u, 0xb02b6de27328a736u, 0x12edd98f37a813c5u, 0x3781ae4a2a49f0e7u ), FR_T(vec256, 0x919cdd87661ef087u, 0x91ca113f97d7ca44u, 0x3badd5e03c5d50cau, 0x13bca07cf7fd2b8au ), FR_T(vec256, 0x91c60317436466c2u, 0xa1b66855982a3204u, 0xb2d086f193433eb3u, 0x3f107a3e099a9db5u ), FR_T(vec256, 0x638c50dbfe1e821du, 0xb0961359be92ad3du, 0x7df980ffe16716dfu, 0x1018c5359b4ecc13u ), FR_T(vec256, 0xc8baf102c72f16ffu, 0x2af5435230c0fdd0u, 0xc1ad28f067a535dbu, 0x27a459a747bfaa35u ), FR_T(vec256, 0x1415db10b291adfdu, 0x21fa4aa67bdf3965u, 0x979ae7d5aa5fe828u, 0x1a685f9fdd2b7d7eu ), FR_T(vec256, 0x012f4495dfc0d0f3u, 0x09735bc3613070c3u, 0x9c33a1002bd1b73au, 0x2de8c154d1e3d8dau ), FR_T(vec256, 0x3cc4b4f24d7fc240u, 0xd5f08177ca98a8b1u, 0xd70d1ea59f1c6afau, 0x26e2b03c28fbfb22u ), FR_T(vec256, 0x4a44ca64169c0c43u, 0x2538682ea139bdeau, 0x49d78d6b542f427au, 0x055c3cdeb8e33f15u ), FR_T(vec256, 0xb66e4538a2e5385bu, 0xe54bde2097778251u, 0xd660e125b05e9525u, 0x341ff150e74d40cbu ), FR_T(vec256, 0xa764d8539f3a0b18u, 0x357dddcabed0f9e9u, 0xe23a298ec99d676cu, 0x3d4f8efd13d9ba90u ), FR_T(vec256, 0xaaaa67749b32268fu, 0x643885735b5d7ccfu, 0xa84427d2f3796b88u, 0x36cb1b460d911f3fu ), FR_T(vec256, 0x1da8574e0da4aaa7u, 0x4c5e2cc3a7b552cbu, 0x86e2ca0e699bbb8fu, 0x1f144001ee95119cu ), FR_T(vec256, 0x1875a84ee663ba65u, 0xf76947257a6f9b33u, 0xf769a6f3e441b507u, 0x1a72d2ae4bb872d3u ), FR_T(vec256, 0x78d36469519b6e2eu, 0xa2db159c25ac8260u, 0x08b70b6458336553u, 0x07485f646aa58848u ), FR_T(vec256, 0x206f9519daf827a8u, 0x88325c4f71568682u, 0x9d50ded9cab6eb78u, 0x1b87d7e14f0f87d5u ), FR_T(vec256, 0x0315784218e11d76u, 0x52c167fc83ea0efau, 0x18a248722aa0a613u, 0x0aac312c29237038u ), FR_T(vec256, 0x0109462e808a8118u, 0x231cb06bce867e7eu, 0x14f3fc8863745777u, 0x1076d41cb616fb28u ), FR_T(vec256, 0x9de6f8ca42c3897fu, 0x542570ce4b202debu, 0x084cdceadcc46158u, 0x287055b2299467f6u ), FR_T(vec256, 0x6dfc6867109c45b4u, 0x5f4a1f27402a0a16u, 0xbde3305901d3188fu, 0x23c22b7962d0e535u ), FR_T(vec256, 0xf9d86940651feb81u, 0x050d7d1caea352a4u, 0x5ce1552dd393d50du, 0x1245da9bc6367ef9u ), FR_T(vec256, 0x353a1ec7b01f309bu, 0x2b0e4bb2cba76146u, 0x283c4a34a4823985u, 0x2f17e60e804ad0feu ), FR_T(vec256, 0x67670e91f3952b88u, 0x0f0948bbe90dc44bu, 0x24f48206fa9eca49u, 0x220c250427ade893u ), FR_T(vec256, 0x11999de98167d867u, 0x4bb4982cba6c26ceu, 0xb4fbe7f0391ac02au, 0x13dfffd245a3817cu ), FR_T(vec256, 0xfae333d64806f372u, 0x1586c88b32052f68u, 0xfae0783f79142b95u, 0x18c3212d858e86adu ), FR_T(vec256, 0xc86f5f58e63b9e91u, 0x6260d177ff1bbcc3u, 0x97b8fa22279dabc4u, 0x1babfcfd2e7c2736u ), FR_T(vec256, 0xdd5e604be741b178u, 0xa7e46b94304b6fbdu, 0x796d50bf10e5bf3eu, 0x379fbf64e385fb65u ), FR_T(vec256, 0xd4ee3f3ecc71b699u, 0x13a88248a483738bu, 0x4e8c44a28ec8bacbu, 0x30628f05d392f074u ), FR_T(vec256, 0xf3bd724fc7651c08u, 0x9cb7c4f79efda23bu, 0x76ae50232f0464e7u, 0x3d891c337554c186u ), FR_T(vec256, 0xa28db849bad6dbf0u, 0x9083cd03d3b539dfu, 0xfba6b9ca9dc8448eu, 0x3ec928747b89c6dau ), }; const fr_t inverse_roots_of_unity[S + 1] = { FR_T(vec256, 0x34786d38fffffffdu, 0x992c350be41914adu, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x64b4c3b400000004u, 0x891a63f02533e46eu, 0x0000000000000000u, 0x0000000000000000u ), FR_T(vec256, 0xaf57498aeb21417fu, 0xad111b9857b84020u, 0xb33940ace578f046u, 0x21a8a87d7d902ba3u ), FR_T(vec256, 0xe633f8bb035949c8u, 0x218023c7703f86afu, 0x792cf89e6c9e7197u, 0x20c7f44ddf560f7bu ), FR_T(vec256, 0x9f91fe66f2205343u, 0xfeca29bcce5ad423u, 0x1a2dc566c531877du, 0x14cc054cda06fd17u ), FR_T(vec256, 0xed015766aff08680u, 0x2b8b67f06ff5e5ecu, 0xfc1988e68a9f75e0u, 0x3cf52321d4f161d3u ), FR_T(vec256, 0xb45bc2aaba470234u, 0x088caab990e6fcd7u, 0x3d875ad5f8e62078u, 0x334afd132487ec24u ), FR_T(vec256, 0x5ce10b11994471dbu, 0x27cfdb4356c5a334u, 0x653e9ee6655ec9cau, 0x270994be59ee1688u ), FR_T(vec256, 0x3f4b89667f4200a0u, 0x99fe6ed9ac8c9a8bu, 0xfabcff5a5a833bdcu, 0x2b90f10730dea533u ), FR_T(vec256, 0x0cd7507eb7b55bc5u, 0xa263e797e6c2c902u, 0x18ace1b6ccf172f8u, 0x241db4ca8027ab61u ), FR_T(vec256, 0x65a48ffd9908f633u, 0x8be3d33c2f034ad4u, 0xe8ea04f25d93cf27u, 0x1218a277a2bde0a2u ), FR_T(vec256, 0x2e8d8b45723ff480u, 0xd1b4d0449c38e955u, 0x73dde41876ef358fu, 0x0448616b3506a7bbu ), FR_T(vec256, 0x4e9f8af797eb8684u, 0xe192715a106841c4u, 0x4e29f77e8d0c2902u, 0x2f5e372ea49e457cu ), FR_T(vec256, 0xed9acaac3b3feafbu, 0x3199ce25e6fd3e72u, 0xbd99288dd8f43737u, 0x0d5414922eff660du ), FR_T(vec256, 0xbead0341103e86ffu, 0x94b6bae19f3132d0u, 0x42c64966764060e7u, 0x247879d7b6a8d6a6u ), FR_T(vec256, 0x5db80c23c8b793e2u, 0x0ee0414e8f23e8dcu, 0x00493dba0d9920fcu, 0x32460ec6b78ff358u ), FR_T(vec256, 0x16455dabaeb15b15u, 0xbdd1596390bcb45eu, 0xbe7b3b2b6a164e05u, 0x17ccf4947f478856u ), FR_T(vec256, 0x76c96791711e794fu, 0x92a564081f65413au, 0xd0495ba4620a60ddu, 0x25b6de6c627103ccu ), FR_T(vec256, 0x10802190c35fbc24u, 0x7a4d3a764126bd02u, 0xe4bc421e6de64119u, 0x0b69c128ef08db88u ), FR_T(vec256, 0x89990be10d94140eu, 0x2308171169a21f4eu, 0xbf9492adb949c6e6u, 0x3c7978e8b41f50d3u ), FR_T(vec256, 0x5197df495903edd6u, 0x4cd4032ca9fbc7ccu, 0xe4f26df7f8ab0371u, 0x31ea15f1acd46e73u ), FR_T(vec256, 0x502d922a860e0248u, 0x9aede8c2164e94aeu, 0xc5413491910138a4u, 0x05cfd8e66c406bcfu ), FR_T(vec256, 0xf960847dd17e4718u, 0xc563ae311df001c0u, 0xcab7569702fd177du, 0x373415759b76cb44u ), FR_T(vec256, 0x23490ab3310cf5adu, 0x9adf07709f93e6a2u, 0x4c1c4bb1e7d4945eu, 0x35c451a6d1eac3ebu ), FR_T(vec256, 0x281d7e00e5d18518u, 0x1c54c47b0ff85914u, 0x42f0f80bd49c7cf0u, 0x0c48c6ec0abb7a66u ), FR_T(vec256, 0x5201c47cb901fd70u, 0x9a2a69e40cb56518u, 0x04f91ba827baf510u, 0x2a2fb12100e13050u ), FR_T(vec256, 0x58f143c945f74cfeu, 0xdda26b6b8eb66b9au, 0x070b3c12119f4f70u, 0x32ed3eb2b92f5667u ), FR_T(vec256, 0xa79987b9f64ac99fu, 0x9220f0a4645760fcu, 0x0b72c1b6797419adu, 0x0a69932addf80267u ), FR_T(vec256, 0xd020fa666ff53916u, 0x0340cdd6acffbdbdu, 0x055bf888f38bb742u, 0x1c6ac32cbcf9e95fu ), FR_T(vec256, 0x00571ac525be8d97u, 0x4363960a6c2ab600u, 0xef8565113262de6du, 0x3bbb2f06f5e05bc5u ), FR_T(vec256, 0xbfa8482d7f4f7bc6u, 0x79a15ad32a10a3b9u, 0x724636160e332ebfu, 0x02bdac2fc039aefbu ), FR_T(vec256, 0x39ae11c799b36804u, 0x5ada0798d938cab2u, 0x8f16455f3116ae8eu, 0x01d36527da74de40u ), FR_T(vec256, 0x5cfe5f67cb155442u, 0x176460c2734c4621u, 0xdf81001645214110u, 0x18047fb9f91068bcu ), }; const fr_t domain_size_inverse[S + 1] = { FR_T(vec256, 0x34786d38fffffffdu, 0x992c350be41914adu, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x66d2cf12ffffffffu, 0xddb96703f6b306e4u, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x4000000000000000u ), 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 ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000800000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000400000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000200000000u ), FR_T(vec256, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000100000000u ), }; #undef FR_T