source: git/factory/FLINTconvert.cc @ c2aeb9

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