version 1.1, 2001/09/03 01:04:26 |
version 1.5, 2001/10/09 01:36:13 |
|
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/gfspn.c,v 1.4 2001/09/03 07:01:06 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "base.h" |
#include "base.h" |
|
|
UM current_mod_gfspn; |
UM current_mod_gfsn; |
|
|
void setmod_gfspn(p) |
void setmod_gfsn(UM p) |
UM p; |
|
{ |
{ |
current_mod_gfspn = p; |
current_mod_gfsn = p; |
} |
} |
|
|
void getmod_gfspn(up) |
void getmod_gfsn(UM *up) |
UM *up; |
|
{ |
{ |
*up = current_mod_gfspn; |
*up = current_mod_gfsn; |
} |
} |
|
|
void simpgfspn(n,r) |
void simpgfsn(GFSN n,GFSN *r) |
GFSPN n; |
|
GFSPN *r; |
|
{ |
{ |
UM t,q; |
UM t,q; |
|
|
if ( !n ) |
if ( !n ) |
*r = 0; |
*r = 0; |
else if ( NID(n) != N_GFSPN ) |
else if ( NID(n) != N_GFSN ) |
*r = n; |
*r = n; |
else { |
else { |
t = UMALLOC(DEG(BDY(n))); |
t = UMALLOC(DEG(BDY(n))); |
q = W_UMALLOC(DEG(BDY(n))); |
q = W_UMALLOC(DEG(BDY(n))); |
cpyum(BDY(n),t); |
cpyum(BDY(n),t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
MKGFSPN(t,*r); |
MKGFSN(t,*r); |
} |
} |
} |
} |
|
|
#define NZGFSPN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSPN)) |
#define NZGFSN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSN)) |
|
|
void ntogfspn(a,b) |
void ntogfsn(Obj a,GFSN *b) |
Obj a; |
|
GFSPN *b; |
|
{ |
{ |
UM t; |
UM t; |
GFS c; |
GFS c; |
|
|
if ( !a || (OID(a)==O_N && NID(a) == N_GFSPN) ) |
if ( !a || (OID(a)==O_N && NID(a) == N_GFSN) ) |
*b = (GFSPN)a; |
*b = (GFSN)a; |
else if ( OID(a) == O_N && (NID(a) == N_GFS || NID(a) == N_Q) ) { |
else if ( OID(a) == O_N && (NID(a) == N_GFS || NID(a) == N_Q) ) { |
ntogfs((Num)a,&c); |
ntogfs((Obj)a,&c); |
if ( !b ) |
if ( !b ) |
*b = 0; |
*b = 0; |
else { |
else { |
t = UMALLOC(0); ptosfum((P)c,t); |
t = UMALLOC(0); ptosfum((P)c,t); |
MKGFSPN(t,*b); |
MKGFSN(t,*b); |
} |
} |
} else |
} else |
error("ntogfspn : invalid argument"); |
error("ntogfsn : invalid argument"); |
} |
} |
|
|
void addgfspn(a,b,c) |
void addgfsn(GFSN a,GFSN b,GFSN *c) |
GFSPN a,b; |
|
GFSPN *c; |
|
{ |
{ |
UM t,q; |
UM t,q; |
GFSPN z; |
GFSN z; |
int d; |
int d; |
|
|
ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z; |
ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z; |
if ( !a ) |
if ( !a ) |
*c = b; |
*c = b; |
else if ( !b ) |
else if ( !b ) |
|
|
t = UMALLOC(d); |
t = UMALLOC(d); |
q = W_UMALLOC(d); |
q = W_UMALLOC(d); |
addsfum(BDY(a),BDY(b),t); |
addsfum(BDY(a),BDY(b),t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
MKGFSPN(t,*c); |
MKGFSN(t,z); |
|
*c = (GFSN)z; |
} |
} |
} |
} |
|
|
void subgfspn(a,b,c) |
void subgfsn(GFSN a,GFSN b,GFSN *c) |
GFSPN a,b; |
|
GFSPN *c; |
|
{ |
{ |
UM t,q; |
UM t,q; |
GFSPN z; |
GFSN z; |
int d; |
int d; |
|
|
ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z; |
ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z; |
if ( !a ) |
if ( !a ) |
chsgngfspn(b,c); |
chsgngfsn(b,c); |
else if ( !b ) |
else if ( !b ) |
*c = a; |
*c = a; |
else { |
else { |
|
|
t = UMALLOC(d); |
t = UMALLOC(d); |
q = W_UMALLOC(d); |
q = W_UMALLOC(d); |
subsfum(BDY(a),BDY(b),t); |
subsfum(BDY(a),BDY(b),t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
MKGFSPN(t,*c); |
MKGFSN(t,*c); |
} |
} |
} |
} |
|
|
extern int up_lazy; |
extern int up_lazy; |
|
|
void mulgfspn(a,b,c) |
void mulgfsn(GFSN a,GFSN b,GFSN *c) |
GFSPN a,b; |
|
GFSPN *c; |
|
{ |
{ |
UM t,q; |
UM t,q; |
GFSPN z; |
GFSN z; |
int d; |
int d; |
|
|
ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z; |
ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z; |
if ( !a || !b ) |
if ( !a || !b ) |
*c = 0; |
*c = 0; |
else { |
else { |
|
|
t = UMALLOC(d); |
t = UMALLOC(d); |
q = W_UMALLOC(d); |
q = W_UMALLOC(d); |
mulsfum(BDY(a),BDY(b),t); |
mulsfum(BDY(a),BDY(b),t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
MKGFSPN(t,*c); |
MKGFSN(t,*c); |
} |
} |
} |
} |
|
|
void divgfspn(a,b,c) |
void divgfsn(GFSN a,GFSN b,GFSN *c) |
GFSPN a,b; |
|
GFSPN *c; |
|
{ |
{ |
GFSPN z; |
GFSN z; |
int d; |
int d; |
UM wb,wc,wd,we,t,q; |
UM wb,wc,wd,we,t,q; |
|
|
ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z; |
ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z; |
if ( !b ) |
if ( !b ) |
error("divgfspn: division by 0"); |
error("divgfsn: division by 0"); |
else if ( !a ) |
else if ( !a ) |
*c = 0; |
*c = 0; |
else { |
else { |
wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb); |
wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb); |
d = DEG(current_mod_gfspn); |
d = DEG(current_mod_gfsn); |
wc = W_UMALLOC(d); cpyum(current_mod_gfspn,wc); |
wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc); |
wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d); |
wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d); |
/* wd*wb+we*wc=1 */ |
/* wd*wb+we*wc=1 */ |
eucsfum(wb,wc,wd,we); |
eucsfum(wb,wc,wd,we); |
d = DEG(BDY(a))+DEG(wd); |
d = DEG(BDY(a))+DEG(wd); |
t = UMALLOC(d); |
t = UMALLOC(d); |
q = W_UMALLOC(d); |
q = W_UMALLOC(d); |
mulsfum(a,wd,t); |
mulsfum(BDY(a),wd,t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
MKGFSPN(t,*c); |
MKGFSN(t,*c); |
} |
} |
} |
} |
|
|
void invgfspn(b,c) |
void invgfsn(GFSN b,GFSN *c) |
GFSPN b; |
|
GFSPN *c; |
|
{ |
{ |
GFSPN z; |
GFSN z; |
int d; |
int d; |
UM wb,wc,wd,we,t; |
UM wb,wc,wd,we,t; |
|
|
ntogfspn((Obj)b,&z); b = z; |
ntogfsn((Obj)b,&z); b = z; |
if ( !b ) |
if ( !b ) |
error("divgfspn: division by 0"); |
error("divgfsn: division by 0"); |
else { |
else { |
wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb); |
wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb); |
d = DEG(current_mod_gfspn); |
d = DEG(current_mod_gfsn); |
wc = W_UMALLOC(d); cpyum(current_mod_gfspn,wc); |
wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc); |
wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d); |
wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d); |
/* wd*wb+we*wc=1 */ |
/* wd*wb+we*wc=1 */ |
eucsfum(wb,wc,wd,we); |
eucsfum(wb,wc,wd,we); |
d = DEG(wd); |
d = DEG(wd); |
t = UMALLOC(d); |
t = UMALLOC(d); |
cpyum(wd,t); |
cpyum(wd,t); |
MKGFSPN(t,*c); |
MKGFSN(t,*c); |
} |
} |
} |
} |
|
|
void chsgngfspn(a,c) |
void chsgngfsn(GFSN a,GFSN *c) |
GFSPN a,*c; |
|
{ |
{ |
GFSPN z; |
GFSN z; |
int d; |
int d; |
struct oUM zero; |
struct oUM zero; |
UM t; |
UM t; |
|
|
ntogfspn((Obj)a,&z); a = z; |
ntogfsn((Obj)a,&z); a = z; |
if ( !a ) |
if ( !a ) |
*c = 0; |
*c = 0; |
else { |
else { |
|
|
t = UMALLOC(d); |
t = UMALLOC(d); |
DEG(&zero) = -1; |
DEG(&zero) = -1; |
subsfum(&zero,BDY(a),t); |
subsfum(&zero,BDY(a),t); |
MKGFSPN(t,*c); |
MKGFSN(t,*c); |
} |
} |
} |
} |
|
|
void pwrgfspn(a,b,c) |
void pwrgfsn(GFSN a,Q b,GFSN *c) |
GFSPN a; |
|
Q b; |
|
GFSPN *c; |
|
{ |
{ |
GFSPN z; |
GFSN z; |
UM t,x,y,q; |
UM t,x,y,q; |
int d,k; |
int d,k; |
N e; |
N e; |
|
|
ntogfspn((Obj)a,&z); a = z; |
ntogfsn((Obj)a,&z); a = z; |
if ( !b ) { |
if ( !b ) { |
t = UMALLOC(0); DEG(t) = 0; COEF(t)[0] = _onesf(); |
t = UMALLOC(0); DEG(t) = 0; COEF(t)[0] = _onesf(); |
MKGFSPN(t,*c); |
MKGFSN(t,*c); |
} else if ( !a ) |
} else if ( !a ) |
*c = 0; |
*c = 0; |
else { |
else { |
d = DEG(current_mod_gfspn); |
d = DEG(current_mod_gfsn); |
|
|
/* y = 1 */ |
/* y = 1 */ |
y = UMALLOC(d); DEG(y) = 0; COEF(y)[0] = _onesf(); |
y = UMALLOC(d); DEG(y) = 0; COEF(y)[0] = _onesf(); |
|
|
|
|
/* x = simplify(a) */ |
/* x = simplify(a) */ |
x = W_UMALLOC(DEG(BDY(a))); cpyum(BDY(a),x); |
x = W_UMALLOC(DEG(BDY(a))); cpyum(BDY(a),x); |
divsfum(x,current_mod_gfspn,q); |
DEG(x) = divsfum(x,current_mod_gfsn,q); |
if ( DEG(x) < 0 ) { |
if ( DEG(x) < 0 ) { |
*c = 0; |
*c = 0; |
} else { |
} else { |
e = NM(b); |
e = NM(b); |
for ( k = n_bits(e)-1; k >= 0; k-- ) { |
for ( k = n_bits(e)-1; k >= 0; k-- ) { |
mulsfum(y,y,t); |
mulsfum(y,y,t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
cpyum(t,y); |
cpyum(t,y); |
if ( e->b[k/32] & (1<<(k%32)) ) { |
if ( e->b[k/32] & (1<<(k%32)) ) { |
mulsfum(y,x,t); |
mulsfum(y,x,t); |
divsfum(t,current_mod_gfspn,q); |
DEG(t) = divsfum(t,current_mod_gfsn,q); |
cpyum(t,y); |
cpyum(t,y); |
} |
} |
} |
} |
MKGFSPN(y,*c); |
MKGFSN(y,*c); |
} |
} |
} |
} |
} |
} |
|
|
int cmpgfspn(a,b) |
int cmpgfsn(GFSN a,GFSN b) |
GFSPN a,b; |
|
{ |
{ |
GFSPN z; |
GFSN z; |
|
|
ntogfspn((Obj)a,&z); a = z; ntogfspn((Obj)b,&z); b = z; |
ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z; |
if ( !a ) |
if ( !a ) |
if ( !b ) |
if ( !b ) |
return 0; |
return 0; |
|
|
return compsfum(BDY(a),BDY(b)); |
return compsfum(BDY(a),BDY(b)); |
} |
} |
|
|
void randomgfspn(r) |
void randomgfsn(GFSN *r) |
GFSPN *r; |
|
{ |
{ |
int i,d; |
int d; |
UM t; |
UM t; |
|
|
if ( !current_mod_gfspn ) |
if ( !current_mod_gfsn ) |
error("randomgfspn : current_mod_gfspn is not set"); |
error("randomgfsn : current_mod_gfsn is not set"); |
d = DEG(current_mod_gfspn); |
d = DEG(current_mod_gfsn); |
t = UMALLOC(d-1); |
t = UMALLOC(d-1); |
randsfum(d,t); |
randsfum(d,t); |
degum(t,d-1); |
degum(t,d-1); |
if ( DEG(t) < 0 ) |
if ( DEG(t) < 0 ) |
*r = 0; |
*r = 0; |
else { |
else { |
MKGFSPN(t,*r); |
MKGFSN(t,*r); |
} |
} |
} |
} |