source: git/libpolys/tests/polys_test.h @ 11837b

spielwiese
Last change on this file since 11837b was 11837b, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
ADD: Show Resource-Settings at the beginning of each test-suit
  • Property mode set to 100644
File size: 18.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
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  if( r == NULL )
195      TS_FAIL("Could not get needed ring");
196  else
197  {
198    TestSum( r, 10 );
199    TestSum( r, 100 );
200    TestSum( r, 101 );
201    TestSum( r, 1001 );
202    TestSum( r, 9000 );
203  }
204}
205
206}
207
208class PolysTestSuite : public CxxTest::TestSuite
209{
210private:
211  /* replaces n by n + c * var^exp (in-place);
212     expects exp >= 0 */
213  void plusTerm(number &n, int c, int exp, const coeffs cf)
214  {
215    number x = n_Par(1, cf);
216    number pow = n_Init(1, cf);
217    number temp;
218    for (int i = 1; i <= exp; i++)
219    {
220      temp = n_Mult(pow, x, cf);
221      n_Delete(&pow, cf);
222      pow = temp;
223    }
224    n_Delete(&x, cf);
225    number m = n_Init(c, cf);
226    number t = n_Mult(m, pow, cf);
227    n_Delete(&m, cf); n_Delete(&pow, cf);
228    temp = n_Add(n, t, cf);
229    n_Delete(&n, cf); n_Delete(&t, cf);
230    n = temp;
231  }
232  void checkInverse(number n, const coeffs cf)
233  {
234    clog << "n = "; n_Write(n, cf);
235    number n1 = n_Invers(n, cf);
236    clog << "==> n^(-1) = "; n_Write(n1, cf);
237    number n2 = n_Mult(n, n1, cf);
238    clog << "(check: n * n^(-1) = "; n_Write(n2, cf);
239    TS_ASSERT( n_IsOne(n2, cf) );
240    n_Delete(&n1, cf); n_Delete(&n2, cf);
241  }
242  void TestArithCf(const coeffs r)
243  {
244    clog << ("TEST: Simple Arithmetics: ");
245    clog << endl;
246
247    number two = n_Init(2, r);
248
249    number t = n_Init(1, r); 
250    ndInpAdd(t, t, r); 
251    TS_ASSERT( n_Equal(two, t, r) );
252    n_Delete(&t, r);
253 
254    if( getCoeffType(r) == n_Q )
255    {
256      number t = n_Init(1, r); 
257      nlInpAdd(t, t, r);
258      TS_ASSERT( n_Equal(two, t, r) );
259      n_Delete(&t, r);
260    }
261 
262    const int N = 66666;
263
264    number a = n_Init(N, r);
265   
266    clog<< "a: "; PrintSized(a, r);
267
268    clog<< "two: "; PrintSized(two, r);
269
270    number aa0 = n_Init(N*2, r);
271
272    number aa = n_Add(a, a, r);
273
274    clog<< "aa = a + a: "; PrintSized(aa, r);
275 
276    number aa2 = n_Mult(a, two, r);
277
278    clog<< "aa2 = a * 2: "; PrintSized(aa2, r);
279
280    number aa1 = n_Mult(two, a, r);
281 
282    clog<< "aa1 = 2 * a: "; PrintSized(aa1, r);
283
284    n_Delete(&a, r);
285    n_Delete(&two, r);
286
287    a = n_Sub( aa, aa1, r );
288 
289    clog<< "a = aa - aa1: "; PrintSized(a, r);
290
291    TS_ASSERT( n_IsZero(a, r) );
292
293    n_Delete(&a, r);
294
295    a = n_Sub( aa, aa2, r );
296
297    clog<< "a = aa - aa2: "; PrintSized(a, r);
298
299    TS_ASSERT( n_IsZero(a, r) );
300
301    n_Delete(&a, r);
302
303    a = n_Sub( aa1, aa2, r );
304
305    clog<< "a = aa1 - aa2: "; PrintSized(a, r);
306
307    TS_ASSERT( n_IsZero(a, r) );
308
309    n_Delete(&a, r);
310
311    TS_ASSERT( n_Equal(aa, aa1, r) );
312    TS_ASSERT( n_Equal(aa, aa2, r) );
313    TS_ASSERT( n_Equal(aa1, aa2, r) );
314 
315    TS_ASSERT( n_Equal(aa0, aa, r) );
316    TS_ASSERT( n_Equal(aa0, aa1, r) );
317    TS_ASSERT( n_Equal(aa0, aa2, r) );
318
319    n_Delete(&aa, r);
320    n_Delete(&aa1, r);
321    n_Delete(&aa2, r);
322
323    n_Delete(&aa0, r);
324
325    clog << ( " >>> TEST DONE!" );
326    clog << endl;
327  }
328  void TestSumCf(const coeffs r, const unsigned long N)
329  {
330    clog << ( _2S("TEST: sum[0..") + _2S(N) + "]: ");
331    clog << endl;
332
333    assume( N > 0 ); // just for now...
334
335    const unsigned long ssss = (N * (N+1)) / 2;
336   
337    number sum1 = n_Init(ssss, r);
338    clog<< "N*(N+1)/2 (int: " << ssss << "): "; PrintSized(sum1, r);
339
340    number s, ss, i, res;
341
342    s = n_Init(, r);
343    i = n_Init(N+1, r);
344    ndInpMult(s, i, r);
345    n_Delete(&i, r);
346   
347    clog<< "N*(N+1): ("<< N*(N+1) << ")"; PrintSized(s, r); 
348   
349    i = n_Init(2, r);
350    clog<< "2: "; PrintSized(i, r); 
351
352    if( !n_IsZero( i, r) )
353    {
354  #ifdef HAVE_RINGS
355      TS_ASSERT( n_DivBy(s, i, r) );
356  #endif
357       
358      res = n_Div(s, i, r);
359   
360      clog<< "N*(N+1)/2: "; PrintSized(res, r);
361
362
363      number d = n_Sub(res, sum1, r);
364      TS_ASSERT( n_IsZeroDivisor(d, r) );
365      n_Delete(&d, r);
366     
367      if( n_GetChar(r) == 0 )
368      {
369        TS_ASSERT( n_Equal(sum1, res, r) );
370        TS_ASSERT( n_Equal(res, sum1, r) );
371      }
372    } else
373      TS_ASSERT_EQUALS( n_GetChar(r), 2);
374   
375
376    n_Delete(&s, r);  n_Delete(&i, r);
377   
378    n_Delete(&sum1, r); n_Delete(&res, r);   
379   
380
381    s = n_Init(0  , r);
382    ss = n_Init(0 , r);
383    for( int k = N; k >= 0; k-- )
384    {
385      i = n_Init(k, r);
386      ndInpAdd(s, i, r); // s += i
387
388      i = n_Neg(i, r);
389      ndInpAdd(ss, i, r); // ss -= i
390     
391      n_Delete(&i, r);   
392    }
393    clog<< "ss: "; PrintSized(ss, r); 
394
395    ss = n_Neg(ss, r); // ss = -ss
396   
397    clog<< "real sum    : "; PrintSized(s, r);
398    clog<< "real sum(--): "; PrintSized(ss, r); 
399
400    TS_ASSERT( n_Equal(s, ss, r) );
401    TS_ASSERT( n_Equal(ss, s, r) );
402
403    n_Delete(&s, r);   
404    n_Delete(&ss, r);   
405
406    clog << ( " >>> TEST DONE!" );
407    clog << endl;
408
409  }
410public:
411  void test_Z13_t()
412  {
413    clog << "Creating  Z/13[t]: " << endl;
414
415    char* n[] = {"t"};
416    ring r = rDefault( 13, 1, n);     
417    TS_ASSERT_DIFFERS( r, NULLp );
418
419    PrintRing(r);
420
421    TS_ASSERT( rField_is_Domain(r) );
422    TS_ASSERT( !rField_is_Q(r) );
423
424    TS_ASSERT( rField_is_Zp(r) );
425    TS_ASSERT( !rField_is_Zp(r, 11) );
426    TS_ASSERT( rField_is_Zp(r, 13) );
427
428    TS_ASSERT_EQUALS( rVar(r), 1);
429
430    Test(r);
431     
432    rDelete(r);
433  }
434
435  void test_QQ_t()
436  {
437    clog << "Creating  Q[s]: " << endl;
438
439    char* n[] = {"s"};
440    ring r = rDefault( 0, 1, n);     
441    TS_ASSERT_DIFFERS( r, NULLp );
442
443    PrintRing(r);
444
445    TS_ASSERT( rField_is_Domain(r) );
446    TS_ASSERT( rField_is_Q(r) );
447   
448    TS_ASSERT( !rField_is_Zp(r) );
449    TS_ASSERT( !rField_is_Zp(r, 11) );
450
451    TS_ASSERT_EQUALS( rVar(r), 1);
452
453    Test(r);
454
455    rDelete(r);
456  }
457 
458  void test_Z11_x_y_z()
459  {
460     clog << "Creating  Z/11[x, y, z]: " << endl;
461     
462     char* n[] = {"x", "y", "z"};
463     ring r = rDefault( 11, 3, n);     
464     TS_ASSERT_DIFFERS( r, NULLp );
465
466     PrintRing(r);
467     
468     TS_ASSERT( rField_is_Domain(r) );
469     TS_ASSERT( !rField_is_Q(r) );
470
471     TS_ASSERT( rField_is_Zp(r) );
472     TS_ASSERT( rField_is_Zp(r, 11) );
473     TS_ASSERT( !rField_is_Zp(r, 13) );
474
475     TS_ASSERT_EQUALS( rVar(r), 3);
476
477     Test(r);
478     
479     rDelete(r);
480  }
481   void test_QQ_x_y_z()
482   {
483     clog << "Creating  QQ[x, y, z, u]: " << endl;
484
485     char* n[] = {"x", "y", "z", "u"};
486     ring r = rDefault( 0, 4, n);     
487     TS_ASSERT_DIFFERS( r, NULLp );
488
489     PrintRing(r);
490
491     TS_ASSERT( rField_is_Domain(r) );
492     TS_ASSERT( rField_is_Q(r) );
493
494     TS_ASSERT( !rField_is_Zp(r) );
495     TS_ASSERT( !rField_is_Zp(r, 11) );
496
497     TS_ASSERT_EQUALS( rVar(r), 4);
498
499     Test(r);
500     
501     rDelete(r);
502   }
503
504
505   void test_Z13_t_GF()
506   {
507     clog << "Creating  GF[t]: " << endl;
508
509     char* n[] = {"t"};
510
511     GFInfo param;
512
513     param.GFChar= 5;
514     param.GFDegree= 2;
515     param.GFPar_name= (const char*)"Q";
516
517     const coeffs cf = nInitChar( n_GF, &param );
518
519     if( cf == NULL )
520       TS_FAIL("Could not get needed coeff. domain");
521
522     TS_ASSERT_DIFFERS( cf, NULLp );
523
524     ring r = rDefault( cf, 1, n);  // now cf belongs to r!
525     TS_ASSERT_DIFFERS( r, NULLp );
526
527     PrintRing(r);
528
529     TS_ASSERT( rField_is_Domain(r) );
530     TS_ASSERT( !rField_is_Q(r) );
531
532     TS_ASSERT( !rField_is_Zp(r) );
533     TS_ASSERT( !rField_is_Zp(r, 11) );
534     TS_ASSERT( !rField_is_Zp(r, 13) );
535     TS_ASSERT( rField_is_GF(r) );
536
537     TS_ASSERT( rField_is_GF(r, 5) );
538     TS_ASSERT( !rField_is_GF(r, 25) );
539
540     TS_ASSERT_EQUALS( rVar(r), 1);
541
542     Test(r);
543
544     rDelete(r); // kills 'cf' as well!
545   }
546   
547  void test_Q_Ext_a()
548  {
549    clog << "Start by creating Q[a]..." << endl;
550
551    char* n[] = {"a"};
552    ring r = rDefault( 0, 1, n);   // Q[a]
553    TS_ASSERT_DIFFERS( r, NULLp );
554
555    PrintRing(r);
556
557    TS_ASSERT( rField_is_Domain(r) );
558    TS_ASSERT( rField_is_Q(r) );
559   
560    TS_ASSERT( !rField_is_Zp(r) );
561    TS_ASSERT( !rField_is_Zp(r, 11) );
562
563    TS_ASSERT_EQUALS( rVar(r), 1);
564
565    poly minPoly = p_ISet(1, r);                    // minPoly = 1
566    p_SetExp(minPoly, 1, 2, r); p_Setm(minPoly, r); // minPoly = a^2
567    minPoly = p_Add_q(minPoly, p_ISet(1, r), r);    // minPoly = a^2 + 1
568    ideal minIdeal = idInit(1);                     // minIdeal = < 0 >
569    minIdeal->m[0] = minPoly;                       // minIdeal = < a^2 + 1 >
570
571    n_coeffType type = nRegister(n_Ext, naInitChar); 
572    TS_ASSERT(type == n_Ext);
573
574    ExtInfo extParam;
575    extParam.r = r;
576    extParam.i = minIdeal;
577   
578    clog << "Next create the extension field Q[a]/<a2+1>..." << endl;
579
580    const coeffs cf = nInitChar(type, &extParam);   // Q[a]/<a2+1>
581   
582    if( cf == NULL )
583      TS_FAIL("Could not get needed coeff. domain");
584
585    TS_ASSERT_DIFFERS( cf->cfCoeffWrite, NULLp );
586 
587    if( cf->cfCoeffWrite != NULL )
588    {
589      clog << "Coeff-domain: "  << endl; 
590      n_CoeffWrite(cf); PrintLn();
591    }
592   
593    // some tests for the coefficient field represented by cf:
594    TestArithCf(cf);
595    TestSumCf(cf, 10);
596    TestSumCf(cf, 100);
597    TestSumCf(cf, 101);
598    TestSumCf(cf, 1001);
599    TestSumCf(cf, 9000);
600
601    clog << "Finally create the polynomial ring (Q[a]/<a2+1>)[x, y]..."
602         << endl;
603   
604    char* m[] = {"x", "y"};
605    ring s = rDefault(cf, 2, m);   // (Q[a]/<a2+1>)[x, y]
606    TS_ASSERT_DIFFERS(s, NULLp);
607
608    PrintRing(s);
609
610    TS_ASSERT( rField_is_Domain(s) );
611    TS_ASSERT( !rField_is_Q(s) );
612    TS_ASSERT( !rField_is_Zp(s) );
613    TS_ASSERT( !rField_is_Zp(s, 11) );
614    TS_ASSERT( !rField_is_Zp(s, 13) );
615    TS_ASSERT( !rField_is_GF(s) );
616    TS_ASSERT( rField_is_Extension(s) );
617    TS_ASSERT( !rField_is_GF(s, 25) );
618    TS_ASSERT_EQUALS(rVar(s), 2);
619
620    Test(s);
621   
622    clog << endl
623         << "Now let's compute some inverses in Q[a]/<a^2+1>..."
624         << endl;
625   
626    number u;
627    u = NULL; plusTerm(u, 1, 1, cf); plusTerm(u, 1, 0, cf);  // a + 1
628    checkInverse(u, cf); n_Delete(&u, cf);
629    u = NULL; plusTerm(u, 1, 1, cf); plusTerm(u, -1, 0, cf); // a - 1
630    checkInverse(u, cf); n_Delete(&u, cf);
631    u = NULL; plusTerm(u, 1, 1, cf); plusTerm(u, 5, 0, cf);  // a + 5
632    checkInverse(u, cf); n_Delete(&u, cf);
633    u = NULL; plusTerm(u, 1, 1, cf); plusTerm(u, -5, 0, cf); // a - 5
634    checkInverse(u, cf); n_Delete(&u, cf);
635    u = NULL; plusTerm(u, 17, 1, cf); plusTerm(u, 5, 0, cf); // 17a + 5
636    checkInverse(u, cf); n_Delete(&u, cf);
637
638    rDelete(s); // kills 'cf' and 'r' as well
639  }
640  void test_Q_Ext_b()
641  {
642    clog << "Start by creating Q[b]..." << endl;
643
644    char* n[] = {"b"};
645    ring r = rDefault( 0, 1, n);   // Q[b]
646    TS_ASSERT_DIFFERS( r, NULLp );
647
648    PrintRing(r);
649
650    TS_ASSERT( rField_is_Domain(r) );
651    TS_ASSERT( rField_is_Q(r) );
652   
653    TS_ASSERT( !rField_is_Zp(r) );
654    TS_ASSERT( !rField_is_Zp(r, 11) );
655
656    TS_ASSERT_EQUALS( rVar(r), 1);
657
658    poly minPoly = p_ISet(1, r);                    // minPoly = 1
659    p_SetExp(minPoly, 1, 7, r); p_Setm(minPoly, r); // minPoly = b^7
660    minPoly = p_Add_q(minPoly, p_ISet(17, r), r);   // minPoly = b^7 + 17
661    ideal minIdeal = idInit(1);                     // minIdeal = < 0 >
662    minIdeal->m[0] = minPoly;                       // minIdeal = < b^7 + 17 >
663
664    n_coeffType type = nRegister(n_Ext, naInitChar); 
665    TS_ASSERT(type == n_Ext);
666
667    ExtInfo extParam;
668    extParam.r = r;
669    extParam.i = minIdeal;
670   
671    clog << "Next create the extension field Q[b]/<b^7+17>..." << endl;
672
673    const coeffs cf = nInitChar(type, &extParam);   // Q[b]/<b^7+17>
674   
675    if( cf == NULL )
676      TS_FAIL("Could not get needed coeff. domain");
677
678    TS_ASSERT_DIFFERS( cf->cfCoeffWrite, NULLp );
679 
680    if( cf->cfCoeffWrite != NULL )
681    {
682      clog << "Coeff-domain: "  << endl; 
683      n_CoeffWrite(cf); PrintLn();
684    }
685   
686    // some tests for the coefficient field represented by cf:
687    TestArithCf(cf);
688    TestSumCf(cf, 10);
689    TestSumCf(cf, 100);
690    TestSumCf(cf, 101);
691    TestSumCf(cf, 1001);
692    TestSumCf(cf, 9000);
693
694    clog << "Finally create the polynomial ring (Q[b]/<b^7+17>)[u, v, w]..."
695         << endl;
696   
697    char* m[] = {"u", "v", "w"};
698    ring s = rDefault(cf, 3, m);   // (Q[b]/<b^7+17>)[u, v, w]
699    TS_ASSERT_DIFFERS(s, NULLp);
700
701    PrintRing(s);
702
703    TS_ASSERT( rField_is_Domain(s) );
704    TS_ASSERT( !rField_is_Q(s) );
705    TS_ASSERT( !rField_is_Zp(s) );
706    TS_ASSERT( !rField_is_Zp(s, 11) );
707    TS_ASSERT( !rField_is_Zp(s, 13) );
708    TS_ASSERT( !rField_is_GF(s) );
709    TS_ASSERT( rField_is_Extension(s) );
710    TS_ASSERT( !rField_is_GF(s, 25) );
711    TS_ASSERT_EQUALS(rVar(s), 3);
712
713    Test(s);
714   
715    clog << endl
716         << "Now let's compute some inverses in Q[b]/<b^7+17>..."
717         << endl;
718         
719    number u;
720    u = NULL; plusTerm(u, 1, 2, cf); plusTerm(u, 33, 0, cf);    // b^2 + 33
721    checkInverse(u, cf); n_Delete(&u, cf);
722    u = NULL; plusTerm(u, 1, 5, cf); plusTerm(u, -137, 0, cf);  // b^5 - 137
723    checkInverse(u, cf); n_Delete(&u, cf);
724
725    clog << endl
726         << "Now let's check a gcd computation in Q[b]..."
727         << endl;
728   
729    number v;
730    v = NULL; plusTerm(v, 1, 2, cf); plusTerm(v, 7, 1, cf);
731    plusTerm(v, 1, 0, cf);        // b^2 + 7b + 1
732    number w = n_Mult(v, v, cf);  // (b^2 + 7b + 1)^2
733    number y = n_Mult(v, w, cf);  // (b^2 + 7b + 1)^3
734    n_Delete(&v, cf);
735    v = NULL; plusTerm(v, 2, 2, cf); plusTerm(v, -61, 1, cf);   // 2b^2 - 61b
736    number z = n_Mult(w, v, cf);   // (b^2 + 7b + 1)^2 * (2b^2 - 61b)
737    n_Delete(&v, cf);
738   
739    clog << "z = "; n_Write(z, cf);
740    clog << "y = "; n_Write(y, cf);
741    number theGcd = n_Gcd(z, y, cf);   // should yield w = (b^2 + 7b + 1)^2
742    clog << "gcd(z, y) = "; n_Write(theGcd, cf);
743   
744    v = n_Sub(theGcd, w, cf);
745    TS_ASSERT( v == NULL );
746    n_Delete(&v, cf);
747   
748    clog << endl
749         << "Now let's check an ext_gcd computation in Q[b]..."
750         << endl;
751         
752    poly zFactor; poly yFactor;
753    poly ppp = p_ExtGcd((poly)z, zFactor, (poly)y, yFactor, cf->algring);
754    v = n_Sub(theGcd, (number)ppp, cf);
755    TS_ASSERT( v == NULL );
756    clog << "z = "; n_Write(z, cf);
757    clog << "zFactor = "; p_Write(zFactor, cf->algring);
758    clog << "y = "; n_Write(y, cf);
759    clog << "yFactor = "; p_Write(yFactor, cf->algring);
760    number v1 = n_Mult(z, (number)zFactor, cf);
761    number v2 = n_Mult(y, (number)yFactor, cf);
762    number v3 = n_Add(v1, v2, cf);
763    clog << "z * zFactor + y * yFactor = "; n_Write(v3, cf);
764    clog << "gcd(z, y) = "; p_Write(ppp, cf->algring);
765    number v4 = n_Sub(v3, w, cf);
766    TS_ASSERT( v4 == NULL );
767   
768    p_Delete(&ppp, cf->algring); p_Delete(&zFactor, cf->algring);
769    p_Delete(&yFactor, cf->algring);
770    n_Delete(&z, cf); n_Delete(&y, cf); n_Delete(&w, cf);
771    n_Delete(&theGcd, cf); n_Delete(&v, cf); n_Delete(&v1, cf);
772    n_Delete(&v2, cf); n_Delete(&v3, cf); n_Delete(&v4, cf);
773
774    rDelete(s); // kills 'cf' and 'r' as well
775  }
776};
777
Note: See TracBrowser for help on using the repository browser.