arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
miden-crypto/src/dsa/rpo_falcon512/math/fft.rs
src/dsa/rpo_falcon512/math/fft.rsRaw
   1use alloc::vec::Vec;
   2use core::{
   3    f64::consts::PI,
   4    ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign},
   5};
   6
   7#[cfg(not(feature = "std"))]
   8use num::Float;
   9use num::{One, Zero};
  10use num_complex::Complex64;
  11
  12use super::{field::FalconFelt, polynomial::Polynomial, Inverse};
  13
  14/// Implements Cyclotomic FFT without bitreversing the outputs, and using precomputed powers of the
  15/// 2n-th primitive root of unity.
  16pub trait FastFft: Sized + Clone {
  17    type Field: Add + Mul + AddAssign + MulAssign + Neg + Sub + SubAssign;
  18    fn fft_inplace(&mut self);
  19    fn fft(&self) -> Self {
  20        let mut a = self.clone();
  21        a.fft_inplace();
  22        a
  23    }
  24
  25    fn merge_fft(a: &Self, b: &Self) -> Self;
  26    fn split_fft(&self) -> (Self, Self);
  27
  28    fn ifft_inplace(&mut self);
  29    fn ifft(&self) -> Self {
  30        let mut a = self.clone();
  31        a.ifft_inplace();
  32        a
  33    }
  34}
  35
  36pub trait CyclotomicFourier
  37where
  38    Self: Sized
  39        + Copy
  40        + One
  41        + Zero
  42        + Add<Output = Self>
  43        + Sub<Output = Self>
  44        + Mul<Output = Self>
  45        + MulAssign
  46        + Inverse,
  47{
  48    /// Gets the inverse of 2^n.
  49    #[allow(dead_code)]
  50    fn power_of_two_inverse(n: usize) -> Self {
  51        let mut a = Self::one() + Self::one();
  52        for _ in 0..n {
  53            a *= a;
  54        }
  55        Self::inverse_or_zero(a)
  56    }
  57
  58    /// Gets a primitive nth (with n a power of 2) root of unity.
  59    #[allow(dead_code)]
  60    fn primitive_root_of_unity(n: usize) -> Self;
  61
  62    /// Computes the integer whose n-bit binary expansion is the reverse of that of the argument.
  63    fn bitreverse_index(arg: usize, n: usize) -> usize {
  64        assert!(n > 0);
  65        assert_eq!(n & (n - 1), 0);
  66        let mut rev = 0;
  67        let mut m = n >> 1;
  68        let mut k = 1;
  69        while m > 0 {
  70            rev |= (((arg & m) != 0) as usize) * k;
  71            k <<= 1;
  72            m >>= 1;
  73        }
  74        rev
  75    }
  76
  77    /// Computes the first n powers of the 2nd root of unity, and put them in bit-reversed order.
  78    #[allow(dead_code)]
  79    fn bitreversed_powers(n: usize) -> Vec<Self> {
  80        let psi = Self::primitive_root_of_unity(2 * n);
  81        let mut array = vec![Self::zero(); n];
  82        let mut alpha = Self::one();
  83        for a in array.iter_mut() {
  84            *a = alpha;
  85            alpha *= psi;
  86        }
  87        Self::bitreverse_array(&mut array);
  88        array
  89    }
  90
  91    /// Computes the first n powers of the 2nd root of unity, invert them, and put them in
  92    /// bit-reversed order.
  93    #[allow(dead_code)]
  94    fn bitreversed_powers_inverse(n: usize) -> Vec<Self> {
  95        let psi = Self::primitive_root_of_unity(2 * n).inverse_or_zero();
  96        let mut array = vec![Self::zero(); n];
  97        let mut alpha = Self::one();
  98        for a in array.iter_mut() {
  99            *a = alpha;
 100            alpha *= psi;
 101        }
 102        Self::bitreverse_array(&mut array);
 103        array
 104    }
 105
 106    /// Reorders the given elements in the array by reversing the binary expansions of their
 107    /// indices.
 108    fn bitreverse_array<T>(array: &mut [T]) {
 109        let n = array.len();
 110        for i in 0..n {
 111            let j = Self::bitreverse_index(i, n);
 112            if i < j {
 113                array.swap(i, j);
 114            }
 115        }
 116    }
 117
 118    /// Computes the evaluations of the polynomial on the roots of the polynomial X^n + 1 using a
 119    /// fast Fourier transform. Algorithm 1 from https://eprint.iacr.org/2016/504.pdf.
 120    ///
 121    /// Arguments:
 122    ///
 123    ///  - a : &mut [Self] (a reference to) a mutable array of field elements which is to be
 124    ///    transformed under the FFT. The transformation happens in- place.
 125    ///
 126    ///  - psi_rev: &[Self] (a reference to) an array of powers of psi, from 0 to n-1, but ordered
 127    ///    by bit-reversed index. Here psi is a primitive root of order 2n. You can use
 128    ///    `Self::bitreversed_powers(psi, n)` for this purpose, but this trait implementation is not
 129    ///    const. For the performance benefit you want a precompiled array, which you can get if you
 130    ///    can get by implementing the same method and marking it "const".
 131    fn fft(a: &mut [Self], psi_rev: &[Self]) {
 132        let n = a.len();
 133        let mut t = n;
 134        let mut m = 1;
 135        while m < n {
 136            t >>= 1;
 137            for i in 0..m {
 138                let j1 = 2 * i * t;
 139                let j2 = j1 + t - 1;
 140                let s = psi_rev[m + i];
 141                for j in j1..=j2 {
 142                    let u = a[j];
 143                    let v = a[j + t] * s;
 144                    a[j] = u + v;
 145                    a[j + t] = u - v;
 146                }
 147            }
 148            m <<= 1;
 149        }
 150    }
 151
 152    /// Computes the coefficients of the polynomial with the given evaluations on the roots of
 153    /// X^n + 1 using an inverse fast Fourier transform.
 154    /// Algorithm 2 from https://eprint.iacr.org/2016/504.pdf.
 155    ///
 156    /// Arguments:
 157    ///
 158    ///  - a : &mut [Self] (a reference to) a mutable array of field elements which is to be
 159    ///    transformed under the IFFT. The transformation happens in- place.
 160    ///
 161    ///  - psi_inv_rev: &[Self] (a reference to) an array of powers of psi^-1, from 0 to n-1, but
 162    ///    ordered by bit-reversed index. Here psi is a primitive root of order 2n. You can use
 163    ///    `Self::bitreversed_powers(Self::inverse_or_zero(psi), n)` for this purpose, but this
 164    ///    trait implementation is not const. For the performance benefit you want a precompiled
 165    ///    array, which you can get if you can get by implementing the same methods and marking them
 166    ///    "const".
 167    fn ifft(a: &mut [Self], psi_inv_rev: &[Self], ninv: Self) {
 168        let n = a.len();
 169        let mut t = 1;
 170        let mut m = n;
 171        while m > 1 {
 172            let h = m / 2;
 173            let mut j1 = 0;
 174            for i in 0..h {
 175                let j2 = j1 + t - 1;
 176                let s = psi_inv_rev[h + i];
 177                for j in j1..=j2 {
 178                    let u = a[j];
 179                    let v = a[j + t];
 180                    a[j] = u + v;
 181                    a[j + t] = (u - v) * s;
 182                }
 183                j1 += 2 * t;
 184            }
 185            t <<= 1;
 186            m >>= 1;
 187        }
 188        for ai in a.iter_mut() {
 189            *ai *= ninv;
 190        }
 191    }
 192
 193    fn split_fft(f: &[Self], psi_inv_rev: &[Self]) -> (Vec<Self>, Vec<Self>) {
 194        let n_over_2 = f.len() / 2;
 195        let mut f0 = vec![Self::zero(); n_over_2];
 196        let mut f1 = vec![Self::zero(); n_over_2];
 197        let two_inv = (Self::one() + Self::one()).inverse_or_zero();
 198        for i in 0..n_over_2 {
 199            let two_i = i * 2;
 200            let two_zeta_inv = two_inv * psi_inv_rev[n_over_2 + i];
 201            f0[i] = two_inv * (f[two_i] + f[two_i + 1]);
 202            f1[i] = two_zeta_inv * (f[two_i] - f[two_i + 1]);
 203        }
 204        (f0, f1)
 205    }
 206
 207    fn merge_fft(f0: &[Self], f1: &[Self], psi_rev: &[Self]) -> Vec<Self> {
 208        let n_over_2 = f0.len();
 209        let n = 2 * n_over_2;
 210        let mut f = vec![Self::zero(); n];
 211        for i in 0..n_over_2 {
 212            let two_i = i * 2;
 213            f[two_i] = f0[i] + psi_rev[n_over_2 + i] * f1[i];
 214            f[two_i + 1] = f0[i] - psi_rev[n_over_2 + i] * f1[i];
 215        }
 216        f
 217    }
 218}
 219
 220impl CyclotomicFourier for Complex64 {
 221    fn primitive_root_of_unity(n: usize) -> Self {
 222        let angle = 2. * PI / (n as f64);
 223        Complex64::new(f64::cos(angle), f64::sin(angle))
 224    }
 225
 226    /// Custom implementation of CyclotomicFourier::bitreversed_powers for
 227    /// better precision.
 228    fn bitreversed_powers(n: usize) -> Vec<Self> {
 229        let mut array = vec![Self::zero(); n];
 230        let half_circle = PI;
 231        for (i, a) in array.iter_mut().enumerate() {
 232            let angle = (i as f64) * half_circle / (n as f64);
 233            *a = Self::new(f64::cos(angle), f64::sin(angle));
 234        }
 235        Self::bitreverse_array(&mut array);
 236        array
 237    }
 238
 239    /// Custom implementation of CyclotomicFourier::bitreversed_powers_inverse
 240    /// for better precision.
 241    fn bitreversed_powers_inverse(n: usize) -> Vec<Self> {
 242        let mut array = vec![Self::zero(); n];
 243        let half_circle = PI;
 244        for (i, a) in array.iter_mut().enumerate() {
 245            let angle = (i as f64) * half_circle / (n as f64);
 246            *a = Self::new(f64::cos(angle), -f64::sin(angle));
 247        }
 248        Self::bitreverse_array(&mut array);
 249        array
 250    }
 251}
 252
 253impl FastFft for Polynomial<Complex64> {
 254    type Field = Complex64;
 255    fn fft_inplace(&mut self) {
 256        let n = self.coefficients.len();
 257        debug_assert!(
 258            (1..=512).contains(&n),
 259            "unsupported: n = {n} not a power of 2 or larger than 512"
 260        );
 261        Complex64::fft(&mut self.coefficients, &COMPLEX_BITREVERSED_POWERS);
 262    }
 263
 264    fn ifft_inplace(&mut self) {
 265        let n = self.coefficients.len();
 266        debug_assert!(
 267            (1..=512).contains(&n),
 268            "unsupported: n = {n} not a power of 2 or larger than 512"
 269        );
 270        let psi_inv_rev: Vec<Complex64> =
 271            COMPLEX_BITREVERSED_POWERS.iter().map(|c| Complex64::new(c.re, -c.im)).collect();
 272        let ninv = Complex64::new(1.0 / (n as f64), 0.0);
 273        Complex64::ifft(&mut self.coefficients, &psi_inv_rev, ninv);
 274    }
 275
 276    fn merge_fft(a: &Self, b: &Self) -> Self {
 277        let n = a.coefficients.len();
 278        debug_assert!(
 279            (1..=512).contains(&n),
 280            "unsupported: n = {n} not a power of 2 or larger than 512"
 281        );
 282        Self {
 283            coefficients: Self::Field::merge_fft(
 284                &a.coefficients,
 285                &b.coefficients,
 286                &COMPLEX_BITREVERSED_POWERS,
 287            ),
 288        }
 289    }
 290
 291    fn split_fft(&self) -> (Self, Self) {
 292        let n = self.coefficients.len();
 293        debug_assert!(
 294            (1..=512).contains(&n),
 295            "unsupported: n = {n} not a power of 2 or larger than 512"
 296        );
 297        let psi_inv_rev: Vec<Complex64> =
 298            COMPLEX_BITREVERSED_POWERS.iter().map(|c| Complex64::new(c.re, -c.im)).collect();
 299        let (a, b) = Self::Field::split_fft(&self.coefficients, &psi_inv_rev);
 300        (Self { coefficients: a }, Self { coefficients: b })
 301    }
 302}
 303
 304impl FastFft for Polynomial<FalconFelt> {
 305    type Field = FalconFelt;
 306
 307    fn fft_inplace(&mut self) {
 308        let n = self.coefficients.len();
 309        debug_assert!(
 310            (1..=512).contains(&n),
 311            "unsupported: n = {n} not a power of 2 or larger than 512"
 312        );
 313        FalconFelt::fft(&mut self.coefficients, &FELT_BITREVERSED_POWERS);
 314    }
 315
 316    fn ifft_inplace(&mut self) {
 317        let n = self.coefficients.len();
 318        debug_assert!(
 319            (1..=512).contains(&n),
 320            "unsupported: n = {n} not a power of 2 or larger than 512"
 321        );
 322        let ninv = match n {
 323            1 => FELT_NINV_1,
 324            2 => FELT_NINV_2,
 325            4 => FELT_NINV_4,
 326            8 => FELT_NINV_8,
 327            16 => FELT_NINV_16,
 328            32 => FELT_NINV_32,
 329            64 => FELT_NINV_64,
 330            128 => FELT_NINV_128,
 331            256 => FELT_NINV_256,
 332            512 => FELT_NINV_512,
 333            _ => unreachable!("vector length is not power of 2 or larger than 512"),
 334        };
 335        FalconFelt::ifft(&mut self.coefficients, &FELT_BITREVERSED_POWERS_INVERSE, ninv);
 336    }
 337
 338    fn merge_fft(a: &Self, b: &Self) -> Self {
 339        let n = a.coefficients.len();
 340        debug_assert!(
 341            (1..=512).contains(&n),
 342            "unsupported: n = {n} not a power of 2 or larger than 512"
 343        );
 344        Self {
 345            coefficients: Self::Field::merge_fft(
 346                &a.coefficients,
 347                &b.coefficients,
 348                &FELT_BITREVERSED_POWERS,
 349            ),
 350        }
 351    }
 352
 353    fn split_fft(&self) -> (Self, Self) {
 354        let n = self.coefficients.len();
 355        debug_assert!(
 356            (1..=512).contains(&n),
 357            "unsupported: n = {n} not a power of 2 or larger than 512"
 358        );
 359        let (a, b) = Self::Field::split_fft(&self.coefficients, &FELT_BITREVERSED_POWERS_INVERSE);
 360        (Self { coefficients: a }, Self { coefficients: b })
 361    }
 362}
 363
 364#[allow(clippy::approx_constant)]
 365const COMPLEX_BITREVERSED_POWERS: [Complex64; 512] = [
 366    Complex64::new(1.0, 0.0),
 367    Complex64::new(0.00000000000000006123233995736766, 1.0),
 368    Complex64::new(0.7071067811865476, 0.7071067811865475),
 369    Complex64::new(-0.7071067811865475, 0.7071067811865476),
 370    Complex64::new(0.9238795325112867, 0.3826834323650898),
 371    Complex64::new(-0.3826834323650897, 0.9238795325112867),
 372    Complex64::new(0.38268343236508984, 0.9238795325112867),
 373    Complex64::new(-0.9238795325112867, 0.3826834323650899),
 374    Complex64::new(0.9807852804032304, 0.19509032201612825),
 375    Complex64::new(-0.1950903220161282, 0.9807852804032304),
 376    Complex64::new(0.5555702330196023, 0.8314696123025452),
 377    Complex64::new(-0.8314696123025453, 0.5555702330196022),
 378    Complex64::new(0.8314696123025452, 0.5555702330196022),
 379    Complex64::new(-0.555570233019602, 0.8314696123025455),
 380    Complex64::new(0.19509032201612833, 0.9807852804032304),
 381    Complex64::new(-0.9807852804032304, 0.1950903220161286),
 382    Complex64::new(0.9951847266721969, 0.0980171403295606),
 383    Complex64::new(-0.09801714032956065, 0.9951847266721969),
 384    Complex64::new(0.6343932841636455, 0.773010453362737),
 385    Complex64::new(-0.773010453362737, 0.6343932841636455),
 386    Complex64::new(0.881921264348355, 0.47139673682599764),
 387    Complex64::new(-0.4713967368259977, 0.881921264348355),
 388    Complex64::new(0.29028467725446233, 0.9569403357322089),
 389    Complex64::new(-0.9569403357322088, 0.2902846772544624),
 390    Complex64::new(0.9569403357322088, 0.29028467725446233),
 391    Complex64::new(-0.29028467725446216, 0.9569403357322089),
 392    Complex64::new(0.4713967368259978, 0.8819212643483549),
 393    Complex64::new(-0.8819212643483549, 0.47139673682599786),
 394    Complex64::new(0.773010453362737, 0.6343932841636455),
 395    Complex64::new(-0.6343932841636454, 0.7730104533627371),
 396    Complex64::new(0.09801714032956077, 0.9951847266721968),
 397    Complex64::new(-0.9951847266721968, 0.09801714032956083),
 398    Complex64::new(0.9987954562051724, 0.049067674327418015),
 399    Complex64::new(-0.04906767432741801, 0.9987954562051724),
 400    Complex64::new(0.6715589548470183, 0.7409511253549591),
 401    Complex64::new(-0.7409511253549589, 0.6715589548470186),
 402    Complex64::new(0.9039892931234433, 0.4275550934302821),
 403    Complex64::new(-0.42755509343028186, 0.9039892931234434),
 404    Complex64::new(0.33688985339222005, 0.9415440651830208),
 405    Complex64::new(-0.9415440651830207, 0.33688985339222033),
 406    Complex64::new(0.970031253194544, 0.24298017990326387),
 407    Complex64::new(-0.24298017990326387, 0.970031253194544),
 408    Complex64::new(0.5141027441932217, 0.8577286100002721),
 409    Complex64::new(-0.857728610000272, 0.5141027441932218),
 410    Complex64::new(0.8032075314806449, 0.5956993044924334),
 411    Complex64::new(-0.5956993044924334, 0.8032075314806449),
 412    Complex64::new(0.14673047445536175, 0.989176509964781),
 413    Complex64::new(-0.989176509964781, 0.1467304744553618),
 414    Complex64::new(0.989176509964781, 0.14673047445536175),
 415    Complex64::new(-0.14673047445536164, 0.989176509964781),
 416    Complex64::new(0.5956993044924335, 0.8032075314806448),
 417    Complex64::new(-0.8032075314806448, 0.5956993044924335),
 418    Complex64::new(0.8577286100002721, 0.5141027441932217),
 419    Complex64::new(-0.5141027441932217, 0.8577286100002721),
 420    Complex64::new(0.24298017990326398, 0.970031253194544),
 421    Complex64::new(-0.970031253194544, 0.24298017990326407),
 422    Complex64::new(0.9415440651830208, 0.33688985339222005),
 423    Complex64::new(-0.33688985339221994, 0.9415440651830208),
 424    Complex64::new(0.4275550934302822, 0.9039892931234433),
 425    Complex64::new(-0.9039892931234433, 0.42755509343028203),
 426    Complex64::new(0.7409511253549591, 0.6715589548470183),
 427    Complex64::new(-0.6715589548470184, 0.740951125354959),
 428    Complex64::new(0.049067674327418126, 0.9987954562051724),
 429    Complex64::new(-0.9987954562051724, 0.049067674327417966),
 430    Complex64::new(0.9996988186962042, 0.024541228522912288),
 431    Complex64::new(-0.024541228522912142, 0.9996988186962042),
 432    Complex64::new(0.6895405447370669, 0.7242470829514669),
 433    Complex64::new(-0.7242470829514668, 0.689540544737067),
 434    Complex64::new(0.9142097557035307, 0.40524131400498986),
 435    Complex64::new(-0.40524131400498975, 0.9142097557035307),
 436    Complex64::new(0.3598950365349883, 0.9329927988347388),
 437    Complex64::new(-0.9329927988347388, 0.35989503653498833),
 438    Complex64::new(0.9757021300385286, 0.2191012401568698),
 439    Complex64::new(-0.21910124015686966, 0.9757021300385286),
 440    Complex64::new(0.5349976198870973, 0.844853565249707),
 441    Complex64::new(-0.8448535652497071, 0.5349976198870972),
 442    Complex64::new(0.8175848131515837, 0.5758081914178453),
 443    Complex64::new(-0.5758081914178453, 0.8175848131515837),
 444    Complex64::new(0.17096188876030136, 0.9852776423889412),
 445    Complex64::new(-0.9852776423889412, 0.17096188876030122),
 446    Complex64::new(0.99247953459871, 0.1224106751992162),
 447    Complex64::new(-0.12241067519921615, 0.99247953459871),
 448    Complex64::new(0.6152315905806268, 0.7883464276266062),
 449    Complex64::new(-0.7883464276266062, 0.6152315905806269),
 450    Complex64::new(0.8700869911087115, 0.49289819222978404),
 451    Complex64::new(-0.492898192229784, 0.8700869911087115),
 452    Complex64::new(0.2667127574748984, 0.9637760657954398),
 453    Complex64::new(-0.9637760657954398, 0.2667127574748985),
 454    Complex64::new(0.9495281805930367, 0.3136817403988915),
 455    Complex64::new(-0.3136817403988914, 0.9495281805930367),
 456    Complex64::new(0.4496113296546066, 0.8932243011955153),
 457    Complex64::new(-0.8932243011955152, 0.4496113296546069),
 458    Complex64::new(0.7572088465064846, 0.6531728429537768),
 459    Complex64::new(-0.6531728429537765, 0.7572088465064847),
 460    Complex64::new(0.07356456359966745, 0.9972904566786902),
 461    Complex64::new(-0.9972904566786902, 0.07356456359966773),
 462    Complex64::new(0.9972904566786902, 0.07356456359966743),
 463    Complex64::new(-0.07356456359966733, 0.9972904566786902),
 464    Complex64::new(0.6531728429537768, 0.7572088465064845),
 465    Complex64::new(-0.7572088465064846, 0.6531728429537766),
 466    Complex64::new(0.8932243011955153, 0.44961132965460654),
 467    Complex64::new(-0.4496113296546067, 0.8932243011955152),
 468    Complex64::new(0.3136817403988916, 0.9495281805930367),
 469    Complex64::new(-0.9495281805930367, 0.3136817403988914),
 470    Complex64::new(0.9637760657954398, 0.26671275747489837),
 471    Complex64::new(-0.2667127574748983, 0.9637760657954398),
 472    Complex64::new(0.4928981922297841, 0.8700869911087113),
 473    Complex64::new(-0.8700869911087113, 0.49289819222978415),
 474    Complex64::new(0.7883464276266063, 0.6152315905806268),
 475    Complex64::new(-0.6152315905806267, 0.7883464276266063),
 476    Complex64::new(0.12241067519921628, 0.99247953459871),
 477    Complex64::new(-0.99247953459871, 0.12241067519921635),
 478    Complex64::new(0.9852776423889412, 0.17096188876030122),
 479    Complex64::new(-0.17096188876030124, 0.9852776423889412),
 480    Complex64::new(0.5758081914178453, 0.8175848131515837),
 481    Complex64::new(-0.8175848131515836, 0.5758081914178454),
 482    Complex64::new(0.8448535652497071, 0.5349976198870972),
 483    Complex64::new(-0.534997619887097, 0.8448535652497072),
 484    Complex64::new(0.21910124015686977, 0.9757021300385286),
 485    Complex64::new(-0.9757021300385285, 0.21910124015687005),
 486    Complex64::new(0.932992798834739, 0.3598950365349881),
 487    Complex64::new(-0.35989503653498817, 0.9329927988347388),
 488    Complex64::new(0.40524131400498986, 0.9142097557035307),
 489    Complex64::new(-0.9142097557035307, 0.4052413140049899),
 490    Complex64::new(0.724247082951467, 0.6895405447370668),
 491    Complex64::new(-0.6895405447370669, 0.7242470829514669),
 492    Complex64::new(0.024541228522912264, 0.9996988186962042),
 493    Complex64::new(-0.9996988186962042, 0.024541228522912326),
 494    Complex64::new(0.9999247018391445, 0.012271538285719925),
 495    Complex64::new(-0.012271538285719823, 0.9999247018391445),
 496    Complex64::new(0.6983762494089729, 0.7157308252838186),
 497    Complex64::new(-0.7157308252838186, 0.6983762494089729),
 498    Complex64::new(0.9191138516900578, 0.3939920400610481),
 499    Complex64::new(-0.393992040061048, 0.9191138516900578),
 500    Complex64::new(0.3713171939518376, 0.9285060804732155),
 501    Complex64::new(-0.9285060804732155, 0.3713171939518377),
 502    Complex64::new(0.9783173707196277, 0.20711137619221856),
 503    Complex64::new(-0.20711137619221845, 0.9783173707196277),
 504    Complex64::new(0.5453249884220465, 0.838224705554838),
 505    Complex64::new(-0.8382247055548381, 0.5453249884220464),
 506    Complex64::new(0.8245893027850253, 0.5657318107836131),
 507    Complex64::new(-0.5657318107836132, 0.8245893027850252),
 508    Complex64::new(0.18303988795514106, 0.9831054874312163),
 509    Complex64::new(-0.9831054874312163, 0.1830398879551409),
 510    Complex64::new(0.9939069700023561, 0.11022220729388306),
 511    Complex64::new(-0.11022220729388306, 0.9939069700023561),
 512    Complex64::new(0.6248594881423865, 0.7807372285720944),
 513    Complex64::new(-0.7807372285720945, 0.6248594881423863),
 514    Complex64::new(0.8760700941954066, 0.4821837720791227),
 515    Complex64::new(-0.4821837720791227, 0.8760700941954066),
 516    Complex64::new(0.27851968938505306, 0.9604305194155658),
 517    Complex64::new(-0.9604305194155658, 0.27851968938505317),
 518    Complex64::new(0.9533060403541939, 0.3020059493192281),
 519    Complex64::new(-0.3020059493192281, 0.9533060403541939),
 520    Complex64::new(0.46053871095824, 0.8876396204028539),
 521    Complex64::new(-0.8876396204028538, 0.4605387109582402),
 522    Complex64::new(0.765167265622459, 0.6438315428897914),
 523    Complex64::new(-0.6438315428897913, 0.7651672656224591),
 524    Complex64::new(0.08579731234443988, 0.996312612182778),
 525    Complex64::new(-0.996312612182778, 0.08579731234444016),
 526    Complex64::new(0.9981181129001492, 0.06132073630220858),
 527    Complex64::new(-0.06132073630220853, 0.9981181129001492),
 528    Complex64::new(0.6624157775901718, 0.7491363945234593),
 529    Complex64::new(-0.7491363945234591, 0.662415777590172),
 530    Complex64::new(0.8986744656939538, 0.43861623853852766),
 531    Complex64::new(-0.4386162385385274, 0.8986744656939539),
 532    Complex64::new(0.325310292162263, 0.9456073253805213),
 533    Complex64::new(-0.9456073253805212, 0.32531029216226326),
 534    Complex64::new(0.9669764710448521, 0.25486565960451457),
 535    Complex64::new(-0.2548656596045145, 0.9669764710448521),
 536    Complex64::new(0.5035383837257176, 0.8639728561215867),
 537    Complex64::new(-0.8639728561215867, 0.5035383837257177),
 538    Complex64::new(0.7958369046088836, 0.6055110414043255),
 539    Complex64::new(-0.6055110414043254, 0.7958369046088836),
 540    Complex64::new(0.13458070850712622, 0.99090263542778),
 541    Complex64::new(-0.99090263542778, 0.13458070850712628),
 542    Complex64::new(0.9873014181578584, 0.15885814333386145),
 543    Complex64::new(-0.15885814333386128, 0.9873014181578584),
 544    Complex64::new(0.5857978574564389, 0.8104571982525948),
 545    Complex64::new(-0.8104571982525947, 0.585797857456439),
 546    Complex64::new(0.8513551931052652, 0.524589682678469),
 547    Complex64::new(-0.5245896826784687, 0.8513551931052652),
 548    Complex64::new(0.23105810828067128, 0.9729399522055601),
 549    Complex64::new(-0.9729399522055601, 0.23105810828067133),
 550    Complex64::new(0.937339011912575, 0.34841868024943456),
 551    Complex64::new(-0.3484186802494344, 0.937339011912575),
 552    Complex64::new(0.4164295600976373, 0.9091679830905223),
 553    Complex64::new(-0.9091679830905224, 0.41642956009763715),
 554    Complex64::new(0.7326542716724128, 0.680600997795453),
 555    Complex64::new(-0.680600997795453, 0.7326542716724128),
 556    Complex64::new(0.03680722294135899, 0.9993223845883495),
 557    Complex64::new(-0.9993223845883495, 0.03680722294135883),
 558    Complex64::new(0.9993223845883495, 0.03680722294135883),
 559    Complex64::new(-0.036807222941358866, 0.9993223845883495),
 560    Complex64::new(0.6806009977954531, 0.7326542716724128),
 561    Complex64::new(-0.7326542716724127, 0.6806009977954532),
 562    Complex64::new(0.9091679830905224, 0.41642956009763715),
 563    Complex64::new(-0.416429560097637, 0.9091679830905225),
 564    Complex64::new(0.3484186802494345, 0.937339011912575),
 565    Complex64::new(-0.9373390119125748, 0.3484186802494348),
 566    Complex64::new(0.9729399522055602, 0.2310581082806711),
 567    Complex64::new(-0.23105810828067114, 0.9729399522055602),
 568    Complex64::new(0.5245896826784688, 0.8513551931052652),
 569    Complex64::new(-0.8513551931052652, 0.524589682678469),
 570    Complex64::new(0.8104571982525948, 0.5857978574564389),
 571    Complex64::new(-0.5857978574564389, 0.8104571982525948),
 572    Complex64::new(0.1588581433338614, 0.9873014181578584),
 573    Complex64::new(-0.9873014181578584, 0.15885814333386147),
 574    Complex64::new(0.99090263542778, 0.13458070850712617),
 575    Complex64::new(-0.1345807085071261, 0.99090263542778),
 576    Complex64::new(0.6055110414043255, 0.7958369046088835),
 577    Complex64::new(-0.7958369046088835, 0.6055110414043257),
 578    Complex64::new(0.8639728561215868, 0.5035383837257176),
 579    Complex64::new(-0.5035383837257175, 0.8639728561215868),
 580    Complex64::new(0.2548656596045146, 0.9669764710448521),
 581    Complex64::new(-0.9669764710448521, 0.2548656596045147),
 582    Complex64::new(0.9456073253805213, 0.3253102921622629),
 583    Complex64::new(-0.32531029216226287, 0.9456073253805214),
 584    Complex64::new(0.4386162385385277, 0.8986744656939538),
 585    Complex64::new(-0.8986744656939539, 0.43861623853852755),
 586    Complex64::new(0.7491363945234594, 0.6624157775901718),
 587    Complex64::new(-0.6624157775901719, 0.7491363945234593),
 588    Complex64::new(0.06132073630220865, 0.9981181129001492),
 589    Complex64::new(-0.9981181129001492, 0.06132073630220849),
 590    Complex64::new(0.996312612182778, 0.0857973123444399),
 591    Complex64::new(-0.08579731234443976, 0.996312612182778),
 592    Complex64::new(0.6438315428897915, 0.765167265622459),
 593    Complex64::new(-0.765167265622459, 0.6438315428897914),
 594    Complex64::new(0.8876396204028539, 0.46053871095824),
 595    Complex64::new(-0.46053871095824006, 0.8876396204028539),
 596    Complex64::new(0.3020059493192282, 0.9533060403541938),
 597    Complex64::new(-0.9533060403541939, 0.30200594931922803),
 598    Complex64::new(0.9604305194155658, 0.27851968938505306),
 599    Complex64::new(-0.27851968938505295, 0.9604305194155659),
 600    Complex64::new(0.48218377207912283, 0.8760700941954066),
 601    Complex64::new(-0.8760700941954065, 0.4821837720791229),
 602    Complex64::new(0.7807372285720945, 0.6248594881423863),
 603    Complex64::new(-0.6248594881423862, 0.7807372285720946),
 604    Complex64::new(0.11022220729388318, 0.9939069700023561),
 605    Complex64::new(-0.9939069700023561, 0.11022220729388324),
 606    Complex64::new(0.9831054874312163, 0.18303988795514095),
 607    Complex64::new(-0.18303988795514092, 0.9831054874312163),
 608    Complex64::new(0.5657318107836132, 0.8245893027850253),
 609    Complex64::new(-0.8245893027850251, 0.5657318107836135),
 610    Complex64::new(0.8382247055548381, 0.5453249884220465),
 611    Complex64::new(-0.5453249884220462, 0.8382247055548382),
 612    Complex64::new(0.20711137619221856, 0.9783173707196277),
 613    Complex64::new(-0.9783173707196275, 0.20711137619221884),
 614    Complex64::new(0.9285060804732156, 0.37131719395183754),
 615    Complex64::new(-0.3713171939518375, 0.9285060804732156),
 616    Complex64::new(0.3939920400610481, 0.9191138516900578),
 617    Complex64::new(-0.9191138516900578, 0.39399204006104815),
 618    Complex64::new(0.7157308252838186, 0.6983762494089729),
 619    Complex64::new(-0.6983762494089728, 0.7157308252838187),
 620    Complex64::new(0.012271538285719944, 0.9999247018391445),
 621    Complex64::new(-0.9999247018391445, 0.012271538285720007),
 622    Complex64::new(0.9999811752826011, 0.006135884649154475),
 623    Complex64::new(-0.006135884649154393, 0.9999811752826011),
 624    Complex64::new(0.7027547444572253, 0.7114321957452164),
 625    Complex64::new(-0.7114321957452165, 0.7027547444572252),
 626    Complex64::new(0.921514039342042, 0.38834504669882625),
 627    Complex64::new(-0.3883450466988262, 0.921514039342042),
 628    Complex64::new(0.3770074102164183, 0.9262102421383113),
 629    Complex64::new(-0.9262102421383114, 0.37700741021641815),
 630    Complex64::new(0.9795697656854405, 0.2011046348420919),
 631    Complex64::new(-0.20110463484209182, 0.9795697656854405),
 632    Complex64::new(0.5504579729366048, 0.83486287498638),
 633    Complex64::new(-0.83486287498638, 0.5504579729366049),
 634    Complex64::new(0.8280450452577558, 0.560661576197336),
 635    Complex64::new(-0.5606615761973359, 0.8280450452577558),
 636    Complex64::new(0.18906866414980628, 0.9819638691095552),
 637    Complex64::new(-0.9819638691095552, 0.18906866414980636),
 638    Complex64::new(0.9945645707342554, 0.10412163387205459),
 639    Complex64::new(-0.1041216338720546, 0.9945645707342554),
 640    Complex64::new(0.6296382389149271, 0.7768884656732324),
 641    Complex64::new(-0.7768884656732323, 0.6296382389149272),
 642    Complex64::new(0.8790122264286335, 0.4767992300633221),
 643    Complex64::new(-0.4767992300633219, 0.8790122264286335),
 644    Complex64::new(0.2844075372112718, 0.9587034748958716),
 645    Complex64::new(-0.9587034748958715, 0.2844075372112721),
 646    Complex64::new(0.9551411683057708, 0.2961508882436238),
 647    Complex64::new(-0.29615088824362384, 0.9551411683057707),
 648    Complex64::new(0.4659764957679661, 0.8847970984309378),
 649    Complex64::new(-0.8847970984309378, 0.4659764957679662),
 650    Complex64::new(0.7691033376455797, 0.6391244448637757),
 651    Complex64::new(-0.6391244448637757, 0.7691033376455796),
 652    Complex64::new(0.0919089564971327, 0.9957674144676598),
 653    Complex64::new(-0.9957674144676598, 0.09190895649713275),
 654    Complex64::new(0.9984755805732948, 0.055195244349689934),
 655    Complex64::new(-0.05519524434968991, 0.9984755805732948),
 656    Complex64::new(0.6669999223036375, 0.745057785441466),
 657    Complex64::new(-0.745057785441466, 0.6669999223036376),
 658    Complex64::new(0.901348847046022, 0.43309381885315196),
 659    Complex64::new(-0.4330938188531519, 0.901348847046022),
 660    Complex64::new(0.33110630575987643, 0.9435934581619604),
 661    Complex64::new(-0.9435934581619604, 0.3311063057598765),
 662    Complex64::new(0.9685220942744174, 0.24892760574572015),
 663    Complex64::new(-0.24892760574572012, 0.9685220942744174),
 664    Complex64::new(0.508830142543107, 0.8608669386377673),
 665    Complex64::new(-0.8608669386377671, 0.5088301425431073),
 666    Complex64::new(0.799537269107905, 0.600616479383869),
 667    Complex64::new(-0.6006164793838688, 0.7995372691079052),
 668    Complex64::new(0.14065823933284924, 0.9900582102622971),
 669    Complex64::new(-0.990058210262297, 0.14065823933284954),
 670    Complex64::new(0.9882575677307495, 0.15279718525844344),
 671    Complex64::new(-0.1527971852584433, 0.9882575677307495),
 672    Complex64::new(0.5907597018588743, 0.8068475535437992),
 673    Complex64::new(-0.8068475535437993, 0.5907597018588742),
 674    Complex64::new(0.8545579883654005, 0.5193559901655896),
 675    Complex64::new(-0.5193559901655896, 0.8545579883654005),
 676    Complex64::new(0.23702360599436734, 0.9715038909862518),
 677    Complex64::new(-0.9715038909862518, 0.23702360599436717),
 678    Complex64::new(0.9394592236021899, 0.3426607173119944),
 679    Complex64::new(-0.34266071731199427, 0.9394592236021899),
 680    Complex64::new(0.4220002707997998, 0.9065957045149153),
 681    Complex64::new(-0.9065957045149153, 0.42200027079979985),
 682    Complex64::new(0.7368165688773699, 0.6760927035753159),
 683    Complex64::new(-0.6760927035753158, 0.73681656887737),
 684    Complex64::new(0.04293825693494096, 0.9990777277526454),
 685    Complex64::new(-0.9990777277526454, 0.04293825693494102),
 686    Complex64::new(0.9995294175010931, 0.030674803176636626),
 687    Complex64::new(-0.03067480317663646, 0.9995294175010931),
 688    Complex64::new(0.6850836677727004, 0.7284643904482252),
 689    Complex64::new(-0.7284643904482252, 0.6850836677727004),
 690    Complex64::new(0.9117060320054299, 0.4108431710579039),
 691    Complex64::new(-0.4108431710579038, 0.9117060320054299),
 692    Complex64::new(0.3541635254204905, 0.9351835099389475),
 693    Complex64::new(-0.9351835099389476, 0.3541635254204904),
 694    Complex64::new(0.9743393827855759, 0.22508391135979283),
 695    Complex64::new(-0.22508391135979267, 0.9743393827855759),
 696    Complex64::new(0.5298036246862948, 0.8481203448032971),
 697    Complex64::new(-0.8481203448032971, 0.5298036246862948),
 698    Complex64::new(0.8140363297059484, 0.5808139580957645),
 699    Complex64::new(-0.5808139580957644, 0.8140363297059485),
 700    Complex64::new(0.1649131204899701, 0.9863080972445987),
 701    Complex64::new(-0.9863080972445986, 0.16491312048997014),
 702    Complex64::new(0.9917097536690995, 0.12849811079379317),
 703    Complex64::new(-0.1284981107937931, 0.9917097536690995),
 704    Complex64::new(0.6103828062763095, 0.7921065773002124),
 705    Complex64::new(-0.7921065773002122, 0.6103828062763097),
 706    Complex64::new(0.8670462455156926, 0.49822766697278187),
 707    Complex64::new(-0.4982276669727816, 0.8670462455156928),
 708    Complex64::new(0.26079411791527557, 0.9653944416976894),
 709    Complex64::new(-0.9653944416976893, 0.26079411791527585),
 710    Complex64::new(0.9475855910177411, 0.3195020308160157),
 711    Complex64::new(-0.31950203081601564, 0.9475855910177412),
 712    Complex64::new(0.44412214457042926, 0.8959662497561851),
 713    Complex64::new(-0.8959662497561851, 0.4441221445704293),
 714    Complex64::new(0.7531867990436125, 0.6578066932970786),
 715    Complex64::new(-0.6578066932970786, 0.7531867990436125),
 716    Complex64::new(0.0674439195636641, 0.9977230666441916),
 717    Complex64::new(-0.9977230666441916, 0.06744391956366418),
 718    Complex64::new(0.9968202992911657, 0.07968243797143013),
 719    Complex64::new(-0.07968243797143001, 0.9968202992911658),
 720    Complex64::new(0.6485144010221126, 0.7612023854842618),
 721    Complex64::new(-0.7612023854842617, 0.6485144010221126),
 722    Complex64::new(0.8904487232447579, 0.45508358712634384),
 723    Complex64::new(-0.4550835871263437, 0.890448723244758),
 724    Complex64::new(0.307849640041535, 0.9514350209690083),
 725    Complex64::new(-0.9514350209690083, 0.30784964004153503),
 726    Complex64::new(0.9621214042690416, 0.272621355449949),
 727    Complex64::new(-0.27262135544994887, 0.9621214042690416),
 728    Complex64::new(0.48755016014843605, 0.8730949784182901),
 729    Complex64::new(-0.8730949784182901, 0.4875501601484359),
 730    Complex64::new(0.7845565971555752, 0.6200572117632891),
 731    Complex64::new(-0.6200572117632892, 0.7845565971555751),
 732    Complex64::new(0.11631863091190488, 0.9932119492347945),
 733    Complex64::new(-0.9932119492347945, 0.11631863091190471),
 734    Complex64::new(0.984210092386929, 0.17700422041214875),
 735    Complex64::new(-0.17700422041214875, 0.984210092386929),
 736    Complex64::new(0.5707807458869674, 0.8211025149911046),
 737    Complex64::new(-0.8211025149911046, 0.5707807458869673),
 738    Complex64::new(0.8415549774368984, 0.5401714727298929),
 739    Complex64::new(-0.5401714727298929, 0.8415549774368984),
 740    Complex64::new(0.21311031991609136, 0.9770281426577544),
 741    Complex64::new(-0.9770281426577544, 0.21311031991609142),
 742    Complex64::new(0.9307669610789837, 0.36561299780477385),
 743    Complex64::new(-0.36561299780477385, 0.9307669610789837),
 744    Complex64::new(0.3996241998456468, 0.9166790599210427),
 745    Complex64::new(-0.9166790599210426, 0.39962419984564707),
 746    Complex64::new(0.7200025079613817, 0.693971460889654),
 747    Complex64::new(-0.6939714608896538, 0.7200025079613818),
 748    Complex64::new(0.01840672990580482, 0.9998305817958234),
 749    Complex64::new(-0.9998305817958234, 0.0184067299058051),
 750    Complex64::new(0.9998305817958234, 0.01840672990580482),
 751    Complex64::new(-0.018406729905804695, 0.9998305817958234),
 752    Complex64::new(0.693971460889654, 0.7200025079613817),
 753    Complex64::new(-0.7200025079613817, 0.693971460889654),
 754    Complex64::new(0.9166790599210427, 0.3996241998456468),
 755    Complex64::new(-0.3996241998456467, 0.9166790599210427),
 756    Complex64::new(0.36561299780477396, 0.9307669610789837),
 757    Complex64::new(-0.9307669610789837, 0.3656129978047738),
 758    Complex64::new(0.9770281426577544, 0.21311031991609136),
 759    Complex64::new(-0.21311031991609125, 0.9770281426577544),
 760    Complex64::new(0.540171472729893, 0.8415549774368983),
 761    Complex64::new(-0.8415549774368983, 0.540171472729893),
 762    Complex64::new(0.8211025149911046, 0.5707807458869673),
 763    Complex64::new(-0.5707807458869671, 0.8211025149911048),
 764    Complex64::new(0.17700422041214886, 0.984210092386929),
 765    Complex64::new(-0.984210092386929, 0.17700422041214894),
 766    Complex64::new(0.9932119492347945, 0.11631863091190475),
 767    Complex64::new(-0.11631863091190475, 0.9932119492347945),
 768    Complex64::new(0.6200572117632892, 0.7845565971555752),
 769    Complex64::new(-0.784556597155575, 0.6200572117632894),
 770    Complex64::new(0.8730949784182901, 0.487550160148436),
 771    Complex64::new(-0.4875501601484357, 0.8730949784182902),
 772    Complex64::new(0.272621355449949, 0.9621214042690416),
 773    Complex64::new(-0.9621214042690415, 0.27262135544994925),
 774    Complex64::new(0.9514350209690083, 0.30784964004153487),
 775    Complex64::new(-0.30784964004153487, 0.9514350209690083),
 776    Complex64::new(0.45508358712634384, 0.8904487232447579),
 777    Complex64::new(-0.8904487232447579, 0.4550835871263439),
 778    Complex64::new(0.7612023854842618, 0.6485144010221124),
 779    Complex64::new(-0.6485144010221124, 0.7612023854842619),
 780    Complex64::new(0.07968243797143013, 0.9968202992911657),
 781    Complex64::new(-0.9968202992911657, 0.0796824379714302),
 782    Complex64::new(0.9977230666441916, 0.06744391956366405),
 783    Complex64::new(-0.06744391956366398, 0.9977230666441916),
 784    Complex64::new(0.6578066932970786, 0.7531867990436124),
 785    Complex64::new(-0.7531867990436124, 0.6578066932970787),
 786    Complex64::new(0.8959662497561852, 0.4441221445704292),
 787    Complex64::new(-0.44412214457042914, 0.8959662497561852),
 788    Complex64::new(0.31950203081601575, 0.9475855910177411),
 789    Complex64::new(-0.9475855910177411, 0.3195020308160158),
 790    Complex64::new(0.9653944416976894, 0.2607941179152755),
 791    Complex64::new(-0.26079411791527546, 0.9653944416976894),
 792    Complex64::new(0.49822766697278187, 0.8670462455156926),
 793    Complex64::new(-0.8670462455156928, 0.49822766697278176),
 794    Complex64::new(0.7921065773002124, 0.6103828062763095),
 795    Complex64::new(-0.6103828062763096, 0.7921065773002123),
 796    Complex64::new(0.12849811079379322, 0.9917097536690995),
 797    Complex64::new(-0.9917097536690995, 0.12849811079379309),
 798    Complex64::new(0.9863080972445987, 0.16491312048996992),
 799    Complex64::new(-0.16491312048996995, 0.9863080972445987),
 800    Complex64::new(0.5808139580957645, 0.8140363297059483),
 801    Complex64::new(-0.8140363297059484, 0.5808139580957645),
 802    Complex64::new(0.8481203448032972, 0.5298036246862946),
 803    Complex64::new(-0.5298036246862947, 0.8481203448032972),
 804    Complex64::new(0.22508391135979278, 0.9743393827855759),
 805    Complex64::new(-0.9743393827855759, 0.22508391135979283),
 806    Complex64::new(0.9351835099389476, 0.35416352542049034),
 807    Complex64::new(-0.3541635254204904, 0.9351835099389476),
 808    Complex64::new(0.4108431710579039, 0.9117060320054299),
 809    Complex64::new(-0.9117060320054298, 0.41084317105790413),
 810    Complex64::new(0.7284643904482252, 0.6850836677727004),
 811    Complex64::new(-0.6850836677727002, 0.7284643904482253),
 812    Complex64::new(0.03067480317663658, 0.9995294175010931),
 813    Complex64::new(-0.9995294175010931, 0.030674803176636865),
 814    Complex64::new(0.9990777277526454, 0.04293825693494082),
 815    Complex64::new(-0.042938256934940834, 0.9990777277526454),
 816    Complex64::new(0.676092703575316, 0.7368165688773698),
 817    Complex64::new(-0.7368165688773699, 0.6760927035753159),
 818    Complex64::new(0.9065957045149153, 0.4220002707997997),
 819    Complex64::new(-0.4220002707997997, 0.9065957045149153),
 820    Complex64::new(0.3426607173119944, 0.9394592236021899),
 821    Complex64::new(-0.9394592236021899, 0.34266071731199443),
 822    Complex64::new(0.9715038909862518, 0.2370236059943672),
 823    Complex64::new(-0.23702360599436723, 0.9715038909862518),
 824    Complex64::new(0.5193559901655895, 0.8545579883654005),
 825    Complex64::new(-0.8545579883654004, 0.5193559901655898),
 826    Complex64::new(0.8068475535437993, 0.5907597018588742),
 827    Complex64::new(-0.590759701858874, 0.8068475535437994),
 828    Complex64::new(0.1527971852584434, 0.9882575677307495),
 829    Complex64::new(-0.9882575677307495, 0.15279718525844369),
 830    Complex64::new(0.9900582102622971, 0.1406582393328492),
 831    Complex64::new(-0.14065823933284913, 0.9900582102622971),
 832    Complex64::new(0.600616479383869, 0.799537269107905),
 833    Complex64::new(-0.7995372691079051, 0.6006164793838689),
 834    Complex64::new(0.8608669386377673, 0.508830142543107),
 835    Complex64::new(-0.5088301425431071, 0.8608669386377672),
 836    Complex64::new(0.24892760574572026, 0.9685220942744173),
 837    Complex64::new(-0.9685220942744174, 0.2489276057457201),
 838    Complex64::new(0.9435934581619604, 0.33110630575987643),
 839    Complex64::new(-0.3311063057598763, 0.9435934581619604),
 840    Complex64::new(0.433093818853152, 0.901348847046022),
 841    Complex64::new(-0.9013488470460219, 0.43309381885315207),
 842    Complex64::new(0.7450577854414661, 0.6669999223036375),
 843    Complex64::new(-0.6669999223036374, 0.7450577854414661),
 844    Complex64::new(0.05519524434969003, 0.9984755805732948),
 845    Complex64::new(-0.9984755805732948, 0.055195244349690094),
 846    Complex64::new(0.9957674144676598, 0.09190895649713272),
 847    Complex64::new(-0.09190895649713257, 0.9957674144676598),
 848    Complex64::new(0.6391244448637757, 0.7691033376455796),
 849    Complex64::new(-0.7691033376455795, 0.6391244448637758),
 850    Complex64::new(0.8847970984309378, 0.4659764957679662),
 851    Complex64::new(-0.465976495767966, 0.8847970984309379),
 852    Complex64::new(0.29615088824362396, 0.9551411683057707),
 853    Complex64::new(-0.9551411683057707, 0.296150888243624),
 854    Complex64::new(0.9587034748958716, 0.2844075372112719),
 855    Complex64::new(-0.2844075372112717, 0.9587034748958716),
 856    Complex64::new(0.47679923006332225, 0.8790122264286334),
 857    Complex64::new(-0.8790122264286335, 0.4767992300633221),
 858    Complex64::new(0.7768884656732324, 0.629638238914927),
 859    Complex64::new(-0.6296382389149271, 0.7768884656732324),
 860    Complex64::new(0.10412163387205473, 0.9945645707342554),
 861    Complex64::new(-0.9945645707342554, 0.10412163387205457),
 862    Complex64::new(0.9819638691095552, 0.1890686641498062),
 863    Complex64::new(-0.18906866414980616, 0.9819638691095552),
 864    Complex64::new(0.560661576197336, 0.8280450452577558),
 865    Complex64::new(-0.8280450452577557, 0.5606615761973361),
 866    Complex64::new(0.83486287498638, 0.5504579729366048),
 867    Complex64::new(-0.5504579729366047, 0.8348628749863801),
 868    Complex64::new(0.20110463484209196, 0.9795697656854405),
 869    Complex64::new(-0.9795697656854405, 0.201104634842092),
 870    Complex64::new(0.9262102421383114, 0.37700741021641826),
 871    Complex64::new(-0.3770074102164182, 0.9262102421383114),
 872    Complex64::new(0.3883450466988263, 0.9215140393420419),
 873    Complex64::new(-0.9215140393420418, 0.3883450466988266),
 874    Complex64::new(0.7114321957452164, 0.7027547444572253),
 875    Complex64::new(-0.7027547444572251, 0.7114321957452167),
 876    Complex64::new(0.006135884649154515, 0.9999811752826011),
 877    Complex64::new(-0.9999811752826011, 0.006135884649154799),
 878];
 879
 880const FELT_BITREVERSED_POWERS: [FalconFelt; 512] = [
 881    FalconFelt::new(1),
 882    FalconFelt::new(1479),
 883    FalconFelt::new(8246),
 884    FalconFelt::new(5146),
 885    FalconFelt::new(4134),
 886    FalconFelt::new(6553),
 887    FalconFelt::new(11567),
 888    FalconFelt::new(1305),
 889    FalconFelt::new(5860),
 890    FalconFelt::new(3195),
 891    FalconFelt::new(1212),
 892    FalconFelt::new(10643),
 893    FalconFelt::new(3621),
 894    FalconFelt::new(9744),
 895    FalconFelt::new(8785),
 896    FalconFelt::new(3542),
 897    FalconFelt::new(7311),
 898    FalconFelt::new(10938),
 899    FalconFelt::new(8961),
 900    FalconFelt::new(5777),
 901    FalconFelt::new(5023),
 902    FalconFelt::new(6461),
 903    FalconFelt::new(5728),
 904    FalconFelt::new(4591),
 905    FalconFelt::new(3006),
 906    FalconFelt::new(9545),
 907    FalconFelt::new(563),
 908    FalconFelt::new(9314),
 909    FalconFelt::new(2625),
 910    FalconFelt::new(11340),
 911    FalconFelt::new(4821),
 912    FalconFelt::new(2639),
 913    FalconFelt::new(12149),
 914    FalconFelt::new(1853),
 915    FalconFelt::new(726),
 916    FalconFelt::new(4611),
 917    FalconFelt::new(11112),
 918    FalconFelt::new(4255),
 919    FalconFelt::new(2768),
 920    FalconFelt::new(1635),
 921    FalconFelt::new(2963),
 922    FalconFelt::new(7393),
 923    FalconFelt::new(2366),
 924    FalconFelt::new(9238),
 925    FalconFelt::new(9198),
 926    FalconFelt::new(12208),
 927    FalconFelt::new(11289),
 928    FalconFelt::new(7969),
 929    FalconFelt::new(8736),
 930    FalconFelt::new(4805),
 931    FalconFelt::new(11227),
 932    FalconFelt::new(2294),
 933    FalconFelt::new(9542),
 934    FalconFelt::new(4846),
 935    FalconFelt::new(9154),
 936    FalconFelt::new(8577),
 937    FalconFelt::new(9275),
 938    FalconFelt::new(3201),
 939    FalconFelt::new(7203),
 940    FalconFelt::new(10963),
 941    FalconFelt::new(1170),
 942    FalconFelt::new(9970),
 943    FalconFelt::new(955),
 944    FalconFelt::new(11499),
 945    FalconFelt::new(8340),
 946    FalconFelt::new(8993),
 947    FalconFelt::new(2396),
 948    FalconFelt::new(4452),
 949    FalconFelt::new(6915),
 950    FalconFelt::new(2837),
 951    FalconFelt::new(130),
 952    FalconFelt::new(7935),
 953    FalconFelt::new(11336),
 954    FalconFelt::new(3748),
 955    FalconFelt::new(6522),
 956    FalconFelt::new(11462),
 957    FalconFelt::new(5067),
 958    FalconFelt::new(10092),
 959    FalconFelt::new(12171),
 960    FalconFelt::new(9813),
 961    FalconFelt::new(8011),
 962    FalconFelt::new(1673),
 963    FalconFelt::new(5331),
 964    FalconFelt::new(7300),
 965    FalconFelt::new(10908),
 966    FalconFelt::new(9764),
 967    FalconFelt::new(4177),
 968    FalconFelt::new(8705),
 969    FalconFelt::new(480),
 970    FalconFelt::new(9447),
 971    FalconFelt::new(1022),
 972    FalconFelt::new(12280),
 973    FalconFelt::new(5791),
 974    FalconFelt::new(11745),
 975    FalconFelt::new(9821),
 976    FalconFelt::new(11950),
 977    FalconFelt::new(12144),
 978    FalconFelt::new(6747),
 979    FalconFelt::new(8652),
 980    FalconFelt::new(3459),
 981    FalconFelt::new(2731),
 982    FalconFelt::new(8357),
 983    FalconFelt::new(6378),
 984    FalconFelt::new(7399),
 985    FalconFelt::new(10530),
 986    FalconFelt::new(3707),
 987    FalconFelt::new(8595),
 988    FalconFelt::new(5179),
 989    FalconFelt::new(3382),
 990    FalconFelt::new(355),
 991    FalconFelt::new(4231),
 992    FalconFelt::new(2548),
 993    FalconFelt::new(9048),
 994    FalconFelt::new(11560),
 995    FalconFelt::new(3289),
 996    FalconFelt::new(10276),
 997    FalconFelt::new(9005),
 998    FalconFelt::new(9408),
 999    FalconFelt::new(5092),
1000    FalconFelt::new(10200),
1001    FalconFelt::new(6534),
1002    FalconFelt::new(4632),
1003    FalconFelt::new(4388),
1004    FalconFelt::new(1260),
1005    FalconFelt::new(334),
1006    FalconFelt::new(2426),
1007    FalconFelt::new(1428),
1008    FalconFelt::new(10593),
1009    FalconFelt::new(3400),
1010    FalconFelt::new(2399),
1011    FalconFelt::new(5191),
1012    FalconFelt::new(9153),
1013    FalconFelt::new(9273),
1014    FalconFelt::new(243),
1015    FalconFelt::new(3000),
1016    FalconFelt::new(671),
1017    FalconFelt::new(3531),
1018    FalconFelt::new(11813),
1019    FalconFelt::new(3985),
1020    FalconFelt::new(7384),
1021    FalconFelt::new(10111),
1022    FalconFelt::new(10745),
1023    FalconFelt::new(6730),
1024    FalconFelt::new(11869),
1025    FalconFelt::new(9042),
1026    FalconFelt::new(2686),
1027    FalconFelt::new(2969),
1028    FalconFelt::new(3978),
1029    FalconFelt::new(8779),
1030    FalconFelt::new(6957),
1031    FalconFelt::new(9424),
1032    FalconFelt::new(2370),
1033    FalconFelt::new(8241),
1034    FalconFelt::new(10040),
1035    FalconFelt::new(9405),
1036    FalconFelt::new(11136),
1037    FalconFelt::new(3186),
1038    FalconFelt::new(5407),
1039    FalconFelt::new(10163),
1040    FalconFelt::new(1630),
1041    FalconFelt::new(3271),
1042    FalconFelt::new(8232),
1043    FalconFelt::new(10600),
1044    FalconFelt::new(8925),
1045    FalconFelt::new(4414),
1046    FalconFelt::new(2847),
1047    FalconFelt::new(10115),
1048    FalconFelt::new(4372),
1049    FalconFelt::new(9509),
1050    FalconFelt::new(5195),
1051    FalconFelt::new(7394),
1052    FalconFelt::new(10805),
1053    FalconFelt::new(9984),
1054    FalconFelt::new(7247),
1055    FalconFelt::new(4053),
1056    FalconFelt::new(9644),
1057    FalconFelt::new(12176),
1058    FalconFelt::new(4919),
1059    FalconFelt::new(2166),
1060    FalconFelt::new(8374),
1061    FalconFelt::new(12129),
1062    FalconFelt::new(9140),
1063    FalconFelt::new(7852),
1064    FalconFelt::new(3),
1065    FalconFelt::new(1426),
1066    FalconFelt::new(7635),
1067    FalconFelt::new(10512),
1068    FalconFelt::new(1663),
1069    FalconFelt::new(8653),
1070    FalconFelt::new(4938),
1071    FalconFelt::new(2704),
1072    FalconFelt::new(5291),
1073    FalconFelt::new(5277),
1074    FalconFelt::new(1168),
1075    FalconFelt::new(11082),
1076    FalconFelt::new(9041),
1077    FalconFelt::new(2143),
1078    FalconFelt::new(11224),
1079    FalconFelt::new(11885),
1080    FalconFelt::new(4645),
1081    FalconFelt::new(4096),
1082    FalconFelt::new(11796),
1083    FalconFelt::new(5444),
1084    FalconFelt::new(2381),
1085    FalconFelt::new(10911),
1086    FalconFelt::new(1912),
1087    FalconFelt::new(4337),
1088    FalconFelt::new(11854),
1089    FalconFelt::new(4976),
1090    FalconFelt::new(10682),
1091    FalconFelt::new(11414),
1092    FalconFelt::new(8509),
1093    FalconFelt::new(11287),
1094    FalconFelt::new(5011),
1095    FalconFelt::new(8005),
1096    FalconFelt::new(5088),
1097    FalconFelt::new(9852),
1098    FalconFelt::new(8643),
1099    FalconFelt::new(9302),
1100    FalconFelt::new(6267),
1101    FalconFelt::new(2422),
1102    FalconFelt::new(6039),
1103    FalconFelt::new(2187),
1104    FalconFelt::new(2566),
1105    FalconFelt::new(10849),
1106    FalconFelt::new(8526),
1107    FalconFelt::new(9223),
1108    FalconFelt::new(27),
1109    FalconFelt::new(7205),
1110    FalconFelt::new(1632),
1111    FalconFelt::new(7404),
1112    FalconFelt::new(1017),
1113    FalconFelt::new(4143),
1114    FalconFelt::new(7575),
1115    FalconFelt::new(12047),
1116    FalconFelt::new(10752),
1117    FalconFelt::new(8585),
1118    FalconFelt::new(2678),
1119    FalconFelt::new(7270),
1120    FalconFelt::new(11744),
1121    FalconFelt::new(3833),
1122    FalconFelt::new(3778),
1123    FalconFelt::new(11899),
1124    FalconFelt::new(773),
1125    FalconFelt::new(5101),
1126    FalconFelt::new(11222),
1127    FalconFelt::new(9888),
1128    FalconFelt::new(442),
1129    FalconFelt::new(9377),
1130    FalconFelt::new(6591),
1131    FalconFelt::new(354),
1132    FalconFelt::new(7428),
1133    FalconFelt::new(5012),
1134    FalconFelt::new(2481),
1135    FalconFelt::new(1045),
1136    FalconFelt::new(9430),
1137    FalconFelt::new(10302),
1138    FalconFelt::new(10587),
1139    FalconFelt::new(8724),
1140    FalconFelt::new(11635),
1141    FalconFelt::new(7083),
1142    FalconFelt::new(5529),
1143    FalconFelt::new(9090),
1144    FalconFelt::new(12233),
1145    FalconFelt::new(6152),
1146    FalconFelt::new(4948),
1147    FalconFelt::new(400),
1148    FalconFelt::new(1728),
1149    FalconFelt::new(6427),
1150    FalconFelt::new(6136),
1151    FalconFelt::new(6874),
1152    FalconFelt::new(3643),
1153    FalconFelt::new(10930),
1154    FalconFelt::new(5435),
1155    FalconFelt::new(1254),
1156    FalconFelt::new(11316),
1157    FalconFelt::new(10256),
1158    FalconFelt::new(3998),
1159    FalconFelt::new(10367),
1160    FalconFelt::new(8410),
1161    FalconFelt::new(11821),
1162    FalconFelt::new(8301),
1163    FalconFelt::new(11907),
1164    FalconFelt::new(316),
1165    FalconFelt::new(6950),
1166    FalconFelt::new(5446),
1167    FalconFelt::new(6093),
1168    FalconFelt::new(3710),
1169    FalconFelt::new(7822),
1170    FalconFelt::new(4789),
1171    FalconFelt::new(7540),
1172    FalconFelt::new(5537),
1173    FalconFelt::new(3789),
1174    FalconFelt::new(147),
1175    FalconFelt::new(5456),
1176    FalconFelt::new(7840),
1177    FalconFelt::new(11239),
1178    FalconFelt::new(7753),
1179    FalconFelt::new(5445),
1180    FalconFelt::new(3860),
1181    FalconFelt::new(9606),
1182    FalconFelt::new(1190),
1183    FalconFelt::new(8471),
1184    FalconFelt::new(6118),
1185    FalconFelt::new(5925),
1186    FalconFelt::new(1018),
1187    FalconFelt::new(8775),
1188    FalconFelt::new(1041),
1189    FalconFelt::new(1973),
1190    FalconFelt::new(5574),
1191    FalconFelt::new(11011),
1192    FalconFelt::new(2344),
1193    FalconFelt::new(4075),
1194    FalconFelt::new(5315),
1195    FalconFelt::new(4324),
1196    FalconFelt::new(4916),
1197    FalconFelt::new(10120),
1198    FalconFelt::new(11767),
1199    FalconFelt::new(7210),
1200    FalconFelt::new(9027),
1201    FalconFelt::new(6281),
1202    FalconFelt::new(11404),
1203    FalconFelt::new(7280),
1204    FalconFelt::new(1956),
1205    FalconFelt::new(11286),
1206    FalconFelt::new(3532),
1207    FalconFelt::new(12048),
1208    FalconFelt::new(12231),
1209    FalconFelt::new(1105),
1210    FalconFelt::new(12147),
1211    FalconFelt::new(5681),
1212    FalconFelt::new(8812),
1213    FalconFelt::new(8851),
1214    FalconFelt::new(2844),
1215    FalconFelt::new(975),
1216    FalconFelt::new(4212),
1217    FalconFelt::new(8687),
1218    FalconFelt::new(6068),
1219    FalconFelt::new(421),
1220    FalconFelt::new(8209),
1221    FalconFelt::new(3600),
1222    FalconFelt::new(3263),
1223    FalconFelt::new(7665),
1224    FalconFelt::new(6077),
1225    FalconFelt::new(4782),
1226    FalconFelt::new(6403),
1227    FalconFelt::new(9260),
1228    FalconFelt::new(5594),
1229    FalconFelt::new(8076),
1230    FalconFelt::new(11785),
1231    FalconFelt::new(605),
1232    FalconFelt::new(9987),
1233    FalconFelt::new(5468),
1234    FalconFelt::new(1010),
1235    FalconFelt::new(787),
1236    FalconFelt::new(8807),
1237    FalconFelt::new(5241),
1238    FalconFelt::new(9369),
1239    FalconFelt::new(9162),
1240    FalconFelt::new(8120),
1241    FalconFelt::new(5057),
1242    FalconFelt::new(7591),
1243    FalconFelt::new(3445),
1244    FalconFelt::new(7509),
1245    FalconFelt::new(2049),
1246    FalconFelt::new(7377),
1247    FalconFelt::new(10968),
1248    FalconFelt::new(192),
1249    FalconFelt::new(431),
1250    FalconFelt::new(10710),
1251    FalconFelt::new(2505),
1252    FalconFelt::new(5906),
1253    FalconFelt::new(12138),
1254    FalconFelt::new(10162),
1255    FalconFelt::new(8332),
1256    FalconFelt::new(9450),
1257    FalconFelt::new(6415),
1258    FalconFelt::new(677),
1259    FalconFelt::new(6234),
1260    FalconFelt::new(3336),
1261    FalconFelt::new(12237),
1262    FalconFelt::new(9115),
1263    FalconFelt::new(1323),
1264    FalconFelt::new(2766),
1265    FalconFelt::new(3150),
1266    FalconFelt::new(1319),
1267    FalconFelt::new(8243),
1268    FalconFelt::new(709),
1269    FalconFelt::new(8049),
1270    FalconFelt::new(8719),
1271    FalconFelt::new(11454),
1272    FalconFelt::new(6224),
1273    FalconFelt::new(922),
1274    FalconFelt::new(11848),
1275    FalconFelt::new(8210),
1276    FalconFelt::new(1058),
1277    FalconFelt::new(1958),
1278    FalconFelt::new(7967),
1279    FalconFelt::new(10211),
1280    FalconFelt::new(11177),
1281    FalconFelt::new(64),
1282    FalconFelt::new(8633),
1283    FalconFelt::new(11606),
1284    FalconFelt::new(9830),
1285    FalconFelt::new(6507),
1286    FalconFelt::new(1566),
1287    FalconFelt::new(2948),
1288    FalconFelt::new(9786),
1289    FalconFelt::new(6370),
1290    FalconFelt::new(7856),
1291    FalconFelt::new(3834),
1292    FalconFelt::new(5257),
1293    FalconFelt::new(10542),
1294    FalconFelt::new(9166),
1295    FalconFelt::new(9235),
1296    FalconFelt::new(5486),
1297    FalconFelt::new(1404),
1298    FalconFelt::new(11964),
1299    FalconFelt::new(1146),
1300    FalconFelt::new(11341),
1301    FalconFelt::new(3728),
1302    FalconFelt::new(8240),
1303    FalconFelt::new(6299),
1304    FalconFelt::new(1159),
1305    FalconFelt::new(6099),
1306    FalconFelt::new(295),
1307    FalconFelt::new(5766),
1308    FalconFelt::new(11637),
1309    FalconFelt::new(8527),
1310    FalconFelt::new(2919),
1311    FalconFelt::new(8273),
1312    FalconFelt::new(8212),
1313    FalconFelt::new(3329),
1314    FalconFelt::new(7991),
1315    FalconFelt::new(9597),
1316    FalconFelt::new(168),
1317    FalconFelt::new(10695),
1318    FalconFelt::new(1962),
1319    FalconFelt::new(5106),
1320    FalconFelt::new(6328),
1321    FalconFelt::new(5297),
1322    FalconFelt::new(6170),
1323    FalconFelt::new(3956),
1324    FalconFelt::new(1360),
1325    FalconFelt::new(11089),
1326    FalconFelt::new(7105),
1327    FalconFelt::new(9734),
1328    FalconFelt::new(6167),
1329    FalconFelt::new(9407),
1330    FalconFelt::new(1805),
1331    FalconFelt::new(1954),
1332    FalconFelt::new(2051),
1333    FalconFelt::new(6142),
1334    FalconFelt::new(2447),
1335    FalconFelt::new(3963),
1336    FalconFelt::new(11713),
1337    FalconFelt::new(8855),
1338    FalconFelt::new(8760),
1339    FalconFelt::new(9381),
1340    FalconFelt::new(218),
1341    FalconFelt::new(9928),
1342    FalconFelt::new(10446),
1343    FalconFelt::new(9259),
1344    FalconFelt::new(4115),
1345    FalconFelt::new(5333),
1346    FalconFelt::new(10258),
1347    FalconFelt::new(5876),
1348    FalconFelt::new(2281),
1349    FalconFelt::new(156),
1350    FalconFelt::new(9522),
1351    FalconFelt::new(8320),
1352    FalconFelt::new(3991),
1353    FalconFelt::new(453),
1354    FalconFelt::new(6381),
1355    FalconFelt::new(11871),
1356    FalconFelt::new(8517),
1357    FalconFelt::new(4774),
1358    FalconFelt::new(6860),
1359    FalconFelt::new(4737),
1360    FalconFelt::new(1293),
1361    FalconFelt::new(10232),
1362    FalconFelt::new(5369),
1363    FalconFelt::new(9087),
1364    FalconFelt::new(7796),
1365    FalconFelt::new(350),
1366    FalconFelt::new(1512),
1367    FalconFelt::new(10474),
1368    FalconFelt::new(6906),
1369    FalconFelt::new(1489),
1370    FalconFelt::new(2500),
1371    FalconFelt::new(1583),
1372    FalconFelt::new(6347),
1373    FalconFelt::new(11026),
1374    FalconFelt::new(12240),
1375    FalconFelt::new(6374),
1376    FalconFelt::new(1483),
1377    FalconFelt::new(3009),
1378    FalconFelt::new(1693),
1379    FalconFelt::new(723),
1380    FalconFelt::new(174),
1381    FalconFelt::new(2738),
1382    FalconFelt::new(6421),
1383    FalconFelt::new(2655),
1384    FalconFelt::new(6554),
1385    FalconFelt::new(10314),
1386    FalconFelt::new(3757),
1387    FalconFelt::new(9364),
1388    FalconFelt::new(11942),
1389    FalconFelt::new(7535),
1390    FalconFelt::new(10431),
1391    FalconFelt::new(426),
1392    FalconFelt::new(3315),
1393];
1394
1395const FELT_BITREVERSED_POWERS_INVERSE: [FalconFelt; 512] = [
1396    FalconFelt::new(1),
1397    FalconFelt::new(10810),
1398    FalconFelt::new(7143),
1399    FalconFelt::new(4043),
1400    FalconFelt::new(10984),
1401    FalconFelt::new(722),
1402    FalconFelt::new(5736),
1403    FalconFelt::new(8155),
1404    FalconFelt::new(8747),
1405    FalconFelt::new(3504),
1406    FalconFelt::new(2545),
1407    FalconFelt::new(8668),
1408    FalconFelt::new(1646),
1409    FalconFelt::new(11077),
1410    FalconFelt::new(9094),
1411    FalconFelt::new(6429),
1412    FalconFelt::new(9650),
1413    FalconFelt::new(7468),
1414    FalconFelt::new(949),
1415    FalconFelt::new(9664),
1416    FalconFelt::new(2975),
1417    FalconFelt::new(11726),
1418    FalconFelt::new(2744),
1419    FalconFelt::new(9283),
1420    FalconFelt::new(7698),
1421    FalconFelt::new(6561),
1422    FalconFelt::new(5828),
1423    FalconFelt::new(7266),
1424    FalconFelt::new(6512),
1425    FalconFelt::new(3328),
1426    FalconFelt::new(1351),
1427    FalconFelt::new(4978),
1428    FalconFelt::new(790),
1429    FalconFelt::new(11334),
1430    FalconFelt::new(2319),
1431    FalconFelt::new(11119),
1432    FalconFelt::new(1326),
1433    FalconFelt::new(5086),
1434    FalconFelt::new(9088),
1435    FalconFelt::new(3014),
1436    FalconFelt::new(3712),
1437    FalconFelt::new(3135),
1438    FalconFelt::new(7443),
1439    FalconFelt::new(2747),
1440    FalconFelt::new(9995),
1441    FalconFelt::new(1062),
1442    FalconFelt::new(7484),
1443    FalconFelt::new(3553),
1444    FalconFelt::new(4320),
1445    FalconFelt::new(1000),
1446    FalconFelt::new(81),
1447    FalconFelt::new(3091),
1448    FalconFelt::new(3051),
1449    FalconFelt::new(9923),
1450    FalconFelt::new(4896),
1451    FalconFelt::new(9326),
1452    FalconFelt::new(10654),
1453    FalconFelt::new(9521),
1454    FalconFelt::new(8034),
1455    FalconFelt::new(1177),
1456    FalconFelt::new(7678),
1457    FalconFelt::new(11563),
1458    FalconFelt::new(10436),
1459    FalconFelt::new(140),
1460    FalconFelt::new(1696),
1461    FalconFelt::new(10861),
1462    FalconFelt::new(9863),
1463    FalconFelt::new(11955),
1464    FalconFelt::new(11029),
1465    FalconFelt::new(7901),
1466    FalconFelt::new(7657),
1467    FalconFelt::new(5755),
1468    FalconFelt::new(2089),
1469    FalconFelt::new(7197),
1470    FalconFelt::new(2881),
1471    FalconFelt::new(3284),
1472    FalconFelt::new(2013),
1473    FalconFelt::new(9000),
1474    FalconFelt::new(729),
1475    FalconFelt::new(3241),
1476    FalconFelt::new(9741),
1477    FalconFelt::new(8058),
1478    FalconFelt::new(11934),
1479    FalconFelt::new(8907),
1480    FalconFelt::new(7110),
1481    FalconFelt::new(3694),
1482    FalconFelt::new(8582),
1483    FalconFelt::new(1759),
1484    FalconFelt::new(4890),
1485    FalconFelt::new(5911),
1486    FalconFelt::new(3932),
1487    FalconFelt::new(9558),
1488    FalconFelt::new(8830),
1489    FalconFelt::new(3637),
1490    FalconFelt::new(5542),
1491    FalconFelt::new(145),
1492    FalconFelt::new(339),
1493    FalconFelt::new(2468),
1494    FalconFelt::new(544),
1495    FalconFelt::new(6498),
1496    FalconFelt::new(9),
1497    FalconFelt::new(11267),
1498    FalconFelt::new(2842),
1499    FalconFelt::new(11809),
1500    FalconFelt::new(3584),
1501    FalconFelt::new(8112),
1502    FalconFelt::new(2525),
1503    FalconFelt::new(1381),
1504    FalconFelt::new(4989),
1505    FalconFelt::new(6958),
1506    FalconFelt::new(10616),
1507    FalconFelt::new(4278),
1508    FalconFelt::new(2476),
1509    FalconFelt::new(118),
1510    FalconFelt::new(2197),
1511    FalconFelt::new(7222),
1512    FalconFelt::new(827),
1513    FalconFelt::new(5767),
1514    FalconFelt::new(8541),
1515    FalconFelt::new(953),
1516    FalconFelt::new(4354),
1517    FalconFelt::new(12159),
1518    FalconFelt::new(9452),
1519    FalconFelt::new(5374),
1520    FalconFelt::new(7837),
1521    FalconFelt::new(9893),
1522    FalconFelt::new(3296),
1523    FalconFelt::new(3949),
1524    FalconFelt::new(2859),
1525    FalconFelt::new(11244),
1526    FalconFelt::new(9808),
1527    FalconFelt::new(7277),
1528    FalconFelt::new(4861),
1529    FalconFelt::new(11935),
1530    FalconFelt::new(5698),
1531    FalconFelt::new(2912),
1532    FalconFelt::new(11847),
1533    FalconFelt::new(2401),
1534    FalconFelt::new(1067),
1535    FalconFelt::new(7188),
1536    FalconFelt::new(11516),
1537    FalconFelt::new(390),
1538    FalconFelt::new(8511),
1539    FalconFelt::new(8456),
1540    FalconFelt::new(545),
1541    FalconFelt::new(5019),
1542    FalconFelt::new(9611),
1543    FalconFelt::new(3704),
1544    FalconFelt::new(1537),
1545    FalconFelt::new(242),
1546    FalconFelt::new(4714),
1547    FalconFelt::new(8146),
1548    FalconFelt::new(11272),
1549    FalconFelt::new(4885),
1550    FalconFelt::new(10657),
1551    FalconFelt::new(5084),
1552    FalconFelt::new(12262),
1553    FalconFelt::new(3066),
1554    FalconFelt::new(3763),
1555    FalconFelt::new(1440),
1556    FalconFelt::new(9723),
1557    FalconFelt::new(10102),
1558    FalconFelt::new(6250),
1559    FalconFelt::new(9867),
1560    FalconFelt::new(6022),
1561    FalconFelt::new(2987),
1562    FalconFelt::new(3646),
1563    FalconFelt::new(2437),
1564    FalconFelt::new(7201),
1565    FalconFelt::new(4284),
1566    FalconFelt::new(7278),
1567    FalconFelt::new(1002),
1568    FalconFelt::new(3780),
1569    FalconFelt::new(875),
1570    FalconFelt::new(1607),
1571    FalconFelt::new(7313),
1572    FalconFelt::new(435),
1573    FalconFelt::new(7952),
1574    FalconFelt::new(10377),
1575    FalconFelt::new(1378),
1576    FalconFelt::new(9908),
1577    FalconFelt::new(6845),
1578    FalconFelt::new(493),
1579    FalconFelt::new(8193),
1580    FalconFelt::new(7644),
1581    FalconFelt::new(404),
1582    FalconFelt::new(1065),
1583    FalconFelt::new(10146),
1584    FalconFelt::new(3248),
1585    FalconFelt::new(1207),
1586    FalconFelt::new(11121),
1587    FalconFelt::new(7012),
1588    FalconFelt::new(6998),
1589    FalconFelt::new(9585),
1590    FalconFelt::new(7351),
1591    FalconFelt::new(3636),
1592    FalconFelt::new(10626),
1593    FalconFelt::new(1777),
1594    FalconFelt::new(4654),
1595    FalconFelt::new(10863),
1596    FalconFelt::new(12286),
1597    FalconFelt::new(4437),
1598    FalconFelt::new(3149),
1599    FalconFelt::new(160),
1600    FalconFelt::new(3915),
1601    FalconFelt::new(10123),
1602    FalconFelt::new(7370),
1603    FalconFelt::new(113),
1604    FalconFelt::new(2645),
1605    FalconFelt::new(8236),
1606    FalconFelt::new(5042),
1607    FalconFelt::new(2305),
1608    FalconFelt::new(1484),
1609    FalconFelt::new(4895),
1610    FalconFelt::new(7094),
1611    FalconFelt::new(2780),
1612    FalconFelt::new(7917),
1613    FalconFelt::new(2174),
1614    FalconFelt::new(9442),
1615    FalconFelt::new(7875),
1616    FalconFelt::new(3364),
1617    FalconFelt::new(1689),
1618    FalconFelt::new(4057),
1619    FalconFelt::new(9018),
1620    FalconFelt::new(10659),
1621    FalconFelt::new(2126),
1622    FalconFelt::new(6882),
1623    FalconFelt::new(9103),
1624    FalconFelt::new(1153),
1625    FalconFelt::new(2884),
1626    FalconFelt::new(2249),
1627    FalconFelt::new(4048),
1628    FalconFelt::new(9919),
1629    FalconFelt::new(2865),
1630    FalconFelt::new(5332),
1631    FalconFelt::new(3510),
1632    FalconFelt::new(8311),
1633    FalconFelt::new(9320),
1634    FalconFelt::new(9603),
1635    FalconFelt::new(3247),
1636    FalconFelt::new(420),
1637    FalconFelt::new(5559),
1638    FalconFelt::new(1544),
1639    FalconFelt::new(2178),
1640    FalconFelt::new(4905),
1641    FalconFelt::new(8304),
1642    FalconFelt::new(476),
1643    FalconFelt::new(8758),
1644    FalconFelt::new(11618),
1645    FalconFelt::new(9289),
1646    FalconFelt::new(12046),
1647    FalconFelt::new(3016),
1648    FalconFelt::new(3136),
1649    FalconFelt::new(7098),
1650    FalconFelt::new(9890),
1651    FalconFelt::new(8889),
1652    FalconFelt::new(8974),
1653    FalconFelt::new(11863),
1654    FalconFelt::new(1858),
1655    FalconFelt::new(4754),
1656    FalconFelt::new(347),
1657    FalconFelt::new(2925),
1658    FalconFelt::new(8532),
1659    FalconFelt::new(1975),
1660    FalconFelt::new(5735),
1661    FalconFelt::new(9634),
1662    FalconFelt::new(5868),
1663    FalconFelt::new(9551),
1664    FalconFelt::new(12115),
1665    FalconFelt::new(11566),
1666    FalconFelt::new(10596),
1667    FalconFelt::new(9280),
1668    FalconFelt::new(10806),
1669    FalconFelt::new(5915),
1670    FalconFelt::new(49),
1671    FalconFelt::new(1263),
1672    FalconFelt::new(5942),
1673    FalconFelt::new(10706),
1674    FalconFelt::new(9789),
1675    FalconFelt::new(10800),
1676    FalconFelt::new(5383),
1677    FalconFelt::new(1815),
1678    FalconFelt::new(10777),
1679    FalconFelt::new(11939),
1680    FalconFelt::new(4493),
1681    FalconFelt::new(3202),
1682    FalconFelt::new(6920),
1683    FalconFelt::new(2057),
1684    FalconFelt::new(10996),
1685    FalconFelt::new(7552),
1686    FalconFelt::new(5429),
1687    FalconFelt::new(7515),
1688    FalconFelt::new(3772),
1689    FalconFelt::new(418),
1690    FalconFelt::new(5908),
1691    FalconFelt::new(11836),
1692    FalconFelt::new(8298),
1693    FalconFelt::new(3969),
1694    FalconFelt::new(2767),
1695    FalconFelt::new(12133),
1696    FalconFelt::new(10008),
1697    FalconFelt::new(6413),
1698    FalconFelt::new(2031),
1699    FalconFelt::new(6956),
1700    FalconFelt::new(8174),
1701    FalconFelt::new(3030),
1702    FalconFelt::new(1843),
1703    FalconFelt::new(2361),
1704    FalconFelt::new(12071),
1705    FalconFelt::new(2908),
1706    FalconFelt::new(3529),
1707    FalconFelt::new(3434),
1708    FalconFelt::new(576),
1709    FalconFelt::new(8326),
1710    FalconFelt::new(9842),
1711    FalconFelt::new(6147),
1712    FalconFelt::new(10238),
1713    FalconFelt::new(10335),
1714    FalconFelt::new(10484),
1715    FalconFelt::new(2882),
1716    FalconFelt::new(6122),
1717    FalconFelt::new(2555),
1718    FalconFelt::new(5184),
1719    FalconFelt::new(1200),
1720    FalconFelt::new(10929),
1721    FalconFelt::new(8333),
1722    FalconFelt::new(6119),
1723    FalconFelt::new(6992),
1724    FalconFelt::new(5961),
1725    FalconFelt::new(7183),
1726    FalconFelt::new(10327),
1727    FalconFelt::new(1594),
1728    FalconFelt::new(12121),
1729    FalconFelt::new(2692),
1730    FalconFelt::new(4298),
1731    FalconFelt::new(8960),
1732    FalconFelt::new(4077),
1733    FalconFelt::new(4016),
1734    FalconFelt::new(9370),
1735    FalconFelt::new(3762),
1736    FalconFelt::new(652),
1737    FalconFelt::new(6523),
1738    FalconFelt::new(11994),
1739    FalconFelt::new(6190),
1740    FalconFelt::new(11130),
1741    FalconFelt::new(5990),
1742    FalconFelt::new(4049),
1743    FalconFelt::new(8561),
1744    FalconFelt::new(948),
1745    FalconFelt::new(11143),
1746    FalconFelt::new(325),
1747    FalconFelt::new(10885),
1748    FalconFelt::new(6803),
1749    FalconFelt::new(3054),
1750    FalconFelt::new(3123),
1751    FalconFelt::new(1747),
1752    FalconFelt::new(7032),
1753    FalconFelt::new(8455),
1754    FalconFelt::new(4433),
1755    FalconFelt::new(5919),
1756    FalconFelt::new(2503),
1757    FalconFelt::new(9341),
1758    FalconFelt::new(10723),
1759    FalconFelt::new(5782),
1760    FalconFelt::new(2459),
1761    FalconFelt::new(683),
1762    FalconFelt::new(3656),
1763    FalconFelt::new(12225),
1764    FalconFelt::new(1112),
1765    FalconFelt::new(2078),
1766    FalconFelt::new(4322),
1767    FalconFelt::new(10331),
1768    FalconFelt::new(11231),
1769    FalconFelt::new(4079),
1770    FalconFelt::new(441),
1771    FalconFelt::new(11367),
1772    FalconFelt::new(6065),
1773    FalconFelt::new(835),
1774    FalconFelt::new(3570),
1775    FalconFelt::new(4240),
1776    FalconFelt::new(11580),
1777    FalconFelt::new(4046),
1778    FalconFelt::new(10970),
1779    FalconFelt::new(9139),
1780    FalconFelt::new(9523),
1781    FalconFelt::new(10966),
1782    FalconFelt::new(3174),
1783    FalconFelt::new(52),
1784    FalconFelt::new(8953),
1785    FalconFelt::new(6055),
1786    FalconFelt::new(11612),
1787    FalconFelt::new(5874),
1788    FalconFelt::new(2839),
1789    FalconFelt::new(3957),
1790    FalconFelt::new(2127),
1791    FalconFelt::new(151),
1792    FalconFelt::new(6383),
1793    FalconFelt::new(9784),
1794    FalconFelt::new(1579),
1795    FalconFelt::new(11858),
1796    FalconFelt::new(12097),
1797    FalconFelt::new(1321),
1798    FalconFelt::new(4912),
1799    FalconFelt::new(10240),
1800    FalconFelt::new(4780),
1801    FalconFelt::new(8844),
1802    FalconFelt::new(4698),
1803    FalconFelt::new(7232),
1804    FalconFelt::new(4169),
1805    FalconFelt::new(3127),
1806    FalconFelt::new(2920),
1807    FalconFelt::new(7048),
1808    FalconFelt::new(3482),
1809    FalconFelt::new(11502),
1810    FalconFelt::new(11279),
1811    FalconFelt::new(6821),
1812    FalconFelt::new(2302),
1813    FalconFelt::new(11684),
1814    FalconFelt::new(504),
1815    FalconFelt::new(4213),
1816    FalconFelt::new(6695),
1817    FalconFelt::new(3029),
1818    FalconFelt::new(5886),
1819    FalconFelt::new(7507),
1820    FalconFelt::new(6212),
1821    FalconFelt::new(4624),
1822    FalconFelt::new(9026),
1823    FalconFelt::new(8689),
1824    FalconFelt::new(4080),
1825    FalconFelt::new(11868),
1826    FalconFelt::new(6221),
1827    FalconFelt::new(3602),
1828    FalconFelt::new(8077),
1829    FalconFelt::new(11314),
1830    FalconFelt::new(9445),
1831    FalconFelt::new(3438),
1832    FalconFelt::new(3477),
1833    FalconFelt::new(6608),
1834    FalconFelt::new(142),
1835    FalconFelt::new(11184),
1836    FalconFelt::new(58),
1837    FalconFelt::new(241),
1838    FalconFelt::new(8757),
1839    FalconFelt::new(1003),
1840    FalconFelt::new(10333),
1841    FalconFelt::new(5009),
1842    FalconFelt::new(885),
1843    FalconFelt::new(6008),
1844    FalconFelt::new(3262),
1845    FalconFelt::new(5079),
1846    FalconFelt::new(522),
1847    FalconFelt::new(2169),
1848    FalconFelt::new(7373),
1849    FalconFelt::new(7965),
1850    FalconFelt::new(6974),
1851    FalconFelt::new(8214),
1852    FalconFelt::new(9945),
1853    FalconFelt::new(1278),
1854    FalconFelt::new(6715),
1855    FalconFelt::new(10316),
1856    FalconFelt::new(11248),
1857    FalconFelt::new(3514),
1858    FalconFelt::new(11271),
1859    FalconFelt::new(6364),
1860    FalconFelt::new(6171),
1861    FalconFelt::new(3818),
1862    FalconFelt::new(11099),
1863    FalconFelt::new(2683),
1864    FalconFelt::new(8429),
1865    FalconFelt::new(6844),
1866    FalconFelt::new(4536),
1867    FalconFelt::new(1050),
1868    FalconFelt::new(4449),
1869    FalconFelt::new(6833),
1870    FalconFelt::new(12142),
1871    FalconFelt::new(8500),
1872    FalconFelt::new(6752),
1873    FalconFelt::new(4749),
1874    FalconFelt::new(7500),
1875    FalconFelt::new(4467),
1876    FalconFelt::new(8579),
1877    FalconFelt::new(6196),
1878    FalconFelt::new(6843),
1879    FalconFelt::new(5339),
1880    FalconFelt::new(11973),
1881    FalconFelt::new(382),
1882    FalconFelt::new(3988),
1883    FalconFelt::new(468),
1884    FalconFelt::new(3879),
1885    FalconFelt::new(1922),
1886    FalconFelt::new(8291),
1887    FalconFelt::new(2033),
1888    FalconFelt::new(973),
1889    FalconFelt::new(11035),
1890    FalconFelt::new(6854),
1891    FalconFelt::new(1359),
1892    FalconFelt::new(8646),
1893    FalconFelt::new(5415),
1894    FalconFelt::new(6153),
1895    FalconFelt::new(5862),
1896    FalconFelt::new(10561),
1897    FalconFelt::new(11889),
1898    FalconFelt::new(7341),
1899    FalconFelt::new(6137),
1900    FalconFelt::new(56),
1901    FalconFelt::new(3199),
1902    FalconFelt::new(6760),
1903    FalconFelt::new(5206),
1904    FalconFelt::new(654),
1905    FalconFelt::new(3565),
1906    FalconFelt::new(1702),
1907    FalconFelt::new(1987),
1908];
1909
1910const FELT_NINV_1: FalconFelt = FalconFelt::new(1);
1911const FELT_NINV_2: FalconFelt = FalconFelt::new(6145);
1912const FELT_NINV_4: FalconFelt = FalconFelt::new(9217);
1913const FELT_NINV_8: FalconFelt = FalconFelt::new(10753);
1914const FELT_NINV_16: FalconFelt = FalconFelt::new(11521);
1915const FELT_NINV_32: FalconFelt = FalconFelt::new(11905);
1916const FELT_NINV_64: FalconFelt = FalconFelt::new(12097);
1917const FELT_NINV_128: FalconFelt = FalconFelt::new(12193);
1918const FELT_NINV_256: FalconFelt = FalconFelt::new(12241);
1919const FELT_NINV_512: FalconFelt = FalconFelt::new(12265);