source: git/factory/facAbsFact.h @ 809d63

spielwiese
Last change on this file since 809d63 was 4553b1, checked in by Martin Lee <martinlee84@…>, 11 years ago
fix: univariate abs. factorization
  • Property mode set to 100644
File size: 4.5 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
23CFAFList absFactorizeMain (const CanonicalForm& F);
24
25static inline
26void normalize (CFAFList & L)
27{
28  for (CFAFListIterator i= L; i.hasItem(); i++)
29    i.getItem()= CFAFactor (i.getItem().factor()/Lc (i.getItem().factor()),
30                            i.getItem().minpoly(), i.getItem().exp());
31}
32
33static inline
34CFAFList uniAbsFactorize (const CanonicalForm& F)
35{
36  CFFList rationalFactors= factorize (F);
37  CFFListIterator i= rationalFactors;
38  i++;
39  Variable alpha;
40  CFAFList result;
41  CFFList QaFactors;
42  CFFListIterator iter;
43  for (; i.hasItem(); i++)
44  {
45    if (degree (i.getItem().factor()) == 1)
46    {
47      alpha= rootOf (Variable (1));
48      result.append (CFAFactor (i.getItem().factor(), getMipo (alpha),
49                                i.getItem().exp()));
50      continue;
51    }
52    alpha= rootOf (i.getItem().factor());
53    QaFactors= factorize (i.getItem().factor(), alpha);
54    iter= QaFactors;
55    if (iter.getItem().factor().inCoeffDomain())
56      iter++;
57    for (;iter.hasItem(); iter++)
58    {
59      if (degree (iter.getItem().factor()) == 1)
60      {
61        result.append (CFAFactor (iter.getItem().factor(), getMipo (alpha),
62                                  i.getItem().exp()));
63        break;
64      }
65    }
66  }
67  result.insert (CFAFactor (rationalFactors.getFirst().factor(), 1, 1));
68  return result;
69}
70
71/*BEGINPUBLIC*/
72
73CFAFList absFactorize (const CanonicalForm& G);
74
75/*ENDPUBLIC*/
76
77CFAFList absFactorize (const CanonicalForm& G)
78{
79  //TODO handle homogeneous input
80  ASSERT (getNumVars (F) == 2, "expected bivariate input");
81  ASSERT (getCharacteristic() == 0 && isOn (SW_RATIONAL),
82          "expected poly over Q");
83
84  CFMap N;
85  CanonicalForm F= compress (G, N);
86  bool isRat= isOn (SW_RATIONAL);
87  if (isRat)
88    F *= bCommonDen (F);
89
90  Off (SW_RATIONAL);
91  F /= icontent (F);
92  if (isRat)
93    On (SW_RATIONAL);
94
95  CanonicalForm contentX= content (F, 1);
96  CanonicalForm contentY= content (F, 2);
97  F /= (contentX*contentY);
98  CFAFList contentXFactors, contentYFactors;
99  contentXFactors= uniAbsFactorize (contentX);
100  contentYFactors= uniAbsFactorize (contentY);
101
102  if (contentXFactors.getFirst().factor().inCoeffDomain())
103    contentXFactors.removeFirst();
104  if (contentYFactors.getFirst().factor().inCoeffDomain())
105    contentYFactors.removeFirst();
106  if (F.inCoeffDomain())
107  {
108    CFAFList result;
109    for (CFAFListIterator i= contentXFactors; i.hasItem(); i++)
110      result.append (CFAFactor (N (i.getItem().factor()), i.getItem().minpoly(),
111                                i.getItem().exp()));
112    for (CFAFListIterator i= contentYFactors; i.hasItem(); i++)
113      result.append (CFAFactor (N (i.getItem().factor()),i.getItem().minpoly(),
114                                i.getItem().exp()));
115    normalize (result);
116    result.insert (CFAFactor (Lc (G), 1, 1));
117    return result;
118  }
119  CFFList rationalFactors= factorize (F);
120
121  CFAFList result, resultBuf;
122
123  CFAFListIterator iter;
124  CFFListIterator i= rationalFactors;
125  i++;
126  for (; i.hasItem(); i++)
127  {
128    resultBuf= absFactorizeMain (i.getItem().factor());
129    for (iter= resultBuf; iter.hasItem(); iter++)
130      iter.getItem()= CFAFactor (iter.getItem().factor(),
131                                 iter.getItem().minpoly(), i.getItem().exp());
132    result= Union (result, resultBuf);
133  }
134
135  for (CFAFListIterator i= result; i.hasItem(); i++)
136    i.getItem()= CFAFactor (N (i.getItem().factor()), i.getItem().minpoly(),
137                            i.getItem().exp());
138  for (CFAFListIterator i= contentXFactors; i.hasItem(); i++)
139    result.append (CFAFactor (N(i.getItem().factor()), i.getItem().minpoly(),
140                              i.getItem().exp()));
141  for (CFAFListIterator i= contentYFactors; i.hasItem(); i++)
142    result.append (CFAFactor (N(i.getItem().factor()), i.getItem().minpoly(),
143                              i.getItem().exp()));
144  normalize (result);
145  result.insert (CFAFactor (Lc(G), 1, 1));
146
147  return result;
148}
149
150#endif
Note: See TracBrowser for help on using the repository browser.