# source:git/factory/facFqFactorizeUtil.cc@7bf145

spielwiese
Last change on this file since 7bf145 was 7bf145, checked in by Martin Lee <martinlee84@…>, 13 years ago
new factorization over finite fields git-svn-id: file:///usr/local/Singular/svn/trunk@12873 2c84dea3-7e68-4137-9b89-c4e89433aadc
• Property mode set to `100644`
File size: 4.5 KB
Line
1/*****************************************************************************\
2 * Computer Algebra System SINGULAR
3\*****************************************************************************/
4/** @file facFqFactorizeUtil.cc
5 *
6 * This file provides utility functions for multivariate factorization
7 *
8 * @author Martin Lee
9 *
10 * @internal @version \\$Id\$
11 *
12 **/
13/*****************************************************************************/
14
15#include <config.h>
16
17#include "canonicalform.h"
18#include "cf_map.h"
19
20static inline
21void decompressAppend (CFList& factors1, const CFList& factors2, const CFMap& N)
22{
23  for (CFListIterator i= factors1; i.hasItem(); i++)
24    i.getItem()= N (i.getItem());
25  for (CFListIterator i= factors2; i.hasItem(); i++)
26    factors1.append (N (i.getItem()));
27  return;
28}
29
30static inline
31void appendSwap (CFList& factors1, const CFList& factors2, const int
32                  swapLevel1, const int swapLevel2, const Variable& x)
33{
34  for (CFListIterator i= factors2; i.hasItem(); i++)
35  {
36    if (swapLevel1)
37    {
38      if (swapLevel2)
39        factors1.append (swapvar (swapvar (i.getItem(), x,
40                         Variable (swapLevel2)), Variable (swapLevel1), x));
41      else
42        factors1.append (swapvar (i.getItem(), Variable (swapLevel1), x));
43    }
44    else
45    {
46      if (swapLevel2)
47        factors1.append (swapvar (i.getItem(), x, Variable (swapLevel2)));
48      else
49        factors1.append (i.getItem());
50    }
51  }
52  return;
53}
54
55static inline
56void swap (CFList& factors, const int swapLevel1, const int swapLevel2, const
57           Variable& x)
58{
59  for (CFListIterator i= factors; i.hasItem(); i++)
60  {
61    if (swapLevel1)
62    {
63      if (swapLevel2)
64        i.getItem()= swapvar (swapvar (i.getItem(), x, Variable (swapLevel2)),
65                              Variable (swapLevel1), x);
66      else
67        i.getItem()= swapvar (i.getItem(), Variable (swapLevel1), x);
68    }
69    else
70    {
71      if (swapLevel2)
72        i.getItem()= swapvar (i.getItem(), x, Variable (swapLevel2));
73    }
74  }
75  return;
76}
77
78static inline
79void appendSwapDecompress (CFList& factors1, const CFList& factors2,
80                             const CFMap& N, const int swapLevel, const
81                             Variable& x)
82{
83  for (CFListIterator i= factors1; i.hasItem(); i++)
84  {
85    if (swapLevel)
86      i.getItem()= swapvar (i.getItem(), Variable (swapLevel), x);
87    i.getItem()= N(i.getItem());
88  }
89  for (CFListIterator i= factors2; i.hasItem(); i++)
90  {
91    if (!i.getItem().inCoeffDomain())
92      factors1.append (N (i.getItem()));
93  }
94  return;
95}
96
97static inline
98void appendSwapDecompress (CFList& factors1, const CFList& factors2,
99                             const CFMap& N, const int swapLevel1,
100                             const int swapLevel2, const Variable& x)
101{
102  for (CFListIterator i= factors1; i.hasItem(); i++)
103  {
104    if (swapLevel1)
105    {
106      if (swapLevel2)
107        i.getItem()=
108        N (swapvar (swapvar (i.getItem(), Variable (swapLevel2), x), x,
109                    Variable (swapLevel1)));
110      else
111        i.getItem()= N (swapvar (i.getItem(), x, Variable (swapLevel1)));
112    }
113    else
114    {
115      if (swapLevel2)
116        i.getItem()= N (swapvar (i.getItem(), Variable (swapLevel2), x));
117      else
118        i.getItem()= N (i.getItem());
119    }
120  }
121  for (CFListIterator i= factors2; i.hasItem(); i++)
122  {
123    if (!i.getItem().inCoeffDomain())
124      factors1.append (N (i.getItem()));
125  }
126  return;
127}
128
129static inline
130int* liftingBounds (const CanonicalForm& A, const int& bivarLiftBound)
131{
132  int j= A.level() - 1;
133  int* liftBounds= new int [j];
134  liftBounds[0]= bivarLiftBound;
135  for (int i= 1; i < j; i++)
136  {
137    liftBounds[i]= degree (A, Variable (i + 2)) + 1 +
138                            degree (LC (A, 1), Variable (i + 2));
139  }
140  return liftBounds;
141}
142
143static inline
144CanonicalForm
145shift2Zero (const CanonicalForm& F, CFList& Feval, const CFList& evaluation)
146{
147  CanonicalForm A= F;
148  int k= A.level();
149  for (CFListIterator i= evaluation; i.hasItem(); i++, k--)
150    A= A (Variable (k) + i.getItem(), k);
151  CanonicalForm buf= A;
152  Feval= CFList();
153  Feval.append (buf);
154  for (k= A.level(); k > 2; k--)
155  {
156    buf= mod (buf, Variable (k));
157    Feval.insert (buf);
158  }
159  return A;
160}
161
162static inline
163CanonicalForm reverseShift (const CanonicalForm& F, const CFList& evaluation)
164{
165  int l= evaluation.length() + 1;
166  CanonicalForm result= F;
167  CFListIterator j= evaluation;
168  for (int i= l; i > 1; i--, j++)
169  {
170    if (F.level() < i)
171      continue;
172    result= result (Variable (i) - j.getItem(), i);
173  }
174  return result;
175}
176
177
Note: See TracBrowser for help on using the repository browser.