source: git/kernel/p_kBucketSetLm__T.cc @ d0f98e

spielwiese
Last change on this file since d0f98e was 924cca, checked in by Michael Brickenstein <bricken@…>, 18 years ago
*bricken: some macros for without USE_COEF_BUCKETS, seems not to break with, but not enough to repair without git-svn-id: file:///usr/local/Singular/svn/trunk@8938 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.0 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/***************************************************************
5 *  File:    p_KBucketSetLm__Template.cc
6 *  Purpose: template for setting the Lm of a bucket
7 *  Author:  obachman (Olaf Bachmann)
8 *  Created: 12/00
9 *  Version: $Id: p_kBucketSetLm__T.cc,v 1.4 2006-02-13 17:12:42 bricken Exp $
10 *******************************************************************/
11#undef USE_COEF_BUCKETS
12#ifdef HAVE_COEF_BUCKETS
13#define USE_COEF_BUCKETS
14#endif
15
16#ifdef USE_COEF_BUCKETS
17#define MULTIPLY_BUCKET(B,I) do                                        \
18  { if (B->coef[I]!=NULL)                                              \
19    {                                                                  \
20      B->buckets[I]=p_Mult_q(B->buckets[I],B->coef[I],B->bucket_ring); \
21      B->coef[I]=NULL;                                                 \
22    }                                                                  \
23  } while(0)
24#else
25#define MULTIPLY_BUCKET(B,I)
26#endif
27#ifndef USE_COEF_BUCKETS
28LINKAGE void p_kBucketSetLm(kBucket_pt bucket)
29{
30  int j = 0;
31  poly lt;
32  BOOLEAN zero = FALSE;
33  ring r = bucket->bucket_ring;
34  assume(bucket->buckets[0] == NULL && bucket->buckets_length[0] == 0);
35  DECLARE_LENGTH(const unsigned long length = r->ExpL_Size);
36  DECLARE_ORDSGN(const long* ordsgn = r->ordsgn);
37  poly p;
38
39  do
40  {
41    j = 0;
42    for (int i = 1; i<=bucket->buckets_used; i++)
43    {
44      if (bucket->buckets[i] != NULL)
45      {
46        MULTIPLY_BUCKET(bucket,i);
47        p =  bucket->buckets[j];
48        if (j == 0)
49        {
50          if (p != NULL) goto Greater;
51          j = i;
52          goto Continue;
53        }
54        assume(p != NULL);
55        p_MemCmp(bucket->buckets[i]->exp, p->exp, length, ordsgn, goto Equal, goto Greater, goto Continue);
56
57        Greater:
58        {
59          if (n_IsZero(pGetCoeff(p), r))
60          {
61            n_Delete(&pGetCoeff(p), r);
62            pIter(bucket->buckets[j]);
63            p_FreeBinAddr(p, r);
64            (bucket->buckets_length[j])--;
65          }
66          j = i;
67          goto Continue;
68        }
69
70        Equal:
71        {
72          MULTIPLY_BUCKET(bucket,i);
73          number tn = pGetCoeff(p);
74          pSetCoeff0(p, n_Add(pGetCoeff(bucket->buckets[i]), tn, r));
75          n_Delete(&tn, r);
76          p = bucket->buckets[i];
77          pIter(bucket->buckets[i]);
78          n_Delete(&pGetCoeff(p), r);
79          p_FreeBinAddr(p, r);
80          (bucket->buckets_length[i])--;
81        }
82
83        Continue:;
84      }
85    }
86    p = bucket->buckets[j];
87    if (j > 0 && n_IsZero(pGetCoeff(p), r))
88    {
89      n_Delete(&pGetCoeff(p), r);
90      pIter(bucket->buckets[j]);
91      p_FreeBinAddr(p, r);
92      (bucket->buckets_length[j])--;
93      j = -1;
94    }
95  }
96  while (j < 0);
97
98  if (j == 0)
99  {
100    return;
101  }
102
103  assume(bucket->buckets[j] != NULL);
104  lt = bucket->buckets[j];
105  bucket->buckets[j] = pNext(lt);
106  bucket->buckets_length[j]--;
107  pNext(lt) = NULL;
108  bucket->buckets[0] = lt;
109  bucket->buckets_length[0] = 1;
110
111  kBucketAdjustBucketsUsed(bucket);
112}
113#else
114LINKAGE void p_kBucketSetLm(kBucket_pt bucket)
115{
116  //int j = 0;
117  poly lt;
118  BOOLEAN zero = FALSE;
119  ring r = bucket->bucket_ring;
120  assume((bucket->buckets[0] == NULL) && (bucket->buckets_length[0] == 0) && (bucket->coef[0]==0));
121  DECLARE_LENGTH(const unsigned long length = r->ExpL_Size);
122  DECLARE_ORDSGN(const long* ordsgn = r->ordsgn);
123  poly p=NULL;
124  while(p==NULL){
125      int found=-1000;
126       for (int i = 1; i<=bucket->buckets_used; i++)
127        {
128          if (bucket->buckets[i] != NULL)
129          {
130           
131            if (p == NULL)
132            {
133                p=bucket->buckets[i];
134                found=i;
135                continue;
136            }
137            assume(p != NULL);
138            p_MemCmp(bucket->buckets[i]->exp, p->exp, length, ordsgn, goto Continue, goto Greater, goto Continue);
139            //assume(p_LmCmp(bucket->buckets[i],p,r)==1);
140          Greater:
141            //if (p_LmCmp(bucket->buckets[i],p,r)!=1) continue;
142            found=i;
143            p=bucket->buckets[i];
144          Continue:;
145          }
146        }
147     
148     
149      if (found<0) return;
150      assume(p==bucket->buckets[found]);
151      assume(p!=NULL);
152     
153      p=kBucketExtractLmOfBucket(bucket, found);
154      assume(p!=NULL);
155      p_Test(p,r);
156      poly copy=p_LmInit(p, r);
157     
158      for (int i = found+1; i<=bucket->buckets_used; i++)
159        {
160         
161          if (bucket->buckets[i] != NULL)
162          {
163            if(p_LmEqual(bucket->buckets[i], copy,r)){
164                poly q=kBucketExtractLmOfBucket(bucket,i);
165                assume(p!=q);
166                p=p_Add_q(p, q,r);
167                assume(pLength(bucket->buckets[i])==bucket->buckets_length[i]);
168            }
169           
170   
171           
172          }
173        }
174        p_Delete(&copy, r);
175  }
176 
177  //assume(bucket->buckets[j] != NULL);
178  assume(pLength(p)==1);
179  lt = p;
180 
181  bucket->buckets[0] = lt;
182  bucket->buckets_length[0] = 1;
183
184  kBucketAdjustBucketsUsed(bucket);
185  kbTest(bucket);
186  }
187#endif
Note: See TracBrowser for help on using the repository browser.