source: git/factory/FLINTconvert.cc @ 9ee586

spielwiese
Last change on this file since 9ee586 was 9ee586, checked in by Hans Schoenemann <hannes@…>, 10 years ago
chg: version test for flint 2.4
  • Property mode set to 100644
File size: 13.7 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
16#include <config.h>
17
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#if ( __FLINT_RELEASE >= 20400)
49#include <flint/fq.h>
50#include <flint/fq_poly.h>
51#include <flint/fq_nmod.h>
52#include <flint/fq_nmod_poly.h>
53#include <flint/fq_nmod_mat.h>
54#endif
55#ifdef __cplusplus
56}
57#endif
58
59#include "FLINTconvert.h"
60
61void convertCF2Fmpz (fmpz_t result, const CanonicalForm& f)
62{
63  if (f.isImm())
64    fmpz_set_si (result, f.intval());
65  else
66  {
67    mpz_t gmp_val;
68    f.mpzval(gmp_val);
69    fmpz_set_mpz (result, gmp_val);
70    mpz_clear (gmp_val);
71  }
72}
73
74void convertFacCF2Fmpz_poly_t (fmpz_poly_t result, const CanonicalForm& f)
75{
76  fmpz_poly_init2 (result, degree (f)+1);
77  _fmpz_poly_set_length(result, degree(f)+1);
78  for (CFIterator i= f; i.hasTerms(); i++)
79    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
80}
81
82CanonicalForm convertFmpz2CF (const fmpz_t coefficient)
83{
84  if (fmpz_cmp_si (coefficient, MINIMMEDIATE) >= 0 &&
85      fmpz_cmp_si (coefficient, MAXIMMEDIATE) <= 0)
86  {
87    long coeff= fmpz_get_si (coefficient);
88    return CanonicalForm (coeff);
89  }
90  else
91  {
92    mpz_t gmp_val;
93    mpz_init (gmp_val);
94    fmpz_get_mpz (gmp_val, coefficient);
95    CanonicalForm result= CanonicalForm (CFFactory::basic (gmp_val));
96    return result;
97  }
98}
99
100CanonicalForm
101convertFmpz_poly_t2FacCF (const fmpz_poly_t poly, const Variable& x)
102{
103  CanonicalForm result= 0;
104  fmpz* coeff;
105  for (int i= 0; i < fmpz_poly_length (poly); i++)
106  {
107    coeff= fmpz_poly_get_coeff_ptr (poly, i);
108    if (!fmpz_is_zero (coeff))
109      result += convertFmpz2CF (coeff)*power (x,i);
110  }
111  return result;
112}
113
114void
115convertFacCF2nmod_poly_t (nmod_poly_t result, const CanonicalForm& f)
116{
117  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
118  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
119  nmod_poly_init2 (result, getCharacteristic(), degree (f)+1);
120  for (CFIterator i= f; i.hasTerms(); i++)
121  {
122    CanonicalForm c= i.coeff();
123    if (!c.isImm()) c=c.mapinto(); //c%= getCharacteristic();
124    if (!c.isImm())
125    {  //This case will never happen if the characteristic is in fact a prime
126       // number, since all coefficients are represented as immediates
127       printf("convertCF2nmod_poly_t: coefficient not immediate!, char=%d\n",
128              getCharacteristic());
129    }
130    else
131      nmod_poly_set_coeff_ui (result, i.exp(), c.intval());
132  }
133  if (save_sym_ff) On (SW_SYMMETRIC_FF);
134}
135
136CanonicalForm
137convertnmod_poly_t2FacCF (const 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)
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  bool isRat= isOn (SW_RATIONAL);
180  if (!isRat)
181    On (SW_RATIONAL);
182
183  CanonicalForm num, den;
184  mpz_t nnum, nden;
185  mpz_init (nnum);
186  mpz_init (nden);
187  fmpz_get_mpz (nnum, fmpq_numref (q));
188  fmpz_get_mpz (nden, fmpq_denref (q));
189
190  CanonicalForm result;
191  if (mpz_is_imm (nnum) && mpz_is_imm (nden))
192  {
193    num= CanonicalForm (mpz_get_si(nnum));
194    den= CanonicalForm (mpz_get_si(nden));
195    mpz_clear (nnum);
196    mpz_clear (nden);
197    result= num/den;
198    if (!isRat)
199      Off (SW_RATIONAL);
200    return result;
201  }
202  else
203  {
204    result= make_cf (nnum, nden, false);
205    if (!isRat)
206      Off (SW_RATIONAL);
207    return result;
208  }
209}
210
211CanonicalForm
212convertFmpq_poly_t2FacCF (const fmpq_poly_t p, const Variable& x)
213{
214  CanonicalForm result= 0;
215  fmpq_t coeff;
216  long n= p->length;
217  for (long i= 0; i < n; i++)
218  {
219    fmpq_init (coeff);
220    fmpq_poly_get_coeff_fmpq (coeff, p, i);
221    if (fmpq_is_zero (coeff))
222    {
223      fmpq_clear (coeff);
224      continue;
225    }
226    result += convertFmpq_t2CF (coeff)*power (x, i);
227    fmpq_clear (coeff);
228  }
229  return result;
230}
231
232void convertFacCF2Fmpz_array (fmpz* result, const CanonicalForm& f)
233{
234  for (CFIterator i= f; i.hasTerms(); i++)
235    convertCF2Fmpz (&result[i.exp()], i.coeff());
236}
237
238void convertFacCF2Fmpq_poly_t (fmpq_poly_t result, const CanonicalForm& f)
239{
240  bool isRat= isOn (SW_RATIONAL);
241  if (!isRat)
242    On (SW_RATIONAL);
243
244  fmpq_poly_init2 (result, degree (f)+1);
245  _fmpq_poly_set_length (result, degree (f) + 1);
246  CanonicalForm den= bCommonDen (f);
247  convertFacCF2Fmpz_array (fmpq_poly_numref (result), f*den);
248  convertCF2Fmpz (fmpq_poly_denref (result), den);
249
250  if (!isRat)
251    Off (SW_RATIONAL);
252}
253
254CFFList
255convertFLINTnmod_poly_factor2FacCFFList (const nmod_poly_factor_t fac,
256                                          const mp_limb_t leadingCoeff,
257                                          const Variable& x
258                                         )
259{
260  CFFList result;
261  if (leadingCoeff != 1)
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 (
268                             (nmod_poly_t &)fac->p[i],x),
269                             fac->exp[i]));
270  return result;
271}
272
273#if __FLINT_RELEASE >= 20400
274CFFList
275convertFLINTFq_nmod_poly_factor2FacCFFList (const fq_nmod_poly_factor_t fac,
276                                       const Variable& x, const Variable& alpha,
277                                       const fq_nmod_ctx_t fq_con
278                                         )
279{
280  CFFList result;
281
282  long i;
283
284  for (i = 0; i < fac->num; i++)
285    result.append (CFFactor (convertFq_nmod_poly_t2FacCF (
286                             (fq_nmod_poly_t &)fac->poly[i], x, alpha, fq_con),
287                             fac->exp[i]));
288  return result;
289}
290#endif
291
292void
293convertFacCF2Fmpz_mod_poly_t (fmpz_mod_poly_t result, const CanonicalForm& f,
294                              const fmpz_t p)
295{
296  fmpz_mod_poly_init2 (result, p, degree (f) + 1);
297  fmpz_poly_t buf;
298  convertFacCF2Fmpz_poly_t (buf, f);
299  fmpz_mod_poly_set_fmpz_poly (result, buf);
300  fmpz_poly_clear (buf);
301}
302
303CanonicalForm
304convertFmpz_mod_poly_t2FacCF (const fmpz_mod_poly_t poly, const Variable& x,
305                              const modpk& b)
306{
307  fmpz_poly_t buf;
308  fmpz_poly_init (buf);
309  fmpz_mod_poly_get_fmpz_poly (buf, poly);
310  CanonicalForm result= convertFmpz_poly_t2FacCF (buf, x);
311  fmpz_poly_clear (buf);
312  return b (result);
313}
314
315#if __FLINT_RELEASE >= 20400
316void
317convertFacCF2Fq_nmod_t (fq_nmod_t result, const CanonicalForm& f,
318                        const fq_nmod_ctx_t ctx)
319{
320  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
321  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
322  for (CFIterator i= f; i.hasTerms(); i++)
323  {
324    CanonicalForm c= i.coeff();
325    if (!c.isImm()) c=c.mapinto(); //c%= getCharacteristic();
326    if (!c.isImm())
327    {  //This case will never happen if the characteristic is in fact a prime
328       // number, since all coefficients are represented as immediates
329       printf("convertFacCF2Fq_nmod_t: coefficient not immediate!, char=%d\n",
330              getCharacteristic());
331    }
332    else
333    {
334      STICKYASSERT (i.exp() <= fq_nmod_ctx_degree(ctx), "convertFacCF2Fq_nmod_t: element is not reduced");
335      nmod_poly_set_coeff_ui (result, i.exp(), c.intval());
336    }
337  }
338  if (save_sym_ff) On (SW_SYMMETRIC_FF);
339}
340
341CanonicalForm
342convertFq_nmod_t2FacCF (const fq_nmod_t poly, const Variable& alpha)
343{
344  return convertnmod_poly_t2FacCF (poly, alpha);
345}
346
347void
348convertFacCF2Fq_t (fq_t result, const CanonicalForm& f, const fq_ctx_t ctx)
349{
350  fmpz_poly_init2 (result, fq_ctx_degree(ctx));
351  ASSERT (degree (f) < fq_ctx_degree (ctx), "input is not reduced");
352  _fmpz_poly_set_length(result, degree(f)+1);
353  for (CFIterator i= f; i.hasTerms(); i++)
354    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
355  _fmpz_vec_scalar_mod_fmpz (result->coeffs, result->coeffs, degree (f) + 1,
356                             &ctx->p);
357  _fmpz_poly_normalise (result);
358}
359
360CanonicalForm
361convertFq_t2FacCF (const fq_t poly, const Variable& alpha)
362{
363  return convertFmpz_poly_t2FacCF (poly, alpha);
364}
365
366void
367convertFacCF2Fq_poly_t (fq_poly_t result, const CanonicalForm& f,
368                        const fq_ctx_t ctx)
369{
370  fq_poly_init2 (result, degree (f)+1, ctx);
371  _fq_poly_set_length (result, degree (f) + 1, ctx);
372  fmpz_poly_t buf;
373  for (CFIterator i= f; i.hasTerms(); i++)
374  {
375    convertFacCF2Fmpz_poly_t (buf, i.coeff());
376    _fmpz_vec_scalar_mod_fmpz (buf->coeffs, buf->coeffs, degree (i.coeff()) + 1,
377                               &ctx->p);
378    _fmpz_poly_normalise (buf);
379    fq_poly_set_coeff (result, i.exp(), buf, ctx);
380    fmpz_poly_clear (buf);
381  }
382}
383
384void
385convertFacCF2Fq_nmod_poly_t (fq_nmod_poly_t result, const CanonicalForm& f,
386                             const fq_nmod_ctx_t ctx)
387{
388  fq_nmod_poly_init2 (result, degree (f)+1, ctx);
389  _fq_nmod_poly_set_length (result, degree (f) + 1, ctx);
390  fq_nmod_t buf;
391  fq_nmod_init2 (buf, ctx);
392  for (CFIterator i= f; i.hasTerms(); i++)
393  {
394    convertFacCF2Fq_nmod_t (buf, i.coeff(), ctx);
395    fq_nmod_poly_set_coeff (result, i.exp(), buf, ctx);
396    fq_nmod_zero (buf, ctx);
397  }
398  fq_nmod_clear (buf, ctx);
399}
400
401CanonicalForm
402convertFq_poly_t2FacCF (const fq_poly_t p, const Variable& x,
403                        const Variable& alpha, const fq_ctx_t ctx)
404{
405  CanonicalForm result= 0;
406  fq_t coeff;
407  long n= fq_poly_length (p, ctx);
408  fq_init2 (coeff, ctx);
409  for (long i= 0; i < n; i++)
410  {
411    fq_poly_get_coeff (coeff, p, i, ctx);
412    if (fq_is_zero (coeff, ctx))
413      continue;
414    result += convertFq_t2FacCF (coeff, alpha)*power (x, i);
415    fq_zero (coeff, ctx);
416  }
417  fq_clear (coeff, ctx);
418
419  return result;
420}
421
422CanonicalForm
423convertFq_nmod_poly_t2FacCF (const fq_nmod_poly_t p, const Variable& x,
424                             const Variable& alpha, const fq_nmod_ctx_t ctx)
425{
426  CanonicalForm result= 0;
427  fq_nmod_t coeff;
428  long n= fq_nmod_poly_length (p, ctx);
429  fq_nmod_init2 (coeff, ctx);
430  for (long i= 0; i < n; i++)
431  {
432    fq_nmod_poly_get_coeff (coeff, p, i, ctx);
433    if (fq_nmod_is_zero (coeff, ctx))
434      continue;
435    result += convertFq_nmod_t2FacCF (coeff, alpha)*power (x, i);
436    fq_nmod_zero (coeff, ctx);
437  }
438  fq_nmod_clear (coeff, ctx);
439
440  return result;
441}
442#endif
443
444void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M, const CFMatrix &m)
445{
446  fmpz_mat_init (M, (long) m.rows(), (long) m.columns());
447
448  int i,j;
449  for(i=m.rows();i>0;i--)
450  {
451    for(j=m.columns();j>0;j--)
452    {
453      convertCF2Fmpz (fmpz_mat_entry (M,i-1,j-1), m(i,j));
454    }
455  }
456}
457CFMatrix* convertFmpz_mat_t2FacCFMatrix(const fmpz_mat_t m)
458{
459  CFMatrix *res=new CFMatrix(fmpz_mat_nrows (m),fmpz_mat_ncols (m));
460  int i,j;
461  for(i=res->rows();i>0;i--)
462  {
463    for(j=res->columns();j>0;j--)
464    {
465      (*res)(i,j)=convertFmpz2CF(fmpz_mat_entry (m,i-1,j-1));
466    }
467  }
468  return res;
469}
470
471void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M, const CFMatrix &m)
472{
473  nmod_mat_init (M, (long) m.rows(), (long) m.columns(), getCharacteristic());
474
475  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
476  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
477  int i,j;
478  for(i=m.rows();i>0;i--)
479  {
480    for(j=m.columns();j>0;j--)
481    {
482      if(!(m(i,j)).isImm()) printf("convertFacCFMatrix2FLINTmat_zz_p: not imm.\n");
483      nmod_mat_entry (M,i-1,j-1)= (m(i,j)).intval();
484    }
485  }
486  if (save_sym_ff) On (SW_SYMMETRIC_FF);
487}
488
489CFMatrix* convertNmod_mat_t2FacCFMatrix(const nmod_mat_t m)
490{
491  CFMatrix *res=new CFMatrix(nmod_mat_nrows (m), nmod_mat_ncols (m));
492  int i,j;
493  for(i=res->rows();i>0;i--)
494  {
495    for(j=res->columns();j>0;j--)
496    {
497      (*res)(i,j)=CanonicalForm((long) nmod_mat_entry (m, i-1, j-1));
498    }
499  }
500  return res;
501}
502
503#if __FLINT_RELEASE >= 20400
504void
505convertFacCFMatrix2Fq_nmod_mat_t (fq_nmod_mat_t M,
506                                  const fq_nmod_ctx_t fq_con, const CFMatrix &m)
507{
508  fq_nmod_mat_init (M, (long) m.rows(), (long) m.columns(), fq_con);
509  int i,j;
510  for(i=m.rows();i>0;i--)
511  {
512    for(j=m.columns();j>0;j--)
513    {
514      convertFacCF2nmod_poly_t (M->rows[i-1]+j-1, m (i,j));
515    }
516  }
517}
518
519CFMatrix*
520convertFq_nmod_mat_t2FacCFMatrix(const fq_nmod_mat_t m,
521                                 const fq_nmod_ctx_t& fq_con,
522                                 const Variable& alpha)
523{
524  CFMatrix *res=new CFMatrix(fq_nmod_mat_nrows (m, fq_con),
525                             fq_nmod_mat_ncols (m, fq_con));
526  int i,j;
527  for(i=res->rows();i>0;i--)
528  {
529    for(j=res->columns();j>0;j--)
530    {
531      (*res)(i,j)=convertFq_nmod_t2FacCF (fq_nmod_mat_entry (m, i-1, j-1),
532                                          alpha);
533    }
534  }
535  return res;
536}
537#endif
538
539#endif
540
541
Note: See TracBrowser for help on using the repository browser.