source: git/libpolys/polys/test.cc @ 2cd1ae

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