=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/builtin/array.c,v retrieving revision 1.8 retrieving revision 1.10 diff -u -p -r1.8 -r1.10 --- OpenXM_contrib2/asir2018/builtin/array.c 2020/10/06 06:31:19 1.8 +++ OpenXM_contrib2/asir2018/builtin/array.c 2022/01/13 08:15:02 1.10 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2018/builtin/array.c,v 1.7 2020/01/09 01:47:40 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2018/builtin/array.c,v 1.9 2021/03/26 09:05:41 ohara Exp $ */ #include "ca.h" #include "base.h" @@ -622,7 +622,7 @@ void Pnewvect(NODE arg,VECT *rp) return; } #endif - for ( i = 0, tn = BDY(list), vb = BDY(vect); tn; i++, tn = NEXT(tn) ) + for ( i = 0, tn = BDY(list), vb = BDY(vect); tn && irow; col = m->col; tmat = (Z **)m->body; wmat = (mp_limb_t **)almat64(row,col); @@ -1265,6 +1268,16 @@ void Pgeneric_gauss_elim_mod64(NODE arg,LIST *rp) for ( j = 0; j < col; j++ ) wmat[i][j] = remqi64((Q)tmat[i][j],md); rank = generic_gauss_elim_mod64(wmat,row,col,md,colstat); + if ( asis ) { + MKMAT(mat,row,col); + tmat = (Z **)mat->body; + for ( i = 0; i < rank; i++ ) + for ( j = 0; j < col; j++ ) { + UTOZ(wmat[i][j],tmat[i][j]); + } + *rp = (LIST)mat; + return; + } MKVECT(rnum,rank); rnb = (Z *)rnum->body; @@ -1307,9 +1320,12 @@ void Pgeneric_gauss_elim_mod(NODE arg,LIST *rp) Z q; long mdl; int md,i,j,k,l,row,col,t,rank; + Obj val; + int asis = 0; asir_assert(ARG0(arg),O_MAT,"generic_gauss_elim_mod"); asir_assert(ARG1(arg),O_N,"generic_gauss_elim_mod"); + if ( get_opt("asis",&val) && val ) asis = 1; #if SIZEOF_LONG==8 mdl = ZTOS((Z)ARG1(arg)); if ( mdl >= ((mp_limb_t)1)<<32 ) { @@ -1330,6 +1346,16 @@ void Pgeneric_gauss_elim_mod(NODE arg,LIST *rp) for ( j = 0; j < col; j++ ) wmat[i][j] = remqi((Q)tmat[i][j],md); rank = generic_gauss_elim_mod(wmat,row,col,md,colstat); + if ( asis ) { + MKMAT(mat,row,col); + tmat = (Z **)mat->body; + for ( i = 0; i < rank; i++ ) + for ( j = 0; j < col; j++ ) { + UTOZ(wmat[i][j],tmat[i][j]); + } + *rp = (LIST)mat; + return; + } MKVECT(rnum,rank); rnb = (Z *)rnum->body;