source: git/factory/FLINTconvert.cc @ 692aed

spielwiese
Last change on this file since 692aed was 692aed, checked in by Martin Lee <martinlee84@…>, 12 years ago
chg: added conversion of matrices to FLINT matrices
  • Property mode set to 100644
File size: 9.2 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    gmp_val[0]= *getmpi(f.getval());
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 && fmpz_cmp_si (coefficient, MAXIMMEDIATE) <= 0) //this should work with flint 2.3 now
76  {
77    long coeff= fmpz_get_si (coefficient);
78    return CanonicalForm (coeff);
79  }
80  else
81  {
82    mpz_t gmp_val;
83    mpz_init (gmp_val);
84    fmpz_get_mpz (gmp_val, coefficient);
85    CanonicalForm result= CanonicalForm (CFFactory::basic (gmp_val));
86    return result;
87  }
88
89  /*mpz_t gmp_val;
90  mpz_init (gmp_val);
91  fmpz_get_mpz (gmp_val, coefficient); //TODO fmpz_fits_si
92  if (mpz_is_imm (gmp_val)) //TODO for long
93  {
94    long coeff= mpz_get_si (gmp_val);
95    mpz_clear (gmp_val);
96    return CanonicalForm (coeff);
97  }
98
99  CanonicalForm result= CanonicalForm (CFFactory::basic (gmp_val));
100  return result;*/
101}
102
103CanonicalForm convertFmpz_poly_t2FacCF (fmpz_poly_t poly, const Variable& x)
104{
105  CanonicalForm result= 0;
106  fmpz* coeff;
107  for (int i= 0; i < fmpz_poly_length (poly); i++)
108  {
109    coeff= fmpz_poly_get_coeff_ptr (poly, i);
110    if (!fmpz_is_zero (coeff))
111      result += convertFmpz2CF (coeff)*power (x,i);
112  }
113  return result;
114}
115
116void convertFacCF2nmod_poly_t (nmod_poly_t result, const CanonicalForm& f)
117{
118  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
119  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
120  nmod_poly_init2 (result, getCharacteristic(), degree (f)+1);
121  for (CFIterator i= f; i.hasTerms(); i++)
122  {
123    CanonicalForm c= i.coeff();
124    if (!c.isImm()) c.mapinto(); //c%= getCharacteristic();
125    if (!c.isImm())
126    {  //This case will never happen if the characteristic is in fact a prime
127       // number, since all coefficients are represented as immediates
128       printf("convertCF2nmod_poly_t: coefficient not immediate!, char=%d\n",
129              getCharacteristic());
130    }
131    else
132      nmod_poly_set_coeff_ui (result, i.exp(), c.intval());
133  }
134  if (save_sym_ff) On (SW_SYMMETRIC_FF);
135}
136
137CanonicalForm convertnmod_poly_t2FacCF (nmod_poly_t poly, const Variable& x)
138{
139  CanonicalForm result= 0;
140  for (int i= 0; i < nmod_poly_length (poly); i++)
141  {
142    ulong coeff= nmod_poly_get_coeff_ui (poly, i);
143    if (!coeff == 0)
144      result += CanonicalForm ((long)coeff)*power (x,i);
145  }
146  return result;
147}
148
149void convertCF2Fmpq (fmpq_t result, const CanonicalForm& f) //TODO wie oben bei CF2Fmpz
150{
151  ASSERT (isOn (SW_RATIONAL), "expected rational");
152  fmpz_t tmp1, tmp2;
153  fmpz_init (tmp1);
154  fmpz_init (tmp2);
155  if (f.isImm ())
156  {
157    fmpz_set_si (tmp1, f.num().intval());
158    fmpz_set_si (tmp2, f.den().intval());
159  }
160  else
161  {
162    mpz_t gmp_val;
163    gmp_numerator (f, gmp_val);
164    fmpz_set_mpz (tmp1, gmp_val);
165    mpz_clear (gmp_val);
166    gmp_denominator (f, gmp_val);
167    fmpz_set_mpz (tmp2, gmp_val);
168    mpz_clear (gmp_val);
169  }
170
171  fmpz_set (fmpq_numref (result), tmp1);
172  fmpz_set (fmpq_denref (result), tmp2);
173  fmpz_clear (tmp1);
174  fmpz_clear (tmp2);
175}
176
177CanonicalForm convertFmpq_t2CF (const fmpq_t q)
178{
179  ASSERT (isOn (SW_RATIONAL), "expected rational");
180  //TODO as for Fmpz check first if num and den are immediate
181
182  CanonicalForm num, den;
183  mpz_t nnum, nden;
184  mpz_init (nnum);
185  mpz_init (nden);
186  fmpz_get_mpz (nnum, fmpq_numref (q));
187  fmpz_get_mpz (nden, fmpq_denref (q));
188
189  if (mpz_is_imm (nnum) && mpz_is_imm (nden))
190  {
191    num= CanonicalForm (mpz_get_si(nnum));
192    den= CanonicalForm (mpz_get_si(nden));
193    mpz_clear (nnum);
194    mpz_clear (nden);
195    return num/den;
196  }
197  else
198    return make_cf (nnum, nden, false);
199}
200
201CanonicalForm convertFmpq_poly_t2FacCF (fmpq_poly_t p, const Variable& x)
202{
203#if 0
204  ASSERT (isOn (SW_RATIONAL), "expected poly over Q");
205  CanonicalForm den= convertFmpz2CF (fmpq_poly_denref (p));
206  fmpz_poly_t FLINTnum;
207  long n= fmpq_poly_length (p);
208  fmpz_poly_init2 (FLINTnum, fmpq_poly_length (p));
209
210  for (long i= 0; i < n; i++)
211    fmpz_set (FLINTnum->coeffs + i,fmpq_poly_numref (p) + i);
212  _fmpz_poly_set_length (FLINTnum, n);
213  CanonicalForm result= convertFmpz_poly_t2FacCF (FLINTnum, x);
214  fmpz_poly_clear (FLINTnum);
215  return result/den;
216#else
217  CanonicalForm result= 0;
218  fmpq_t coeff;
219  long n= fmpq_poly_length (p);
220  for (long i= 0; i < n; i++)
221  {
222    fmpq_init (coeff);
223    fmpq_poly_get_coeff_fmpq (coeff, p, i);
224    if (fmpq_is_zero (coeff))
225    {
226      fmpq_clear (coeff);
227      continue;
228    }
229    result += convertFmpq_t2CF (coeff)*power (x, i);
230    fmpq_clear (coeff);
231  }
232  return result;
233#endif
234}
235
236void convertFacCF2Fmpz_array (fmpz* result, const CanonicalForm& f)
237{
238  for (CFIterator i= f; i.hasTerms(); i++)
239    convertCF2Fmpz (&result[i.exp()], i.coeff());
240}
241
242//TODO multiply by bCommonDen and convertFacCF2Fmpz_poly_t
243void convertFacCF2Fmpq_poly_t (fmpq_poly_t result, const CanonicalForm& f)
244{
245  ASSERT (isOn (SW_RATIONAL), "expected poly over Q");
246
247  fmpq_poly_init2 (result, degree (f)+1);
248  _fmpq_poly_set_length (result, degree (f) + 1);
249  CanonicalForm den= bCommonDen (f);
250  convertFacCF2Fmpz_array (fmpq_poly_numref (result), f*den);
251  convertCF2Fmpz (fmpq_poly_denref (result), den);
252  /*fmpq_t coeff;
253  for (CFIterator i= f; i.hasTerms(); i++)
254  {
255    fmpq_init (coeff);
256    convertCF2Fmpq (coeff, i.coeff());
257    fmpq_poly_set_coeff_fmpq (result, i.exp(), coeff);
258    fmpq_clear (coeff);
259  }*/
260}
261
262CFFList
263convertFLINTnmod_poly_factor2FacCFFList (nmod_poly_factor_t fac,
264                                          mp_limb_t leadingCoeff,
265                                          const Variable& x
266                                         )
267{
268  CFFList result;
269  if (leadingCoeff != 1)
270    result.insert (CFFactor (CanonicalForm ((long) leadingCoeff), 1));
271
272  long i;
273
274  for (i = 0; i < fac->num; i++)
275    result.append (CFFactor (convertnmod_poly_t2FacCF ((nmod_poly_t &)fac->p[i],x),
276                             fac->exp[i]));
277  return result;
278}
279
280void
281convertFacCF2Fmpz_mod_poly_t (fmpz_mod_poly_t result, const CanonicalForm& f,
282                              const fmpz_t p)
283{
284  fmpz_mod_poly_init2 (result, p, degree (f) + 1);
285  fmpz_poly_t buf;
286  convertFacCF2Fmpz_poly_t (buf, f);
287  fmpz_mod_poly_set_fmpz_poly (result, buf);
288  fmpz_poly_clear (buf);
289}
290
291CanonicalForm
292convertFmpz_mod_poly_t2FacCF (fmpz_mod_poly_t poly, const Variable& x,
293                              const modpk& b)
294{
295  fmpz_poly_t buf;
296  fmpz_poly_init (buf);
297  fmpz_mod_poly_get_fmpz_poly (buf, poly);
298  CanonicalForm result= convertFmpz_poly_t2FacCF (buf, x);
299  fmpz_poly_clear (buf);
300  return b (result);
301}
302
303void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M, CFMatrix &m)
304{
305  fmpz_mat_init (M, (long) m.rows(), (long) m.columns());
306
307  int i,j;
308  for(i=m.rows();i>0;i--)
309  {
310    for(j=m.columns();j>0;j--)
311    {
312      convertCF2Fmpz (fmpz_mat_entry (M,i-1,j-1), m(i,j));
313    }
314  }
315}
316CFMatrix* convertFmpz_mat_t2FacCFMatrix(fmpz_mat_t m)
317{
318  CFMatrix *res=new CFMatrix(fmpz_mat_nrows (m),fmpz_mat_ncols (m));
319  int i,j;
320  for(i=res->rows();i>0;i--)
321  {
322    for(j=res->columns();j>0;j--)
323    {
324      (*res)(i,j)=convertFmpz2CF(fmpz_mat_entry (m,i-1,j-1));
325    }
326  }
327  return res;
328}
329
330void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M, CFMatrix &m)
331{
332  nmod_mat_init (M, (long) m.rows(), (long) m.columns(), getCharacteristic());
333
334  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
335  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
336  int i,j;
337  for(i=m.rows();i>0;i--)
338  {
339    for(j=m.columns();j>0;j--)
340    {
341      if(!(m(i,j)).isImm()) printf("convertFacCFMatrix2FLINTmat_zz_p: not imm.\n");
342      nmod_mat_entry (M,i-1,j-1)= (m(i,j)).intval();
343    }
344  }
345  if (save_sym_ff) On (SW_SYMMETRIC_FF);
346}
347
348CFMatrix* convertNmod_mat_t2FacCFMatrix(nmod_mat_t m)
349{
350  CFMatrix *res=new CFMatrix(nmod_mat_nrows (m), nmod_mat_ncols (m));
351  int i,j;
352  for(i=res->rows();i>0;i--)
353  {
354    for(j=res->columns();j>0;j--)
355    {
356      (*res)(i,j)=CanonicalForm((long) nmod_mat_entry (m, i-1, j-1));
357    }
358  }
359  return res;
360}
361
362#endif
363
364
Note: See TracBrowser for help on using the repository browser.