source: git/libpolys/tests/polys_test.h @ fd01a8

spielwiese
Last change on this file since fd01a8 was fd01a8, checked in by Frank Seelisch <seelisch@…>, 12 years ago
testing multivariate gcd from factory: problem in p_polys.cc ('longalg missing')
  • Property mode set to 100644
File size: 21.2 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#include <polys/clapsing.h>
23
24class MyGlobalPrintingFixture : public GlobalPrintingFixture
25{
26  public:
27    virtual bool setUpWorld()
28    {
29   
30      GlobalPrintingFixture::setUpWorld();
31     
32
33      TS_ASSERT_EQUALS( nRegister( n_Zp, npInitChar), n_Zp );
34      TS_ASSERT_EQUALS( nRegister( n_GF, nfInitChar), n_GF );
35      TS_ASSERT_EQUALS( nRegister( n_R, nrInitChar), n_R );
36      TS_ASSERT_EQUALS( nRegister( n_Q, nlInitChar), n_Q );
37      TS_ASSERT_EQUALS( nRegister( n_R, nrInitChar), n_R );
38     
39#ifdef HAVE_RINGS
40      TS_ASSERT_EQUALS( nRegister( n_Z, nrzInitChar), n_Z ); // these are UNusable at the moment!
41#endif
42     
43      return true;
44    }
45};
46
47
48//
49// We can rely on this file being included exactly once
50// and declare this global variable in the header file.
51//
52static MyGlobalPrintingFixture globalPrintingFixture;
53
54
55namespace
56{
57 
58  void PrintRing(const ring r)
59  {
60    rWrite(r); PrintLn();
61  #ifdef  RDEBUG
62    rDebugPrint(r); PrintLn();
63  #endif
64  }
65
66  static inline std::string _2S(poly a, const ring r)
67  {
68    p_Test(a,r);
69   
70    StringSetS("");
71    p_Write(a, r);
72
73    const char* s = StringAppendS("");
74
75    std::stringstream ss;  ss << s;
76
77    StringSetS(""); 
78    return ss.str();
79  }
80
81  static inline void PrintSized(/*const*/ poly a, const ring r, BOOLEAN eoln = TRUE)
82  {
83    std::clog << _2S(a, r) << ", of size: " << p_Size(a, r);
84
85    if( eoln ) 
86      std::clog << std::endl; 
87  }
88
89static inline void Delete(poly &p, const ring r)
90{
91  if( p != NULL )
92    p_Delete(&p, r);
93
94  p = NULL;
95}
96
97void TestSum(const ring r, const int N)
98{
99  TS_ASSERT_DIFFERS( r    , NULLp);
100  TS_ASSERT_DIFFERS( r->cf, NULLp);
101 
102 
103  clog << ( _2S("TEST: sum[0..") + _2S(N) + "]: ");
104  clog << endl;
105
106  assume( N > 0 ); // just for now...
107
108  const int ssss = (N * (N+1)) / 2;
109 
110  poly sum1 = p_ISet(ssss, r);
111  clog<< "poly(N*(N+1)/2) (int: " << ssss << "): "; PrintSized(sum1, r);
112
113  poly s=NULL, ss=NULL, i=NULL, res=NULL;
114
115  s = p_ISet(, r);
116  i = p_ISet(N+1, r);
117
118  i = p_Mult_q(s, i, r); s = NULL;
119
120  clog<< "poly(N)*poly(N+1): (int: "<< N*(N+1) << "): "; PrintSized(i, r); 
121
122  number t = n_Init(2, r->cf);
123  clog<< "number(2): "; PrintSized(t, r->cf); 
124
125  if( !n_IsZero( t, r->cf) )
126  {
127    if( i != NULL )
128    {
129      number ii = p_GetCoeff(i, r);
130      clog<< "number(poly(N)*poly(N+1)): "; PrintSized(ii, r->cf); 
131
132#ifdef HAVE_RINGS
133      TS_ASSERT( n_DivBy(ii, t, r->cf) );
134#endif
135       res = p_Div_nn(i, t, r); i = NULL;
136    }
137   
138     
139
140    clog<< "(poly(N)*poly(N+1))/number(2): "; PrintSized(res, r);
141    poly d = p_Sub(p_Copy(res, r), p_Copy(sum1, r), r);
142
143    if( d != NULL )
144      TS_ASSERT( n_IsZeroDivisor(p_GetCoeff(d, r), r->cf) );
145
146    Delete(d, r);
147
148    if( n_GetChar(r->cf) == 0 )
149    {
150      TS_ASSERT( p_EqualPolys(sum1, res, r) );
151      TS_ASSERT( p_EqualPolys(res, sum1, r) );
152    }
153  } else
154    TS_ASSERT_EQUALS( n_GetChar(r->cf), 2);
155 
156  n_Delete(&t, r->cf);
157
158
159  s = NULL;
160  ss = NULL;
161  for( int k = N; k >= 0; k-- )
162  {
163    i = p_ISet(k, r);
164    s = p_Add_q(s, i, r); // s += i
165
166    i = p_Neg( p_ISet(k, r), r );
167    ss = p_Add_q(ss, i, r); // ss -= i
168  }
169 
170  clog<< "ss(-sum): "; PrintSized(ss, r); 
171
172  ss = p_Neg(ss, r); // ss = -ss
173 
174  clog<< "real sum    : "; PrintSized(s, r);
175  clog<< "real sum(--): "; PrintSized(ss, r); 
176
177  TS_ASSERT( p_EqualPolys(s, ss, r) );
178  TS_ASSERT( p_EqualPolys(ss, s, r) );
179
180  TODO(somebody, fix the delete method!);
181
182  Delete(sum1, r); 
183  Delete(res, r);
184
185  Delete(s, r);   
186  Delete(ss, r);   
187
188  clog << ( " >>> TEST DONE!" );
189  clog << endl;
190
191}
192   
193void Test(const ring r)
194{
195  if( r == NULL )
196      TS_FAIL("Could not get needed ring");
197  else
198  {
199    TestSum( r, 10 );
200    TestSum( r, 100 );
201    TestSum( r, 101 );
202    TestSum( r, 1001 );
203    TestSum( r, 9000 );
204  }
205}
206
207}
208
209class PolysTestSuite : public CxxTest::TestSuite
210{
211private:
212  /* replaces p by p + c * var(i)^exp (in-place);
213     expects exp >= 0 */
214  void plusTerm(poly &p, int c, int i, int exp, const ring r)
215  {
216    poly t = p_ISet(c, r); p_SetExp(t, i, exp, r); p_Setm(t, r);
217    p = p_Add_q(p, t, r);
218  }
219  void checkInverse(number n, const coeffs cf)
220  {
221    clog << "n = "; n_Write(n, cf);
222    number n1 = n_Invers(n, cf);
223    clog << "==> n^(-1) = "; n_Write(n1, cf);
224    number n2 = n_Mult(n, n1, cf);
225    clog << "(check: n * n^(-1) = "; n_Write(n2, cf);
226    TS_ASSERT( n_IsOne(n2, cf) );
227    n_Delete(&n1, cf); n_Delete(&n2, cf);
228  }
229  void TestArithCf(const coeffs r)
230  {
231    clog << ("TEST: Simple Arithmetics: ");
232    clog << endl;
233
234    number two = n_Init(2, r);
235
236    number t = n_Init(1, r); 
237    ndInpAdd(t, t, r); 
238    TS_ASSERT( n_Equal(two, t, r) );
239    n_Delete(&t, r);
240 
241    if( getCoeffType(r) == n_Q )
242    {
243      number t = n_Init(1, r); 
244      nlInpAdd(t, t, r);
245      TS_ASSERT( n_Equal(two, t, r) );
246      n_Delete(&t, r);
247    }
248 
249    const int N = 66666;
250
251    number a = n_Init(N, r);
252   
253    clog<< "a: "; PrintSized(a, r);
254
255    clog<< "two: "; PrintSized(two, r);
256
257    number aa0 = n_Init(N*2, r);
258
259    number aa = n_Add(a, a, r);
260
261    clog<< "aa = a + a: "; PrintSized(aa, r);
262 
263    number aa2 = n_Mult(a, two, r);
264
265    clog<< "aa2 = a * 2: "; PrintSized(aa2, r);
266
267    number aa1 = n_Mult(two, a, r);
268 
269    clog<< "aa1 = 2 * a: "; PrintSized(aa1, r);
270
271    n_Delete(&a, r);
272    n_Delete(&two, r);
273
274    a = n_Sub( aa, aa1, r );
275 
276    clog<< "a = aa - aa1: "; PrintSized(a, r);
277
278    TS_ASSERT( n_IsZero(a, r) );
279
280    n_Delete(&a, r);
281
282    a = n_Sub( aa, aa2, r );
283
284    clog<< "a = aa - aa2: "; PrintSized(a, r);
285
286    TS_ASSERT( n_IsZero(a, r) );
287
288    n_Delete(&a, r);
289
290    a = n_Sub( aa1, aa2, r );
291
292    clog<< "a = aa1 - aa2: "; PrintSized(a, r);
293
294    TS_ASSERT( n_IsZero(a, r) );
295
296    n_Delete(&a, r);
297
298    TS_ASSERT( n_Equal(aa, aa1, r) );
299    TS_ASSERT( n_Equal(aa, aa2, r) );
300    TS_ASSERT( n_Equal(aa1, aa2, r) );
301 
302    TS_ASSERT( n_Equal(aa0, aa, r) );
303    TS_ASSERT( n_Equal(aa0, aa1, r) );
304    TS_ASSERT( n_Equal(aa0, aa2, r) );
305
306    n_Delete(&aa, r);
307    n_Delete(&aa1, r);
308    n_Delete(&aa2, r);
309
310    n_Delete(&aa0, r);
311
312    clog << ( " >>> TEST DONE!" );
313    clog << endl;
314  }
315  void TestSumCf(const coeffs r, const unsigned long N)
316  {
317    clog << ( _2S("TEST: sum[0..") + _2S(N) + "]: ");
318    clog << endl;
319
320    assume( N > 0 ); // just for now...
321
322    const unsigned long ssss = (N * (N+1)) / 2;
323   
324    number sum1 = n_Init(ssss, r);
325    clog<< "N*(N+1)/2 (int: " << ssss << "): "; PrintSized(sum1, r);
326
327    number s, ss, i, res;
328
329    s = n_Init(, r);
330    i = n_Init(N+1, r);
331    ndInpMult(s, i, r);
332    n_Delete(&i, r);
333   
334    clog<< "N*(N+1): ("<< N*(N+1) << ")"; PrintSized(s, r); 
335   
336    i = n_Init(2, r);
337    clog<< "2: "; PrintSized(i, r); 
338
339    if( !n_IsZero( i, r) )
340    {
341  #ifdef HAVE_RINGS
342      TS_ASSERT( n_DivBy(s, i, r) );
343  #endif
344       
345      res = n_Div(s, i, r);
346   
347      clog<< "N*(N+1)/2: "; PrintSized(res, r);
348
349
350      number d = n_Sub(res, sum1, r);
351      TS_ASSERT( n_IsZeroDivisor(d, r) );
352      n_Delete(&d, r);
353     
354      if( n_GetChar(r) == 0 )
355      {
356        TS_ASSERT( n_Equal(sum1, res, r) );
357        TS_ASSERT( n_Equal(res, sum1, r) );
358      }
359    } else
360      TS_ASSERT_EQUALS( n_GetChar(r), 2);
361   
362
363    n_Delete(&s, r);  n_Delete(&i, r);
364   
365    n_Delete(&sum1, r); n_Delete(&res, r);   
366   
367
368    s = n_Init(0  , r);
369    ss = n_Init(0 , r);
370    for( int k = N; k >= 0; k-- )
371    {
372      i = n_Init(k, r);
373      ndInpAdd(s, i, r); // s += i
374
375      i = n_Neg(i, r);
376      ndInpAdd(ss, i, r); // ss -= i
377     
378      n_Delete(&i, r);   
379    }
380    clog<< "ss: "; PrintSized(ss, r); 
381
382    ss = n_Neg(ss, r); // ss = -ss
383   
384    clog<< "real sum    : "; PrintSized(s, r);
385    clog<< "real sum(--): "; PrintSized(ss, r); 
386
387    TS_ASSERT( n_Equal(s, ss, r) );
388    TS_ASSERT( n_Equal(ss, s, r) );
389
390    n_Delete(&s, r);   
391    n_Delete(&ss, r);   
392
393    clog << ( " >>> TEST DONE!" );
394    clog << endl;
395
396  }
397public:
398  void test_Z13_t()
399  {
400    clog << "Creating  Z/13[t]: " << endl;
401
402    char* n[] = {"t"};
403    ring r = rDefault( 13, 1, n);     
404    TS_ASSERT_DIFFERS( r, NULLp );
405
406    PrintRing(r);
407
408    TS_ASSERT( rField_is_Domain(r) );
409    TS_ASSERT( !rField_is_Q(r) );
410
411    TS_ASSERT( rField_is_Zp(r) );
412    TS_ASSERT( !rField_is_Zp(r, 11) );
413    TS_ASSERT( rField_is_Zp(r, 13) );
414
415    TS_ASSERT_EQUALS( rVar(r), 1);
416
417    Test(r);
418     
419    rDelete(r);
420  }
421
422  void test_QQ_t()
423  {
424    clog << "Creating  Q[s]: " << endl;
425
426    char* n[] = {"s"};
427    ring r = rDefault( 0, 1, n);     
428    TS_ASSERT_DIFFERS( r, NULLp );
429
430    PrintRing(r);
431
432    TS_ASSERT( rField_is_Domain(r) );
433    TS_ASSERT( rField_is_Q(r) );
434   
435    TS_ASSERT( !rField_is_Zp(r) );
436    TS_ASSERT( !rField_is_Zp(r, 11) );
437
438    TS_ASSERT_EQUALS( rVar(r), 1);
439
440    Test(r);
441
442    rDelete(r);
443  }
444 
445  void test_Z11_x_y_z()
446  {
447     clog << "Creating  Z/11[x, y, z]: " << endl;
448     
449     char* n[] = {"x", "y", "z"};
450     ring r = rDefault( 11, 3, n);     
451     TS_ASSERT_DIFFERS( r, NULLp );
452
453     PrintRing(r);
454     
455     TS_ASSERT( rField_is_Domain(r) );
456     TS_ASSERT( !rField_is_Q(r) );
457
458     TS_ASSERT( rField_is_Zp(r) );
459     TS_ASSERT( rField_is_Zp(r, 11) );
460     TS_ASSERT( !rField_is_Zp(r, 13) );
461
462     TS_ASSERT_EQUALS( rVar(r), 3);
463
464     Test(r);
465     
466     rDelete(r);
467  }
468   void test_QQ_x_y_z()
469   {
470     clog << "Creating  QQ[x, y, z, u]: " << endl;
471
472     char* n[] = {"x", "y", "z", "u"};
473     ring r = rDefault( 0, 4, n);     
474     TS_ASSERT_DIFFERS( r, NULLp );
475
476     PrintRing(r);
477
478     TS_ASSERT( rField_is_Domain(r) );
479     TS_ASSERT( rField_is_Q(r) );
480
481     TS_ASSERT( !rField_is_Zp(r) );
482     TS_ASSERT( !rField_is_Zp(r, 11) );
483
484     TS_ASSERT_EQUALS( rVar(r), 4);
485
486     Test(r);
487     
488     rDelete(r);
489   }
490
491
492   void test_Z13_t_GF()
493   {
494     clog << "Creating  GF[t]: " << endl;
495
496     char* n[] = {"t"};
497
498     GFInfo param;
499
500     param.GFChar= 5;
501     param.GFDegree= 2;
502     param.GFPar_name= (const char*)"Q";
503
504     const coeffs cf = nInitChar( n_GF, &param );
505
506     if( cf == NULL )
507       TS_FAIL("Could not get needed coeff. domain");
508
509     TS_ASSERT_DIFFERS( cf, NULLp );
510
511     ring r = rDefault( cf, 1, n);  // now cf belongs to r!
512     TS_ASSERT_DIFFERS( r, NULLp );
513
514     PrintRing(r);
515
516     TS_ASSERT( rField_is_Domain(r) );
517     TS_ASSERT( !rField_is_Q(r) );
518
519     TS_ASSERT( !rField_is_Zp(r) );
520     TS_ASSERT( !rField_is_Zp(r, 11) );
521     TS_ASSERT( !rField_is_Zp(r, 13) );
522     TS_ASSERT( rField_is_GF(r) );
523
524     TS_ASSERT( rField_is_GF(r, 5) );
525     TS_ASSERT( !rField_is_GF(r, 25) );
526
527     TS_ASSERT_EQUALS( rVar(r), 1);
528
529     Test(r);
530
531     rDelete(r); // kills 'cf' as well!
532   }
533   
534  void test_Q_Ext_a()
535  {
536    clog << "Start by creating Q[a]..." << endl;
537
538    char* n[] = {"a"};
539    ring r = rDefault( 0, 1, n);   // Q[a]
540    TS_ASSERT_DIFFERS( r, NULLp );
541
542    PrintRing(r);
543
544    TS_ASSERT( rField_is_Domain(r) );
545    TS_ASSERT( rField_is_Q(r) );
546   
547    TS_ASSERT( !rField_is_Zp(r) );
548    TS_ASSERT( !rField_is_Zp(r, 11) );
549
550    TS_ASSERT_EQUALS( rVar(r), 1);
551
552    poly minPoly = p_ISet(1, r);                    // minPoly = 1
553    p_SetExp(minPoly, 1, 2, r); p_Setm(minPoly, r); // minPoly = a^2
554    minPoly = p_Add_q(minPoly, p_ISet(1, r), r);    // minPoly = a^2 + 1
555    ideal minIdeal = idInit(1);                     // minIdeal = < 0 >
556    minIdeal->m[0] = minPoly;                       // minIdeal = < a^2 + 1 >
557
558    n_coeffType type = nRegister(n_Ext, naInitChar); 
559    TS_ASSERT(type == n_Ext);
560
561    ExtInfo extParam;
562    extParam.r = r;
563    extParam.i = minIdeal;
564   
565    clog << "Next create the extension field Q[a]/<a2+1>..." << endl;
566
567    const coeffs cf = nInitChar(type, &extParam);   // Q[a]/<a2+1>
568   
569    if( cf == NULL )
570      TS_FAIL("Could not get needed coeff. domain");
571
572    TS_ASSERT_DIFFERS( cf->cfCoeffWrite, NULLp );
573 
574    if( cf->cfCoeffWrite != NULL )
575    {
576      clog << "Coeff-domain: "  << endl; 
577      n_CoeffWrite(cf); PrintLn();
578    }
579   
580    // some tests for the coefficient field represented by cf:
581    TestArithCf(cf);
582    TestSumCf(cf, 10);
583    TestSumCf(cf, 100);
584    TestSumCf(cf, 101);
585    TestSumCf(cf, 1001);
586    TestSumCf(cf, 2000);
587
588    clog << "Finally create the polynomial ring (Q[a]/<a2+1>)[x, y]..."
589         << endl;
590   
591    char* m[] = {"x", "y"};
592    ring s = rDefault(cf, 2, m);   // (Q[a]/<a2+1>)[x, y]
593    TS_ASSERT_DIFFERS(s, NULLp);
594
595    PrintRing(s);
596
597    TS_ASSERT( rField_is_Domain(s) );
598    TS_ASSERT( !rField_is_Q(s) );
599    TS_ASSERT( !rField_is_Zp(s) );
600    TS_ASSERT( !rField_is_Zp(s, 11) );
601    TS_ASSERT( !rField_is_Zp(s, 13) );
602    TS_ASSERT( !rField_is_GF(s) );
603    TS_ASSERT( rField_is_Extension(s) );
604    TS_ASSERT( !rField_is_GF(s, 25) );
605    TS_ASSERT_EQUALS(rVar(s), 2);
606
607    Test(s);
608   
609    clog << endl
610         << "Now let's compute some inverses in Q[a]/<a^2+1>..."
611         << endl;
612   
613    poly u;
614    u = NULL; plusTerm(u, 1, 1, 1, cf->algring);
615    plusTerm(u, 1, 1, 0, cf->algring);  // a + 1
616    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
617    u = NULL; plusTerm(u, 1, 1, 1, cf->algring);
618    plusTerm(u, -1, 1, 0, cf->algring); // a - 1
619    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
620    u = NULL; plusTerm(u, 1, 1, 1, cf->algring);
621    plusTerm(u, 5, 1, 0, cf->algring);  // a + 5
622    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
623    u = NULL; plusTerm(u, 1, 1, 1, cf->algring);
624    plusTerm(u, -5, 1, 0, cf->algring); // a - 5
625    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
626    u = NULL; plusTerm(u, 17, 1, 1, cf->algring);
627    plusTerm(u, 5, 1, 0, cf->algring); // 17a + 5
628    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
629
630    rDelete(s); // kills 'cf' and 'r' as well
631  }
632  void test_Q_Ext_b()
633  {
634    clog << "Start by creating Q[b]..." << endl;
635
636    char* n[] = {"b"};
637    ring r = rDefault( 0, 1, n);   // Q[b]
638    TS_ASSERT_DIFFERS( r, NULLp );
639
640    PrintRing(r);
641
642    TS_ASSERT( rField_is_Domain(r) );
643    TS_ASSERT( rField_is_Q(r) );
644   
645    TS_ASSERT( !rField_is_Zp(r) );
646    TS_ASSERT( !rField_is_Zp(r, 11) );
647
648    TS_ASSERT_EQUALS( rVar(r), 1);
649
650    poly minPoly = p_ISet(1, r);                    // minPoly = 1
651    p_SetExp(minPoly, 1, 7, r); p_Setm(minPoly, r); // minPoly = b^7
652    minPoly = p_Add_q(minPoly, p_ISet(17, r), r);   // minPoly = b^7 + 17
653    ideal minIdeal = idInit(1);                     // minIdeal = < 0 >
654    minIdeal->m[0] = minPoly;                       // minIdeal = < b^7 + 17 >
655
656    n_coeffType type = nRegister(n_Ext, naInitChar); 
657    TS_ASSERT(type == n_Ext);
658
659    ExtInfo extParam;
660    extParam.r = r;
661    extParam.i = minIdeal;
662   
663    clog << "Next create the extension field Q[b]/<b^7+17>..." << endl;
664
665    const coeffs cf = nInitChar(type, &extParam);   // Q[b]/<b^7+17>
666   
667    if( cf == NULL )
668      TS_FAIL("Could not get needed coeff. domain");
669
670    TS_ASSERT_DIFFERS( cf->cfCoeffWrite, NULLp );
671 
672    if( cf->cfCoeffWrite != NULL )
673    {
674      clog << "Coeff-domain: "  << endl; 
675      n_CoeffWrite(cf); PrintLn();
676    }
677   
678    // some tests for the coefficient field represented by cf:
679    TestArithCf(cf);
680    TestSumCf(cf, 10);
681    TestSumCf(cf, 100);
682    TestSumCf(cf, 101);
683    TestSumCf(cf, 1001);
684    TestSumCf(cf, 9000);
685
686    clog << "Finally create the polynomial ring (Q[b]/<b^7+17>)[u, v, w]..."
687         << endl;
688   
689    char* m[] = {"u", "v", "w"};
690    ring s = rDefault(cf, 3, m);   // (Q[b]/<b^7+17>)[u, v, w]
691    TS_ASSERT_DIFFERS(s, NULLp);
692
693    PrintRing(s);
694
695    TS_ASSERT( rField_is_Domain(s) );
696    TS_ASSERT( !rField_is_Q(s) );
697    TS_ASSERT( !rField_is_Zp(s) );
698    TS_ASSERT( !rField_is_Zp(s, 11) );
699    TS_ASSERT( !rField_is_Zp(s, 13) );
700    TS_ASSERT( !rField_is_GF(s) );
701    TS_ASSERT( rField_is_Extension(s) );
702    TS_ASSERT( !rField_is_GF(s, 25) );
703    TS_ASSERT_EQUALS(rVar(s), 3);
704
705    Test(s);
706   
707    clog << endl
708         << "Now let's compute some inverses in Q[b]/<b^7+17>..."
709         << endl;
710         
711    poly u;
712    u = NULL; plusTerm(u, 1, 1, 2, cf->algring);
713    plusTerm(u, 33, 1, 0, cf->algring);     // b^2 + 33
714    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
715    u = NULL; plusTerm(u, 1, 1, 5, cf->algring);
716    plusTerm(u, -137, 1, 0, cf->algring);   // b^5 - 137
717    checkInverse((number)u, cf); p_Delete(&u, cf->algring);
718
719    clog << endl
720         << "Now let's check a gcd computation in Q[b]..."
721         << endl;
722   
723    poly v;
724    v = NULL; plusTerm(v, 1, 1, 2, cf->algring);
725    plusTerm(v, 7, 1, 1, cf->algring);
726    plusTerm(v, 1, 1, 0, cf->algring);            // b^2 + 7b + 1
727    number w = n_Mult((number)v, (number)v, cf);  // (b^2 + 7b + 1)^2
728    number y = n_Mult((number)v, (number)w, cf);  // (b^2 + 7b + 1)^3
729    p_Delete(&v, cf->algring);
730    v = NULL; plusTerm(v, 2, 1, 2, cf->algring);
731    plusTerm(v, -61, 1, 1, cf->algring);          // 2b^2 - 61b
732    number z = n_Mult((number)w,
733                      (number)v, cf);   // (b^2 + 7b + 1)^2 * (2b^2 - 61b)
734    p_Delete(&v, cf->algring);
735   
736    clog << "z = "; p_Write((poly)z, cf->algring);
737    clog << "y = "; p_Write((poly)y, cf->algring);
738    number theGcd = n_Gcd(z, y, cf);   // should yield w = (b^2 + 7b + 1)^2
739    clog << "gcd(z, y) = "; p_Write((poly)theGcd, cf->algring);
740   
741    v = (poly)n_Sub(theGcd, w, cf);
742    TS_ASSERT( v == NULL );
743    p_Delete(&v, cf->algring);
744   
745    clog << endl
746         << "Now let's check an ext_gcd computation in Q[b]..."
747         << endl;
748         
749    poly zFactor; poly yFactor;
750    poly ppp = p_ExtGcd((poly)z, zFactor, (poly)y, yFactor, cf->algring);
751    v = (poly)n_Sub(theGcd, (number)ppp, cf);
752    TS_ASSERT( v == NULL );
753    clog << "z = "; p_Write((poly)z, cf->algring);
754    clog << "zFactor = "; p_Write(zFactor, cf->algring);
755    clog << "y = "; p_Write((poly)y, cf->algring);
756    clog << "yFactor = "; p_Write((poly)yFactor, cf->algring);
757    number v1 = n_Mult(z, (number)zFactor, cf);
758    number v2 = n_Mult(y, (number)yFactor, cf);
759    number v3 = n_Add(v1, v2, cf);
760    clog << "z * zFactor + y * yFactor = "; p_Write((poly)v3, cf->algring);
761    clog << "gcd(z, y) = "; p_Write(ppp, cf->algring);
762    number v4 = n_Sub(v3, w, cf);
763    TS_ASSERT( v4 == NULL );
764   
765    p_Delete(&ppp, cf->algring); p_Delete(&zFactor, cf->algring);
766    p_Delete(&yFactor, cf->algring);
767    n_Delete(&z, cf); n_Delete(&y, cf); n_Delete(&w, cf);
768    n_Delete(&theGcd, cf); p_Delete(&v, cf->algring); n_Delete(&v1, cf);
769    n_Delete(&v2, cf); n_Delete(&v3, cf); n_Delete(&v4, cf);
770
771    rDelete(s); // kills 'cf' and 'r' as well
772  }
773  void test_Z_17_Ext_a()
774  {
775    clog << "Start by creating Z_17[a]..." << endl;
776
777    char* n[] = {"a"};
778    ring r = rDefault( 17, 1, n);   // Z/17Z[a]
779    TS_ASSERT_DIFFERS( r, NULLp );
780
781    PrintRing(r);
782
783    TS_ASSERT( rField_is_Domain(r) );
784    TS_ASSERT( !rField_is_Q(r) );
785   
786    TS_ASSERT( rField_is_Zp(r) );
787    TS_ASSERT( rField_is_Zp(r, 17) );
788
789    TS_ASSERT_EQUALS( rVar(r), 1);
790
791    poly minPoly = p_ISet(1, r);                    // minPoly = 1
792    p_SetExp(minPoly, 1, 2, r); p_Setm(minPoly, r); // minPoly = a^2
793    minPoly = p_Add_q(minPoly, p_ISet(3, r), r);    // minPoly = a^2 + 3
794    ideal minIdeal = idInit(1);                     // minIdeal = < 0 >
795    minIdeal->m[0] = minPoly;                       // minIdeal = < a^2 + 3 >
796
797    n_coeffType type = nRegister(n_Ext, naInitChar); 
798    TS_ASSERT(type == n_Ext);
799
800    ExtInfo extParam;
801    extParam.r = r;
802    extParam.i = minIdeal;
803   
804    clog << "Next create the extension field Z_17[a]/<a^2+3>..." << endl;
805
806    const coeffs cf = nInitChar(type, &extParam);   // Z_17[a]/<a^2+3>
807   
808    if( cf == NULL )
809      TS_FAIL("Could not get needed coeff. domain");
810
811    TS_ASSERT_DIFFERS( cf->cfCoeffWrite, NULLp );
812   
813    if( cf->cfCoeffWrite != NULL )
814    {
815      clog << "Coeff-domain: "  << endl; 
816      n_CoeffWrite(cf); PrintLn();
817    }
818   
819    // some tests for the coefficient field represented by cf:
820    TestArithCf(cf);
821    TestSumCf(cf, 10);
822    TestSumCf(cf, 100);
823    TestSumCf(cf, 101);
824    TestSumCf(cf, 1001);
825    TestSumCf(cf, 9000);
826
827    clog << "Finally create the polynomial ring (Z_17[a]/<a^2+3>)[u, v, w]..."
828         << endl;
829   
830    char* m[] = {"u", "v", "w"};
831    ring s = rDefault(cf, 3, m);   // (Z_17[a]/<a^2+3>)[u, v, w]
832    TS_ASSERT_DIFFERS(s, NULLp);
833
834    PrintRing(s);
835
836    TS_ASSERT( rField_is_Domain(s) );
837    TS_ASSERT( !rField_is_Q(s) );
838    TS_ASSERT( !rField_is_Zp(s) );
839    TS_ASSERT( !rField_is_Zp(s, 11) );
840    TS_ASSERT( !rField_is_Zp(s, 17) );
841    TS_ASSERT( !rField_is_GF(s) );
842    TS_ASSERT( rField_is_Extension(s) );
843    TS_ASSERT( !rField_is_GF(s, 25) );
844    TS_ASSERT_EQUALS(rVar(s), 3);
845
846    Test(s);
847   
848    poly f = p_ISet(3, s);
849    p_SetExp(f, 1, 3, s);
850    p_SetExp(f, 2, 1, s);
851    p_SetExp(f, 3, 5, s);
852    p_Setm(f, r);   // 3*u^3*v*w^5
853    plusTerm(f, -2, 1, 6, s); // -2*u^6 + 3*u^3*v*w^5
854    p_Write(f, s);
855    poly g = p_ISet(7, s);
856    p_SetExp(g, 1, 5, s);
857    p_SetExp(g, 2, 6, s);
858    p_SetExp(g, 3, 2, s);
859    p_Setm(g, r);   // 7*u^5*v^6*w^2
860    plusTerm(g, 8, 1, 4, s); // 7*u^5*v^6*w^2 + 8*u^4
861    p_Write(g, s);
862    poly h = singclap_gcd(f, g, s);   // u^3*v*w^2, destroys f and g
863    p_Write(h, s);
864    p_Test(h, s);
865    p_Delete(&h, s);
866   
867    rDelete(s); // kills 'cf' and 'r' as well
868  }
869};
870
Note: See TracBrowser for help on using the repository browser.