source: git/libpolys/tests/polys_test.h @ 6c5f32

spielwiese
Last change on this file since 6c5f32 was 6c5f32, checked in by Oleksandr Motsak <motsak@…>, 13 years ago
FIX: n_DivBy exists for rings only... FIX: p_Div_nn should always exist!
  • Property mode set to 100644
File size: 8.5 KB
Line 
1#include "config.h"
2
3#include "common.h"
4using namespace std;
5
6// the following headers are private...
7#include <coeffs/longrat.h>
8#include <coeffs/gnumpfl.h>
9#include <coeffs/gnumpc.h>
10#include <coeffs/shortfl.h>
11#include <coeffs/ffields.h>
12#include <coeffs/modulop.h>
13#include <coeffs/rmodulon.h>
14#include <coeffs/rmodulo2m.h>
15#include <coeffs/rintegers.h>
16
17#include <polys/ext_fields/algext.h>
18#include <polys/monomials/ring.h>
19#include <polys/monomials/p_polys.h>
20
21#include <polys/simpleideals.h>
22
23class MyGlobalPrintingFixture : public GlobalPrintingFixture
24{
25  public:
26    virtual bool setUpWorld()
27    {
28   
29      GlobalPrintingFixture::setUpWorld();
30     
31
32      TS_ASSERT_EQUALS( nRegister( n_Zp, npInitChar), n_Zp );
33      TS_ASSERT_EQUALS( nRegister( n_GF, nfInitChar), n_GF );
34      TS_ASSERT_EQUALS( nRegister( n_R, nrInitChar), n_R );
35      TS_ASSERT_EQUALS( nRegister( n_Q, nlInitChar), n_Q );
36      TS_ASSERT_EQUALS( nRegister( n_R, nrInitChar), n_R );
37     
38#ifdef HAVE_RINGS
39      TS_ASSERT_EQUALS( nRegister( n_Z, nrzInitChar), n_Z ); // these are UNusable at the moment!
40#endif
41     
42      return true;
43    }
44};
45
46
47//
48// We can rely on this file being included exactly once
49// and declare this global variable in the header file.
50//
51static MyGlobalPrintingFixture globalPrintingFixture;
52
53
54namespace
55{
56 
57  void PrintRing(const ring r)
58  {
59    rWrite(r); PrintLn();
60  #ifdef  RDEBUG
61    rDebugPrint(r); PrintLn();
62  #endif
63  }
64
65  static inline std::string _2S(poly a, const ring r)
66  {
67    p_Test(a,r);
68   
69    StringSetS("");
70    p_Write(a, r);
71
72    const char* s = StringAppendS("");
73
74    std::stringstream ss;  ss << s;
75
76    StringSetS(""); 
77    return ss.str();
78  }
79
80  static inline void PrintSized(/*const*/ poly a, const ring r, BOOLEAN eoln = TRUE)
81  {
82    std::clog << _2S(a, r) << ", of size: " << p_Size(a, r);
83
84    if( eoln ) 
85      std::clog << std::endl; 
86  }
87
88static inline void Delete(poly &p, const ring r)
89{
90  if( p != NULL )
91    p_Delete(&p, r);
92
93  p = NULL;
94}
95
96void TestSum(const ring r, const int N)
97{
98  TS_ASSERT_DIFFERS( r    , NULLp);
99  TS_ASSERT_DIFFERS( r->cf, NULLp);
100 
101 
102  clog << ( _2S("TEST: sum[0..") + _2S(N) + "]: ");
103  clog << endl;
104
105  assume( N > 0 ); // just for now...
106
107  const int ssss = (N * (N+1)) / 2;
108 
109  poly sum1 = p_ISet(ssss, r);
110  clog<< "poly(N*(N+1)/2) (int: " << ssss << "): "; PrintSized(sum1, r);
111
112  poly s=NULL, ss=NULL, i=NULL, res=NULL;
113
114  s = p_ISet(, r);
115  i = p_ISet(N+1, r);
116
117  i = p_Mult_q(s, i, r); s = NULL;
118
119  clog<< "poly(N)*poly(N+1): (int: "<< N*(N+1) << "): "; PrintSized(i, r); 
120
121  number t = n_Init(2, r->cf);
122  clog<< "number(2): "; PrintSized(t, r->cf); 
123
124  if( !n_IsZero( t, r->cf) )
125  {
126    if( i != NULL )
127    {
128      number ii = p_GetCoeff(i, r);
129      clog<< "number(poly(N)*poly(N+1)): "; PrintSized(ii, r->cf); 
130
131#ifdef HAVE_RINGS
132      TS_ASSERT( n_DivBy(ii, t, r->cf) );
133#endif
134       res = p_Div_nn(i, t, r); i = NULL;
135    }
136   
137     
138
139    clog<< "(poly(N)*poly(N+1))/number(2): "; PrintSized(res, r);
140    poly d = p_Sub(p_Copy(res, r), p_Copy(sum1, r), r);
141
142    if( d != NULL )
143      TS_ASSERT( n_IsZeroDivisor(p_GetCoeff(d, r), r->cf) );
144
145    Delete(d, r);
146
147    if( n_GetChar(r->cf) == 0 )
148    {
149      TS_ASSERT( p_EqualPolys(sum1, res, r) );
150      TS_ASSERT( p_EqualPolys(res, sum1, r) );
151    }
152  } else
153    TS_ASSERT_EQUALS( n_GetChar(r->cf), 2);
154 
155  n_Delete(&t, r->cf);
156
157
158  s = NULL;
159  ss = NULL;
160  for( int k = N; k >= 0; k-- )
161  {
162    i = p_ISet(k, r);
163    s = p_Add_q(s, i, r); // s += i
164
165    i = p_Neg( p_ISet(k, r), r );
166    ss = p_Add_q(ss, i, r); // ss -= i
167  }
168 
169  clog<< "ss(-sum): "; PrintSized(ss, r); 
170
171  ss = p_Neg(ss, r); // ss = -ss
172 
173  clog<< "real sum    : "; PrintSized(s, r);
174  clog<< "real sum(--): "; PrintSized(ss, r); 
175
176  TS_ASSERT( p_EqualPolys(s, ss, r) );
177  TS_ASSERT( p_EqualPolys(ss, s, r) );
178
179  TODO(somebody, fix the delete method!);
180
181  Delete(sum1, r); 
182  Delete(res, r);
183
184  Delete(s, r);   
185  Delete(ss, r);   
186
187  clog << ( " >>> TEST DONE!" );
188  clog << endl;
189
190}
191   
192void Test(const ring r)
193{
194  TestSum( r, 10 );
195  TestSum( r, 100 );
196  TestSum( r, 101 );
197  TestSum( r, 1001 );
198  TestSum( r, 9000 );
199}
200
201}
202
203class PolysTestSuite : public CxxTest::TestSuite
204{
205public:
206  void test_Z13_t()
207  {
208    clog << "Creating  Z/13[t]: " << endl;
209
210    char* n[] = {"t"};
211    ring r = rDefault( 13, 1, n);     
212    TS_ASSERT_DIFFERS( r, NULLp );
213
214    PrintRing(r);
215
216    TS_ASSERT( rField_is_Domain(r) );
217    TS_ASSERT( !rField_is_Q(r) );
218
219    TS_ASSERT( rField_is_Zp(r) );
220    TS_ASSERT( !rField_is_Zp(r, 11) );
221    TS_ASSERT( rField_is_Zp(r, 13) );
222
223    TS_ASSERT_EQUALS( rVar(r), 1);
224
225    Test(r);
226     
227    rDelete(r);
228  }
229
230  void test_QQ_t()
231  {
232    clog << "Creating  Q[s]: " << endl;
233
234    char* n[] = {"s"};
235    ring r = rDefault( 0, 1, n);     
236    TS_ASSERT_DIFFERS( r, NULLp );
237
238    PrintRing(r);
239
240    TS_ASSERT( rField_is_Domain(r) );
241    TS_ASSERT( rField_is_Q(r) );
242   
243    TS_ASSERT( !rField_is_Zp(r) );
244    TS_ASSERT( !rField_is_Zp(r, 11) );
245
246    TS_ASSERT_EQUALS( rVar(r), 1);
247
248    Test(r);
249
250    rDelete(r);
251  }
252 
253  void test_Z11_x_y_z()
254  {
255     clog << "Creating  Z/11[x, y, z]: " << endl;
256     
257     char* n[] = {"x", "y", "z"};
258     ring r = rDefault( 11, 3, n);     
259     TS_ASSERT_DIFFERS( r, NULLp );
260
261     PrintRing(r);
262     
263     TS_ASSERT( rField_is_Domain(r) );
264     TS_ASSERT( !rField_is_Q(r) );
265
266     TS_ASSERT( rField_is_Zp(r) );
267     TS_ASSERT( rField_is_Zp(r, 11) );
268     TS_ASSERT( !rField_is_Zp(r, 13) );
269
270     TS_ASSERT_EQUALS( rVar(r), 3);
271
272     Test(r);
273     
274     rDelete(r);
275  }
276   void test_QQ_x_y_z()
277   {
278     clog << "Creating  QQ[x, y, z, u]: " << endl;
279
280     char* n[] = {"x", "y", "z", "u"};
281     ring r = rDefault( 0, 4, n);     
282     TS_ASSERT_DIFFERS( r, NULLp );
283
284     PrintRing(r);
285
286     TS_ASSERT( rField_is_Domain(r) );
287     TS_ASSERT( rField_is_Q(r) );
288
289     TS_ASSERT( !rField_is_Zp(r) );
290     TS_ASSERT( !rField_is_Zp(r, 11) );
291
292     TS_ASSERT_EQUALS( rVar(r), 4);
293
294     Test(r);
295     
296     rDelete(r);
297   }
298
299
300   void test_Z13_t_GF()
301   {
302     clog << "Creating  GF[t]: " << endl;
303
304     char* n[] = {"t"};
305
306     GFInfo param;
307
308     param.GFChar= 5;
309     param.GFDegree= 2;
310     param.GFPar_name= (const char*)"Q";
311
312     const coeffs cf = nInitChar( n_GF, &param );
313
314     TS_ASSERT_DIFFERS( cf, NULLp );
315
316     ring r = rDefault( cf, 1, n);  // now cf belongs to r!
317     TS_ASSERT_DIFFERS( r, NULLp );
318
319     PrintRing(r);
320
321     TS_ASSERT( rField_is_Domain(r) );
322     TS_ASSERT( !rField_is_Q(r) );
323
324     TS_ASSERT( !rField_is_Zp(r) );
325     TS_ASSERT( !rField_is_Zp(r, 11) );
326     TS_ASSERT( !rField_is_Zp(r, 13) );
327     TS_ASSERT( rField_is_GF(r) );
328
329     TS_ASSERT( rField_is_GF(r, 5) );
330     TS_ASSERT( !rField_is_GF(r, 25) );
331
332     TS_ASSERT_EQUALS( rVar(r), 1);
333
334     Test(r);
335
336     rDelete(r); // kills 'cf' as well!
337   }
338   
339  void test_Q_Ext_a()
340  {
341    clog << "Start by creating Q[a]..." << endl;
342
343    char* n[] = {"a"};
344    ring r = rDefault( 0, 1, n);   // Q[a]
345    TS_ASSERT_DIFFERS( r, NULLp );
346
347    PrintRing(r);
348
349    TS_ASSERT( rField_is_Domain(r) );
350    TS_ASSERT( rField_is_Q(r) );
351   
352    TS_ASSERT( !rField_is_Zp(r) );
353    TS_ASSERT( !rField_is_Zp(r, 11) );
354
355    TS_ASSERT_EQUALS( rVar(r), 1);
356
357    poly minPoly = p_ISet(1, r);                    // minPoly = 1
358    p_SetExp(minPoly, 1, 2, r); p_Setm(minPoly, r); // minPoly = a^2
359    minPoly = p_Add_q(minPoly, p_ISet(1, r), r);    // minPoly = a^2 + 1
360    ideal minIdeal = idInit(1);                     // minIdeal = < 0 >
361    minIdeal->m[0] = minPoly;                       // minIdeal = < a^2 + 1 >
362
363    n_coeffType type = nRegister(n_Ext, naInitChar); 
364    TS_ASSERT(type == n_Ext);
365
366    ExtInfo extParam;
367    extParam.r = r;
368    extParam.i = minIdeal;
369   
370    clog << "Next create the extension field Q[a]/<a2+1>..." << endl;
371
372    const coeffs cf = nInitChar(type, &extParam);   // Q[a]/<a2+1>
373
374    TS_ASSERT_DIFFERS( cf->cfCoeffWrite, NULLp );
375 
376    if( cf->cfCoeffWrite != NULL )
377    {
378      clog << "Coeff-domain: "  << endl; 
379      n_CoeffWrite(cf); PrintLn();
380    }
381
382    clog << "Finally create the polynomial ring (Q[a]/<a2+1>)[x, y]..."
383         << endl;
384   
385    char* m[] = {"x", "y"};
386    ring s = rDefault(cf, 2, m);   // (Q[a]/<a2+1>)[x, y]
387    TS_ASSERT_DIFFERS(s, NULLp);
388
389    PrintRing(s);
390
391    TS_ASSERT( rField_is_Domain(s) );
392    TS_ASSERT( !rField_is_Q(s) );
393    TS_ASSERT( !rField_is_Zp(s) );
394    TS_ASSERT( !rField_is_Zp(s, 11) );
395    TS_ASSERT( !rField_is_Zp(s, 13) );
396    TS_ASSERT( !rField_is_GF(s) );
397    TS_ASSERT( rField_is_Extension(s) );
398    TS_ASSERT( !rField_is_GF(s, 25) );
399    TS_ASSERT_EQUALS(rVar(s), 2);
400
401    //Test(s);
402
403    rDelete(s); // kills 'cf' and 'r' as well
404  }
405};
406
Note: See TracBrowser for help on using the repository browser.