source: git/kernel/kbuckets.cc @ f52579a

spielwiese
Last change on this file since f52579a was f52579a, checked in by Michael Brickenstein <bricken@…>, 18 years ago
*bricken: second step, still a long way git-svn-id: file:///usr/local/Singular/svn/trunk@8854 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 23.0 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: kbuckets.cc,v 1.5 2005-12-13 13:46:08 bricken Exp $ */
5
6#include "mod2.h"
7#include "structs.h"
8#include "omalloc.h"
9#include "p_polys.h"
10#include "febase.h"
11#include "pShallowCopyDelete.h"
12#include "kbuckets.h"
13#include "numbers.h"
14#include "p_Procs.h"
15
16#ifdef HAVE_COEF_BUCKETS
17#define USE_COEF_BUCKETS
18#endif
19
20#ifdef USE_COEF_BUCKETS
21#define MULTIPLY_BUCKET(B,I) do                                        \
22  { if (B->coef[I]!=NULL)                                              \
23    {                                                                  \
24      B->buckets[I]=p_Mult_q(B->buckets[I],B->coef[I],B->bucket_ring); \
25      B->coef[I]=NULL;                                                 \
26    }                                                                  \
27  } while(0)
28#else
29#define MULTIPLY_BUCKET(B,I)
30#endif
31static omBin kBucket_bin = omGetSpecBin(sizeof(kBucket));
32static int coef_start=1;
33//////////////////////////////////////////////////////////////////////////
34///
35/// Some internal stuff
36///
37
38// returns ceil(log_4(l))
39inline unsigned int pLogLength(unsigned int l)
40{
41  unsigned int i = 0;
42
43  if (l == 0) return 0;
44  l--;
45#ifdef BUCKET_TWO_BASE
46  while ((l = (l >> 1))) i++;
47#else
48  while ((l = (l >> 2))) i++;
49#endif
50  return i+1;
51}
52
53// returns ceil(log_4(pLength(p)))
54inline unsigned int pLogLength(poly p)
55{
56  return pLogLength((unsigned int) pLength(p));
57}
58
59#ifdef KDEBUG
60
61#ifndef HAVE_PSEUDO_BUCKETS
62BOOLEAN kbTest_i(kBucket_pt bucket, int i)
63{//sBucketSortMerge
64  #ifdef USE_COEF_BUCKETS
65  assume(bucket->coef[0]==NULL);
66  if ((bucket->coef[i]!=NULL) && (bucket->buckets[i]==NULL))
67  {
68    dReportError("Bucket %d coef not NULL", i);
69  }
70  if (bucket->coef[i]!=NULL)
71  {
72    assume(bucket->buckets[i]!=NULL);
73    _p_Test(bucket->coef[i],bucket->bucket_ring,PDEBUG);
74    }
75  #endif
76  pFalseReturn(p_Test(bucket->buckets[i], bucket->bucket_ring));
77  if (bucket->buckets_length[i] != pLength(bucket->buckets[i]))
78  {
79    dReportError("Bucket %d lengths difference should:%d has:%d",
80                 i, bucket->buckets_length[i], pLength(bucket->buckets[i]));
81  }
82  else if (i > 0 && (int) pLogLength(bucket->buckets_length[i]) > i)
83  {
84    dReportError("Bucket %d too long %d",
85                 i, bucket->buckets_length[i]);
86  }
87  if (i==0 && bucket->buckets_length[0] > 1)
88  {
89    dReportError("Bucket 0 too long");
90  }
91  return TRUE;
92}
93
94
95BOOLEAN kbTest(kBucket_pt bucket)
96{
97  assume(bucket->coef[0]==NULL);
98  int i;
99  poly lm = bucket->buckets[0];
100
101  omCheckAddrBin(bucket, kBucket_bin);
102  if (! kbTest_i(bucket, 0)) return FALSE;
103  for (i=1; i<= (int) bucket->buckets_used; i++)
104  {
105    if (!kbTest_i(bucket, i)) return FALSE;
106    if (lm != NULL &&  bucket->buckets[i] != NULL
107        && p_LmCmp(lm, bucket->buckets[i], bucket->bucket_ring) != 1)
108    {
109      dReportError("Bucket %d larger than lm", i);
110      return FALSE;
111    }
112    if (!p_Test(bucket->buckets[i],bucket->bucket_ring))
113    {
114      dReportError("Bucket %d is not =0(4)", i);
115      return FALSE;
116    }
117  }
118
119  for (; i<=MAX_BUCKET; i++)
120  {
121    if (bucket->buckets[i] != NULL || bucket->buckets_length[i] != 0)
122    {
123      dReportError("Bucket %d not zero", i);
124      return FALSE;
125    }
126  }
127  for(i=0;i<=MAX_BUCKET;i++){
128    if (bucket->buckets[i]!=NULL){
129        int j;
130        for(j=i+1;j<=MAX_BUCKET;j++){
131            if (bucket->buckets[j]==bucket->buckets[i])
132                dReportError("Bucket %d %d equal", i,j);
133                return FALSE;
134        }
135    }
136    if (bucket->coef[i]!=NULL){
137        int j;
138        for(j=i+1;j<=MAX_BUCKET;j++){
139            if (bucket->coef[j]==bucket->coef[i])
140                dReportError("internal coef %d %d equal", i,j);
141                return FALSE;
142        }
143        for(j=0;j<=MAX_BUCKET;j++){
144            if (bucket->coef[j]==bucket->coef[i])
145                dReportError("internal coef %d equals bucket %d", i,j);
146                return FALSE;
147        }
148    }
149  }
150  return TRUE;
151}
152
153#else // HAVE_PSEUDO_BUCKETS
154BOOLEAN kbTest(kBucket_pt bucket)
155{
156  return TRUE;
157}
158#endif // ! HAVE_PSEUDO_BUCKETS
159#endif // KDEBUG
160
161//////////////////////////////////////////////////////////////////////////
162///
163/// Creation/Destruction of buckets
164///
165
166kBucket_pt kBucketCreate(ring bucket_ring)
167{
168  assume(bucket_ring != NULL);
169  kBucket_pt bucket = (kBucket_pt) omAlloc0Bin(kBucket_bin);
170  bucket->bucket_ring = bucket_ring;
171  return bucket;
172}
173void kBucketDestroy(kBucket_pt *bucket_pt)
174{
175  omFreeBin(*bucket_pt, kBucket_bin);
176  *bucket_pt = NULL;
177}
178
179
180void kBucketDeleteAndDestroy(kBucket_pt *bucket_pt)
181{
182  kBucket_pt bucket = *bucket_pt;
183  kbTest(bucket);
184  int i;
185  for (i=0; i<= bucket->buckets_used; i++)
186  {
187    if (bucket->buckets[i] != NULL)
188    {
189      p_Delete(&(bucket->buckets[i]), bucket->bucket_ring);
190#ifdef USE_COEF_BUCKETS
191      if (bucket->coef[i]!=NULL)
192        p_Delete(&(bucket->coef[i]), bucket->bucket_ring);
193#endif
194    }
195  }
196  omFreeBin(bucket, kBucket_bin);
197  *bucket_pt = NULL;
198}
199
200/////////////////////////////////////////////////////////////////////////////
201// Convertion from/to Bpolys
202//
203#ifndef HAVE_PSEUDO_BUCKETS
204
205inline void kBucketMergeLm(kBucket_pt bucket)
206{
207
208  if (bucket->buckets[0] != NULL)
209  {
210    poly lm = bucket->buckets[0];
211    int i = 1;
212#ifdef BUCKET_TWO_BASE
213    int l = 2;
214    while ( bucket->buckets_length[i] >= l)
215    {
216      i++;
217      l = l << 1;
218    }
219#else
220    int l = 4;
221    while ( bucket->buckets_length[i] >= l)
222    {
223      i++;
224      l = l << 2;
225    }
226#endif
227#if 0
228    MULTIPLY_BUCKET(bucket,i);
229    pNext(lm) = bucket->buckets[i];
230    bucket->buckets[i] = lm;
231    bucket->buckets_length[i]++;
232    assume(i <= bucket->buckets_used+1);
233    if (i > bucket->buckets_used)  bucket->buckets_used = i;
234    bucket->buckets[0] = NULL;
235    bucket->buckets_length[0] = 0;
236#endif
237    if (i > bucket->buckets_used)  bucket->buckets_used = i;
238    assume(i!=0);
239    if (bucket->buckets[i]!=NULL){
240       MULTIPLY_BUCKET(bucket,i);
241       pNext(lm) = bucket->buckets[i];
242       bucket->buckets[i] = lm;
243       bucket->buckets_length[i]++;
244       assume(i <= bucket->buckets_used+1);
245       
246    } else {
247      #if 1
248       assume(bucket->buckets[i]==NULL);
249       assume(bucket->coef[0]==NULL);
250       assume(pLength(lm)==1);
251       assume(pNext(lm)==NULL);
252       number coef=p_GetCoeff(lm,bucket->bucket_ring);
253       p_SetCoeff0(lm, n_Init(1,bucket->bucket_ring), bucket->bucket_ring);
254       bucket->buckets[i]=lm;
255       bucket->buckets_length[i]=1;
256       bucket->coef[i]=p_NSet(n_Copy(coef,bucket->bucket_ring),bucket->bucket_ring);
257       
258       bucket->buckets[i]=lm;
259       bucket->buckets_length[i]=1;
260       #else
261       MULTIPLY_BUCKET(bucket,i);
262       pNext(lm) = bucket->buckets[i];
263       bucket->buckets[i] = lm;
264       bucket->buckets_length[i]++;
265       assume(i <= bucket->buckets_used+1);
266       #endif
267    }
268    bucket->buckets[0]=NULL;
269    bucket->buckets_length[0] = 0;
270    bucket->coef[0]=NULL;
271    kbTest(bucket);
272  }
273}
274
275static BOOLEAN kBucketIsCleared(kBucket_pt bucket)
276{
277  int i;
278
279  for (i = 0;i<=MAX_BUCKET;i++)
280  {
281    if (bucket->buckets[i] != NULL) return FALSE;
282    if (bucket->buckets_length[i] != 0) return FALSE;
283  }
284  return TRUE;
285}
286
287void kBucketInit(kBucket_pt bucket, poly lm, int length)
288{
289  //assume(false);
290  assume(bucket != NULL);
291  assume(length <= 0 || length == pLength(lm));
292  assume(kBucketIsCleared(bucket));
293
294  if (lm == NULL) return;
295
296  if (length <= 0)
297    length = pLength(lm);
298
299  bucket->buckets[0] = lm;
300  bucket->buckets_length[0] = 1;
301  if (length > 1)
302  {
303    unsigned int i = pLogLength(length-1);
304    bucket->buckets[i] = pNext(lm);
305    pNext(lm) = NULL;
306    bucket->buckets_length[i] = length-1;
307    bucket->buckets_used = i;
308  }
309  else
310  {
311    bucket->buckets_used = 0;
312  }
313}
314
315int kBucketCanonicalize(kBucket_pt bucket)
316{
317  MULTIPLY_BUCKET(bucket,1);
318  kbTest(bucket);
319  poly p = bucket->buckets[1];
320  poly lm;
321  int pl = bucket->buckets_length[1], i;
322  bucket->buckets[1] = NULL;
323  bucket->buckets_length[1] = 0;
324  ring r=bucket->bucket_ring;
325
326
327  for (i=1; i<=bucket->buckets_used; i++)
328  {
329  #ifdef USE_COEF_BUCKETS
330    if (bucket->coef[i]!=NULL)
331    {
332      assume(bucket->buckets[i]!=NULL);
333      p = p_Plus_mm_Mult_qq(p, bucket->coef[i], bucket->buckets[i],
334                 pl, bucket->buckets_length[i], r);
335      p_Delete(&bucket->coef[i],r);
336      p_Delete(&bucket->buckets[i],r);
337    }
338    else
339    p = p_Add_q(p, bucket->buckets[i],
340                 pl, bucket->buckets_length[i], r);
341  #else
342    p = p_Add_q(p, bucket->buckets[i],
343                 pl, bucket->buckets_length[i], r);
344  #endif
345    if (i==1) continue;
346    bucket->buckets[i] = NULL;
347    bucket->buckets_length[i] = 0;
348  }
349
350  lm = bucket->buckets[0];
351  if (lm != NULL)
352  {
353    pNext(lm) = p;
354    p = lm;
355    pl++;
356    bucket->buckets[0] = NULL;
357    bucket->buckets_length[0] = 0;
358  }
359  if (pl > 0)
360  {
361    i = pLogLength(pl);
362    bucket->buckets[i] = p;
363    bucket->buckets_length[i] = pl;
364  }
365  else
366  {
367    i = 0;
368  }
369  bucket->buckets_used = i;
370  assume(bucket->coef[0]==NULL);
371  assume(bucket->coef[i]==NULL);
372  assume(pLength(p) == (int) pl);
373  kbTest(bucket);
374  return i;
375}
376
377void kBucketClear(kBucket_pt bucket, poly *p, int *length)
378{
379  int i = kBucketCanonicalize(bucket);
380  if (i > 0)
381  {
382  #ifdef USE_COEF_BUCKETS
383    MULTIPLY_BUCKET(bucket,i);
384    //bucket->coef[i]=NULL;
385#endif
386    *p = bucket->buckets[i];
387    *length = bucket->buckets_length[i];
388    bucket->buckets[i] = NULL;
389    bucket->buckets_length[i] = 0;
390    bucket->buckets_used = 0;
391
392  }
393  else
394  {
395    *p = NULL;
396    *length = 0;
397  }
398}
399
400void kBucketSetLm(kBucket_pt bucket, poly lm)
401{
402  kBucketMergeLm(bucket);
403  pNext(lm) = NULL;
404  bucket->buckets[0] = lm;
405  bucket->buckets_length[0] = 1;
406}
407
408#else // HAVE_PSEUDO_BUCKETS
409
410void kBucketInit(kBucket_pt bucket, poly lm, int length)
411{
412  int i;
413
414  assume(bucket != NULL);
415  assume(length <= 0 || length == pLength(lm));
416
417  bucket->p = lm;
418  if (length <= 0) bucket->l = pLength(lm);
419  else bucket->l = length;
420
421}
422
423const poly kBucketGetLm(kBucket_pt bucket)
424{
425  return bucket->p;
426}
427
428poly kBucketExtractLm(kBucket_pt bucket)
429{
430  poly lm = bucket->p;
431  assume(pLength(bucket->p) == bucket->l);
432  pIter(bucket->p);
433  (bucket->l)--;
434  pNext(lm) = NULL;
435  return lm;
436}
437
438void kBucketClear(kBucket_pt bucket, poly *p, int *length)
439{
440  assume(pLength(bucket->p) == bucket->l);
441  *p = bucket->p;
442  *length = bucket->l;
443  bucket->p = NULL;
444  bucket->l = 0;
445}
446
447#endif // ! HAVE_PSEUDO_BUCKETS
448//////////////////////////////////////////////////////////////////////////
449///
450/// For changing the ring of the Bpoly to new_tailBin
451///
452void kBucketShallowCopyDelete(kBucket_pt bucket,
453                              ring new_tailRing, omBin new_tailBin,
454                              pShallowCopyDeleteProc p_shallow_copy_delete)
455{
456#ifndef HAVE_PSEUDO_BUCKETS
457  int i;
458
459  kBucketCanonicalize(bucket);
460  for (i=0; i<= bucket->buckets_used; i++)
461    if (bucket->buckets[i] != NULL)
462    {
463      MULTIPLY_BUCKET(bucket,i);
464      bucket->buckets[i] = p_shallow_copy_delete(bucket->buckets[i],
465                                                 bucket->bucket_ring,
466                                                 new_tailRing,
467                                                 new_tailBin);
468    }
469#else
470  bucket->p = p_shallow_copy_delete(p,
471                                    bucket_ring,
472                                    new_tailRing,
473                                    new_tailBin);
474#endif
475  bucket->bucket_ring = new_tailRing;
476}
477
478
479
480//////////////////////////////////////////////////////////////////////////
481///
482/// Multiply Bucket by number ,i.e. Bpoly == n*Bpoly
483///
484void kBucket_Mult_n(kBucket_pt bucket, number n)
485{
486#ifndef HAVE_PSEUDO_BUCKETS
487  kbTest(bucket);
488  ring r=bucket->bucket_ring;
489  int i;
490
491  for (i=0; i<= bucket->buckets_used; i++)
492  {
493    if (bucket->buckets[i] != NULL)
494    {
495#ifdef USE_COEF_BUCKETS
496      if (i<coef_start)
497        bucket->buckets[i] = p_Mult_nn(bucket->buckets[i], n, r);
498      else
499      if (bucket->coef[i]!=NULL)
500      {
501        bucket->coef[i] = p_Mult_nn(bucket->coef[i],n,r);
502      }
503      else
504      {
505        bucket->coef[i] = p_NSet(n_Copy(n,r),r);
506      }
507#else
508      bucket->buckets[i] = p_Mult_nn(bucket->buckets[i], n, r);
509#endif
510    }
511  }
512  kbTest(bucket);
513#else
514  bucket->p = p_Mult_nn(bucket->p, n, bucket->bucket_ring);
515#endif
516}
517
518
519//////////////////////////////////////////////////////////////////////////
520///
521/// Add to Bucket a poly ,i.e. Bpoly == q+Bpoly
522///
523void kBucket_Add_q(kBucket_pt bucket, poly q, int *l)
524{
525  if (q == NULL) return;
526  assume(*l <= 0 || pLength(q) == *l);
527
528  int i, l1;
529  ring r = bucket->bucket_ring;
530
531  if (*l <= 0)
532  {
533    l1 = pLength(q);
534    *l = l1;
535  }
536  else
537    l1 = *l;
538
539  kBucketMergeLm(bucket);
540  kbTest(bucket);
541  i = pLogLength(l1);
542
543  while (bucket->buckets[i] != NULL)
544  {
545    //MULTIPLY_BUCKET(bucket,i);
546  #ifdef USE_COEF_BUCKETS
547    if (bucket->coef[i]!=NULL)
548    {
549      q = p_Plus_mm_Mult_qq(q, bucket->coef[i], bucket->buckets[i],
550                 l1, bucket->buckets_length[i], r);
551      p_Delete(&bucket->coef[i],r);
552      p_Delete(&bucket->buckets[i],r);
553    }
554    else
555    q = p_Add_q(q, bucket->buckets[i],
556                 l1, bucket->buckets_length[i], r);
557  #else
558    q = p_Add_q(q, bucket->buckets[i],
559                 l1, bucket->buckets_length[i], r);
560  #endif
561    bucket->buckets[i] = NULL;
562    bucket->buckets_length[i] = 0;
563    i = pLogLength(l1);
564  }
565
566  bucket->buckets[i] = q;
567  bucket->buckets_length[i]=l1;
568  if (i >= bucket->buckets_used)
569    bucket->buckets_used = i;
570  else
571    kBucketAdjustBucketsUsed(bucket);
572  kbTest(bucket);
573}
574
575
576
577//////////////////////////////////////////////////////////////////////////
578///
579/// Bpoly == Bpoly - m*p; where m is a monom
580/// Does not destroy p and m
581/// assume (*l <= 0 || pLength(p) == *l)
582void kBucket_Minus_m_Mult_p(kBucket_pt bucket, poly m, poly p, int *l,
583                            poly spNoether)
584{
585  assume(*l <= 0 || pLength(p) == *l);
586  int i, l1;
587  poly p1 = p;
588  poly last;
589  ring r = bucket->bucket_ring;
590
591  if (*l <= 0)
592  {
593    l1 = pLength(p1);
594    *l = l1;
595  }
596  else
597    l1 = *l;
598
599  if (m == NULL || p == NULL) return;
600
601#ifndef HAVE_PSEUDO_BUCKETS
602  kBucketMergeLm(bucket);
603  kbTest(bucket);
604  i = pLogLength(l1);
605
606  if ((i <= bucket->buckets_used) && (bucket->buckets[i] != NULL))
607  {
608    assume(pLength(bucket->buckets[i])==bucket->buckets_length[i]);
609//#ifdef USE_COEF_BUCKETS
610//     if(bucket->coef[i]!=NULL)
611//     {
612//       poly mult=p_Mult_mm(bucket->coef[i],m,r);
613//       bucket->coef[i]=NULL;
614//       p1 = p_Minus_mm_Mult_qq(bucket->buckets[i], mult, p1,
615//                               bucket->buckets_length[i], l1,
616//                             spNoether, r);
617//     }
618//     else
619//#endif
620    MULTIPLY_BUCKET(bucket,i);
621    p1 = p_Minus_mm_Mult_qq(bucket->buckets[i], m, p1,
622                            bucket->buckets_length[i], l1,
623                            spNoether, r);
624    l1 = bucket->buckets_length[i];
625    bucket->buckets[i] = NULL;
626    bucket->buckets_length[i] = 0;
627    i = pLogLength(l1);
628  }
629  else
630  {
631    pSetCoeff0(m, nNeg(pGetCoeff(m)));
632    if (spNoether != NULL)
633    {
634      l1 = -1;
635      p1 = r->p_Procs->pp_Mult_mm_Noether(p1, m, spNoether, l1, r, last);
636      i = pLogLength(l1);
637    }
638    else
639      p1 = r->p_Procs->pp_Mult_mm(p1, m, r, last);
640    pSetCoeff0(m, nNeg(pGetCoeff(m)));
641  }
642
643  while (bucket->buckets[i] != NULL)
644  {
645    //kbTest(bucket);
646    MULTIPLY_BUCKET(bucket,i);
647    p1 = p_Add_q(p1, bucket->buckets[i],
648                 l1, bucket->buckets_length[i], r);
649    bucket->buckets[i] = NULL;
650    bucket->buckets_length[i] = 0;
651    i = pLogLength(l1);
652  }
653
654  bucket->buckets[i] = p1;
655  bucket->buckets_length[i]=l1;
656  if (i >= bucket->buckets_used)
657    bucket->buckets_used = i;
658  else
659    kBucketAdjustBucketsUsed(bucket);
660#else // HAVE_PSEUDO_BUCKETS
661  bucket->p = p_Minus_mm_Mult_qq(bucket->p, m,  p,
662                               bucket->l, l1,
663                               spNoether, r);
664#endif
665}
666
667//////////////////////////////////////////////////////////////////////////
668///
669/// Bpoly == Bpoly + m*p; where m is a monom
670/// Does not destroy p and m
671/// assume (l <= 0 || pLength(p) == l)
672void kBucket_Plus_mm_Mult_pp(kBucket_pt bucket, poly m, poly p, int l)
673{
674  assume(l <= 0 || pLength(p) == l);
675  int i, l1;
676  poly p1 = p;
677  poly last;
678  ring r = bucket->bucket_ring;
679
680  if (l <= 0)
681  {
682    l1 = pLength(p1);
683    l = l1;
684  }
685  else
686    l1 = l;
687
688  if (m == NULL || p == NULL) return;
689
690  kBucketMergeLm(bucket);
691  kbTest(bucket);
692  i = pLogLength(l1);
693  number n=n_Init(1,r);
694  if (i <= bucket->buckets_used && bucket->buckets[i] != NULL)
695  {
696    MULTIPLY_BUCKET(bucket,i);
697    p1 = p_Plus_mm_Mult_qq(bucket->buckets[i], m, p1,
698                           bucket->buckets_length[i], l1, r);
699    l1 = bucket->buckets_length[i];
700    bucket->buckets[i] = NULL;
701    bucket->buckets_length[i] = 0;
702    i = pLogLength(l1);
703  }
704  else
705  {
706    number swap_n=p_GetCoeff(m,r);
707   
708    assume(n_IsOne(n,r));
709    p_SetCoeff0(m,n,r);
710    n=swap_n;
711    //p_SetCoeff0(n, swap_n, r);
712    //p_GetCoeff0(n, swap_n,r);
713   
714    p1 = r->p_Procs->pp_Mult_mm(p1, m, r, last);
715  }
716
717  while (bucket->buckets[i] != NULL)
718  {
719
720   
721   
722    //don't do that, pull out gcd
723    if(!(n_IsOne(n,r))) {
724        p1=p_Mult_nn(p1, n, r);
725        n_Delete(&n,r);
726        n=n_Init(1,r);
727    }
728   
729    MULTIPLY_BUCKET(bucket,i);
730    p1 = p_Add_q(p1, bucket->buckets[i],
731                 l1, bucket->buckets_length[i], r);
732    bucket->buckets[i] = NULL;
733    bucket->buckets_length[i] = 0;
734    i = pLogLength(l1);
735  }
736
737 
738  bucket->buckets[i] = p1;
739 
740  assume(bucket->coef[i]==NULL);
741  if (!(n_IsOne(n,r))){
742    bucket->coef[i]=p_NSet(n,r);
743  } else {
744    bucket->coef[i]=NULL;
745    n_Delete(&n,r);
746  }
747 
748  bucket->buckets_length[i]=l1;
749  if (i >= bucket->buckets_used)
750    bucket->buckets_used = i;
751  else
752    kBucketAdjustBucketsUsed(bucket);
753
754  kbTest(bucket);
755}
756
757poly kBucket_ExtractLarger(kBucket_pt bucket, poly q, poly append)
758{
759  if (q == NULL) return append;
760  poly lm;
761  loop
762  {
763    lm = kBucketGetLm(bucket);
764    if (lm == NULL) return append;
765    if (p_LmCmp(lm, q, bucket->bucket_ring) == 1)
766    {
767      lm = kBucketExtractLm(bucket);
768      pNext(append) = lm;
769      pIter(append);
770    }
771    else
772    {
773      return append;
774    }
775  }
776}
777
778/////////////////////////////////////////////////////////////////////////////
779//
780// Extract all monomials from bucket with component comp
781// Return as a polynomial *p with length *l
782// In other words, afterwards
783// Bpoly = Bpoly - (poly consisting of all monomials with component comp)
784// and components of monomials of *p are all 0
785//
786
787// Hmm... for now I'm too lazy to implement those independent of currRing
788// But better declare it extern than including polys.h
789extern void pTakeOutComp(poly *p, Exponent_t comp, poly *q, int *lq);
790void pDecrOrdTakeOutComp(poly *p, Exponent_t comp, Order_t order,
791                         poly *q, int *lq);
792
793void kBucketTakeOutComp(kBucket_pt bucket,
794                        Exponent_t comp,
795                        poly *r_p, int *l)
796{
797  poly p = NULL, q;
798  int i, lp = 0, lq;
799
800#ifndef HAVE_PSEUDO_BUCKETS
801  kBucketMergeLm(bucket);
802  for (i=1; i<=bucket->buckets_used; i++)
803  {
804    if (bucket->buckets[i] != NULL)
805    {
806      MULTIPLY_BUCKET(bucket,i);
807      pTakeOutComp(&(bucket->buckets[i]), comp, &q, &lq);
808      if (q != NULL)
809      {
810        assume(pLength(q) == lq);
811        bucket->buckets_length[i] -= lq;
812        assume(pLength(bucket->buckets[i]) == bucket->buckets_length[i]);
813        p = p_Add_q(p, q, lp, lq, bucket->bucket_ring);
814      }
815    }
816  }
817  kBucketAdjustBucketsUsed(bucket);
818#else
819  pTakeOutComp(&(bucket->p), comp, &p, &lp);
820  (bucket->l) -= lp;
821#endif
822  *r_p = p;
823  *l = lp;
824
825  kbTest(bucket);
826}
827
828void kBucketDecrOrdTakeOutComp(kBucket_pt bucket,
829                               Exponent_t comp, Order_t order,
830                               poly *r_p, int *l)
831{
832  poly p = NULL, q;
833  int i, lp = 0, lq;
834
835#ifndef HAVE_PSEUDO_BUCKETS
836  kBucketMergeLm(bucket);
837  for (i=1; i<=bucket->buckets_used; i++)
838  {
839    if (bucket->buckets[i] != NULL)
840    {
841      MULTIPLY_BUCKET(bucket,i);
842      pDecrOrdTakeOutComp(&(bucket->buckets[i]), comp, order, &q, &lq);
843      if (q != NULL)
844      {
845        bucket->buckets_length[i] -= lq;
846        p = p_Add_q(p, q, lp, lq, bucket->bucket_ring);
847      }
848    }
849  }
850  kBucketAdjustBucketsUsed(bucket);
851#else
852  pDecrOrdTakeOutComp(&(bucket->p), comp, order, &p, &lp);
853  (bucket->l) -= lp;
854#endif
855
856  *r_p = p;
857  *l = lp;
858}
859
860/////////////////////////////////////////////////////////////////////////////
861// Reduction of Bpoly with a given poly
862//
863
864extern int ksCheckCoeff(number *a, number *b);
865
866number kBucketPolyRed(kBucket_pt bucket,
867                      poly p1, int l1,
868                      poly spNoether)
869{
870  assume(p1 != NULL &&
871         p_DivisibleBy(p1,  kBucketGetLm(bucket), bucket->bucket_ring));
872  assume(pLength(p1) == (int) l1);
873
874  poly a1 = pNext(p1), lm = kBucketExtractLm(bucket);
875  BOOLEAN reset_vec=FALSE;
876  number rn;
877
878  if(a1==NULL)
879  {
880    p_DeleteLm(&lm, bucket->bucket_ring);
881    return nInit(1);
882  }
883
884  if (! nIsOne(pGetCoeff(p1)))
885  {
886    number an = pGetCoeff(p1), bn = pGetCoeff(lm);
887    int ct = ksCheckCoeff(&an, &bn);
888    p_SetCoeff(lm, bn, bucket->bucket_ring);
889    if ((ct == 0) || (ct == 2)) kBucket_Mult_n(bucket, an);
890    rn = an;
891  }
892  else
893  {
894    rn = nInit(1);
895  }
896
897  if (p_GetComp(p1, bucket->bucket_ring) != p_GetComp(lm, bucket->bucket_ring))
898  {
899    p_SetCompP(a1, p_GetComp(lm, bucket->bucket_ring), bucket->bucket_ring);
900    reset_vec = TRUE;
901    p_SetComp(lm, p_GetComp(p1, bucket->bucket_ring), bucket->bucket_ring);
902    p_Setm(lm, bucket->bucket_ring);
903  }
904
905  p_ExpVectorSub(lm,p1, bucket->bucket_ring);
906  l1--;
907
908  kBucket_Minus_m_Mult_p(bucket, lm, a1, &l1, spNoether);
909
910  p_DeleteLm(&lm, bucket->bucket_ring);
911  if (reset_vec) p_SetCompP(a1, 0, bucket->bucket_ring);
912  kbTest(bucket);
913  return rn;
914}
915static BOOLEAN nIsPseudoUnit(number n, ring r){
916    if (rField_is_Zp(r))
917        return TRUE;
918       
919    //if (r->parameter!=NULL)
920    number one=n_Init(1,r);
921    if (n_Equal(n,one,r)) {
922    n_Delete(&one,r);
923    return TRUE;
924    }
925    n_Delete(&one,r);
926    number minus_one=n_Init(-1,r);
927    if (n_Equal(n,minus_one,r)){
928        n_Delete(&minus_one,r);
929        return TRUE;
930    }
931
932    return FALSE;
933   
934}
935void kBucketSimpleContent(kBucket_pt bucket){
936    int i;
937    //PrintS("HHHHHHHHHHHHH");
938    for (i=0;i<=MAX_BUCKET;i++){
939        if ((bucket->buckets[i]!=NULL) && (bucket->coef[i]!=NULL))
940            PrintS("H2H2H2");
941        if ((bucket->buckets[i]!=NULL) && (bucket->coef[i]==NULL)){
942           
943         }
944    }
945    return;
946    ring r=bucket->bucket_ring;
947    number coef=n_Init(0,r);
948    //ATTENTION: will not work correct for GB over ring
949    PrintS("CCCCCCCCCCCCC");
950    for (i=0;i<=MAX_BUCKET;i++){
951   
952        if (bucket->buckets[i]!=NULL){
953            assume(bucket->coef[i]!=NULL);
954            //in this way it should crash on programming errors, yeah
955            number temp=nGcd(coef, pGetCoeff(bucket->buckets[i]),r);
956            n_Delete(&coef,r );
957            coef=temp;
958            if (nIsPseudoUnit(coef,r))
959            {
960                n_Delete(&coef,r);
961            }
962            return;
963         }
964    }
965    PrintS("SSSSSSSSSSSSS");
966    for(i=0;i<=MAX_BUCKET;i++){
967        number lc=pGetCoeff(bucket->coef[i]);
968        p_SetCoeff(bucket->coef[i], n_IntDiv(lc,coef,r),r);
969    }
970    return;
971}
972
973
Note: See TracBrowser for help on using the repository browser.