source: git/libpolys/polys/flintconv.cc @ 4188f03

fieker-DuValspielwiese
Last change on this file since 4188f03 was 4188f03, checked in by Hans Schoenemann <hannes@…>, 5 years ago
fix: flintconv
  • Property mode set to 100644
File size: 4.3 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2/****************************************
3*  Computer Algebra System SINGULAR     *
4****************************************/
5/*
6* ABSTRACT: convert data between Singular and Flint
7*/
8
9
10
11#include "misc/auxiliary.h"
12#include "flintconv.h"
13
14#ifdef HAVE_FLINT
15#if __FLINT_RELEASE >= 20500
16#include "coeffs/coeffs.h"
17#include "coeffs/longrat.h"
18#include "polys/monomials/p_polys.h"
19
20#include "polys/sbuckets.h"
21#include "polys/clapconv.h"
22
23#include "simpleideals.h"
24
25
26int convFlintISingI (fmpz_t f)
27{
28  int res;
29  res = fmpz_get_si(f);
30  return res;
31}
32
33void convSingIFlintI(fmpz_t f, int p)
34{
35  fmpz_init(f);
36  fmpz_set_si(f,p);
37  return;
38}
39
40void convFlintNSingN (mpz_t z, fmpz_t f)
41{
42  mpz_init(z);
43  fmpz_get_mpz(z,f);
44}
45
46number convFlintNSingN (fmpz_t f)
47{
48  mpz_t z;
49  mpz_init(z);
50  fmpz_get_mpz(z,f);
51  number n;
52  nlMPZ(z,n,NULL);
53  return n;
54}
55number convFlintNSingN (fmpq_t f)
56{
57  number z=ALLOC_RNUMBER();
58#if defined(LDEBUG)
59  z->debug=123456;
60#endif
61  fmpq_get_mpz_frac(z->z,z->n,f);
62  nlNormalize(z,NULL);
63  return z;
64}
65
66void convSingNFlintN(fmpz_t f, mpz_t n)
67{
68  fmpz_init(f);
69  fmpz_set_mpz(f,n);
70}
71
72void convSingNFlintN(fmpz_t f, number n)
73{
74  fmpz_init(f);
75  fmpz_set_mpz(f,(mpz_ptr)n);
76}
77
78void convSingNFlintN(fmpq_t f, number n)
79{
80  fmpq_init(f);
81  if (SR_HDL(n)&SR_INT)
82    fmpq_set_si(f,SR_TO_INT(n),1);
83  else if (n->s<3)
84  {
85    fmpz_set_mpz(fmpq_numref(f), n->z);
86    fmpz_set_mpz(fmpq_denref(f), n->n);
87  }
88  else
89  {
90    mpz_t one;
91    mpz_init_set_si(one,1);
92    fmpz_set_mpz(fmpq_numref(f), n->z);
93    fmpz_set_mpz(fmpq_denref(f), one);
94    mpz_clear(one);
95  }
96}
97
98
99bigintmat* singflint_LLL(bigintmat*  m, bigintmat* T)
100{
101  int r=m->rows();
102  int c=m->cols();
103  bigintmat* res=new bigintmat(r,c,m->basecoeffs());
104  fmpz_mat_t M, Transf;
105  fmpz_mat_init(M, r, c);
106  if(T != NULL)
107  {
108    fmpz_mat_init(Transf, T->rows(), T->rows());
109  }
110  fmpz_t dummy;
111  mpz_t n;
112  int i,j;
113  for(i=r;i>0;i--)
114  {
115    for(j=c;j>0;j--)
116    {
117      n_MPZ(n, BIMATELEM(*m, i, j),m->basecoeffs());
118      convSingNFlintN(dummy,n);
119      mpz_clear(n);
120      fmpz_set(fmpz_mat_entry(M, i-1, j-1), dummy);
121      fmpz_clear(dummy);
122    }
123  }
124  if(T != NULL)
125  {
126    for(i=T->rows();i>0;i--)
127    {
128      for(j=T->rows();j>0;j--)
129      {
130        n_MPZ(n, BIMATELEM(*T, i, j),T->basecoeffs());
131        convSingNFlintN(dummy,n);
132        mpz_clear(n);
133        fmpz_set(fmpz_mat_entry(Transf, i-1, j-1), dummy);
134        fmpz_clear(dummy);
135      }
136    }
137  }
138  fmpz_lll_t fl;
139  fmpz_lll_context_init_default(fl);
140  if(T != NULL)
141    fmpz_lll(M, Transf, fl);
142  else
143    fmpz_lll(M, NULL, fl);
144  for(i=r;i>0;i--)
145  {
146    for(j=c;j>0;j--)
147    {
148      convFlintNSingN(n, fmpz_mat_entry(M, i-1, j-1));
149      n_Delete(&(BIMATELEM(*res,i,j)),res->basecoeffs());
150      BIMATELEM(*res,i,j)=n_InitMPZ(n,res->basecoeffs());
151      mpz_clear(n);
152    }
153  }
154  if(T != NULL)
155  {
156    for(i=T->rows();i>0;i--)
157    {
158      for(j=T->cols();j>0;j--)
159      {
160        convFlintNSingN(n, fmpz_mat_entry(Transf, i-1, j-1));
161        n_Delete(&(BIMATELEM(*T,i,j)),T->basecoeffs());
162        BIMATELEM(*T,i,j)=n_InitMPZ(n,T->basecoeffs());
163        mpz_clear(n);
164      }
165    }
166  }
167  return res;
168}
169
170intvec* singflint_LLL(intvec*  m, intvec* T)
171{
172  int r=m->rows();
173  int c=m->cols();
174  intvec* res = new intvec(r,c,(int)0);
175  fmpz_mat_t M,Transf;
176  fmpz_mat_init(M, r, c);
177  if(T != NULL)
178    fmpz_mat_init(Transf, r, r);
179  fmpz_t dummy;
180  int i,j;
181  for(i=r;i>0;i--)
182  {
183    for(j=c;j>0;j--)
184    {
185      convSingIFlintI(dummy,IMATELEM(*m,i,j));
186      fmpz_set(fmpz_mat_entry(M, i-1, j-1), dummy);
187      fmpz_clear(dummy);
188    }
189  }
190  if(T != NULL)
191  {
192    for(i=T->rows();i>0;i--)
193    {
194      for(j=T->rows();j>0;j--)
195      {
196        convSingIFlintI(dummy,IMATELEM(*T,i,j));
197        fmpz_set(fmpz_mat_entry(Transf, i-1, j-1), dummy);
198        fmpz_clear(dummy);
199      }
200    }
201  }
202  fmpz_lll_t fl;
203  fmpz_lll_context_init_default(fl);
204  if(T != NULL)
205    fmpz_lll(M, Transf, fl);
206  else
207    fmpz_lll(M, NULL, fl);
208  for(i=r;i>0;i--)
209  {
210    for(j=c;j>0;j--)
211    {
212      IMATELEM(*res,i,j)=convFlintISingI(fmpz_mat_entry(M, i-1, j-1));
213    }
214  }
215  if(T != NULL)
216  {
217    for(i=Transf->r;i>0;i--)
218    {
219      for(j=Transf->r;j>0;j--)
220      {
221        IMATELEM(*T,i,j)=convFlintISingI(fmpz_mat_entry(Transf, i-1, j-1));
222      }
223    }
224  }
225  return res;
226}
227#endif
228#endif
Note: See TracBrowser for help on using the repository browser.