source: git/factory/cfGEval.cc @ 7d1c995

spielwiese
Last change on this file since 7d1c995 was 99ffd8, checked in by Martin Lee <martinlee84@…>, 13 years ago
added better way to create points in (Z/p)^n,(Z/p(alpha))^n and GF^n git-svn-id: file:///usr/local/Singular/svn/trunk@14041 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.9 KB
Line 
1#include <config.h>
2
3#include "cfGEval.h"
4#include "cf_generator.h"
5
6GEvaluation::GEvaluation( const GEvaluation & e )
7{
8    if ( e.gen == 0 )
9      gen = 0;
10    else
11    {
12      for (int i= 0; i < values.max() - values.min() + 1; i++)
13        delete gen[i];
14      delete [] gen;
15           
16      gen= new CFGenerator* [e.values.max() - e.values.min() + 1];
17      for (int i= 0; i < e.values.max() - e.values.min() + 1; i++)
18        gen[i] = e.gen[i]->clone();
19    }
20    values = e.values;
21}
22
23GEvaluation::GEvaluation (int min0, int max0, const CFGenerator & sample): Evaluation (min0, max0)
24{
25  gen= new CFGenerator* [max0 - min0 + 1];
26  for (int i= 0; i < max0 - min0 + 1; i++)
27    gen[i]= sample.clone(); 
28}
29
30GEvaluation::~GEvaluation()
31{
32    if ( gen != 0 )
33    {
34      for (int i= 0; i < values.max() - values.max() + 1; i++)
35        delete gen[i];
36      delete [] gen;
37    }
38}
39
40GEvaluation&
41GEvaluation::operator= ( const GEvaluation & e )
42{
43  if ( this != &e )
44  {
45    if (gen!=0)
46    {
47      for (int i= 0; i < values.max() - values.min() + 1; i++)
48        delete gen[i];
49      delete [] gen;
50    }
51    if ( e.gen == 0 )
52      gen = 0;
53    else
54    {
55      gen= new CFGenerator* [e.values.max() - e.values.min() + 1];
56      for (int i= 0; i < e.values.max() - e.values.min() + 1; i++)
57        gen[i] = e.gen[i]->clone();
58    }
59    values = e.values;
60  }
61  return *this;
62}
63
64void 
65GEvaluation::reset()
66{
67  int t= values.max();
68  int u= values.min();
69  for (int i= u; i <= t; i++)
70  {
71    values[i]= 0;
72    gen[i - u]->reset();
73  }
74}
75
76void 
77GEvaluation::init (int n)
78{
79  int t= values.max();
80  int u= values.min();
81  ASSERT (n <= t - u + 1, "wrong number of evaluation points");
82  for (int i= u; i <= u + n - 1; i++)
83  {
84    gen[i - u]->next();
85    values[i]= gen[i - u]->item();
86  }
87}
88
89bool 
90GEvaluation::nextpoint (int n) // n= number of non zero components
91{
92  int t= values.max();
93  int u= values.min();
94  ASSERT (n <= t - u + 1, "wrong number of evaluation points");
95  if (t - u + 1 < n) return false;
96  for (int i= u; i <= t; i++)
97  {
98    if (!values[i].isZero())
99    {
100      if (n == 1)
101      {
102        if (gen[i - u]->hasItems())
103        {
104          gen[i - u]->next();
105          values[i]= gen[i - u]->item();
106          return true;
107        }
108        else if (!gen [i - u]->hasItems() && i + 1 <= t)
109        {
110          gen[i - u]->reset();
111          gen[i + 1 - u]->next();
112          values[i + 1]= gen [i + 1 - u]->item();
113          values[i]= 0;
114          return true;
115        }
116        else return false;
117      }
118      int count= 1;
119      int j= i + 1;
120      while (j <= t && count < n)
121      {
122        if (!values [j].isZero())
123          count++;
124        j++;
125      }
126      if (j > t)
127      {
128        if (gen[j - 1 - u]->hasItems())
129        {
130          gen[j - 1 - u]->next();
131          values[j - 1]= gen[j - 1 - u]->item();
132          return true;
133        }
134        int count2= 0;
135        for (int k= j - 2; k >= i; k--)
136        {
137          if (!values[k].isZero() && !values[k + 1].isZero())
138            count2++;
139          if (!values[k].isZero() && !gen[k - u]->hasItems() &&
140              values[k + 1].isZero())
141          {
142            values[k]= 0;
143            gen[k - u]->reset();
144            gen[k - u + 1]->next();
145            values[k + 1]= gen[k - u + 1]->item();
146            if (count2 == 0)
147            {
148              gen[k - u + 2]->reset();
149              gen[k - u + 2]->next();
150              values[k + 2]= gen[k - u + 2]->item();
151            }
152            else
153            {
154              for (int index= 2; index <= count2 + 2 && k + index <= t; index++)
155              {
156                gen[k + index - u]-> reset();
157                gen[k + index - u]->next();
158                values[k + index]= gen[k + index - u]->item();
159              }
160            }
161            for (int index= k + count2 + 3; index <= t; index++)
162            {
163              gen[index - u]->reset();
164              values[index]= 0;
165            }
166            return true;
167          }
168          if (!values[k].isZero() && gen[k - u]->hasItems() &&
169              values[k + 1].isZero())
170          {
171            gen[k - u]->next();
172            values[k]= gen[k - u]->item();
173            gen[k - u + 1]->next();
174            values[k + 1]= gen[k - u + 1]->item();
175            if (count2 > 0)
176            {
177              for (int index= 2; index <= count2 + 1 && k + index <= t; index++)
178              {
179                gen[k + index - u]->reset();
180                gen[k + index - u]->next();
181                values[k + index]= gen[k + index - u]->item();
182              }
183            }
184            for (int index= k + count2 + 2; index <= t; index++)
185            {
186              gen[index - u]->reset();
187              values[index]= 0;
188            }
189            return true;
190          }
191          if (!values[k].isZero() && gen [k - u]->hasItems())
192          {
193            gen[k - u]->next();
194            values[k]= gen[k - u]->item();
195            gen[k - u + 1]->reset();
196            gen[k - u + 1]->next();
197            values[k + 1]= gen[k - u + 1]->item();
198            if (count2 > 0)
199            {
200              for (int index= 2; index <= count2 + 1 && k + index <= t; index++)
201              {
202                gen[k + index - u]->reset();
203                gen[k + index - u]->next();
204                values[k + index]= gen[k + index - u]->item();
205              }
206            }
207            for (int index= k + count2 + 2; index <= t; index++)
208            {
209              gen[index - u]->reset();
210              values[index]= 0;
211            }
212            return true;
213          }
214        }
215      }
216      else
217      {
218        if (gen[j - u - 1]->hasItems())
219        {
220          gen[j - 1 - u]->next();
221          values[j - 1]= gen[j - u - 1]->item();
222        }
223        else
224        {
225          gen[j - u - 1]->reset();
226          gen[j - u]->next();
227          values[j]= gen[j - u]->item();
228          values[j - 1]= 0;
229        }
230        return true;
231      }
232    }
233  }
234  // should never reach this
235  return false;
236}
237
Note: See TracBrowser for help on using the repository browser.