source: git/factory/cfSubResGcd.cc @ 2ce3bf

spielwiese
Last change on this file since 2ce3bf was 03c742, checked in by Hans Schoenemann <hannes@…>, 4 years ago
factory: BuildIrred, FLINT/NTL seperation
  • Property mode set to 100644
File size: 5.8 KB
Line 
1#include "config.h"
2
3#include "cf_defs.h"
4#include "cf_algorithm.h"
5#include "cfEzgcd.h"
6#include "cfGcdUtil.h"
7#include "templates/ftmpl_functions.h"
8#include "cf_factory.h"
9#include "cfUnivarGcd.h"
10
11CanonicalForm
12subResGCD_p( const CanonicalForm & f, const CanonicalForm & g )
13{
14    if (f.inCoeffDomain() || g.inCoeffDomain()) //zero case should be caught by gcd
15      return 1;
16    CanonicalForm pi, pi1;
17    CanonicalForm C, Ci, Ci1, Hi, bi, pi2;
18    bool bpure, ezgcdon= isOn (SW_USE_EZGCD_P);
19    int delta = degree( f ) - degree( g );
20
21    if ( delta >= 0 )
22    {
23        pi = f; pi1 = g;
24    }
25    else
26    {
27        pi = g; pi1 = f; delta = -delta;
28    }
29    if (pi.isUnivariate())
30      Ci= 1;
31    else
32    {
33      if (!ezgcdon)
34        On (SW_USE_EZGCD_P);
35      Ci = content( pi );
36      if (!ezgcdon)
37        Off (SW_USE_EZGCD_P);
38      pi = pi / Ci;
39    }
40    if (pi1.isUnivariate())
41      Ci1= 1;
42    else
43    {
44      if (!ezgcdon)
45        On (SW_USE_EZGCD_P);
46      Ci1 = content( pi1 );
47      if (!ezgcdon)
48        Off (SW_USE_EZGCD_P);
49      pi1 = pi1 / Ci1;
50    }
51    C = gcd( Ci, Ci1 );
52    int d= 0;
53    #ifdef HAVE_NTL // gcd_test_one, primitiveElement
54    if ( !( pi.isUnivariate() && pi1.isUnivariate() ) )
55    {
56        if ( gcd_test_one( pi1, pi, true, d ) )
57        {
58          C=abs(C);
59          //out_cf("GCD:",C,"\n");
60          return C;
61        }
62        bpure = false;
63    }
64    else
65    #endif
66    {
67        bpure = isPurePoly(pi) && isPurePoly(pi1);
68#ifdef HAVE_FLINT
69        if (bpure && (CFFactory::gettype() != GaloisFieldDomain))
70          return gcd_univar_flintp(pi,pi1)*C;
71#else
72#ifdef HAVE_NTL
73        if (bpure && (CFFactory::gettype() != GaloisFieldDomain))
74            return gcd_univar_ntlp(pi, pi1 ) * C;
75#endif
76#endif
77    }
78    Variable v = f.mvar();
79    Hi = power( LC( pi1, v ), delta );
80    int maxNumVars= tmax (getNumVars (pi), getNumVars (pi1));
81
82    if (!(pi.isUnivariate() && pi1.isUnivariate()))
83    {
84      if (size (Hi)*size (pi)/(maxNumVars*3) > 500) //maybe this needs more tuning
85      {
86        On (SW_USE_FF_MOD_GCD);
87        C *= gcd (pi, pi1);
88        Off (SW_USE_FF_MOD_GCD);
89        return C;
90      }
91    }
92
93    if ( (delta+1) % 2 )
94        bi = 1;
95    else
96        bi = -1;
97    CanonicalForm oldPi= pi, oldPi1= pi1, powHi;
98    while ( degree( pi1, v ) > 0 )
99    {
100        if (!(pi.isUnivariate() && pi1.isUnivariate()))
101        {
102          if (size (pi)/maxNumVars > 500 || size (pi1)/maxNumVars > 500)
103          {
104            On (SW_USE_FF_MOD_GCD);
105            C *= gcd (oldPi, oldPi1);
106            Off (SW_USE_FF_MOD_GCD);
107            return C;
108          }
109        }
110        pi2 = psr( pi, pi1, v );
111        pi2 = pi2 / bi;
112        pi = pi1; pi1 = pi2;
113        maxNumVars= tmax (getNumVars (pi), getNumVars (pi1));
114        if (!pi1.isUnivariate() && (size (pi1)/maxNumVars > 500))
115        {
116            On (SW_USE_FF_MOD_GCD);
117            C *= gcd (oldPi, oldPi1);
118            Off (SW_USE_FF_MOD_GCD);
119            return C;
120        }
121        if ( degree( pi1, v ) > 0 )
122        {
123            delta = degree( pi, v ) - degree( pi1, v );
124            powHi= power (Hi, delta-1);
125            if ( (delta+1) % 2 )
126                bi = LC( pi, v ) * powHi*Hi;
127            else
128                bi = -LC( pi, v ) * powHi*Hi;
129            Hi = power( LC( pi1, v ), delta ) / powHi;
130            if (!(pi.isUnivariate() && pi1.isUnivariate()))
131            {
132              if (size (Hi)*size (pi)/(maxNumVars*3) > 1500) //maybe this needs more tuning
133              {
134                On (SW_USE_FF_MOD_GCD);
135                C *= gcd (oldPi, oldPi1);
136                Off (SW_USE_FF_MOD_GCD);
137                return C;
138              }
139            }
140        }
141    }
142    if ( degree( pi1, v ) == 0 )
143    {
144      C=abs(C);
145      //out_cf("GCD:",C,"\n");
146      return C;
147    }
148    if (!pi.isUnivariate())
149    {
150      if (!ezgcdon)
151        On (SW_USE_EZGCD_P);
152      Ci= gcd (LC (oldPi,v), LC (oldPi1,v));
153      pi /= LC (pi,v)/Ci;
154      Ci= content (pi);
155      pi /= Ci;
156      if (!ezgcdon)
157        Off (SW_USE_EZGCD_P);
158    }
159    if ( bpure )
160        pi /= pi.lc();
161    C=abs(C*pi);
162    //out_cf("GCD:",C,"\n");
163    return C;
164}
165
166CanonicalForm
167subResGCD_0( const CanonicalForm & f, const CanonicalForm & g )
168{
169    CanonicalForm pi, pi1;
170    CanonicalForm C, Ci, Ci1, Hi, bi, pi2;
171    int delta = degree( f ) - degree( g );
172
173    if ( delta >= 0 )
174    {
175        pi = f; pi1 = g;
176    }
177    else
178    {
179        pi = g; pi1 = f; delta = -delta;
180    }
181    Ci = content( pi ); Ci1 = content( pi1 );
182    pi1 = pi1 / Ci1; pi = pi / Ci;
183    C = gcd( Ci, Ci1 );
184    int d= 0;
185    if ( pi.isUnivariate() && pi1.isUnivariate() )
186    {
187#ifdef HAVE_FLINT
188        if (isPurePoly(pi) && isPurePoly(pi1) )
189            return gcd_univar_flint0(pi, pi1 ) * C;
190#else
191#ifdef HAVE_NTL
192        if (isPurePoly(pi) && isPurePoly(pi1) )
193            return gcd_univar_ntl0(pi, pi1 ) * C;
194#endif
195#endif
196#ifndef HAVE_NTL
197        return gcd_poly_univar0( pi, pi1, true ) * C;
198#endif
199    }
200    #ifdef HAVE__NTL // gcd_test_one, primitievElement
201    else if ( gcd_test_one( pi1, pi, true, d ) )
202      return C;
203    #else
204    else if (gcd(pi1,pi)==1)
205      return C;
206    #endif
207    Variable v = f.mvar();
208    Hi = power( LC( pi1, v ), delta );
209    if ( (delta+1) % 2 )
210        bi = 1;
211    else
212        bi = -1;
213    while ( degree( pi1, v ) > 0 )
214    {
215        pi2 = psr( pi, pi1, v );
216        pi2 = pi2 / bi;
217        pi = pi1; pi1 = pi2;
218        if ( degree( pi1, v ) > 0 )
219        {
220            delta = degree( pi, v ) - degree( pi1, v );
221            if ( (delta+1) % 2 )
222                bi = LC( pi, v ) * power( Hi, delta );
223            else
224                bi = -LC( pi, v ) * power( Hi, delta );
225            Hi = power( LC( pi1, v ), delta ) / power( Hi, delta-1 );
226        }
227    }
228    if ( degree( pi1, v ) == 0 )
229        return C;
230    else
231        return C * pp( pi );
232}
Note: See TracBrowser for help on using the repository browser.