source: git/libpolys/polys/test.cc @ 7203f7

spielwiese
Last change on this file since 7203f7 was 7203f7, checked in by Hans Schoenemann <hannes@…>, 9 years ago
fix (windows port): move reference to NF/BBA stuff to function pointers
  • Property mode set to 100644
File size: 7.9 KB
Line 
1#include <iostream>
2#include <fstream>
3#include <sstream>
4#include <string.h>
5
6#include <misc/auxiliary.h>
7#include <omalloc/omalloc.h>
8
9#include <coeffs/coeffs.h>
10#include <coeffs/numbers.h>
11
12#include <reporter/reporter.h>
13#include <resources/feResource.h>
14
15#ifndef PLURAL_INTERNAL_DECLARATIONS
16#define PLURAL_INTERNAL_DECLARATIONS
17#endif
18
19#ifndef TRANSEXT_PRIVATES
20#define TRANSEXT_PRIVATES
21#endif
22
23#include <polys/nc/gb_hack.h>
24
25#include <polys/monomials/ring.h>
26#include <polys/monomials/p_polys.h>
27
28#include <polys/simpleideals.h>
29
30#include <polys/ext_fields/algext.h>
31#include <polys/ext_fields/transext.h>
32
33#pragma GCC diagnostic ignored "-Wwrite-strings"
34
35#define  TS_ASSERT(a) assume(a)
36#define  TS_ASSERT_EQUALS(a, b) assume( a == b )
37#define  TS_ASSERT_DIFFERS(a, b) assume( a != b )
38#define  TS_FAIL(a) WerrorS(a)
39
40
41namespace
42{
43  static inline std::ostream& operator<< (std::ostream& o, const n_coeffType& type)
44  {
45#define CASE(A) case A: return o << (" " # A) << " ";
46    switch( type )
47    {
48      CASE(n_unknown);
49      CASE(n_Zp);
50      CASE(n_Q);
51      CASE(n_R);
52      CASE(n_GF);
53      CASE(n_long_R);
54      CASE(n_algExt);
55      CASE(n_transExt);
56      CASE(n_long_C);
57      CASE(n_Z);
58      CASE(n_Zn);
59      CASE(n_Znm);
60      CASE(n_Z2m);
61      CASE(n_CF);
62      default: return o << "Unknown type: [" << (const unsigned long) type << "]";
63    }
64#undef CASE
65    return o;
66  }
67
68  template<typename T>
69      static inline std::string _2S(T i)
70  {
71    std::stringstream ss;
72    ss << i;
73//    std::string s = ss.str();
74    return ss.str();
75  }
76
77
78  static inline std::string _2S(number a, const coeffs r)
79  {
80    n_Test(a,r);
81    StringSetS("");
82    n_Write(a, r);
83
84    std::stringstream ss;
85    {
86      char* s = StringEndS();  ss << s; omFree(s);
87    }
88
89    return ss.str();
90
91  }
92
93  static inline void PrintSized(/*const*/ number a, const coeffs r, BOOLEAN eoln = TRUE)
94  {
95    std::clog << _2S(a, r) << ", of size: " << n_Size(a, r);
96
97    if( eoln )
98      std::clog << std::endl;
99  }
100
101
102
103}
104
105using namespace std;
106
107
108
109
110void PrintRing(const ring r)
111  {
112    rWrite(r); PrintLn();
113  #ifdef  RDEBUG
114    rDebugPrint(r); PrintLn();
115  #endif
116  }
117
118
119  static inline std::string _2S(poly a, const ring r)
120  {
121    p_Test(a,r);
122
123    StringSetS("");
124    p_Write(a, r);
125
126    std::stringstream ss;
127    {
128      char* s = StringEndS();  ss << s; omFree(s);
129    }
130
131    return ss.str();
132  }
133
134  static inline void PrintSized(/*const*/ poly a, const ring r, BOOLEAN eoln = TRUE)
135  {
136    std::clog << _2S(a, r) << ", of size: " << p_Size(a, r);
137
138    if( eoln )
139      std::clog << std::endl;
140  }
141
142static inline void Delete(poly &p, const ring r)
143{
144  if( p != NULL )
145    p_Delete(&p, r);
146
147  p = NULL;
148}
149
150void TestSum(const ring r, const int N)
151{
152  TS_ASSERT_DIFFERS( r    , NULLp);
153  TS_ASSERT_DIFFERS( r->cf, NULLp);
154
155
156  clog << ( _2S("TEST: sum[0..") + _2S(N) + "]: ");
157  clog << endl;
158
159  assume( N > 0 ); // just for now...
160
161  const int ssss = (N * (N+1)) / 2;
162
163  poly sum1 = p_ISet(ssss, r);
164  clog<< "poly(N*(N+1)/2) (int: " << ssss << "): "; PrintSized(sum1, r);
165
166  poly s=NULL, ss=NULL, i=NULL, res=NULL;
167
168  s = p_ISet(, r);
169  i = p_ISet(N+1, r);
170
171  i = p_Mult_q(s, i, r); s = NULL;
172
173  clog<< "poly(N)*poly(N+1): (int: "<< N*(N+1) << "): "; PrintSized(i, r);
174
175  number t = n_Init(2, r->cf);
176  clog<< "number(2): "; PrintSized(t, r->cf);
177
178  if( !n_IsZero( t, r->cf) )
179  {
180    if( i != NULL )
181    {
182      number ii = p_GetCoeff(i, r);
183      clog<< "number(poly(N)*poly(N+1)): "; PrintSized(ii, r->cf);
184
185#ifdef HAVE_RINGS
186      TS_ASSERT( n_DivBy(ii, t, r->cf) );
187#endif
188       res = p_Div_nn(i, t, r); i = NULL;
189    }
190
191
192
193    clog<< "(poly(N)*poly(N+1))/number(2): "; PrintSized(res, r);
194    poly d = p_Sub(p_Copy(res, r), p_Copy(sum1, r), r);
195
196    if( d != NULL )
197      TS_ASSERT( n_IsZeroDivisor(p_GetCoeff(d, r), r->cf) );
198
199    Delete(d, r);
200
201    if( n_GetChar(r->cf) == 0 )
202    {
203      TS_ASSERT( p_EqualPolys(sum1, res, r) );
204      TS_ASSERT( p_EqualPolys(res, sum1, r) );
205    }
206  } else
207    TS_ASSERT_EQUALS( n_GetChar(r->cf), 2);
208
209  n_Delete(&t, r->cf);
210
211
212  s = NULL;
213  ss = NULL;
214  for( int k = N; k >= 0; k-- )
215  {
216    i = p_ISet(k, r);
217    s = p_Add_q(s, i, r); // s += i
218
219    i = p_Neg( p_ISet(k, r), r );
220    ss = p_Add_q(ss, i, r); // ss -= i
221  }
222
223  clog<< "ss(-sum): "; PrintSized(ss, r);
224
225  ss = p_Neg(ss, r); // ss = -ss
226
227  clog<< "real sum    : "; PrintSized(s, r);
228  clog<< "real sum(--): "; PrintSized(ss, r);
229
230  TS_ASSERT( p_EqualPolys(s, ss, r) );
231  TS_ASSERT( p_EqualPolys(ss, s, r) );
232
233//   TODO(somebody, fix the delete method!);
234
235  Delete(sum1, r);
236  Delete(res, r);
237
238  Delete(s, r);
239  Delete(ss, r);
240
241  clog << ( " >>> TEST DONE!" );
242  clog << endl;
243
244}
245
246void Test(const ring r)
247{
248  if( r == NULL )
249      TS_FAIL("Could not get needed ring");
250  else
251  {
252    TestSum( r, 10 );
253    TestSum( r, 100 );
254    TestSum( r, 101 );
255    TestSum( r, 1001 );
256    TestSum( r, 9000 );
257  }
258}
259
260  void test_Z13_t()
261  {
262    cout << "Creating  Z/13[t]: " << endl;
263
264    char* n[] = {(char*)"t"};
265    ring r = rDefault( 13, 1, n);
266    TS_ASSERT_DIFFERS( r, NULLp );
267
268    PrintRing(r);
269
270    TS_ASSERT( rField_is_Domain(r) );
271    TS_ASSERT( !rField_is_Q(r) );
272
273    TS_ASSERT( rField_is_Zp(r) );
274    TS_ASSERT( !rField_is_Zp(r, 11) );
275    TS_ASSERT( rField_is_Zp(r, 13) );
276
277    TS_ASSERT_EQUALS( rVar(r), 1);
278
279    Test(r);
280
281    rDelete(r);
282  }
283
284  void test_QQ_t()
285  {
286    cout << "Creating  Q[s]: " << endl;
287
288    char* n[] = {(char*)"s"};
289    ring r = rDefault( 0, 1, n);
290    TS_ASSERT_DIFFERS( r, NULLp );
291
292    PrintRing(r);
293
294    TS_ASSERT( rField_is_Domain(r) );
295    TS_ASSERT( rField_is_Q(r) );
296
297    TS_ASSERT( !rField_is_Zp(r) );
298    TS_ASSERT( !rField_is_Zp(r, 11) );
299
300    TS_ASSERT_EQUALS( rVar(r), 1);
301
302    Test(r);
303
304    rDelete(r);
305  }
306
307  void test_Z11_x_y_z()
308  {
309     cout << "Creating  Z/11[x, y, z]: " << endl;
310
311     char* n[] = {(char*)"x", (char*)"y", (char*)"z"};
312     ring r = rDefault( 11, 3, n);
313     TS_ASSERT_DIFFERS( r, NULLp );
314
315     PrintRing(r);
316
317     TS_ASSERT( rField_is_Domain(r) );
318     TS_ASSERT( !rField_is_Q(r) );
319
320     TS_ASSERT( rField_is_Zp(r) );
321     TS_ASSERT( rField_is_Zp(r, 11) );
322     TS_ASSERT( !rField_is_Zp(r, 13) );
323
324     TS_ASSERT_EQUALS( rVar(r), 3);
325
326     Test(r);
327
328     rDelete(r);
329  }
330   void test_QQ_x_y_z()
331   {
332     cout << "Creating  QQ[x, y, z, u]: " << endl;
333
334     char* n[] = {(char*)"x", (char*)"y", (char*)"z", (char*)"u"};
335     ring r = rDefault( 0, 4, n);
336     TS_ASSERT_DIFFERS( r, NULLp );
337
338     PrintRing(r);
339
340     TS_ASSERT( rField_is_Domain(r) );
341     TS_ASSERT( rField_is_Q(r) );
342
343     TS_ASSERT( !rField_is_Zp(r) );
344     TS_ASSERT( !rField_is_Zp(r, 11) );
345
346     TS_ASSERT_EQUALS( rVar(r), 4);
347
348     Test(r);
349
350     rDelete(r);
351   }
352
353
354   void test_Z13_t_GF()
355   {
356     cout << "Creating  GF[t]: " << endl;
357
358     char* n[] = {(char*)"t"};
359
360     GFInfo param;
361
362     param.GFChar= 5;
363     param.GFDegree= 2;
364     param.GFPar_name= (const char*)"Q";
365
366     const coeffs cf = nInitChar( n_GF, &param );
367
368     if( cf == NULL )
369       TS_FAIL("Could not get needed coeff. domain");
370
371     TS_ASSERT_DIFFERS( cf, NULLp );
372
373     ring r = rDefault( cf, 1, n);  // now cf belongs to r!
374     TS_ASSERT_DIFFERS( r, NULLp );
375
376     PrintRing(r);
377
378     TS_ASSERT( rField_is_Domain(r) );
379     TS_ASSERT( !rField_is_Q(r) );
380
381     TS_ASSERT( !rField_is_Zp(r) );
382     TS_ASSERT( !rField_is_Zp(r, 11) );
383     TS_ASSERT( !rField_is_Zp(r, 13) );
384     TS_ASSERT( rField_is_GF(r) );
385
386     TS_ASSERT( rField_is_GF(r, 5) );
387     TS_ASSERT( !rField_is_GF(r, 25) );
388
389     TS_ASSERT_EQUALS( rVar(r), 1);
390
391     Test(r);
392
393     rDelete(r); // kills 'cf' as well!
394   }
395
396
397int main( int, char *argv[] )
398{
399  assume( sizeof(long) == SIZEOF_LONG );
400
401  if( sizeof(long) != SIZEOF_LONG )
402  {
403    WerrorS("Bad config.h: wrong size of long!");
404
405    return(1);
406  }
407
408
409  feInitResources(argv[0]);
410
411  StringSetS("ressources in use (as reported by feStringAppendResources(0):\n");
412  feStringAppendResources(0);
413  PrintLn();
414
415  { char* s = StringEndS(); PrintS(s); omFree(s); }
416
417
418   test_Z13_t();
419   test_QQ_t();
420   test_Z11_x_y_z();
421   test_QQ_x_y_z();
422   test_Z13_t_GF();
423
424   return 0;
425}
Note: See TracBrowser for help on using the repository browser.