source: git/ntl/src/Poly1TimeTest.c @ 287cc8

spielwiese
Last change on this file since 287cc8 was 287cc8, checked in by Hans Schönemann <hannes@…>, 14 years ago
ntl 5.5.2 git-svn-id: file:///usr/local/Singular/svn/trunk@12402 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.8 KB
Line 
1
2#include <NTL/ZZ_pX.h>
3#include <NTL/FFT.h>
4
5#include <stdio.h>
6
7NTL_CLIENT
8
9
10double clean_data(double *t)
11{
12   double x, y, z;
13   long i, ix, iy, n;
14
15   x = t[0]; ix = 0;
16   y = t[0]; iy = 0;
17
18   for (i = 1; i < 5; i++) {
19      if (t[i] < x) {
20         x = t[i];
21         ix = i;
22      }
23      if (t[i] > y) {
24         y = t[i];
25         iy = i;
26      }
27   }
28
29   z = 0; n = 0;
30   for (i = 0; i < 5; i++) {
31      if (i != ix && i != iy) z+= t[i], n++;
32   }
33
34   z = z/n;
35
36   return z;
37}
38
39
40void print_flag()
41{
42
43
44#if defined(NTL_SPMM_UL)
45printf("SPMM_UL ");
46#elif defined(NTL_SPMM_ULL)
47printf("SPMM_ULL ");
48#elif defined(NTL_SPMM_ASM)
49printf("SPMM_ASM ");
50#else
51printf("DEFAULT ");
52#endif
53
54#if defined(NTL_AVOID_BRANCHING)
55printf("AVOID_BRANCHING");
56#endif
57
58
59printf("\n");
60
61}
62
63
64int main()
65{
66   _ntl_gmp_hack = 0;
67
68
69#ifdef NTL_SPMM_ULL
70
71   if (sizeof(NTL_ULL_TYPE) < 2*sizeof(long)) {
72      printf("999999999999999 ");
73      print_flag();
74      return 0;
75   }
76
77#endif
78
79
80   long n, k;
81
82   n = 200;
83   k = 10*NTL_ZZ_NBITS;
84
85   ZZ p;
86
87   RandomLen(p, k);
88
89
90   ZZ_p::init(p);         // initialization
91
92   ZZ_pX f, g, h, r1, r2, r3;
93
94   random(g, n);    // g = random polynomial of degree < n
95   random(h, n);    // h =             "   "
96   random(f, n);    // f =             "   "
97
98   SetCoeff(f, n);  // Sets coefficient of X^n to 1
99
100
101   // For doing arithmetic mod f quickly, one must pre-compute
102   // some information.
103
104   ZZ_pXModulus F;
105   build(F, f);
106
107   PlainMul(r1, g, h);  // this uses classical arithmetic
108   PlainRem(r1, r1, f);
109
110   MulMod(r2, g, h, F);  // this uses the FFT
111
112   MulMod(r3, g, h, f);  // uses FFT, but slower
113
114   // compare the results...
115
116   if (r1 != r2) {
117      printf("999999999999999 ");
118      print_flag();
119      return 0;
120   }
121   else if (r1 != r3) {
122      printf("999999999999999 ");
123      print_flag();
124      return 0;
125   }
126
127   double t;
128   long i, j;
129   long iter;
130
131   UseFFTPrime(0);
132
133   vec_long aa, AA;
134
135   aa.SetLength(4096);
136   AA.SetLength(4096);
137
138   for (i = 0; i < 4096; i++)
139      aa[i] = RandomBnd(FFTPrime[0]);
140
141
142   FFT(AA.elts(), aa.elts(), 12, FFTPrime[0], &RootTable[0][0]);
143
144   iter = 1;
145
146   do {
147     t = GetTime();
148     for (i = 0; i < iter; i++) {
149        for (j = 0; j < 10; j++) FFT(AA.elts(), aa.elts(), 12, FFTPrime[0], &RootTable[0][0]);
150     }
151     t = GetTime() - t;
152     iter = 2*iter;
153   } while(t < 1);
154
155   iter = iter/2;
156
157   iter = long((2/t)*iter) + 1;
158
159
160   double tvec[5];
161   long w;
162
163   for (w = 0; w < 5; w++) {
164     t = GetTime();
165     for (i = 0; i < iter; i++) {
166        for (j = 0; j < 10; j++) FFT(AA.elts(), aa.elts(), 12, FFTPrime[0], &RootTable[0][0]);
167     }
168     t = GetTime() - t;
169     tvec[w] = t;
170   }
171
172   t = clean_data(tvec);
173
174   t = floor((t/iter)*1e13);
175
176   if (t < 0 || t >= 1e15)
177      printf("999999999999999 ");
178   else
179      printf("%015.0f ", t);
180
181   printf(" [%ld] ", iter);
182
183   print_flag();
184
185   return 0;
186}
Note: See TracBrowser for help on using the repository browser.