// 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, 0x96bc8c8cffffffedu, 0x74c2a54b49f7778eu, 0xfffffffffffffffdu, 0x3fffffffffffffffu ); const fr_t group_gen_inverse = FR_T(vec256, 0x123bd95299999999u, 0xb83c0a9bfa40677bu, 0xccccccccccccccccu, 0x0cccccccccccccccu ); const int S = 32; const fr_t forward_roots_of_unity[S + 1] = { FR_T(vec256, 0x5b2b3e9cfffffffdu, 0x992c350be3420567u, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x311bac8400000004u, 0x891a63f02652a376u, 0x0000000000000000u, 0x0000000000000000u ), FR_T(vec256, 0x9952b39750411c8du, 0xc2e1c20d5b45ab59u, 0x9f5fe7ea79e2cf8bu, 0x3fb874919a0b0416u ), FR_T(vec256, 0xb221f07cf7f50a19u, 0x0c9f8cbd70ed76f3u, 0xddf25119a2e42558u, 0x08e53df70c4df3f6u ), FR_T(vec256, 0xab89165064ac7194u, 0x454a773d53bd7200u, 0x9456c50d8950947du, 0x3cb937c9b96ec59bu ), FR_T(vec256, 0xe8086b31650476f8u, 0xb63b2005303b24bcu, 0xb25166eb17a3ffb0u, 0x230328d900255739u ), FR_T(vec256, 0x163b3c5d3f074990u, 0x578682b46c96d06fu, 0xacf59d52ea9d1021u, 0x3698f7373a56fc2au ), FR_T(vec256, 0x3e08cb31fa111bf4u, 0x5aa2fb76ef61b93eu, 0x1d74a62907dd00eau, 0x10d24a4597350e45u ), FR_T(vec256, 0x8f8c40cb3bd29625u, 0x47c325a9226b05e2u, 0xb0540d11a6d1c7d0u, 0x241041d6a96c274cu ), FR_T(vec256, 0xdfd41e53f3eb06fau, 0xec6d8d6f989558d9u, 0xb8d47ab8808d6660u, 0x3c54390999eb3c55u ), FR_T(vec256, 0x63b1d5a6879503d8u, 0xe22c26abc1052ef0u, 0x52ffda3fd4b42543u, 0x22f540e93940f1b6u ), FR_T(vec256, 0xf81410adb6019cf5u, 0x7f4638245e4bbf3cu, 0xd509663746eaa942u, 0x1d5453f447e04f09u ), FR_T(vec256, 0x748e7d26dffd19d8u, 0x95dd3f10dba49993u, 0x06c1e60413222d29u, 0x3db5c1101a7d1844u ), FR_T(vec256, 0x5fb32ae271e0ca6du, 0xf48011d56826298bu, 0xe109abb9e9ab487eu, 0x3f9125be01a58c18u ), FR_T(vec256, 0xa38e3e19f4818062u, 0x559f9e92621c0220u, 0x639d1af90fbbe419u, 0x1d44ced69920ccf4u ), FR_T(vec256, 0x877632433999d9d1u, 0xfbca68e105ebc958u, 0xf4c8224cac00952cu, 0x2f321721df668653u ), FR_T(vec256, 0x9f95087bb402fb40u, 0x69101bbf1c4e41b0u, 0x2f1974dfed938731u, 0x32a411dfef38a035u ), FR_T(vec256, 0x502f832df8f99854u, 0x52f3b9142f0fe1aau, 0xd865cc5a173d33a9u, 0x39f13afec6f84281u ), FR_T(vec256, 0x7701cb1e3ae794b1u, 0x9ead68a5bb63749bu, 0xb0f90d9299b3f107u, 0x15cad977d761cb45u ), FR_T(vec256, 0x67a44f6c90b1d6e1u, 0x16c499dc0787c915u, 0xb8a8f0c1d3059563u, 0x0523f4b51792007bu ), FR_T(vec256, 0xccb26769ce776c88u, 0xb8a64c4e7b263e0au, 0xc3b8d16b8a676d4cu, 0x33236b994dc9bef2u ), FR_T(vec256, 0xcc23a55a5e07d030u, 0xc8c96363fea81102u, 0xa6b51bdc2d46ac62u, 0x1a99f3149f30bce1u ), FR_T(vec256, 0x6a05fe3ffbee061au, 0x915eb4355dc1d87bu, 0x01141911fc5a21b2u, 0x001bf5e2190e04bfu ), FR_T(vec256, 0xc01654ebcd319478u, 0x8dd099e5bd673478u, 0x9589c6ab42cd8fb7u, 0x0acf2bd1b5500acfu ), FR_T(vec256, 0xfe195b5b18e70991u, 0x6ed57abae8c4aa09u, 0xa085cdd45285e191u, 0x2d59eef0f0957a90u ), FR_T(vec256, 0xabbbd7999e73bfabu, 0x813ae194b411a883u, 0x867e01b91f33be33u, 0x342391b392042ae6u ), FR_T(vec256, 0x584e581c95b88431u, 0x77344057c4f3afd0u, 0x20015c52782b587bu, 0x1a06ebc45c6903bfu ), FR_T(vec256, 0x60e1e8e011a6f844u, 0xb331d32f6251b0b6u, 0xf211bd1e064041ebu, 0x0e4fa253c73a7ddfu ), FR_T(vec256, 0x476b662836925b05u, 0xb17411f4ae79f7c8u, 0xaa9d0bfbd36f4a2au, 0x029dfb82b085dc9eu ), FR_T(vec256, 0xf298d125060eced6u, 0x921d0ff20eb41b93u, 0x24652dc74e46fc33u, 0x08aee078db6412b3u ), FR_T(vec256, 0xf31f4f7dffeba333u, 0xc75e3d69cde6642cu, 0xdb39e31b345898c4u, 0x39eaef71940b7ad0u ), FR_T(vec256, 0xbb086a83c4c1147bu, 0x0dff3918dd4a4747u, 0x3448e7ef3ced2e1au, 0x20b4cf141c369cedu ), FR_T(vec256, 0x218077428c9942deu, 0xcc49578921b60494u, 0xac2e5d27b2efbee2u, 0x0b79fa897f2db056u ), }; const fr_t inverse_roots_of_unity[S + 1] = { FR_T(vec256, 0x5b2b3e9cfffffffdu, 0x992c350be3420567u, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x311bac8400000004u, 0x891a63f02652a376u, 0x0000000000000000u, 0x0000000000000000u ), FR_T(vec256, 0xf2f43789afbee374u, 0x5f64d6eeae4efd83u, 0x60a01815861d3074u, 0x00478b6e65f4fbe9u ), FR_T(vec256, 0xd23873d5f0a5b0e5u, 0x2b522cd8e5968f0eu, 0x1a7c767c3919f01au, 0x1877b00e1c71baffu ), FR_T(vec256, 0x9c99d2f98f07725eu, 0xa5a8e56f63e64ed0u, 0x5bde7d8cad1907d4u, 0x1839f546f8bb3507u ), FR_T(vec256, 0x8bfea7cd6d80bcb9u, 0xb1d7554e94ae70b3u, 0x88782d2088468d7au, 0x352938b7d671e816u ), FR_T(vec256, 0x97cb451444af06deu, 0x0c3108dfb176ab4eu, 0xeebbecdfd8ae23bbu, 0x3d22244d542d2cd5u ), FR_T(vec256, 0x564b2b327bc921f6u, 0x3d43357944bc8f48u, 0x82ff6f4ab48fa15cu, 0x2ff6af5196b7b9f1u ), FR_T(vec256, 0x0940888d0030605au, 0x44c675d32a49d764u, 0x950421713cd180aeu, 0x059d6129ed528c02u ), FR_T(vec256, 0x3a1bf632d2ad115fu, 0xb2283acb0663939du, 0x1a99f7634de45ba8u, 0x38bf3db8b0310962u ), FR_T(vec256, 0x5720ee91513e4a4au, 0x226d03744c68a15bu, 0x8cb88876a3c83d3cu, 0x179fc93d75dd1468u ), FR_T(vec256, 0x5d93a3f7957a8247u, 0x80a81d1f63857295u, 0xc6c696e9e24a02b7u, 0x0326c0b15d516fe2u ), FR_T(vec256, 0xd3a8ad9f763f9c5du, 0x870f37b43cb01495u, 0x96893315de5a18dau, 0x156e3e6d7f0ed3b0u ), FR_T(vec256, 0x9c84bdcf81284775u, 0x3336971238e53f83u, 0xac9701135bf17538u, 0x3c2311436b4f2a74u ), FR_T(vec256, 0xdfe5722969f5f87bu, 0x19f5d293d70993b1u, 0xdbc66fcb780c5339u, 0x0d8064a702c99479u ), FR_T(vec256, 0x6a5854c41770e0feu, 0xe368681c2bed3ae9u, 0x27f7f6b53db2d46au, 0x16b540cfd21189dfu ), FR_T(vec256, 0x47ccec774563e020u, 0x119b26e3ebc2b816u, 0xaed7d83bf8e183b4u, 0x1fc5d601feaa3d1bu ), FR_T(vec256, 0xbb71b426af9472c7u, 0x3a4c85a6880ef684u, 0x9edaf018e80ca342u, 0x35c8697459d4c59bu ), FR_T(vec256, 0x2d1cd35939c613f2u, 0xa74afe707adff7ddu, 0xed4b3166a6519478u, 0x3301dae688661f71u ), FR_T(vec256, 0xbf77594f48aaf3f8u, 0xf962581c4c09b2bcu, 0x9edd9f4c3dc6b1d6u, 0x0ac09c997b9c21c7u ), FR_T(vec256, 0xeea86d0aff815435u, 0x3e82efe633774f61u, 0x3d76869e12bd1c6du, 0x1b0bab216c708988u ), FR_T(vec256, 0x13d00b9807804e04u, 0xde52cd351bfa70fdu, 0xf08499fdf08dafd6u, 0x1ab7133ddf5bf5e8u ), FR_T(vec256, 0x78d4de6ae191382au, 0x419113246b406379u, 0x7595a5755af50829u, 0x2b8c65d7d893623cu ), FR_T(vec256, 0x18b39c0266a1d816u, 0x3d3100214696a7a6u, 0x5a46979bc39fb309u, 0x10a909e2f3662567u ), FR_T(vec256, 0xbb46ba275a79fe4du, 0xb78f9dc567f45c8au, 0x194a5257e74dbd52u, 0x0bcc650325c5d688u ), FR_T(vec256, 0xd288bf4d52ceb49eu, 0xbbcfe2336b33a37du, 0x444e8e6dc6315838u, 0x02c7dce6a4557edbu ), FR_T(vec256, 0x5fdffb112a7da976u, 0x5460c0d0af9683c8u, 0x9b7d269833a148d8u, 0x2d782f20867dc31bu ), FR_T(vec256, 0xc537eae78dc37c2cu, 0x0422a99002f63696u, 0x4fbbf679b2b498b3u, 0x22bfb73b2402d4bcu ), FR_T(vec256, 0x51c974f5d568866fu, 0xe69eb7a48f652521u, 0xd78107c66296509cu, 0x1e175b9d89c56e33u ), FR_T(vec256, 0xf49c886df5ecd31bu, 0x486c02cc934df55cu, 0xbc7708ffddbf35b3u, 0x3240dc2e0f53da8cu ), FR_T(vec256, 0x9f2de71b6ea9cbc2u, 0xa92b999d8a9ceba2u, 0x252d04a31253fb65u, 0x31b18dd7575fb508u ), FR_T(vec256, 0xd1dbb3e688e91ad9u, 0x491d4513e44ffd0cu, 0x006e18c577fcadc5u, 0x24ab3529132ab860u ), FR_T(vec256, 0xb990773d23d22e85u, 0x4ece919a03f3c012u, 0x2c9ac8b9aa3ba50bu, 0x364d5dfa434d9efau ), }; const fr_t domain_size_inverse[S + 1] = { FR_T(vec256, 0x5b2b3e9cfffffffdu, 0x992c350be3420567u, 0xffffffffffffffffu, 0x3fffffffffffffffu ), FR_T(vec256, 0x73b914deffffffffu, 0xddb96703f66b5722u, 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