source: git/factory/cfSubResGcd.cc @ 96ce32

spielwiese
Last change on this file since 96ce32 was 8c73aaf, checked in by Hans Schoenemann <hannes@…>, 4 years ago
use flint, comment unused stuff
  • Property mode set to 100644
File size: 5.7 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    #ifdef HAVE_NTL // gcd_test_one, primitiveElement
53    int d= 0;
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    if ( pi.isUnivariate() && pi1.isUnivariate() )
185    {
186#ifdef HAVE_FLINT
187        if (isPurePoly(pi) && isPurePoly(pi1) )
188            return gcd_univar_flint0(pi, pi1 ) * C;
189#else
190#ifdef HAVE_NTL
191        if (isPurePoly(pi) && isPurePoly(pi1) )
192            return gcd_univar_ntl0(pi, pi1 ) * C;
193#endif
194#endif
195#ifndef HAVE_NTL
196        return gcd_poly_univar0( pi, pi1, true ) * C;
197#endif
198    }
199    #ifdef HAVE__NTL // gcd_test_one, primitievElement
200    else if ( gcd_test_one( pi1, pi, true, d ) )
201      return C;
202    #else
203    else if (gcd(pi1,pi)==1)
204      return C;
205    #endif
206    Variable v = f.mvar();
207    Hi = power( LC( pi1, v ), delta );
208    if ( (delta+1) % 2 )
209        bi = 1;
210    else
211        bi = -1;
212    while ( degree( pi1, v ) > 0 )
213    {
214        pi2 = psr( pi, pi1, v );
215        pi2 = pi2 / bi;
216        pi = pi1; pi1 = pi2;
217        if ( degree( pi1, v ) > 0 )
218        {
219            delta = degree( pi, v ) - degree( pi1, v );
220            if ( (delta+1) % 2 )
221                bi = LC( pi, v ) * power( Hi, delta );
222            else
223                bi = -LC( pi, v ) * power( Hi, delta );
224            Hi = power( LC( pi1, v ), delta ) / power( Hi, delta-1 );
225        }
226    }
227    if ( degree( pi1, v ) == 0 )
228        return C;
229    else
230        return C * pp( pi );
231}
Note: See TracBrowser for help on using the repository browser.