source: git/factory/FLINTconvert.cc @ 050d1b

spielwiese
Last change on this file since 050d1b was c2a8b6, checked in by Martin Lee <martinlee84@…>, 12 years ago
chg: set interface back to official FLINT 2.3.alpha2
  • Property mode set to 100644
File size: 7.7 KB
Line 
1/*****************************************************************************\
2 * Computer Algebra System SINGULAR
3\*****************************************************************************/
4/** @file FLINTconvert.cc
5 *
6 * This file implements functions for conversion to FLINT (www.flintlib.org)
7 * and back.
8 *
9 * @author Martin Lee
10 *
11 **/
12/*****************************************************************************/
13
14
15#include <config.h>
16
17#include "canonicalform.h"
18#include "fac_util.h"
19#include "cf_iter.h"
20#include "cf_factory.h"
21#include "gmpext.h"
22#include "singext.h"
23#include "cf_algorithm.h"
24
25#ifdef HAVE_FLINT
26#ifdef HAVE_CSTDIO
27#include <cstdio>
28#else
29#include <stdio.h>
30#endif
31#ifdef __cplusplus
32extern "C"
33{
34#endif
35#include <fmpz.h>
36#include <fmpq.h>
37#include <fmpz_poly.h>
38#include <fmpz_mod_poly.h>
39#include <nmod_poly.h>
40#include <fmpq_poly.h>
41#ifdef __cplusplus
42}
43#endif
44
45#include "FLINTconvert.h"
46
47void convertCF2Fmpz (fmpz_t result, const CanonicalForm& f)
48{
49  if (f.isImm())
50    fmpz_set_si (result, f.intval());
51  else
52  {
53    mpz_t gmp_val;
54    gmp_val[0]= *getmpi(f.getval());
55    fmpz_set_mpz (result, gmp_val);
56    mpz_clear (gmp_val);
57  }
58}
59
60void convertFacCF2Fmpz_poly_t (fmpz_poly_t result, const CanonicalForm& f)
61{
62  fmpz_poly_init2 (result, degree (f)+1);
63  _fmpz_poly_set_length(result, degree(f)+1);
64  for (CFIterator i= f; i.hasTerms(); i++)
65    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
66}
67
68CanonicalForm convertFmpz2CF (fmpz_t coefficient)
69{
70  if (fmpz_cmp_si (coefficient, MINIMMEDIATE) >= 0 && fmpz_cmp_si (coefficient, MAXIMMEDIATE) <= 0) //this should work with flint 2.3 now
71  {
72    long coeff= fmpz_get_si (coefficient);
73    return CanonicalForm (coeff);
74  }
75  else
76  {
77    mpz_t gmp_val;
78    mpz_init (gmp_val);
79    fmpz_get_mpz (gmp_val, coefficient);
80    CanonicalForm result= CanonicalForm (CFFactory::basic (gmp_val));
81    return result;
82  }
83
84  /*mpz_t gmp_val;
85  mpz_init (gmp_val);
86  fmpz_get_mpz (gmp_val, coefficient); //TODO fmpz_fits_si
87  if (mpz_is_imm (gmp_val)) //TODO for long
88  {
89    long coeff= mpz_get_si (gmp_val);
90    mpz_clear (gmp_val);
91    return CanonicalForm (coeff);
92  }
93
94  CanonicalForm result= CanonicalForm (CFFactory::basic (gmp_val));
95  return result;*/
96}
97
98CanonicalForm convertFmpz_poly_t2FacCF (fmpz_poly_t poly, const Variable& x)
99{
100  CanonicalForm result= 0;
101  fmpz* coeff;
102  for (int i= 0; i < fmpz_poly_length (poly); i++)
103  {
104    coeff= fmpz_poly_get_coeff_ptr (poly, i);
105    if (!fmpz_is_zero (coeff))
106      result += convertFmpz2CF (coeff)*power (x,i);
107  }
108  return result;
109}
110
111void convertFacCF2nmod_poly_t (nmod_poly_t result, const CanonicalForm& f)
112{
113  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
114  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
115  nmod_poly_init2 (result, getCharacteristic(), degree (f)+1);
116  for (CFIterator i= f; i.hasTerms(); i++)
117  {
118    CanonicalForm c= i.coeff();
119    if (!c.isImm()) c.mapinto(); //c%= getCharacteristic();
120    if (!c.isImm())
121    {  //This case will never happen if the characteristic is in fact a prime
122       // number, since all coefficients are represented as immediates
123       printf("convertCF2nmod_poly_t: coefficient not immediate!, char=%d\n",
124              getCharacteristic());
125    }
126    else
127      nmod_poly_set_coeff_ui (result, i.exp(), c.intval());
128  }
129  if (save_sym_ff) On (SW_SYMMETRIC_FF);
130}
131
132CanonicalForm convertnmod_poly_t2FacCF (nmod_poly_t poly, const Variable& x)
133{
134  CanonicalForm result= 0;
135  for (int i= 0; i < nmod_poly_length (poly); i++)
136  {
137    ulong coeff= nmod_poly_get_coeff_ui (poly, i);
138    if (!coeff == 0)
139      result += CanonicalForm (coeff)*power (x,i);
140  }
141  return result;
142}
143
144void convertCF2Fmpq (fmpq_t result, const CanonicalForm& f) //TODO wie oben bei CF2Fmpz
145{
146  ASSERT (isOn (SW_RATIONAL), "expected rational");
147  fmpz_t tmp1, tmp2;
148  fmpz_init (tmp1);
149  fmpz_init (tmp2);
150  if (f.isImm ())
151  {
152    fmpz_set_si (tmp1, f.num().intval());
153    fmpz_set_si (tmp2, f.den().intval());
154  }
155  else
156  {
157    mpz_t gmp_val;
158    gmp_numerator (f, gmp_val);
159    fmpz_set_mpz (tmp1, gmp_val);
160    mpz_clear (gmp_val);
161    gmp_denominator (f, gmp_val);
162    fmpz_set_mpz (tmp2, gmp_val);
163    mpz_clear (gmp_val);
164  }
165
166  fmpz_set (fmpq_numref (result), tmp1);
167  fmpz_set (fmpq_denref (result), tmp2);
168  fmpz_clear (tmp1);
169  fmpz_clear (tmp2);
170}
171
172CanonicalForm convertFmpq_t2CF (const fmpq_t q)
173{
174  ASSERT (isOn (SW_RATIONAL), "expected rational");
175  //TODO as for Fmpz check first if num and den are immediate
176
177  CanonicalForm num, den;
178  mpz_t nnum, nden;
179  mpz_init (nnum);
180  mpz_init (nden);
181  fmpz_get_mpz (nnum, fmpq_numref (q));
182  fmpz_get_mpz (nden, fmpq_denref (q));
183
184  if (mpz_is_imm (nnum) && mpz_is_imm (nden))
185  {
186    num= CanonicalForm (mpz_get_si(nnum));
187    den= CanonicalForm (mpz_get_si(nden));
188    mpz_clear (nnum);
189    mpz_clear (nden);
190    return num/den;
191  }
192  else
193    return make_cf (nnum, nden, false);
194}
195
196CanonicalForm convertFmpq_poly_t2FacCF (fmpq_poly_t p, const Variable& x)
197{
198#if 0
199  ASSERT (isOn (SW_RATIONAL), "expected poly over Q");
200  CanonicalForm den= convertFmpz2CF (fmpq_poly_denref (p));
201  fmpz_poly_t FLINTnum;
202  long n= fmpq_poly_length (p);
203  fmpz_poly_init2 (FLINTnum, fmpq_poly_length (p));
204
205  for (long i= 0; i < n; i++)
206    fmpz_set (FLINTnum->coeffs + i,fmpq_poly_numref (p) + i);
207  _fmpz_poly_set_length (FLINTnum, n);
208  CanonicalForm result= convertFmpz_poly_t2FacCF (FLINTnum, x);
209  fmpz_poly_clear (FLINTnum);
210  return result/den;
211#else
212  CanonicalForm result= 0;
213  fmpq_t coeff;
214  long n= fmpq_poly_length (p);
215  for (long i= 0; i < n; i++)
216  {
217    fmpq_init (coeff);
218    fmpq_poly_get_coeff_fmpq (coeff, p, i);
219    if (fmpq_is_zero (coeff))
220    {
221      fmpq_clear (coeff);
222      continue;
223    }
224    result += convertFmpq_t2CF (coeff)*power (x, i);
225    fmpq_clear (coeff);
226  }
227  return result;
228#endif
229}
230
231void convertFacCF2Fmpz_array (fmpz* result, const CanonicalForm& f)
232{
233  for (CFIterator i= f; i.hasTerms(); i++)
234    convertCF2Fmpz (&result[i.exp()], i.coeff());
235}
236
237//TODO multiply by bCommonDen and convertFacCF2Fmpz_poly_t
238void convertFacCF2Fmpq_poly_t (fmpq_poly_t result, const CanonicalForm& f)
239{
240  ASSERT (isOn (SW_RATIONAL), "expected poly over Q");
241
242  fmpq_poly_init2 (result, degree (f)+1);
243  _fmpq_poly_set_length (result, degree (f) + 1);
244  CanonicalForm den= bCommonDen (f);
245  convertFacCF2Fmpz_array (fmpq_poly_numref (result), f*den);
246  convertCF2Fmpz (fmpq_poly_denref (result), den);
247  /*fmpq_t coeff;
248  for (CFIterator i= f; i.hasTerms(); i++)
249  {
250    fmpq_init (coeff);
251    convertCF2Fmpq (coeff, i.coeff());
252    fmpq_poly_set_coeff_fmpq (result, i.exp(), coeff);
253    fmpq_clear (coeff);
254  }*/
255}
256
257CFFList
258convertFLINTnmod_poly_factor2FacCFFList (nmod_poly_factor_t fac,
259                                          mp_limb_t leadingCoeff,
260                                          const Variable& x
261                                         )
262{
263  CFFList result;
264  result.insert (CFFactor (CanonicalForm ((long) leadingCoeff), 1));
265
266  long i;
267
268  for (i = 0; i < fac->num_factors; i++)
269    result.append (CFFactor (convertnmod_poly_t2FacCF ((nmod_poly_t &)fac->factors[i],x),
270                             fac->exponents[i]));
271  return result;
272}
273
274void
275convertFacCF2Fmpz_mod_poly_t (fmpz_mod_poly_t result, const CanonicalForm& f,
276                              const fmpz_t p)
277{
278  fmpz_mod_poly_init2 (result, p, degree (f) + 1);
279  fmpz_poly_t buf;
280  convertFacCF2Fmpz_poly_t (buf, f);
281  fmpz_mod_poly_set_fmpz_poly (result, buf);
282  fmpz_poly_clear (buf);
283}
284
285CanonicalForm
286convertFmpz_mod_poly_t2FacCF (fmpz_mod_poly_t poly, const Variable& x,
287                              const modpk& b)
288{
289  fmpz_poly_t buf;
290  fmpz_poly_init (buf);
291  fmpz_mod_poly_get_fmpz_poly (buf, poly);
292  CanonicalForm result= convertFmpz_poly_t2FacCF (buf, x);
293  fmpz_poly_clear (buf);
294  return b (result);
295}
296
297#endif
298
299
Note: See TracBrowser for help on using the repository browser.