[f0ccd06] | 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 | |
---|
[aadd638] | 11 | #include "misc/auxiliary.h" |
---|
[69806a] | 12 | #include "flintconv.h" |
---|
| 13 | |
---|
[fb24e81] | 14 | #ifdef HAVE_FLINT |
---|
| 15 | #if __FLINT_RELEASE >= 20500 |
---|
[aadd638] | 16 | #include "coeffs/coeffs.h" |
---|
[837062d] | 17 | #include "coeffs/longrat.h" |
---|
[aadd638] | 18 | #include "polys/monomials/p_polys.h" |
---|
[f0ccd06] | 19 | |
---|
[aadd638] | 20 | #include "polys/sbuckets.h" |
---|
| 21 | #include "polys/clapconv.h" |
---|
[f0ccd06] | 22 | |
---|
| 23 | #include "simpleideals.h" |
---|
| 24 | |
---|
[c410e23] | 25 | |
---|
[f0ccd06] | 26 | int convFlintISingI (fmpz_t f) |
---|
| 27 | { |
---|
| 28 | int res; |
---|
| 29 | res = fmpz_get_si(f); |
---|
| 30 | return res; |
---|
| 31 | } |
---|
| 32 | |
---|
| 33 | void convSingIFlintI(fmpz_t f, int p) |
---|
| 34 | { |
---|
[301c99e] | 35 | fmpz_init(f); |
---|
[f0ccd06] | 36 | fmpz_set_si(f,p); |
---|
| 37 | return; |
---|
| 38 | } |
---|
| 39 | |
---|
| 40 | void convFlintNSingN (mpz_t z, fmpz_t f) |
---|
| 41 | { |
---|
[301c99e] | 42 | mpz_init(z); |
---|
[f0ccd06] | 43 | fmpz_get_mpz(z,f); |
---|
| 44 | } |
---|
| 45 | |
---|
[837062d] | 46 | number 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 | } |
---|
| 55 | number convFlintNSingN (fmpq_t f) |
---|
| 56 | { |
---|
| 57 | number z=ALLOC_RNUMBER(); |
---|
| 58 | #if defined(LDEBUG) |
---|
| 59 | z->debug=123456; |
---|
| 60 | #endif |
---|
[4188f03] | 61 | fmpq_get_mpz_frac(z->z,z->n,f); |
---|
[837062d] | 62 | nlNormalize(z,NULL); |
---|
| 63 | return z; |
---|
| 64 | } |
---|
| 65 | |
---|
| 66 | void convSingNFlintN(fmpz_t f, mpz_t n) |
---|
| 67 | { |
---|
| 68 | fmpz_init(f); |
---|
| 69 | fmpz_set_mpz(f,n); |
---|
| 70 | } |
---|
| 71 | |
---|
| 72 | void convSingNFlintN(fmpz_t f, number n) |
---|
[f0ccd06] | 73 | { |
---|
[301c99e] | 74 | fmpz_init(f); |
---|
[837062d] | 75 | fmpz_set_mpz(f,(mpz_ptr)n); |
---|
| 76 | } |
---|
| 77 | |
---|
| 78 | void 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 | } |
---|
[f0ccd06] | 96 | } |
---|
| 97 | |
---|
| 98 | |
---|
[d6cb88] | 99 | bigintmat* singflint_LLL(bigintmat* m, bigintmat* T) |
---|
[f0ccd06] | 100 | { |
---|
| 101 | int r=m->rows(); |
---|
| 102 | int c=m->cols(); |
---|
| 103 | bigintmat* res=new bigintmat(r,c,m->basecoeffs()); |
---|
[d6cb88] | 104 | fmpz_mat_t M, Transf; |
---|
[f0ccd06] | 105 | fmpz_mat_init(M, r, c); |
---|
[d6cb88] | 106 | if(T != NULL) |
---|
| 107 | { |
---|
| 108 | fmpz_mat_init(Transf, T->rows(), T->rows()); |
---|
| 109 | } |
---|
[f0ccd06] | 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); |
---|
[301c99e] | 119 | mpz_clear(n); |
---|
[f0ccd06] | 120 | fmpz_set(fmpz_mat_entry(M, i-1, j-1), dummy); |
---|
[301c99e] | 121 | fmpz_clear(dummy); |
---|
[f0ccd06] | 122 | } |
---|
| 123 | } |
---|
[d6cb88] | 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); |
---|
[301c99e] | 132 | mpz_clear(n); |
---|
[d6cb88] | 133 | fmpz_set(fmpz_mat_entry(Transf, i-1, j-1), dummy); |
---|
[301c99e] | 134 | fmpz_clear(dummy); |
---|
[d6cb88] | 135 | } |
---|
| 136 | } |
---|
| 137 | } |
---|
[f0ccd06] | 138 | fmpz_lll_t fl; |
---|
| 139 | fmpz_lll_context_init_default(fl); |
---|
[d6cb88] | 140 | if(T != NULL) |
---|
| 141 | fmpz_lll(M, Transf, fl); |
---|
| 142 | else |
---|
| 143 | fmpz_lll(M, NULL, fl); |
---|
[f0ccd06] | 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)); |
---|
[625fd1] | 149 | n_Delete(&(BIMATELEM(*res,i,j)),res->basecoeffs()); |
---|
| 150 | BIMATELEM(*res,i,j)=n_InitMPZ(n,res->basecoeffs()); |
---|
[301c99e] | 151 | mpz_clear(n); |
---|
[d6cb88] | 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)); |
---|
[625fd1] | 161 | n_Delete(&(BIMATELEM(*T,i,j)),T->basecoeffs()); |
---|
| 162 | BIMATELEM(*T,i,j)=n_InitMPZ(n,T->basecoeffs()); |
---|
[301c99e] | 163 | mpz_clear(n); |
---|
[d6cb88] | 164 | } |
---|
[f0ccd06] | 165 | } |
---|
| 166 | } |
---|
| 167 | return res; |
---|
| 168 | } |
---|
| 169 | |
---|
[d6cb88] | 170 | intvec* singflint_LLL(intvec* m, intvec* T) |
---|
[f0ccd06] | 171 | { |
---|
| 172 | int r=m->rows(); |
---|
| 173 | int c=m->cols(); |
---|
| 174 | intvec* res = new intvec(r,c,(int)0); |
---|
[d6cb88] | 175 | fmpz_mat_t M,Transf; |
---|
[f0ccd06] | 176 | fmpz_mat_init(M, r, c); |
---|
[d6cb88] | 177 | if(T != NULL) |
---|
| 178 | fmpz_mat_init(Transf, r, r); |
---|
[f0ccd06] | 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); |
---|
[301c99e] | 187 | fmpz_clear(dummy); |
---|
[f0ccd06] | 188 | } |
---|
| 189 | } |
---|
[d6cb88] | 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); |
---|
[301c99e] | 198 | fmpz_clear(dummy); |
---|
[d6cb88] | 199 | } |
---|
| 200 | } |
---|
| 201 | } |
---|
[f0ccd06] | 202 | fmpz_lll_t fl; |
---|
| 203 | fmpz_lll_context_init_default(fl); |
---|
[d6cb88] | 204 | if(T != NULL) |
---|
| 205 | fmpz_lll(M, Transf, fl); |
---|
| 206 | else |
---|
| 207 | fmpz_lll(M, NULL, fl); |
---|
[f0ccd06] | 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)); |
---|
[d6cb88] | 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 | } |
---|
[f0ccd06] | 223 | } |
---|
| 224 | } |
---|
| 225 | return res; |
---|
| 226 | } |
---|
| 227 | #endif |
---|
| 228 | #endif |
---|