source: git/factory/cfGcdUtil.cc @ 91695f

spielwiese
Last change on this file since 91695f was 03f640, checked in by Martin Lee <martinlee84@…>, 10 years ago
chg: added pruning of alg extensions
  • Property mode set to 100644
File size: 6.5 KB
Line 
1#include "config.h"
2
3#include "canonicalform.h"
4#include "cf_factory.h"
5#include "cf_reval.h"
6#include "cf_util.h"
7#include "cf_iter.h"
8#include "gfops.h"
9#include "cf_map_ext.h"
10#include "templates/ftmpl_functions.h"
11
12#ifdef HAVE_NTL
13#include "NTLconvert.h"
14#endif
15
16/// coprimality check
17bool
18gcd_test_one ( const CanonicalForm & f, const CanonicalForm & g, bool swap, int & d )
19{
20    d= 0;
21    int count = 0;
22    // assume polys have same level;
23
24    Variable v= Variable (1);
25    bool algExtension= (hasFirstAlgVar (f, v) || hasFirstAlgVar (g, v));
26    CanonicalForm lcf, lcg;
27    if ( swap )
28    {
29        lcf = swapvar( LC( f ), Variable(1), f.mvar() );
30        lcg = swapvar( LC( g ), Variable(1), f.mvar() );
31    }
32    else
33    {
34        lcf = LC( f, Variable(1) );
35        lcg = LC( g, Variable(1) );
36    }
37
38    CanonicalForm F, G;
39    if ( swap )
40    {
41        F=swapvar( f, Variable(1), f.mvar() );
42        G=swapvar( g, Variable(1), g.mvar() );
43    }
44    else
45    {
46        F = f;
47        G = g;
48    }
49
50    #define TEST_ONE_MAX 50
51    int p= getCharacteristic();
52    bool passToGF= false;
53    int k= 1;
54    bool extOfExt= false;
55    Variable v3;
56    if (p > 0 && p < TEST_ONE_MAX && CFFactory::gettype() != GaloisFieldDomain && !algExtension)
57    {
58      if (p == 2)
59        setCharacteristic (2, 6, 'Z');
60      else if (p == 3)
61        setCharacteristic (3, 4, 'Z');
62      else if (p == 5 || p == 7)
63        setCharacteristic (p, 3, 'Z');
64      else
65        setCharacteristic (p, 2, 'Z');
66      passToGF= true;
67    }
68    else if (p > 0 && CFFactory::gettype() == GaloisFieldDomain && ipower (p , getGFDegree()) < TEST_ONE_MAX)
69    {
70      k= getGFDegree();
71      if (ipower (p, 2*k) > TEST_ONE_MAX)
72        setCharacteristic (p, 2*k, gf_name);
73      else
74        setCharacteristic (p, 3*k, gf_name);
75      F= GFMapUp (F, k);
76      G= GFMapUp (G, k);
77      lcf= GFMapUp (lcf, k);
78      lcg= GFMapUp (lcg, k);
79    }
80    else if (p > 0 && p < TEST_ONE_MAX && algExtension)
81    {
82#ifdef HAVE_NTL
83      int d= degree (getMipo (v));
84      CFList source, dest;
85      Variable v2;
86      CanonicalForm primElem, imPrimElem;
87      if (p == 2 && d < 6)
88      {
89        if (fac_NTL_char != 2)
90        {
91          fac_NTL_char= 2;
92          zz_p::init (p);
93        }
94        bool primFail= false;
95        Variable vBuf;
96        primElem= primitiveElement (v, vBuf, primFail);
97        ASSERT (!primFail, "failure in integer factorizer");
98        if (d < 3)
99        {
100          zz_pX NTLIrredpoly;
101          BuildIrred (NTLIrredpoly, d*3);
102          CanonicalForm newMipo= convertNTLzzpX2CF (NTLIrredpoly, Variable (1));
103          v2= rootOf (newMipo);
104        }
105        else
106        {
107          zz_pX NTLIrredpoly;
108          BuildIrred (NTLIrredpoly, d*2);
109          CanonicalForm newMipo= convertNTLzzpX2CF (NTLIrredpoly, Variable (1));
110          v2= rootOf (newMipo);
111        }
112        imPrimElem= mapPrimElem (primElem, v, v2);
113        extOfExt= true;
114      }
115      else if ((p == 3 && d < 4) || ((p == 5 || p == 7) && d < 3))
116      {
117        if (fac_NTL_char != p)
118        {
119          fac_NTL_char= p;
120          zz_p::init (p);
121        }
122        bool primFail= false;
123        Variable vBuf;
124        primElem= primitiveElement (v, vBuf, primFail);
125        ASSERT (!primFail, "failure in integer factorizer");
126        zz_pX NTLIrredpoly;
127        BuildIrred (NTLIrredpoly, d*2);
128        CanonicalForm newMipo= convertNTLzzpX2CF (NTLIrredpoly, Variable (1));
129        v2= rootOf (newMipo);
130        imPrimElem= mapPrimElem (primElem, v, v2);
131        extOfExt= true;
132      }
133      if (extOfExt)
134      {
135        v3= v;
136        F= mapUp (F, v, v2, primElem, imPrimElem, source, dest);
137        G= mapUp (G, v, v2, primElem, imPrimElem, source, dest);
138        lcf= mapUp (lcf, v, v2, primElem, imPrimElem, source, dest);
139        lcg= mapUp (lcg, v, v2, primElem, imPrimElem, source, dest);
140        v= v2;
141      }
142#endif
143    }
144
145    CFRandom * sample;
146    if ((!algExtension && p > 0) || p == 0)
147      sample = CFRandomFactory::generate();
148    else
149      sample = AlgExtRandomF (v).clone();
150
151    REvaluation e( 2, tmax( f.level(), g.level() ), *sample );
152    delete sample;
153
154    if (passToGF)
155    {
156      lcf= lcf.mapinto();
157      lcg= lcg.mapinto();
158    }
159
160    CanonicalForm eval1, eval2;
161    if (passToGF)
162    {
163      eval1= e (lcf);
164      eval2= e (lcg);
165    }
166    else
167    {
168      eval1= e (lcf);
169      eval2= e (lcg);
170    }
171
172    while ( ( eval1.isZero() || eval2.isZero() ) && count < TEST_ONE_MAX )
173    {
174        e.nextpoint();
175        count++;
176        eval1= e (lcf);
177        eval2= e (lcg);
178    }
179    if ( count >= TEST_ONE_MAX )
180    {
181        if (passToGF)
182          setCharacteristic (p);
183        if (k > 1)
184          setCharacteristic (p, k, gf_name);
185        if (extOfExt)
186          prune1 (v3);
187        return false;
188    }
189
190
191    if (passToGF)
192    {
193      F= F.mapinto();
194      G= G.mapinto();
195      eval1= e (F);
196      eval2= e (G);
197    }
198    else
199    {
200      eval1= e (F);
201      eval2= e (G);
202    }
203
204    CanonicalForm c= gcd (eval1, eval2);
205    d= c.degree();
206    bool result= d < 1;
207    if (d < 0)
208      d= 0;
209
210    if (passToGF)
211      setCharacteristic (p);
212    if (k > 1)
213      setCharacteristic (p, k, gf_name);
214    if (extOfExt)
215      prune1 (v3);
216    return result;
217}
218
219/** static CanonicalForm balance_p ( const CanonicalForm & f, const CanonicalForm & q )
220 *
221 * balance_p() - map f from positive to symmetric representation
222 *   mod q.
223 *
224 * This makes sense for polynomials over Z only.
225 * q should be an integer.
226 *
227**/
228CanonicalForm
229balance_p ( const CanonicalForm & f, const CanonicalForm & q, const CanonicalForm & qh )
230{
231    Variable x = f.mvar();
232    CanonicalForm result = 0;
233    CanonicalForm c;
234    CFIterator i;
235    for ( i = f; i.hasTerms(); i++ )
236    {
237        c = i.coeff();
238        if ( c.inCoeffDomain())
239        {
240          if ( c > qh )
241            result += power( x, i.exp() ) * (c - q);
242          else
243            result += power( x, i.exp() ) * c;
244        }
245        else
246          result += power( x, i.exp() ) * balance_p(c,q,qh);
247    }
248    return result;
249}
250
251CanonicalForm
252balance_p ( const CanonicalForm & f, const CanonicalForm & q )
253{
254    CanonicalForm qh = q / 2;
255    return balance_p (f, q, qh);
256}
257
258
259/*static CanonicalForm
260balance ( const CanonicalForm & f, const CanonicalForm & q )
261{
262    Variable x = f.mvar();
263    CanonicalForm result = 0, qh = q / 2;
264    CanonicalForm c;
265    CFIterator i;
266    for ( i = f; i.hasTerms(); i++ ) {
267        c = mod( i.coeff(), q );
268        if ( c > qh )
269            result += power( x, i.exp() ) * (c - q);
270        else
271            result += power( x, i.exp() ) * c;
272    }
273    return result;
274}*/
Note: See TracBrowser for help on using the repository browser.