source: git/factory/FLINTconvert.cc @ 1ba7d5

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