algebramix_doc 0.3
tft_test.cpp
/******************************************************************************
* MODULE     : tft_test.cpp
* DESCRIPTION: Test TFT
* COPYRIGHT  : (C) 2005  Joris van der Hoeven and Gregoire Lecerf
*******************************************************************************
* This software falls under the GNU general public license and comes WITHOUT
* ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details.
* If you don't have this file, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/

#include <numerix/modular_int.hpp>
#include <algebramix/fft_truncated.hpp>
using namespace mmx;

#define K modular<modulus<nat>,FFTP>

template<typename C> C*
make (nat n) {
  C* a= mmx_new<C> (n);
  for (nat i=0; i<n; i++)
    //a[i]= C(rand ());
    a[i]= i;
  return a;
}

void
test_fft_truncated () {
  typedef implementation<vector_linear,vector_naive> NVec;
  for (nat l = 2; l < 1000; l++) {
    mmout << "Testing naive tft with length " << l << "\r";
    nat n = next_power_of_two (l);
  
    K* a= make<K> (n);
    NVec::clear (a+l, n-l);
    //NVec::print (mmout, a, n); mmout << "\n";
    fft_truncated_transformer<K> tfter (l);
    tfter.direct_transform (a);
    NVec::clear (a+l, n-l);
    //NVec::print (mmout, a, n); mmout << "\n";

    K* b= make<K> (n);
    NVec::clear (b+l, n-l);
    fft_naive_transformer<K> ffter (n);
    ffter.direct_transform (b);
    NVec::clear (b+l, n-l);
    //NVec::print (mmout, b, n); mmout << "\n";

    ASSERT (NVec::equal (a, b, l), "error in tft");
    mmx_delete<K> (a, n);
    mmx_delete<K> (b, n);
  }
  mmout << "\n";
}

void
test_ifft_truncated () {
  typedef implementation<vector_linear,vector_naive> NVec;
  for (nat l = 2; l < 1000; l++) {
    mmout << "Testing naive inverve tft with length " << l << "\r";
    nat n = next_power_of_two (l);
  
    K* a= make<K> (n);
    K* b= make<K> (n);
    NVec::clear (a+l, n-l);
    NVec::clear (b+l, n-l);
    fft_truncated_transformer<K> tfter (l);
    tfter.direct_transform (a);
    NVec::clear (a+l, n-l);
    tfter.inverse_transform (a);
    ASSERT (NVec::equal (a, b, l), "error in tft");
    mmx_delete<K> (a, n);
    mmx_delete<K> (b, n);
  }
  mmout << "\n";
}

int
main () {
  try {
    test_fft_truncated ();
    test_ifft_truncated ();
  }
  catch (exception& e) {
    mmout << e << "\n";
    return -1;
  }
  return 0;
}
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines