version 1.15, 2019/04/23 08:07:24 |
version 1.19, 2020/10/06 06:31:19 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2018/engine/Q.c,v 1.14 2019/03/27 07:45:53 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2018/engine/Q.c,v 1.18 2020/10/04 03:14:09 noro Exp $ */ |
#include "ca.h" |
#include "ca.h" |
#include "gmp.h" |
#include "gmp.h" |
#include "base.h" |
#include "base.h" |
#include "inline.h" |
#include "inline.h" |
|
|
mpz_t ONEMPZ; |
mpz_t ONEMPZ; |
Z ONE; |
extern Z ONE; |
int lf_lazy; |
int lf_lazy; |
Z current_mod_lf; |
Z current_mod_lf; |
int current_mod_lf_size; |
int current_mod_lf_size; |
Line 17 extern int DP_Print; |
|
Line 17 extern int DP_Print; |
|
|
|
void isqrtz(Z a,Z *r); |
void isqrtz(Z a,Z *r); |
void bshiftz(Z a,int n,Z *r); |
void bshiftz(Z a,int n,Z *r); |
|
int mpz_inttorat(mpz_t c,mpz_t m,mpz_t b,mpz_t nm,mpz_t dn); |
|
int generic_gauss_elim_hensel64(MAT mat,MAT *nmmat,Z *dn,int **rindp,int **cindp,DP *mb); |
|
int find_lhs_and_lu_mod64(mp_limb_t **a,int row,int col,mp_limb_t md,int **rinfo,int **cinfo); |
|
void solve_by_lu_mod64(mp_limb_t **a,int n,mp_limb_t md,mp_limb_signed_t **b,int l,int normalize); |
|
|
void *gc_realloc(void *p,size_t osize,size_t nsize) |
void *gc_realloc(void *p,size_t osize,size_t nsize) |
{ |
{ |
Line 388 int cmpz(Z q1,Z q2) |
|
Line 392 int cmpz(Z q1,Z q2) |
|
else if ( sgn < 0 ) return -1; |
else if ( sgn < 0 ) return -1; |
else return 0; |
else return 0; |
} |
} |
|
/* XXX */ |
|
return 0; |
} |
} |
|
|
void gcdz(Z n1,Z n2,Z *nq) |
void gcdz(Z n1,Z n2,Z *nq) |
Line 762 void lgp(P p,Z *g,Z *l); |
|
Line 768 void lgp(P p,Z *g,Z *l); |
|
|
|
void ptozp(P p,int sgn,Q *c,P *pr) |
void ptozp(P p,int sgn,Q *c,P *pr) |
{ |
{ |
Z nm,dn; |
Z nm,dn,nm1; |
|
|
if ( !p ) { |
if ( !p ) { |
*c = 0; *pr = 0; |
*c = 0; *pr = 0; |
} else { |
} else { |
lgp(p,&nm,&dn); |
lgp(p,&nm,&dn); |
|
if ( sgn < 0 ) { |
|
chsgnz(nm,&nm1); nm = nm1; |
|
} |
divz(nm,dn,(Z *)c); |
divz(nm,dn,(Z *)c); |
divsp(CO,p,(P)*c,pr); |
divsp(CO,p,(P)*c,pr); |
} |
} |
Line 1229 int intmtoratm(MAT mat,Z md,MAT nm,Z *dn) |
|
Line 1238 int intmtoratm(MAT mat,Z md,MAT nm,Z *dn) |
|
return 0; |
return 0; |
row = mat->row; col = mat->col; |
row = mat->row; col = mat->col; |
bshiftz(md,1,&t); |
bshiftz(md,1,&t); |
isqrt(t,&s); |
isqrtz(t,&s); |
bshiftz(s,64,&b); |
bshiftz(s,64,&b); |
if ( !b ) b = ONE; |
if ( !b ) b = ONE; |
dn0 = ONE; |
dn0 = ONE; |
Line 2260 int generic_gauss_elim_hensel64(MAT mat,MAT *nmmat,Z * |
|
Line 2269 int generic_gauss_elim_hensel64(MAT mat,MAT *nmmat,Z * |
|
for ( j = 0, bi = b[i], wi = wc[i]; j < ri; j++ ) |
for ( j = 0, bi = b[i], wi = wc[i]; j < ri; j++ ) |
wi[j] = mpz_fdiv_ui(bi[j],md); |
wi[j] = mpz_fdiv_ui(bi[j],md); |
/* wc = A^(-1)wc; wc is not normalized */ |
/* wc = A^(-1)wc; wc is not normalized */ |
solve_by_lu_mod64(w,rank,md,wc,ri,0); |
solve_by_lu_mod64(w,rank,md,(mp_limb_signed_t **)wc,ri,0); |
/* x += q*wc */ |
/* x += q*wc */ |
for ( i = 0; i < rank; i++ ) |
for ( i = 0; i < rank; i++ ) |
for ( j = 0, wi = wc[i]; j < ri; j++ ) |
for ( j = 0, wi = wc[i]; j < ri; j++ ) |