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