algebramix_doc 0.3
|
/****************************************************************************** * 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; }