00001 #ifndef TEST_H
00002 #define TEST_H
00003
00004
00010
00011
00012
00013
00014
00015 using namespace std;
00016
00025 void test_template_functions()
00026 {
00027 assert (pow2<1>::value == 2);
00028 assert (pow2<2>::value == 4);
00029 assert (pow2<3>::value == 8);
00030 assert (pow2<4>::value == 16);
00031 assert (pow2<5>::value == 32);
00032 assert (pow2<6>::value == 64);
00033 assert (pow2<7>::value == 128);
00034 assert (pow2<8>::value == 256);
00035 assert (pow2<9>::value == 512);
00036 assert (pow2<10>::value == 1024);
00037
00038
00039 assert (nextpow2num<7>::value == 8);
00040 assert (nextpow2num<8>::value == 16);
00041 assert (nextpow2num<23>::value == 32);
00042 assert (nextpow2num<32>::value == 64);
00043 assert (nextpow2num<33>::value == 64);
00044 assert (nextpow2num<197>::value == 256);
00045
00046 assert (needbits<7>::value == 3);
00047 assert (needbits<8>::value == 4);
00048 assert (needbits<23>::value == 5);
00049 assert (needbits<32>::value == 6);
00050 assert (needbits<33>::value == 6);
00051 assert (needbits<197>::value== 8);
00052
00053 }
00054
00055
00059 template <typename TRing>
00060 void manual_test()
00061 {
00062 int charakteristic = 29;
00063 int epsPrecision = 1;
00064 TRing ring = new TRing( charakteristic, epsPrecision);
00065 typename TRing::ElementType element(28,27);
00066 std::cerr << "add " << element <<"," << element ;
00067 typename TRing::ElementType result;
00068 result = ring->add(element,element);
00069 std::cerr << " results in " << result << std::endl;
00070 std::cerr << "multiply " << element <<"," << element ;
00071 result = ring->multiply(element,element);
00072 std::cerr << " results in " << result << std::endl;
00073
00074 return;
00075 }
00076
00077
00082 template <int CHAR>
00083 void testEpsRing(int epsPrecision)
00084 {
00085 }
00086
00087
00088
00094 template <typename TRing>
00095 void testRing(unsigned int characteristic, unsigned short epsPrecision=1)
00096 {
00097 cerr << "characteristic" << characteristic<< endl;
00098 TRing* ring= new TRing(characteristic, epsPrecision);
00099
00100 for (unsigned int i=0; i<characteristic; i++)
00101 {
00102 assert(ring->addInv(i).getX()==(-i+characteristic) % characteristic);
00103 for (unsigned int j=0; j<characteristic; j++)
00104 {
00105 assert(ring->add(i,j).getX() == ((i+j) % characteristic));
00106 assert(ring->multiply(i,j).getX()== ((i*j) % characteristic));
00107
00108 if (ring->multiply(i,j) == TRing::ElementType::One)
00109 {
00110 assert(ring->multInv(i).getX()==j);
00111 }
00112 }
00113 }
00114 if (epsPrecision==1)
00115 {
00116 for (unsigned int i=0;i<characteristic;i++)
00117 {
00118 for (unsigned int j=0;j<characteristic;j++)
00119 {
00120 for (unsigned int k=0;k<characteristic;k++)
00121 {
00122 for (unsigned int l=0;l<characteristic;l++)
00123 {
00124 typename TRing::ElementType a(i,j);
00125 typename TRing::ElementType b(k,l);
00126 assert(ring->addInv(a).getX() ==(-i+characteristic)% characteristic);
00127 assert(ring->addInv(a).getEps()==(-j+characteristic)% characteristic);
00128
00129 assert(ring->add(a,b).getX() ==((i+k)%characteristic));
00130 assert(ring->add(a,b).getEps()==((l+j)%characteristic));
00131
00132 assert(ring->multiply(a,b).getX() == ((i*k) % characteristic));
00133 assert(ring->multiply(a,b).getEps()== ((i*l+j*k)% characteristic));
00134 }
00135 }
00136 }
00137 }
00138 }
00139
00140 delete ring;
00141 std::cerr << "--Partly tested: fast_Ring operations with charakteristic="
00142 << characteristic << "and epsPrecision= " << epsPrecision << std::endl;
00143 }
00144
00145
00146
00151 template <template<class a, class b> class TRing, typename TScalar, class TScaparPair , int characteristic, int epsPrecision>
00152 void tt_autotest()
00153 {
00154 typedef kdefs_zahl_x<7,0> kdefs_dummy;
00155
00156 typedef fast_Ring< number_eps0< characteristic, TScalar> ,kdefs_dummy > TR1;
00157
00158 typedef fast_Ring< fieldScalar< TScalar> , kdefs_dummy > TdR0;
00159
00160 if (characteristic<50)
00161 {
00162 typedef TRing< number_eps1< characteristic, TScalar, TScaparPair> ,kdefs_dummy > TR0;
00163 typedef fast_Ring< basicNumber< TScalar > , kdefs_dummy > TdR1;
00164 testRing<TR0>(characteristic,0);
00165 testRing<TdR1>(characteristic,0);
00166 }
00167 testRing<TR1>(characteristic,0);
00168 testRing<TdR0>(characteristic,0);
00169
00170 }
00171
00172 template <typename TScalar, class TScaparPair>
00173 void tautotest()
00174 {
00175 test_template_functions();
00176 typedef kdefs_zahl_x<7,0> kdefs_dummy;
00177
00178 tt_autotest<fast_Ring,TScalar,TScaparPair,7,0>();
00179 tt_autotest<fast_Ring,TScalar,TScaparPair,11,0>();
00180 tt_autotest<fast_Ring,TScalar,TScaparPair,13,0>();
00181 tt_autotest<fast_Ring,TScalar,TScaparPair,17,0>();
00182 tt_autotest<fast_Ring,TScalar,TScaparPair,19,0>();
00183 tt_autotest<fast_Ring,TScalar,TScaparPair,29,0>();
00184
00185
00186
00187 return;
00188 }
00189
00191 void autotest()
00192 {
00193 tautotest<unsigned char,short>();
00194 tautotest<short,short>();
00195 }
00196
00197
00206
00207 void testRandom(int characteristic)
00208 {
00209 std::cerr << "-- Random Generator Test" << std::endl;
00210 std::cerr << "--------------------" << std::endl;
00211 std::cerr << "-- seed from Systime" << std::endl;
00212 std::cerr << "-- characteristic: " << characteristic << std::endl;
00213 int array[characteristic];
00214 int value;
00215
00216 for (int i=0;i<characteristic;i++)
00217 {
00218 array[i]=0;
00219 }
00220 long seed = -30;
00221
00222 time_t tt;
00223 time(&tt);
00224 seed = (tt);
00225
00226 long trials=10000000;
00227 for (long i=0;i<trials;i++)
00228 {
00229 value =random(&seed,characteristic-1);
00230 assert(value>=0 && value<characteristic);
00231 array[value]++;
00232 }
00233 long average =(long)trials/(characteristic*1.0);
00234 double maxError=0;
00235
00236
00237
00238
00239 for (int i=0;i<characteristic;i++)
00240 {
00241
00242
00243 if (maxError<(double)abs(average-array[i])/(average *1.0))
00244 maxError=abs(average-array[i])/(average*1.0);
00245
00246
00247 assert(abs(average-array[i]) < average*0.006 );
00248 }
00249
00250 std::cerr << "--Random Generator test finished" << std::endl;
00251 std::cerr << "--maxError: " << maxError<< std::endl;
00252
00253 }
00254
00255
00256
00257 #endif
00258