//
// This file is part of the book "Language C++ et calcul scientifique"
//
// Copyright (C) 2005-2012 Pierre Saramito <Pierre.Saramito@imag.fr>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
#include "fft.h"
#include <valarray>
#include <complex>
#include <cassert>
template <typename T>
std::valarray<T> fft_sin (const std::valarray<T>& v) {
  using namespace std;
  size_t m = v.size()+1;
  valarray<complex<T> > v_ext(2*m), hat_v(2*m);
  v_ext[0] = 0;
  for (size_t p = 1; p < m; ++p) {
    v_ext[p]     =  v[p-1];
    v_ext[2*m-p] = -v[p-1];
  }
  const T pi = acos(T(-1));
  complex<T> i (0,1), w  = exp((pi/m)*i);
  assert(fabs(log2(m)-int(log2(m))) < 1e-10);
  fft (w, v_ext, hat_v);
  std::valarray<T> tilde_v(m-1);
  for (size_t p = 1; p < m; ++p)
    tilde_v[p-1] = m*hat_v[p].imag();
  return tilde_v;
}
