source: git/factory/FLINTconvert.cc @ 3ef2d6

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