source: git/factory/facFqBivarUtil.cc @ 1372ae

spielwiese
Last change on this file since 1372ae was 1372ae, checked in by Hans Schoenemann <hannes@…>, 13 years ago
Variable(i) ->v.level() git-svn-id: file:///usr/local/Singular/svn/trunk@13666 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 8.4 KB
Line 
1/*****************************************************************************\
2 * Computer Algebra System SINGULAR
3\*****************************************************************************/
4/** @file facFqBivarUtil.cc
5 *
6 * This file provides utility functions for bivariate factorization
7 *
8 * @author Martin Lee
9 *
10 * @internal @version \$Id$
11 *
12 **/
13/*****************************************************************************/
14
15#include <config.h>
16
17#include "cf_map.h"
18#include "cf_map_ext.h"
19#include "ftmpl_functions.h"
20#include "ExtensionInfo.h"
21#include "cf_algorithm.h"
22#include "cf_factory.h"
23#include "cf_util.h"
24#include "imm.h"
25#include "cf_iter.h"
26#include "facFqBivarUtil.h"
27
28
29void append (CFList& factors1, const CFList& factors2)
30{
31  for (CFListIterator i= factors2; i.hasItem(); i++)
32  {
33    if (!i.getItem().inCoeffDomain())
34      factors1.append (i.getItem());
35  }
36  return;
37}
38
39void decompress (CFList& factors, const CFMap& N)
40{
41  for (CFListIterator i= factors; i.hasItem(); i++)
42    i.getItem()= N (i.getItem());
43  return;
44}
45
46void appendSwapDecompress (CFList& factors1, const CFList& factors2,
47                           const CFList& factors3, const bool swap1,
48                           const bool swap2, const CFMap& N)
49{
50  Variable x= Variable (1);
51  Variable y= Variable (2);
52  for (CFListIterator i= factors1; i.hasItem(); i++)
53  {
54    if (swap1)
55    {
56      if (!swap2)
57        i.getItem()= swapvar (i.getItem(), x, y);
58    }
59    else
60    {
61      if (swap2)
62        i.getItem()= swapvar (i.getItem(), y, x);
63    }
64    i.getItem()= N (i.getItem());
65  }
66  for (CFListIterator i= factors2; i.hasItem(); i++)
67    factors1.append (N (i.getItem()));
68  for (CFListIterator i= factors3; i.hasItem(); i++)
69    factors1.append (N (i.getItem()));
70  return;
71}
72
73void swapDecompress (CFList& factors, const bool swap, const CFMap& N)
74{
75  Variable x= Variable (1);
76  Variable y= Variable (2);
77  for (CFListIterator i= factors; i.hasItem(); i++)
78  {
79    if (swap)
80      i.getItem()= swapvar (i.getItem(), x, y);
81    i.getItem()= N (i.getItem());
82  }
83  return;
84}
85
86static inline
87bool GFInExtensionHelper (const CanonicalForm& F, const int number)
88{
89  if (F.isOne()) return false;
90  InternalCF* buf;
91  int exp;
92  bool result= false;
93  if (F.inBaseDomain())
94  {
95    buf= F.getval();
96    exp= imm2int (buf);
97    if (exp%number != 0)
98      return true;
99    else
100      return result;
101  }
102  else
103  {
104    for (CFIterator i= F; i.hasTerms(); i++)
105    {
106      result= GFInExtensionHelper (i.coeff(), number);
107      if (result == true)
108        return result;
109    }
110  }
111  return result;
112}
113
114static inline
115bool FqInExtensionHelper (const CanonicalForm& F, const CanonicalForm& gamma)
116{
117  bool result= false;
118  if (F.inBaseDomain())
119    return result;
120  else if (F.inCoeffDomain())
121  {
122    if (!fdivides (gamma, F))
123      return true;
124    else
125      return result;
126  }
127  else
128  {
129    for (CFIterator i= F; i.hasTerms(); i++)
130    {
131      result= FqInExtensionHelper (i.coeff(), gamma);
132      if (result == true)
133        return result;
134    }
135  }
136  return result;
137}
138
139bool isInExtension (const CanonicalForm& F, const CanonicalForm& gamma,
140                    const int k)
141{
142  bool result;
143  if (CFFactory::gettype() == GaloisFieldDomain)
144  {
145    int p= getCharacteristic();
146    int orderFieldExtension= ipower (p, getGFDegree()) - 1;
147    int order= ipower (p, k) - 1;
148    int number= orderFieldExtension/order;
149    result= GFInExtensionHelper (F, number);
150    return result;
151  }
152  else
153  {
154    result= FqInExtensionHelper (F, gamma);
155    return result;
156  }
157}
158
159CanonicalForm
160mapDown (const CanonicalForm& F, const ExtensionInfo& info, CFList& source,
161         CFList& dest)
162{
163  int k= info.getGFDegree();
164  Variable beta= info.getAlpha();
165  CanonicalForm primElem= info.getGamma();
166  CanonicalForm imPrimElem= info.getDelta();
167  if (k > 1)
168    return GFMapDown (F, k);
169  else if (k == 1)
170    return F;
171  else if (!k && beta == Variable (1))
172    return F;
173  else if (!k && beta != Variable (1))
174    return mapDown (F, primElem, imPrimElem, beta, source, dest);
175}
176
177void appendTestMapDown (CFList& factors, const CanonicalForm& f,
178                        const ExtensionInfo& info, CFList& source, CFList& dest)
179{
180  int k= info.getGFDegree();
181  Variable beta= info.getBeta();
182  Variable alpha= info.getAlpha();
183  CanonicalForm delta= info.getDelta();
184  CanonicalForm gamma= info.getGamma();
185  CanonicalForm g= f;
186  int degMipoBeta;
187  if (!k && beta.level() == 1)
188    degMipoBeta= 1;
189  else if (!k && beta.level() != 1)
190    degMipoBeta= degree (getMipo (beta));
191  if (k > 1)
192  {
193    if (!isInExtension (g, delta, k))
194    {
195      g= GFMapDown (g, k);
196      factors.append (g);
197    }
198  }
199  else if (k == 1)
200  {
201    if (!isInExtension (g, delta, k));
202      factors.append (g);
203  }
204  else if (!k && beta == Variable (1))
205  {
206    if (degree (g, alpha) < degMipoBeta)
207      factors.append (g);
208  }
209  else if (!k && beta != Variable (1))
210  {
211    if (!isInExtension (g, delta, k))
212    {
213      g= mapDown (g, gamma, delta, alpha, source, dest);
214      factors.append (g);
215    }
216  }
217  return;
218}
219
220void
221appendMapDown (CFList& factors, const CanonicalForm& g,
222               const ExtensionInfo& info, CFList& source, CFList& dest)
223{
224  int k= info.getGFDegree();
225  Variable beta= info.getBeta();
226  Variable alpha= info.getAlpha();
227  CanonicalForm gamma= info.getGamma();
228  CanonicalForm delta= info.getDelta();
229  if (k > 1)
230    factors.append (GFMapDown (g, k));
231  else if (k == 1)
232    factors.append (g);
233  else if (!k && beta == Variable (1))
234    factors.append (g);
235  else if (!k && beta != Variable (1))
236    factors.append (mapDown (g, gamma, delta, alpha, source, dest));
237  return;
238}
239
240void normalize (CFList& factors)
241{
242  for (CFListIterator i= factors; i.hasItem(); i++)
243    i.getItem() /= Lc(i.getItem());
244  return;
245}
246
247CFList subset (int index [], const int& s, const CFArray& elements,
248               bool& noSubset)
249{
250  int r= elements.size();
251  int i= 0;
252  CFList result;
253  noSubset= false;
254  if (index[s - 1] == 0)
255  {
256    while (i < s)
257    {
258      index[i]= i + 1;
259      result.append (elements[i]);
260      i++;
261    }
262    return result;
263  }
264  int buf;
265  int k;
266  bool found= false;
267  if (index[s - 1] == r)
268  {
269    if (index[0] == r - s + 1)
270    {
271      noSubset= true;
272      return result;
273    }
274    else {
275      while (found == false)
276      {
277        if (index[s - 2 - i] < r - i - 1)
278          found= true;
279        i++;
280      }
281      buf= index[s - i - 1];
282      k= 0;
283      while (s - i - 1 + k < s)
284      {
285        index[s - i - 1 + k]= buf + k + 1;
286        k++;
287      }
288    }
289    for (int j= 0; j < s; j++)
290      result.append (elements[index[j] - 1]);
291    return result;
292  }
293  else
294  {
295    index[s - 1] += 1;
296    for (int j= 0; j < s; j++)
297      result.append (elements[index[j] - 1]);
298    return result;
299  }
300}
301
302CFArray copy (const CFList& list)
303{
304  CFArray array= CFArray (list.length());
305  int j= 0;
306  for (CFListIterator i= list; i.hasItem(); i++, j++)
307    array[j]= i.getItem();
308  return array;
309}
310
311void indexUpdate (int index [], const int& subsetSize, const int& setSize,
312                   bool& noSubset)
313{
314  noSubset= false;
315  if (subsetSize > setSize)
316  {
317    noSubset= true;
318    return;
319  }
320  int v [setSize];
321  for (int i= 0; i < setSize; i++)
322    v[i]= index[i];
323  if (subsetSize == 1)
324  {
325    v[0]= v[0] - 1;
326    if (v[0] >= setSize)
327    {
328      noSubset= true;
329      return;
330    }
331  }
332  else
333  {
334    if (v[subsetSize - 1] - v[0] + 1 == subsetSize && v[0] > 1)
335    {
336      if (v[0] + subsetSize - 1 > setSize)
337      {
338        noSubset= true;
339        return;
340      }
341      v[0]= v[0] - 1;
342      for (int i= 1; i < subsetSize - 1; i++)
343        v[i]= v[i - 1] + 1;
344      v[subsetSize - 1]= v[subsetSize - 2];
345    }
346    else
347    {
348      if (v[0] + subsetSize - 1 > setSize)
349      {
350        noSubset= true;
351        return;
352      }
353      for (int i= 1; i < subsetSize - 1; i++)
354        v[i]= v[i - 1] + 1;
355      v[subsetSize - 1]= v[subsetSize - 2];
356    }
357  }
358  for (int i= 0; i < setSize; i++)
359    index[i]= v[i];
360  return;
361}
362
363int subsetDegree (const CFList& S)
364{
365  int result= 0;
366  for (CFListIterator i= S; i.hasItem(); i++)
367    result += degree (i.getItem(), Variable (1));
368  return result;
369}
370
371CFFList multiplicity (CanonicalForm& F, const CFList& factors)
372{
373  if (F.inCoeffDomain())
374    return CFFList (CFFactor (F, 1));
375  CFFList result;
376  int multi= 0;
377  for (CFListIterator i= factors; i.hasItem(); i++)
378  {
379    while (fdivides (i.getItem(), F))
380    {
381      multi++;
382      F /= i.getItem();
383    }
384    if (multi > 0)
385      result.append (CFFactor (i.getItem(), multi));
386    multi= 0;
387  }
388  return result;
389}
390
Note: See TracBrowser for help on using the repository browser.