version 1.70, 2017/01/08 03:05:39 |
version 1.72, 2017/08/31 08:08:25 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/array.c,v 1.69 2015/09/03 23:05:35 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/array.c,v 1.71 2017/02/21 09:20:23 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "base.h" |
#include "base.h" |
|
|
extern int DP_Print; /* XXX */ |
extern int DP_Print; /* XXX */ |
|
|
|
|
void Pnewvect(), Pnewmat(), Psepvect(), Psize(), Pdet(), Pleqm(), Pleqm1(), Pgeninvm(); |
void Pnewvect(), Pnewmat(), Psepvect(), Psize(), Pdet(), Pleqm(), Pleqm1(), Pgeninvm(), Ptriangleq(); |
void Pinvmat(); |
void Pinvmat(); |
void Pnewbytearray(),Pmemoryplot_to_coord(); |
void Pnewbytearray(),Pmemoryplot_to_coord(); |
|
|
Line 151 struct ftab array_tab[] = { |
|
Line 151 struct ftab array_tab[] = { |
|
{"mat_col",Pmat_col,2}, |
{"mat_col",Pmat_col,2}, |
{"lusolve_prep",Plusolve_prep,1}, |
{"lusolve_prep",Plusolve_prep,1}, |
{"lusolve_main",Plusolve_main,1}, |
{"lusolve_main",Plusolve_main,1}, |
|
{"triangleq",Ptriangleq,1}, |
{0,0,0}, |
{0,0,0}, |
}; |
}; |
|
|
Line 158 typedef struct _ent { int j; unsigned int e; } ent; |
|
Line 159 typedef struct _ent { int j; unsigned int e; } ent; |
|
|
|
ent *get_row(FILE *,int *l); |
ent *get_row(FILE *,int *l); |
void put_row(FILE *out,int l,ent *a); |
void put_row(FILE *out,int l,ent *a); |
int lu_elim(int *l,ent **a,int k,int i,int mul,int mod); |
void lu_elim(int *l,ent **a,int k,int i,int mul,int mod); |
|
void lu_append(int *,ent **,int *,int,int,int); |
|
void solve_l(int *,ent **,int,int *,int); |
|
void solve_u(int *,ent **,int,int *,int); |
|
|
|
|
static int *ul,*ll; |
static int *ul,*ll; |
static ent **u,**l; |
static ent **u,**l; |
static int modulus; |
static int modulus; |
Line 224 ent *get_row(FILE *in,int *l) |
|
Line 229 ent *get_row(FILE *in,int *l) |
|
return a; |
return a; |
} |
} |
|
|
int lu_gauss(int *ul,ent **u,int *ll,ent **l,int n,int mod) |
void lu_gauss(int *ul,ent **u,int *ll,ent **l,int n,int mod) |
{ |
{ |
int i,j,k,s,mul; |
int i,j,k,s,mul; |
unsigned int inv; |
unsigned int inv; |
Line 247 int lu_gauss(int *ul,ent **u,int *ll,ent **l,int n,int |
|
Line 252 int lu_gauss(int *ul,ent **u,int *ll,ent **l,int n,int |
|
|
|
#define INITLEN 10 |
#define INITLEN 10 |
|
|
lu_append(int *l,ent **a,int *l2,int k,int i,int mul) |
void lu_append(int *l,ent **a,int *l2,int k,int i,int mul) |
{ |
{ |
int len; |
int len; |
ent *p; |
ent *p; |
Line 270 lu_append(int *l,ent **a,int *l2,int k,int i,int mul) |
|
Line 275 lu_append(int *l,ent **a,int *l2,int k,int i,int mul) |
|
|
|
/* a[k] = a[k]-mul*a[i] */ |
/* a[k] = a[k]-mul*a[i] */ |
|
|
int lu_elim(int *l,ent **a,int k,int i,int mul,int mod) |
void lu_elim(int *l,ent **a,int k,int i,int mul,int mod) |
{ |
{ |
ent *ak,*ai,*w; |
ent *ak,*ai,*w; |
int lk,li,j,m,p,q,r,s,t,j0; |
int lk,li,j,m,p,q,r,s,t,j0; |
Line 318 int lu_elim(int *l,ent **a,int k,int i,int mul,int mod |
|
Line 323 int lu_elim(int *l,ent **a,int k,int i,int mul,int mod |
|
l[k] = j; |
l[k] = j; |
} |
} |
|
|
int solve_l(int *ll,ent **l,int n,int *rhs,int mod) |
void solve_l(int *ll,ent **l,int n,int *rhs,int mod) |
{ |
{ |
int j,k,s,len; |
int j,k,s,len; |
ent *p; |
ent *p; |
Line 332 int solve_l(int *ll,ent **l,int n,int *rhs,int mod) |
|
Line 337 int solve_l(int *ll,ent **l,int n,int *rhs,int mod) |
|
} |
} |
} |
} |
|
|
int solve_u(int *ul,ent **u,int n,int *rhs,int mod) |
void solve_u(int *ul,ent **u,int n,int *rhs,int mod) |
{ |
{ |
int j,k,s,len,inv; |
int j,k,s,len,inv; |
ent *p; |
ent *p; |
Line 2359 void red_by_vect_sf(int m,unsigned int *p,unsigned int |
|
Line 2364 void red_by_vect_sf(int m,unsigned int *p,unsigned int |
|
*p = _addsf(_mulsf(*r,hc),*p); |
*p = _addsf(_mulsf(*r,hc),*p); |
} |
} |
|
|
|
extern GZ current_mod_lf; |
|
extern int current_mod_lf_size; |
|
|
void red_by_vect_lf(mpz_t *p,mpz_t *r,mpz_t hc,int len) |
void red_by_vect_lf(mpz_t *p,mpz_t *r,mpz_t hc,int len) |
{ |
{ |
mpz_set_ui(*p++,0); r++; len--; |
mpz_set_ui(*p++,0); r++; len--; |
for ( ; len; len--, r++, p++ ) |
for ( ; len; len--, r++, p++ ) { |
mpz_addmul(*p,*r,hc); |
mpz_addmul(*p,*r,hc); |
|
#if 0 |
|
if ( mpz_size(*p) > current_mod_lf_size ) |
|
mpz_mod(*p,*p,BDY(current_mod_lf)); |
|
#endif |
|
} |
} |
} |
|
|
|
|
Line 3078 void mat_to_gfmmat(MAT m,unsigned int md,GFMMAT *rp) |
|
Line 3091 void mat_to_gfmmat(MAT m,unsigned int md,GFMMAT *rp) |
|
TOGFMMAT(row,col,wmat,*rp); |
TOGFMMAT(row,col,wmat,*rp); |
} |
} |
|
|
void Pgeninvm_swap(arg,rp) |
void Pgeninvm_swap(NODE arg,LIST *rp) |
NODE arg; |
|
LIST *rp; |
|
{ |
{ |
MAT m; |
MAT m; |
pointer **mat; |
pointer **mat; |
|
|
} |
} |
} |
} |
|
|
gauss_elim_geninv_mod_swap(mat,row,col,md,invmatp,indexp) |
int gauss_elim_geninv_mod_swap(unsigned int **mat,int row,int col,unsigned int md, |
unsigned int **mat; |
unsigned int ***invmatp,int **indexp) |
int row,col; |
|
unsigned int md; |
|
unsigned int ***invmatp; |
|
int **indexp; |
|
{ |
{ |
int i,j,k,inv,a,n,m; |
int i,j,k,inv,a,n,m; |
unsigned int *t,*pivot,*s; |
unsigned int *t,*pivot,*s; |
Line 3838 void Pmat_col(NODE arg,VECT *rp) |
|
Line 3845 void Pmat_col(NODE arg,VECT *rp) |
|
BDY(vect)[i] = BDY(mat)[i][j]; |
BDY(vect)[i] = BDY(mat)[i][j]; |
} |
} |
*rp = vect; |
*rp = vect; |
|
} |
|
|
|
NODE triangleq(NODE e) |
|
{ |
|
int n,i,k; |
|
V v; |
|
VL vl; |
|
P *p; |
|
NODE r,r1; |
|
|
|
n = length(e); |
|
p = (P *)MALLOC(n*sizeof(P)); |
|
for ( i = 0; i < n; i++, e = NEXT(e) ) p[i] = (P)BDY(e); |
|
i = 0; |
|
while ( 1 ) { |
|
for ( ; i < n && !p[i]; i++ ); |
|
if ( i == n ) break; |
|
if ( OID(p[i]) == O_N ) return 0; |
|
v = p[i]->v; |
|
for ( k = i+1; k < n; k++ ) |
|
if ( p[k] ) { |
|
if ( OID(p[k]) == O_N ) return 0; |
|
if ( p[k]->v == v ) p[k] = 0; |
|
} |
|
i++; |
|
} |
|
for ( r = 0, i = 0; i < n; i++ ) { |
|
if ( p[i] ) { |
|
MKNODE(r1,p[i],r); r = r1; |
|
} |
|
} |
|
return r; |
|
} |
|
|
|
void Ptriangleq(NODE arg,LIST *rp) |
|
{ |
|
NODE ret; |
|
|
|
asir_assert(ARG0(arg),O_LIST,"sparseleq"); |
|
ret = triangleq(BDY((LIST)ARG0(arg))); |
|
MKLIST(*rp,ret); |
} |
} |