source: git/factory/FLINTconvert.cc @ aba90e8

spielwiese
Last change on this file since aba90e8 was 53568d, checked in by Martin Lee <martinlee84@…>, 11 years ago
chg: clean up of FLINT interface
  • Property mode set to 100644
File size: 8.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 "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#ifndef __GMP_BITS_PER_MP_LIMB
36#define __GMP_BITS_PER_MP_LIMB GMP_LIMB_BITS
37#endif
38#include <flint/fmpz.h>
39#include <flint/fmpq.h>
40#include <flint/fmpz_poly.h>
41#include <flint/fmpz_mod_poly.h>
42#include <flint/nmod_poly.h>
43#include <flint/fmpq_poly.h>
44#include <flint/nmod_mat.h>
45#include <flint/fmpz_mat.h>
46#ifdef __cplusplus
47}
48#endif
49
50#include "FLINTconvert.h"
51
52void convertCF2Fmpz (fmpz_t result, const CanonicalForm& f)
53{
54  if (f.isImm())
55    fmpz_set_si (result, f.intval());
56  else
57  {
58    mpz_t gmp_val;
59    f.mpzval(gmp_val);
60    fmpz_set_mpz (result, gmp_val);
61    mpz_clear (gmp_val);
62  }
63}
64
65void convertFacCF2Fmpz_poly_t (fmpz_poly_t result, const CanonicalForm& f)
66{
67  fmpz_poly_init2 (result, degree (f)+1);
68  _fmpz_poly_set_length(result, degree(f)+1);
69  for (CFIterator i= f; i.hasTerms(); i++)
70    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
71}
72
73CanonicalForm convertFmpz2CF (fmpz_t coefficient)
74{
75  if (fmpz_cmp_si (coefficient, MINIMMEDIATE) >= 0 &&
76      fmpz_cmp_si (coefficient, MAXIMMEDIATE) <= 0)
77  {
78    long coeff= fmpz_get_si (coefficient);
79    return CanonicalForm (coeff);
80  }
81  else
82  {
83    mpz_t gmp_val;
84    mpz_init (gmp_val);
85    fmpz_get_mpz (gmp_val, coefficient);
86    CanonicalForm result= CanonicalForm (CFFactory::basic (gmp_val));
87    return result;
88  }
89}
90
91CanonicalForm convertFmpz_poly_t2FacCF (fmpz_poly_t poly, const Variable& x)
92{
93  CanonicalForm result= 0;
94  fmpz* coeff;
95  for (int i= 0; i < fmpz_poly_length (poly); i++)
96  {
97    coeff= fmpz_poly_get_coeff_ptr (poly, i);
98    if (!fmpz_is_zero (coeff))
99      result += convertFmpz2CF (coeff)*power (x,i);
100  }
101  return result;
102}
103
104void convertFacCF2nmod_poly_t (nmod_poly_t result, const CanonicalForm& f)
105{
106  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
107  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
108  nmod_poly_init2 (result, getCharacteristic(), degree (f)+1);
109  for (CFIterator i= f; i.hasTerms(); i++)
110  {
111    CanonicalForm c= i.coeff();
112    if (!c.isImm()) c=c.mapinto(); //c%= getCharacteristic();
113    if (!c.isImm())
114    {  //This case will never happen if the characteristic is in fact a prime
115       // number, since all coefficients are represented as immediates
116       printf("convertCF2nmod_poly_t: coefficient not immediate!, char=%d\n",
117              getCharacteristic());
118    }
119    else
120      nmod_poly_set_coeff_ui (result, i.exp(), c.intval());
121  }
122  if (save_sym_ff) On (SW_SYMMETRIC_FF);
123}
124
125CanonicalForm convertnmod_poly_t2FacCF (nmod_poly_t poly, const Variable& x)
126{
127  CanonicalForm result= 0;
128  for (int i= 0; i < nmod_poly_length (poly); i++)
129  {
130    ulong coeff= nmod_poly_get_coeff_ui (poly, i);
131    if (!coeff == 0)
132      result += CanonicalForm ((long)coeff)*power (x,i);
133  }
134  return result;
135}
136
137void convertCF2Fmpq (fmpq_t result, const CanonicalForm& f)
138{
139  ASSERT (isOn (SW_RATIONAL), "expected rational");
140  fmpz_t tmp1, tmp2;
141  fmpz_init (tmp1);
142  fmpz_init (tmp2);
143  if (f.isImm ())
144  {
145    fmpz_set_si (tmp1, f.num().intval());
146    fmpz_set_si (tmp2, f.den().intval());
147  }
148  else
149  {
150    mpz_t gmp_val;
151    gmp_numerator (f, gmp_val);
152    fmpz_set_mpz (tmp1, gmp_val);
153    mpz_clear (gmp_val);
154    gmp_denominator (f, gmp_val);
155    fmpz_set_mpz (tmp2, gmp_val);
156    mpz_clear (gmp_val);
157  }
158
159  fmpz_set (fmpq_numref (result), tmp1);
160  fmpz_set (fmpq_denref (result), tmp2);
161  fmpz_clear (tmp1);
162  fmpz_clear (tmp2);
163}
164
165CanonicalForm convertFmpq_t2CF (const fmpq_t q)
166{
167  ASSERT (isOn (SW_RATIONAL), "expected rational");
168
169  CanonicalForm num, den;
170  mpz_t nnum, nden;
171  mpz_init (nnum);
172  mpz_init (nden);
173  fmpz_get_mpz (nnum, fmpq_numref (q));
174  fmpz_get_mpz (nden, fmpq_denref (q));
175
176  if (mpz_is_imm (nnum) && mpz_is_imm (nden))
177  {
178    num= CanonicalForm (mpz_get_si(nnum));
179    den= CanonicalForm (mpz_get_si(nden));
180    mpz_clear (nnum);
181    mpz_clear (nden);
182    return num/den;
183  }
184  else
185    return make_cf (nnum, nden, false);
186}
187
188CanonicalForm convertFmpq_poly_t2FacCF (fmpq_poly_t p, const Variable& x)
189{
190  CanonicalForm result= 0;
191  fmpq_t coeff;
192  long n= fmpq_poly_length (p);
193  for (long i= 0; i < n; i++)
194  {
195    fmpq_init (coeff);
196    fmpq_poly_get_coeff_fmpq (coeff, p, i);
197    if (fmpq_is_zero (coeff))
198    {
199      fmpq_clear (coeff);
200      continue;
201    }
202    result += convertFmpq_t2CF (coeff)*power (x, i);
203    fmpq_clear (coeff);
204  }
205  return result;
206}
207
208void convertFacCF2Fmpz_array (fmpz* result, const CanonicalForm& f)
209{
210  for (CFIterator i= f; i.hasTerms(); i++)
211    convertCF2Fmpz (&result[i.exp()], i.coeff());
212}
213
214void convertFacCF2Fmpq_poly_t (fmpq_poly_t result, const CanonicalForm& f)
215{
216  ASSERT (isOn (SW_RATIONAL), "expected poly over Q");
217
218  fmpq_poly_init2 (result, degree (f)+1);
219  _fmpq_poly_set_length (result, degree (f) + 1);
220  CanonicalForm den= bCommonDen (f);
221  convertFacCF2Fmpz_array (fmpq_poly_numref (result), f*den);
222  convertCF2Fmpz (fmpq_poly_denref (result), den);
223}
224
225CFFList
226convertFLINTnmod_poly_factor2FacCFFList (nmod_poly_factor_t fac,
227                                          mp_limb_t leadingCoeff,
228                                          const Variable& x
229                                         )
230{
231  CFFList result;
232  if (leadingCoeff != 1)
233    result.insert (CFFactor (CanonicalForm ((long) leadingCoeff), 1));
234
235  long i;
236
237  for (i = 0; i < fac->num; i++)
238    result.append (CFFactor (convertnmod_poly_t2FacCF ((nmod_poly_t &)fac->p[i],x),
239                             fac->exp[i]));
240  return result;
241}
242
243void
244convertFacCF2Fmpz_mod_poly_t (fmpz_mod_poly_t result, const CanonicalForm& f,
245                              const fmpz_t p)
246{
247  fmpz_mod_poly_init2 (result, p, degree (f) + 1);
248  fmpz_poly_t buf;
249  convertFacCF2Fmpz_poly_t (buf, f);
250  fmpz_mod_poly_set_fmpz_poly (result, buf);
251  fmpz_poly_clear (buf);
252}
253
254CanonicalForm
255convertFmpz_mod_poly_t2FacCF (fmpz_mod_poly_t poly, const Variable& x,
256                              const modpk& b)
257{
258  fmpz_poly_t buf;
259  fmpz_poly_init (buf);
260  fmpz_mod_poly_get_fmpz_poly (buf, poly);
261  CanonicalForm result= convertFmpz_poly_t2FacCF (buf, x);
262  fmpz_poly_clear (buf);
263  return b (result);
264}
265
266void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M, CFMatrix &m)
267{
268  fmpz_mat_init (M, (long) m.rows(), (long) m.columns());
269
270  int i,j;
271  for(i=m.rows();i>0;i--)
272  {
273    for(j=m.columns();j>0;j--)
274    {
275      convertCF2Fmpz (fmpz_mat_entry (M,i-1,j-1), m(i,j));
276    }
277  }
278}
279CFMatrix* convertFmpz_mat_t2FacCFMatrix(fmpz_mat_t m)
280{
281  CFMatrix *res=new CFMatrix(fmpz_mat_nrows (m),fmpz_mat_ncols (m));
282  int i,j;
283  for(i=res->rows();i>0;i--)
284  {
285    for(j=res->columns();j>0;j--)
286    {
287      (*res)(i,j)=convertFmpz2CF(fmpz_mat_entry (m,i-1,j-1));
288    }
289  }
290  return res;
291}
292
293void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M, CFMatrix &m)
294{
295  nmod_mat_init (M, (long) m.rows(), (long) m.columns(), getCharacteristic());
296
297  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
298  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
299  int i,j;
300  for(i=m.rows();i>0;i--)
301  {
302    for(j=m.columns();j>0;j--)
303    {
304      if(!(m(i,j)).isImm()) printf("convertFacCFMatrix2FLINTmat_zz_p: not imm.\n");
305      nmod_mat_entry (M,i-1,j-1)= (m(i,j)).intval();
306    }
307  }
308  if (save_sym_ff) On (SW_SYMMETRIC_FF);
309}
310
311CFMatrix* convertNmod_mat_t2FacCFMatrix(nmod_mat_t m)
312{
313  CFMatrix *res=new CFMatrix(nmod_mat_nrows (m), nmod_mat_ncols (m));
314  int i,j;
315  for(i=res->rows();i>0;i--)
316  {
317    for(j=res->columns();j>0;j--)
318    {
319      (*res)(i,j)=CanonicalForm((long) nmod_mat_entry (m, i-1, j-1));
320    }
321  }
322  return res;
323}
324
325#endif
326
327
Note: See TracBrowser for help on using the repository browser.