source: git/factory/facAbsFact.h @ 247b0f

fieker-DuValspielwiese
Last change on this file since 247b0f was 386b3d, checked in by Martin Lee <martinlee84@…>, 11 years ago
chg: some simplifications
  • Property mode set to 100644
File size: 5.8 KB
Line 
1/*****************************************************************************\
2 * Computer Algebra System SINGULAR
3\*****************************************************************************/
4/** @file facAbsFact.h
5 *
6 * bivariate absolute factorization over Q described in "Modular Las Vegas
7 * Algorithms for Polynomial Absolute Factorization" by Bertone, ChÚze, Galligo
8 *
9 * @author Martin Lee
10 *
11 **/
12/*****************************************************************************/
13
14#ifndef FAC_ABS_FACT_H
15#define FAC_ABS_FACT_H
16
17#include "assert.h"
18
19#include "canonicalform.h"
20#include "cf_map.h"
21#include "cfNewtonPolygon.h"
22
23/// main absolute factorization routine, expects bivariate poly which is
24/// primitive wrt. any of its variables and irreducible over Q
25///
26/// @return absFactorizeMain returns a list whose entries contain three entities:
27///         an absolute irreducible factor, an irreducible univariate polynomial
28///         that defines the minimal field extension over which the irreducible
29///         factor is defined and the multiplicity of the absolute irreducible
30///         factor
31CFAFList absFactorizeMain (const CanonicalForm& F ///<[in] s.a.
32                          );
33
34
35/// normalize factors, i.e. make factors monic
36static inline
37void normalize (CFAFList & L)
38{
39  for (CFAFListIterator i= L; i.hasItem(); i++)
40    i.getItem()= CFAFactor (i.getItem().factor()/Lc (i.getItem().factor()),
41                            i.getItem().minpoly(), i.getItem().exp());
42}
43
44/// univariate absolute factorization over Q
45///
46/// @return uniAbsFactorize returns a list whose entries contain three entities:
47///         an absolute irreducible factor, an irreducible univariate polynomial
48///         that defines the minimal field extension over which the irreducible
49///         factor is defined and the multiplicity of the absolute irreducible
50///         factor
51static inline
52CFAFList uniAbsFactorize (const CanonicalForm& F ///<[in] univariate poly over Q
53                         )
54{
55  CFFList rationalFactors= factorize (F);
56  CFFListIterator i= rationalFactors;
57  i++;
58  Variable alpha;
59  CFAFList result;
60  CFFList QaFactors;
61  CFFListIterator iter;
62  for (; i.hasItem(); i++)
63  {
64    if (degree (i.getItem().factor()) == 1)
65    {
66      result.append (CFAFactor (i.getItem().factor(), 1, i.getItem().exp()));
67      continue;
68    }
69    alpha= rootOf (i.getItem().factor());
70    QaFactors= factorize (i.getItem().factor(), alpha);
71    iter= QaFactors;
72    if (iter.getItem().factor().inCoeffDomain())
73      iter++;
74    for (;iter.hasItem(); iter++)
75    {
76      if (degree (iter.getItem().factor()) == 1)
77      {
78        result.append (CFAFactor (iter.getItem().factor(), getMipo (alpha),
79                                  i.getItem().exp()));
80        break;
81      }
82    }
83  }
84  result.insert (CFAFactor (rationalFactors.getFirst().factor(), 1, 1));
85  return result;
86}
87
88/*BEGINPUBLIC*/
89
90CFAFList absFactorize (const CanonicalForm& G);
91
92/*ENDPUBLIC*/
93
94/// absolute factorization of bivariate poly over Q
95///
96/// @return absFactorize returns a list whose entries contain three entities:
97///         an absolute irreducible factor, an irreducible univariate polynomial
98///         that defines the minimal field extension over which the irreducible
99///         factor is defined and the multiplicity of the absolute irreducible
100///         factor
101CFAFList absFactorize (const CanonicalForm& G ///<[in] bivariate poly over Q
102                      )
103{
104  //TODO handle homogeneous input
105  ASSERT (getNumVars (F) == 2, "expected bivariate input");
106  ASSERT (getCharacteristic() == 0 && isOn (SW_RATIONAL),
107          "expected poly over Q");
108
109  CFMap N;
110  CanonicalForm F= compress (G, N);
111  bool isRat= isOn (SW_RATIONAL);
112  if (isRat)
113    F *= bCommonDen (F);
114
115  Off (SW_RATIONAL);
116  F /= icontent (F);
117  if (isRat)
118    On (SW_RATIONAL);
119
120  CanonicalForm contentX= content (F, 1);
121  CanonicalForm contentY= content (F, 2);
122  F /= (contentX*contentY);
123  CFAFList contentXFactors, contentYFactors;
124  contentXFactors= uniAbsFactorize (contentX);
125  contentYFactors= uniAbsFactorize (contentY);
126
127  if (contentXFactors.getFirst().factor().inCoeffDomain())
128    contentXFactors.removeFirst();
129  if (contentYFactors.getFirst().factor().inCoeffDomain())
130    contentYFactors.removeFirst();
131  if (F.inCoeffDomain())
132  {
133    CFAFList result;
134    for (CFAFListIterator i= contentXFactors; i.hasItem(); i++)
135      result.append (CFAFactor (N (i.getItem().factor()), i.getItem().minpoly(),
136                                i.getItem().exp()));
137    for (CFAFListIterator i= contentYFactors; i.hasItem(); i++)
138      result.append (CFAFactor (N (i.getItem().factor()),i.getItem().minpoly(),
139                                i.getItem().exp()));
140    normalize (result);
141    result.insert (CFAFactor (Lc (G), 1, 1));
142    return result;
143  }
144  CFFList rationalFactors= factorize (F);
145
146  CFAFList result, resultBuf;
147
148  CFAFListIterator iter;
149  CFFListIterator i= rationalFactors;
150  i++;
151  for (; i.hasItem(); i++)
152  {
153    resultBuf= absFactorizeMain (i.getItem().factor());
154    for (iter= resultBuf; iter.hasItem(); iter++)
155      iter.getItem()= CFAFactor (iter.getItem().factor(),
156                                 iter.getItem().minpoly(), i.getItem().exp());
157    result= Union (result, resultBuf);
158  }
159
160  for (CFAFListIterator i= result; i.hasItem(); i++)
161    i.getItem()= CFAFactor (N (i.getItem().factor()), i.getItem().minpoly(),
162                            i.getItem().exp());
163  for (CFAFListIterator i= contentXFactors; i.hasItem(); i++)
164    result.append (CFAFactor (N(i.getItem().factor()), i.getItem().minpoly(),
165                              i.getItem().exp()));
166  for (CFAFListIterator i= contentYFactors; i.hasItem(); i++)
167    result.append (CFAFactor (N(i.getItem().factor()), i.getItem().minpoly(),
168                              i.getItem().exp()));
169  normalize (result);
170  result.insert (CFAFactor (Lc(G), 1, 1));
171
172  return result;
173}
174
175#endif
Note: See TracBrowser for help on using the repository browser.