arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/fft64_dft.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/fft64_dft.hRaw
 1#ifndef SPQLIOS_FFT64_DFT_H
 2#define SPQLIOS_FFT64_DFT_H
 3
 4#include "negacyclic_polynomial.h"
 5#include "reim4_elem.h"
 6
 7class reim_fft64vec {
 8  std::vector<double> v;
 9
10 public:
11  reim_fft64vec() = default;
12  explicit reim_fft64vec(uint64_t n);
13  reim_fft64vec(uint64_t n, const double* data);
14  uint64_t nn() const;
15  static reim_fft64vec zero(uint64_t n);
16  /** random complex coefficients (unstructured) */
17  static reim_fft64vec random(uint64_t n, double log2bound);
18  /** random fft of a small int polynomial */
19  static reim_fft64vec dft_random(uint64_t n, uint64_t log2bound);
20  double* data();
21  const double* data() const;
22  void save_as(double* dest) const;
23  reim4_elem get_blk(uint64_t blk) const;
24  void set_blk(uint64_t blk, const reim4_elem& value);
25};
26
27reim_fft64vec operator+(const reim_fft64vec& a, const reim_fft64vec& b);
28reim_fft64vec operator-(const reim_fft64vec& a, const reim_fft64vec& b);
29reim_fft64vec operator*(const reim_fft64vec& a, const reim_fft64vec& b);
30reim_fft64vec operator*(double coeff, const reim_fft64vec& v);
31reim_fft64vec& operator+=(reim_fft64vec& a, const reim_fft64vec& b);
32reim_fft64vec& operator-=(reim_fft64vec& a, const reim_fft64vec& b);
33
34/** infty distance */
35double infty_dist(const reim_fft64vec& a, const reim_fft64vec& b);
36
37reim_fft64vec simple_fft64(const znx_i64& polynomial);
38znx_i64 simple_rint_ifft64(const reim_fft64vec& fftvec);
39rnx_f64 naive_ifft64(const reim_fft64vec& fftvec);
40reim_fft64vec simple_fft64(const rnx_f64& polynomial);
41rnx_f64 simple_ifft64(const reim_fft64vec& v);
42
43#endif  // SPQLIOS_FFT64_DFT_H