version 1.5, 2000/08/22 05:03:59 |
version 1.28, 2018/03/27 06:29:19 |
|
|
* 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/poly.c,v 1.4 2000/08/21 08:31:21 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/poly.c,v 1.27 2017/09/06 06:25:26 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
|
|
|
|
void Pranp(); |
void Pranp(); |
|
|
|
void Pheadsgn(); |
|
void Pmul_trunc(),Pquo_trunc(); |
void Pumul(),Pumul_ff(),Pusquare(),Pusquare_ff(),Putmul(),Putmul_ff(); |
void Pumul(),Pumul_ff(),Pusquare(),Pusquare_ff(),Putmul(),Putmul_ff(); |
void Pkmul(),Pksquare(),Pktmul(); |
void Pkmul(),Pksquare(),Pktmul(); |
void Pord(), Pcoef0(), Pcoef(), Pdeg(), Pmindeg(), Psetmod(); |
void Pord(), Premove_vars(), Pcoef0(), Pcoef(), Pdeg(), Pmindeg(), Psetmod(); |
void Pcoef_gf2n(); |
void Pcoef_gf2n(); |
void getcoef(), getdeglist(), mergedeglist(), change_mvar(), restore_mvar(); |
void getcoef(), getdeglist(), mergedeglist(), change_mvar(), restore_mvar(); |
|
|
Line 63 void Pp_mag(),Pmaxblen(); |
|
Line 65 void Pp_mag(),Pmaxblen(); |
|
void Pmergelist(), Pch_mv(), Pre_mv(), Pdeglist(); |
void Pmergelist(), Pch_mv(), Pre_mv(), Pdeglist(); |
void Pptomp(),Pmptop(); |
void Pptomp(),Pmptop(); |
void Pptolmp(),Plmptop(); |
void Pptolmp(),Plmptop(); |
|
void Pptosfp(),Psfptop(),Psf_galois_action(),Psf_embed(),Psf_find_root(); |
|
void Psf_minipoly(),Psf_log(),Psfptopsfp(); |
void Pptogf2n(),Pgf2ntop(),Pgf2ntovect(); |
void Pptogf2n(),Pgf2ntop(),Pgf2ntovect(); |
void Pptogfpn(),Pgfpntop(); |
void Pptogfpn(),Pgfpntop(); |
void Pfind_root_gf2n(); |
void Pfind_root_gf2n(); |
Line 99 void Pis_irred_gf2(); |
|
Line 103 void Pis_irred_gf2(); |
|
void Pis_irred_ddd_gf2(); |
void Pis_irred_ddd_gf2(); |
void Pget_next_fft_prime(); |
void Pget_next_fft_prime(); |
void Puadj_coef(); |
void Puadj_coef(); |
|
void Preorder(); |
|
void Phomogeneous_part(); |
|
void Phomogeneous_deg(); |
void simp_ff(Obj,Obj *); |
void simp_ff(Obj,Obj *); |
void ranp(int,UP *); |
void ranp(int,UP *); |
void field_order_ff(N *); |
void field_order_ff(N *); |
|
|
extern int current_mod; |
|
extern GEN_UP2 current_mod_gf2n; |
|
extern int lm_lazy; |
|
|
|
int current_ff; |
int current_ff; |
|
|
struct ftab poly_tab[] = { |
struct ftab poly_tab[] = { |
|
{"headsgn",Pheadsgn,1}, |
|
{"quo_trunc",Pquo_trunc,2}, |
|
{"mul_trunc",Pmul_trunc,3}, |
|
{"homogeneous_deg",Phomogeneous_deg,-2}, |
|
{"homogeneous_part",Phomogeneous_part,-3}, |
|
{"reorder",Preorder,3}, |
{"uadj_coef",Puadj_coef,3}, |
{"uadj_coef",Puadj_coef,3}, |
{"ranp",Pranp,2}, |
{"ranp",Pranp,2}, |
{"p_mag",Pp_mag,1}, |
{"p_mag",Pp_mag,1}, |
{"maxblen",Pmaxblen,1}, |
{"maxblen",Pmaxblen,1}, |
{"ord",Pord,-1}, |
{"ord",Pord,-1}, |
|
{"remove_vars",Premove_vars,1}, |
|
{"delete_vars",Premove_vars,1}, |
{"coef0",Pcoef0,-3}, |
{"coef0",Pcoef0,-3}, |
{"coef",Pcoef,-3}, |
{"coef",Pcoef,-3}, |
{"coef_gf2n",Pcoef_gf2n,2}, |
{"coef_gf2n",Pcoef_gf2n,2}, |
Line 124 struct ftab poly_tab[] = { |
|
Line 135 struct ftab poly_tab[] = { |
|
|
|
{"sparsemod_gf2n",Psparsemod_gf2n,-1}, |
{"sparsemod_gf2n",Psparsemod_gf2n,-1}, |
|
|
{"setmod_ff",Psetmod_ff,-2}, |
{"setmod_ff",Psetmod_ff,-3}, |
{"simp_ff",Psimp_ff,1}, |
{"simp_ff",Psimp_ff,1}, |
{"extdeg_ff",Pextdeg_ff,0}, |
{"extdeg_ff",Pextdeg_ff,0}, |
{"characteristic_ff",Pcharacteristic_ff,0}, |
{"characteristic_ff",Pcharacteristic_ff,0}, |
Line 137 struct ftab poly_tab[] = { |
|
Line 148 struct ftab poly_tab[] = { |
|
{"ch_mv",Pch_mv,2}, |
{"ch_mv",Pch_mv,2}, |
{"re_mv",Pre_mv,2}, |
{"re_mv",Pre_mv,2}, |
|
|
{"ptomp",Pptomp,2}, |
{"ptomp",Pptomp,-2}, |
{"mptop",Pmptop,1}, |
{"mptop",Pmptop,1}, |
|
|
{"ptolmp",Pptolmp,1}, |
{"ptolmp",Pptolmp,1}, |
{"lmptop",Plmptop,1}, |
{"lmptop",Plmptop,1}, |
|
|
|
{"sf_galois_action",Psf_galois_action,2}, |
|
{"sf_find_root",Psf_find_root,1}, |
|
{"sf_minipoly",Psf_minipoly,2}, |
|
{"sf_embed",Psf_embed,3}, |
|
{"sf_log",Psf_log,1}, |
|
|
|
{"ptosfp",Pptosfp,1}, |
|
{"sfptop",Psfptop,1}, |
|
{"sfptopsfp",Psfptopsfp,2}, |
{"ptogf2n",Pptogf2n,1}, |
{"ptogf2n",Pptogf2n,1}, |
{"gf2ntop",Pgf2ntop,-2}, |
{"gf2ntop",Pgf2ntop,-2}, |
{"gf2ntovect",Pgf2ntovect,1}, |
{"gf2ntovect",Pgf2ntovect,1}, |
Line 210 struct ftab poly_tab[] = { |
|
Line 230 struct ftab poly_tab[] = { |
|
{0,0,0}, |
{0,0,0}, |
}; |
}; |
|
|
extern V up_var; |
void Pheadsgn(NODE arg,Q *rp) |
|
{ |
|
int s; |
|
|
|
s = headsgn((P)ARG0(arg)); |
|
STOQ(s,*rp); |
|
} |
|
|
|
void Pmul_trunc(NODE arg,P *rp) |
|
{ |
|
P p1,p2,p,h; |
|
VL vl0,vl1,vl2,tvl,vl; |
|
VN vn; |
|
int i,n; |
|
|
|
p1 = (P)ARG0(arg); |
|
p2 = (P)ARG1(arg); |
|
get_vars((Obj)p1,&vl1); get_vars((Obj)p2,&vl2); mergev(CO,vl1,vl2,&tvl); |
|
p = (P)ARG2(arg); |
|
get_vars((Obj)p,&vl0); mergev(CO,tvl,vl0,&vl); |
|
for ( tvl = vl, n = 0; tvl; tvl = NEXT(tvl), n++ ); |
|
vn = (VN) ALLOCA((n+1)*sizeof(struct oVN)); |
|
for ( i = 0, tvl = vl; i < n; tvl = NEXT(tvl), i++ ) { |
|
vn[i].v = tvl->v; |
|
vn[i].n = 0; |
|
} |
|
vn[i].v = 0; |
|
vn[i].n = 0; |
|
for ( h = p, i = 0; OID(h) == O_P; h = COEF(DC(h)) ) { |
|
for ( ; vn[i].v != VR(h); i++ ); |
|
vn[i].n = QTOS(DEG(DC(h))); |
|
} |
|
mulp_trunc(vl,p1,p2,vn,rp); |
|
} |
|
|
|
void Pquo_trunc(NODE arg,P *rp) |
|
{ |
|
P p1,p2,p,h; |
|
VL vl0,vl1,vl2,tvl,vl; |
|
VN vn; |
|
int i,n; |
|
|
|
p1 = (P)ARG0(arg); |
|
p2 = (P)ARG1(arg); |
|
if ( !p1 ) |
|
*rp = 0; |
|
else if ( NUM(p2) ) |
|
divsp(CO,p1,p2,rp); |
|
else { |
|
get_vars((Obj)p1,&vl1); get_vars((Obj)p2,&vl2); mergev(CO,vl1,vl2,&vl); |
|
for ( tvl = vl, n = 0; tvl; tvl = NEXT(tvl), n++ ); |
|
vn = (VN) ALLOCA((n+1)*sizeof(struct oVN)); |
|
for ( i = 0, tvl = vl; i < n; tvl = NEXT(tvl), i++ ) { |
|
vn[i].v = tvl->v; |
|
vn[i].n = 0; |
|
} |
|
vn[i].v = 0; |
|
vn[i].n = 0; |
|
for ( h = p2, i = 0; OID(h) == O_P; h = COEF(DC(h)) ) { |
|
for ( ; vn[i].v != VR(h); i++ ); |
|
vn[i].n = QTOS(DEG(DC(h))); |
|
} |
|
quop_trunc(vl,p1,p2,vn,rp); |
|
} |
|
} |
|
|
|
void Phomogeneous_part(NODE arg,P *rp) |
|
{ |
|
if ( argc(arg) == 2 ) |
|
exthp(CO,(P)ARG0(arg),QTOS((Q)ARG1(arg)),rp); |
|
else |
|
exthpc_generic(CO,(P)ARG0(arg),QTOS((Q)ARG2(arg)), |
|
VR((P)ARG1(arg)),rp); |
|
} |
|
|
|
void Phomogeneous_deg(NODE arg,Q *rp) |
|
{ |
|
int d; |
|
|
|
if ( argc(arg) == 1 ) |
|
d = homdeg((P)ARG0(arg)); |
|
else |
|
d = getchomdeg(VR((P)ARG1(arg)),(P)ARG0(arg)); |
|
STOQ(d,*rp); |
|
} |
|
|
|
/* |
|
p1 = reorder(p,ovl,nvl) => p1 is 'sorted accoding to nvl. |
|
*/ |
|
|
|
void Preorder(NODE arg,P *rp) |
|
{ |
|
VL ovl,nvl,tvl; |
|
NODE n; |
|
|
|
for ( ovl = 0, n = BDY((LIST)ARG1(arg)); n; n = NEXT(n) ) { |
|
if ( !ovl ) { |
|
NEWVL(ovl); tvl = ovl; |
|
} else { |
|
NEWVL(NEXT(tvl)); tvl = NEXT(tvl); |
|
} |
|
VR(tvl) = VR((P)BDY(n)); |
|
} |
|
for ( nvl = 0, n = BDY((LIST)ARG2(arg)); n; n = NEXT(n) ) { |
|
if ( !nvl ) { |
|
NEWVL(nvl); tvl = nvl; |
|
} else { |
|
NEWVL(NEXT(tvl)); tvl = NEXT(tvl); |
|
} |
|
VR(tvl) = VR((P)BDY(n)); |
|
} |
|
reorderp(nvl,ovl,(P)ARG0(arg),rp); |
|
} |
|
|
/* |
/* |
uadj_coef(F,M,M2) |
uadj_coef(F,M,M2) |
if ( F is a non-negative integer ) |
if ( F is a non-negative integer ) |
Line 221 extern V up_var; |
|
Line 353 extern V up_var; |
|
return uadj_coef(CN,M,M2)*V^N+...+uadj_coef(C0,M,M2); |
return uadj_coef(CN,M,M2)*V^N+...+uadj_coef(C0,M,M2); |
*/ |
*/ |
|
|
void Puadj_coef(arg,rp) |
void Puadj_coef(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP f,r; |
UP f,r; |
N m,m2; |
N m,m2; |
|
|
return [Index,Mod] or 0 (not exist) |
return [Index,Mod] or 0 (not exist) |
*/ |
*/ |
|
|
void Pget_next_fft_prime(arg,rp) |
void Pget_next_fft_prime(NODE arg,LIST *rp) |
NODE arg; |
|
LIST *rp; |
|
{ |
{ |
unsigned int mod,d; |
unsigned int mod,d; |
int start,bits,i; |
int start,bits,i; |
|
|
if ( !mod ) { |
if ( !mod ) { |
*rp = 0; return; |
*rp = 0; return; |
} |
} |
if ( bits <= d ) { |
if ( bits <= (int)d ) { |
UTOQ(mod,q); |
UTOQ(mod,q); |
UTOQ(i,ind); |
UTOQ(i,ind); |
n = mknode(2,ind,q); |
n = mknode(2,ind,q); |
|
|
} |
} |
} |
} |
|
|
void Pranp(arg,rp) |
void Pranp(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
int n; |
int n; |
UP c; |
UP c; |
|
|
*rp = 0; |
*rp = 0; |
} |
} |
|
|
void ranp(n,nr) |
void ranp(int n,UP *nr) |
int n; |
|
UP *nr; |
|
{ |
{ |
int i; |
int i; |
unsigned int r; |
unsigned int r; |
|
|
*nr = 0; |
*nr = 0; |
} |
} |
|
|
void Pmaxblen(arg,rp) |
void Pmaxblen(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
int l; |
int l; |
l = maxblenp(ARG0(arg)); |
l = maxblenp(ARG0(arg)); |
STOQ(l,*rp); |
STOQ(l,*rp); |
} |
} |
|
|
void Pp_mag(arg,rp) |
void Pp_mag(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
int l; |
int l; |
l = p_mag(ARG0(arg)); |
l = p_mag(ARG0(arg)); |
STOQ(l,*rp); |
STOQ(l,*rp); |
} |
} |
|
|
void Pord(arg,listp) |
void Pord(NODE arg,LIST *listp) |
NODE arg; |
|
LIST *listp; |
|
{ |
{ |
NODE n,tn; |
NODE n,tn,p,opt; |
|
char *key; |
|
Obj value; |
|
int overwrite=0; |
LIST l; |
LIST l; |
VL vl,tvl,svl; |
VL vl,tvl,svl; |
P t; |
P t; |
|
|
V *va; |
V *va; |
V v; |
V v; |
|
|
|
printf("LASTCO="); printv(CO,LASTCO->v); printf("\n"); |
|
if ( current_option ) { |
|
for ( opt = current_option; opt; opt = NEXT(opt) ) { |
|
p = BDY((LIST)BDY(opt)); |
|
key = BDY((STRING)BDY(p)); |
|
value = (Obj)BDY(NEXT(p)); |
|
if ( !strcmp(key,"overwrite") && value ) { |
|
overwrite = value ? 1 : 0; |
|
break; |
|
} |
|
} |
|
} |
|
|
if ( argc(arg) ) { |
if ( argc(arg) ) { |
asir_assert(ARG0(arg),O_LIST,"ord"); |
asir_assert(ARG0(arg),O_LIST,"ord"); |
for ( vl = 0, i = 0, n = BDY((LIST)ARG0(arg)); |
for ( vl = 0, i = 0, n = BDY((LIST)ARG0(arg)); |
|
|
error("ord : invalid argument"); |
error("ord : invalid argument"); |
VR(tvl) = VR(t); |
VR(tvl) = VR(t); |
} |
} |
va = (V *)ALLOCA(i*sizeof(V)); |
if ( !overwrite ) { |
for ( j = 0, svl = vl; j < i; j++, svl = NEXT(svl) ) |
va = (V *)ALLOCA(i*sizeof(V)); |
va[j] = VR(svl); |
for ( j = 0, svl = vl; j < i; j++, svl = NEXT(svl) ) |
for ( svl = CO; svl; svl = NEXT(svl) ) { |
va[j] = VR(svl); |
v = VR(svl); |
for ( svl = CO; svl; svl = NEXT(svl) ) { |
for ( j = 0; j < i; j++ ) |
v = VR(svl); |
if ( v == va[j] ) |
for ( j = 0; j < i; j++ ) |
break; |
if ( v == va[j] ) |
if ( j == i ) { |
break; |
if ( !vl ) { |
if ( j == i ) { |
NEWVL(vl); tvl = vl; |
if ( !vl ) { |
} else { |
NEWVL(vl); tvl = vl; |
NEWVL(NEXT(tvl)); tvl = NEXT(tvl); |
} else { |
|
NEWVL(NEXT(tvl)); tvl = NEXT(tvl); |
|
} |
|
VR(tvl) = v; |
} |
} |
VR(tvl) = v; |
|
} |
} |
|
} else { |
|
for ( svl = vl; svl; svl = NEXT(svl) ) { |
|
if ( svl->v->attr == (pointer)V_PF ) |
|
((PFINS)svl->v->priv)->pf->ins = 0; |
|
} |
} |
} |
if ( vl ) |
if ( vl ) |
NEXT(tvl) = 0; |
NEXT(tvl) = 0; |
CO = vl; |
CO = vl; |
|
update_LASTCO(); |
} |
} |
for ( n = 0, vl = CO; vl; vl = NEXT(vl) ) { |
for ( n = 0, vl = CO; vl; vl = NEXT(vl) ) { |
NEXTNODE(n,tn); MKV(VR(vl),t); BDY(tn) = (pointer)t; |
NEXTNODE(n,tn); MKV(VR(vl),t); BDY(tn) = (pointer)t; |
|
|
NEXT(tn) = 0; MKLIST(l,n); *listp = l; |
NEXT(tn) = 0; MKLIST(l,n); *listp = l; |
} |
} |
|
|
void Pcoef0(arg,rp) |
void Premove_vars(NODE arg,LIST *listp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
|
NODE l,nd,tnd; |
|
V *v,*va; |
|
int n,na,i,j; |
|
VL vl,vl1; |
|
P t; |
|
LIST list; |
|
|
|
asir_assert(ARG0(arg),O_LIST,"remove_vars"); |
|
l = BDY((LIST)ARG0(arg)); n = length(l); |
|
v = (V *)ALLOCA(n*sizeof(V)); |
|
for ( i = 0; i < n; i++, l = NEXT(l) ) |
|
if ( !(t = (P)BDY(l)) || (OID(t) != O_P) ) |
|
error("ord : invalid argument"); |
|
else v[i] = VR(t); |
|
|
|
for ( na = 0, vl = CO; vl; vl = NEXT(vl), na++ ); |
|
va = (V *)ALLOCA(na*sizeof(V)); |
|
for ( i = 0, vl = CO; i < na; i++, vl = NEXT(vl) ) va[i] = VR(vl); |
|
for ( i = 0; i < na; i++ ) |
|
for ( j = 0; j < n; j++ ) if ( va[i] == v[j] ) va[i] = 0; |
|
for ( vl = 0, i = na-1; i >= 0; i-- ) |
|
if ( va[i] ) { |
|
NEWVL(vl1); VR(vl1) = va[i]; NEXT(vl1) = vl; vl = vl1; |
|
} |
|
CO = vl; |
|
for ( nd = 0, vl = CO; vl; vl = NEXT(vl) ) { |
|
NEXTNODE(nd,tnd); MKV(VR(vl),t); BDY(tnd) = (pointer)t; |
|
} |
|
if ( nd ) NEXT(tnd) = 0; |
|
MKLIST(list,nd); *listp = list; |
|
} |
|
|
|
void Pcoef0(NODE arg,Obj *rp) |
|
{ |
Obj t,n; |
Obj t,n; |
P s; |
P s; |
DCP dc; |
DCP dc; |
|
|
} |
} |
} |
} |
|
|
void Pcoef(arg,rp) |
void Pcoef(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
Obj t,n; |
Obj t,n; |
P s; |
P s; |
|
|
} |
} |
} |
} |
|
|
void Pcoef_gf2n(arg,rp) |
void Pcoef_gf2n(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
Obj t,n; |
Obj t,n; |
int id,d; |
int id,d; |
|
|
*rp = 0; |
*rp = 0; |
} |
} |
|
|
void Pdeg(arg,rp) |
void Pdeg(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
Obj t,v; |
Obj t,v; |
int d; |
int d; |
|
|
degp(VR((P)ARG1(arg)),(P)ARG0(arg),rp); |
degp(VR((P)ARG1(arg)),(P)ARG0(arg),rp); |
} |
} |
|
|
void Pmindeg(arg,rp) |
void Pmindeg(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
Obj t; |
Obj t; |
|
|
|
|
getmindeg(VR((P)ARG1(arg)),(P)ARG0(arg),rp); |
getmindeg(VR((P)ARG1(arg)),(P)ARG0(arg),rp); |
} |
} |
|
|
void Psetmod(arg,rp) |
void Psetmod(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
if ( arg ) { |
if ( arg ) { |
asir_assert(ARG0(arg),O_N,"setmod"); |
asir_assert(ARG0(arg),O_N,"setmod"); |
|
|
STOQ(current_mod,*rp); |
STOQ(current_mod,*rp); |
} |
} |
|
|
void Psparsemod_gf2n(arg,rp) |
void Psparsemod_gf2n(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
int id; |
int id; |
|
|
|
|
STOQ(id,*rp); |
STOQ(id,*rp); |
} |
} |
|
|
void Pmultest_gf2n(arg,rp) |
void Pmultest_gf2n(NODE arg,GF2N *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
GF2N a,b,c; |
GF2N a,b,c; |
int i; |
int i; |
|
|
*rp = c; |
*rp = c; |
} |
} |
|
|
void Psquaretest_gf2n(arg,rp) |
void Psquaretest_gf2n(NODE arg,GF2N *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
GF2N a,c; |
GF2N a,c; |
int i; |
int i; |
|
|
*rp = c; |
*rp = c; |
} |
} |
|
|
void Pinvtest_gf2n(arg,rp) |
void Pinvtest_gf2n(NODE arg,GF2N *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
GF2N a,c; |
GF2N a,c; |
int i; |
int i; |
|
|
*rp = c; |
*rp = c; |
} |
} |
|
|
void Pbininv_gf2n(arg,rp) |
void Pbininv_gf2n(NODE arg,GF2N *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
UP2 a,inv; |
UP2 a,inv; |
int n; |
int n; |
|
|
MKGF2N(inv,*rp); |
MKGF2N(inv,*rp); |
} |
} |
|
|
void Prinvtest_gf2n(rp) |
void Prinvtest_gf2n(Real *rp) |
Real *rp; |
|
{ |
{ |
GF2N *a; |
GF2N *a; |
GF2N c; |
GF2N c; |
|
|
MKReal(r,*rp); |
MKReal(r,*rp); |
} |
} |
|
|
void Pfind_root_gf2n(arg,rp) |
void Pfind_root_gf2n(NODE arg,GF2N *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
|
|
#if 0 |
#if 0 |
|
|
#endif |
#endif |
} |
} |
|
|
void Pis_irred_gf2(arg,rp) |
void Pis_irred_gf2(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
UP2 t; |
UP2 t; |
|
|
|
|
*rp = irredcheckup2(t) ? ONE : 0; |
*rp = irredcheckup2(t) ? ONE : 0; |
} |
} |
|
|
void Pis_irred_ddd_gf2(arg,rp) |
void Pis_irred_ddd_gf2(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
UP2 t; |
UP2 t; |
int ret; |
int ret; |
|
|
STOQ(ret,*rp); |
STOQ(ret,*rp); |
} |
} |
|
|
void Psetmod_ff(arg,rp) |
void Psetmod_ff(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
int ac; |
int ac; |
|
int d; |
Obj mod,defpoly; |
Obj mod,defpoly; |
N n; |
N n; |
UP up; |
UP up; |
UP2 up2; |
UP2 up2; |
Q q; |
UM dp; |
P p; |
Q q,r; |
|
P p,p1,y; |
NODE n0,n1; |
NODE n0,n1; |
LIST list; |
LIST list; |
|
|
|
|
if ( ac == 1 ) { |
if ( ac == 1 ) { |
mod = (Obj)ARG0(arg); |
mod = (Obj)ARG0(arg); |
if ( !mod ) |
if ( !mod ) |
error("setmod_ff : invalid argument"); |
current_ff = FF_NOT_SET; |
switch ( OID(mod) ) { |
else { |
|
switch ( OID(mod) ) { |
case O_N: |
case O_N: |
current_ff = FF_GFP; |
current_ff = FF_GFP; |
setmod_lm(NM((Q)mod)); break; |
setmod_lm(NM((Q)mod)); |
|
break; |
case O_P: |
case O_P: |
current_ff = FF_GF2N; |
current_ff = FF_GF2N; |
setmod_gf2n((P)mod); break; |
setmod_gf2n((P)mod); break; |
default: |
default: |
error("setmod_ff : invalid argument"); |
error("setmod_ff : invalid argument"); |
} |
} |
|
} |
} else if ( ac == 2 ) { |
} else if ( ac == 2 ) { |
current_ff = FF_GFPN; |
if ( OID(ARG0(arg)) == O_N ) { |
defpoly = (Obj)ARG0(arg); |
/* small finite field; primitive root representation */ |
mod = (Obj)ARG1(arg); |
current_ff = FF_GFS; |
if ( !mod || !defpoly ) |
setmod_sf(QTOS((Q)ARG0(arg)),QTOS((Q)ARG1(arg))); |
error("setmod_ff : invalid argument"); |
} else { |
setmod_lm(NM((Q)mod)); |
mod = (Obj)ARG1(arg); |
setmod_gfpn((P)defpoly); |
current_ff = FF_GFPN; |
|
defpoly = (Obj)ARG0(arg); |
|
if ( !mod || !defpoly ) |
|
error("setmod_ff : invalid argument"); |
|
setmod_lm(NM((Q)mod)); |
|
setmod_gfpn((P)defpoly); |
|
} |
|
} else if ( ac == 3 ) { |
|
/* finite extension of a small finite field */ |
|
current_ff = FF_GFS; |
|
setmod_sf(QTOS((Q)ARG0(arg)),QTOS((Q)ARG1(arg))); |
|
d = QTOS((Q)ARG2(arg)); |
|
generate_defpoly_sfum(d,&dp); |
|
setmod_gfsn(dp); |
|
current_ff = FF_GFSN; |
} |
} |
switch ( current_ff ) { |
switch ( current_ff ) { |
case FF_GFP: |
case FF_GFP: |
|
|
MKNODE(n1,q,0); MKNODE(n0,p,n1); |
MKNODE(n1,q,0); MKNODE(n0,p,n1); |
MKLIST(list,n0); |
MKLIST(list,n0); |
*rp = (Obj)list; break; |
*rp = (Obj)list; break; |
|
case FF_GFS: |
|
case FF_GFSN: |
|
STOQ(current_gfs_p,q); |
|
if ( current_gfs_ext ) |
|
enc_to_p(current_gfs_p,current_gfs_iton[1], |
|
VR(current_gfs_ext),&p); |
|
else { |
|
if ( current_gfs_p == 2 ) |
|
r = ONE; |
|
else if ( !current_gfs_ntoi ) |
|
r = 0; |
|
else |
|
STOQ(current_gfs_iton[1],r); |
|
p = (P)r; |
|
} |
|
switch ( current_ff ) { |
|
case FF_GFS: |
|
n0 = mknode(3,q,current_gfs_ext,p); |
|
break; |
|
case FF_GFSN: |
|
getmod_gfsn(&dp); |
|
makevar("y",&y); |
|
sfumtop(VR(y),dp,&p1); |
|
n0 = mknode(4,q,current_gfs_ext,p,p1); |
|
break; |
|
} |
|
MKLIST(list,n0); |
|
*rp = (Obj)list; break; |
default: |
default: |
*rp = 0; break; |
*rp = 0; break; |
} |
} |
} |
} |
|
|
void Pextdeg_ff(rp) |
void Pextdeg_ff(Q *rp) |
Q *rp; |
|
{ |
{ |
int d; |
int d; |
UP2 up2; |
UP2 up2; |
UP up; |
UP up; |
|
UM dp; |
|
|
switch ( current_ff ) { |
switch ( current_ff ) { |
case FF_GFP: |
case FF_GFP: |
|
|
getmod_gf2n(&up2); d = degup2(up2); STOQ(d,*rp); break; |
getmod_gf2n(&up2); d = degup2(up2); STOQ(d,*rp); break; |
case FF_GFPN: |
case FF_GFPN: |
getmod_gfpn(&up); STOQ(up->d,*rp); break; |
getmod_gfpn(&up); STOQ(up->d,*rp); break; |
|
case FF_GFS: |
|
if ( !current_gfs_ext ) |
|
*rp = ONE; |
|
else |
|
*rp = DEG(DC(current_gfs_ext)); |
|
break; |
|
case FF_GFSN: |
|
getmod_gfsn(&dp); |
|
STOQ(DEG(dp),*rp); |
|
break; |
default: |
default: |
error("extdeg_ff : current_ff is not set"); |
error("extdeg_ff : current_ff is not set"); |
} |
} |
} |
} |
|
|
void Pcharacteristic_ff(rp) |
void Pcharacteristic_ff(Q *rp) |
Q *rp; |
|
{ |
{ |
N lm; |
N lm; |
|
|
|
|
getmod_lm(&lm); NTOQ(lm,1,*rp); break; |
getmod_lm(&lm); NTOQ(lm,1,*rp); break; |
case FF_GF2N: |
case FF_GF2N: |
STOQ(2,*rp); break; |
STOQ(2,*rp); break; |
|
case FF_GFS: |
|
case FF_GFSN: |
|
STOQ(current_gfs_p,*rp); break; |
default: |
default: |
error("characteristic_ff : current_ff is not set"); |
error("characteristic_ff : current_ff is not set"); |
} |
} |
} |
} |
|
|
void Pfield_type_ff(rp) |
void Pfield_type_ff(Q *rp) |
Q *rp; |
|
{ |
{ |
STOQ(current_ff,*rp); |
STOQ(current_ff,*rp); |
} |
} |
|
|
void Pfield_order_ff(rp) |
void Pfield_order_ff(Q *rp) |
Q *rp; |
|
{ |
{ |
N n; |
N n; |
|
|
|
|
NTOQ(n,1,*rp); |
NTOQ(n,1,*rp); |
} |
} |
|
|
void field_order_ff(order) |
void Prandom_ff(Obj *rp) |
N *order; |
|
{ |
{ |
UP2 up2; |
|
UP up; |
|
N m; |
|
int d,w; |
|
|
|
switch ( current_ff ) { |
|
case FF_GFP: |
|
getmod_lm(order); break; |
|
case FF_GF2N: |
|
getmod_gf2n(&up2); d = degup2(up2); |
|
w = (d>>5)+1; |
|
*order = m = NALLOC(w); |
|
PL(m)=w; |
|
bzero((char *)BD(m),w*sizeof(unsigned int)); |
|
BD(m)[d>>5] |= 1<<(d&31); |
|
break; |
|
case FF_GFPN: |
|
getmod_lm(&m); |
|
getmod_gfpn(&up); pwrn(m,up->d,order); break; |
|
default: |
|
error("field_order_ff : current_ff is not set"); |
|
} |
|
} |
|
|
|
void Prandom_ff(rp) |
|
Obj *rp; |
|
{ |
|
LM l; |
LM l; |
GF2N g; |
GF2N g; |
GFPN p; |
GFPN p; |
|
GFS s; |
|
GFSN spn; |
|
|
switch ( current_ff ) { |
switch ( current_ff ) { |
case FF_GFP: |
case FF_GFP: |
|
|
randomgf2n(&g); *rp = (Obj)g; break; |
randomgf2n(&g); *rp = (Obj)g; break; |
case FF_GFPN: |
case FF_GFPN: |
randomgfpn(&p); *rp = (Obj)p; break; |
randomgfpn(&p); *rp = (Obj)p; break; |
|
case FF_GFS: |
|
randomgfs(&s); *rp = (Obj)s; break; |
|
case FF_GFSN: |
|
randomgfsn(&spn); *rp = (Obj)spn; break; |
default: |
default: |
error("random_ff : current_ff is not set"); |
error("random_ff : current_ff is not set"); |
} |
} |
} |
} |
|
|
void Psimp_ff(arg,rp) |
void Psimp_ff(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
LM r; |
|
GF2N rg; |
|
extern lm_lazy; |
|
|
|
simp_ff((Obj)ARG0(arg),rp); |
simp_ff((Obj)ARG0(arg),rp); |
} |
} |
|
|
void simp_ff(p,rp) |
void getcoef(VL vl,P p,V v,Q d,P *r) |
Obj p; |
|
Obj *rp; |
|
{ |
{ |
Num n; |
|
LM r,s; |
|
DCP dc,dcr0,dcr; |
|
GF2N rg,sg; |
|
GFPN rpn,spn; |
|
P t; |
|
Obj obj; |
|
|
|
lm_lazy = 0; |
|
if ( !p ) |
|
*rp = 0; |
|
else if ( OID(p) == O_N ) { |
|
switch ( current_ff ) { |
|
case FF_GFP: |
|
ptolmp((P)p,&t); simplm((LM)t,&s); *rp = (Obj)s; |
|
break; |
|
case FF_GF2N: |
|
ptogf2n((Obj)p,&rg); simpgf2n((GF2N)rg,&sg); *rp = (Obj)sg; |
|
break; |
|
case FF_GFPN: |
|
ntogfpn((Obj)p,&rpn); simpgfpn((GFPN)rpn,&spn); *rp = (Obj)spn; |
|
break; |
|
default: |
|
*rp = (Obj)p; |
|
break; |
|
} |
|
} else if ( OID(p) == O_P ) { |
|
for ( dc = DC((P)p), dcr0 = 0; dc; dc = NEXT(dc) ) { |
|
simp_ff((Obj)COEF(dc),&obj); |
|
if ( obj ) { |
|
NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = (P)obj; |
|
} |
|
} |
|
if ( !dcr0 ) |
|
*rp = 0; |
|
else { |
|
NEXT(dcr) = 0; MKP(VR((P)p),dcr0,t); *rp = (Obj)t; |
|
} |
|
} else |
|
error("simp_ff : not implemented yet"); |
|
} |
|
|
|
void getcoef(vl,p,v,d,r) |
|
VL vl; |
|
P p; |
|
V v; |
|
Q d; |
|
P *r; |
|
{ |
|
P s,t,u,a,b,x; |
P s,t,u,a,b,x; |
DCP dc; |
DCP dc; |
V w; |
V w; |
|
|
} |
} |
} |
} |
|
|
void Pdeglist(arg,rp) |
void Pdeglist(NODE arg,LIST *rp) |
NODE arg; |
|
LIST *rp; |
|
{ |
{ |
NODE d; |
NODE d; |
|
|
|
|
MKLIST(*rp,d); |
MKLIST(*rp,d); |
} |
} |
|
|
void Pch_mv(arg,rp) |
void Pch_mv(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
change_mvar(CO,(P)ARG0(arg),VR((P)ARG1(arg)),rp); |
change_mvar(CO,(P)ARG0(arg),VR((P)ARG1(arg)),rp); |
} |
} |
|
|
void Pre_mv(arg,rp) |
void Pre_mv(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
restore_mvar(CO,(P)ARG0(arg),VR((P)ARG1(arg)),rp); |
restore_mvar(CO,(P)ARG0(arg),VR((P)ARG1(arg)),rp); |
} |
} |
|
|
void change_mvar(vl,p,v,r) |
void change_mvar(VL vl,P p,V v,P *r) |
VL vl; |
|
P p; |
|
V v; |
|
P *r; |
|
{ |
{ |
Q d; |
Q d; |
DCP dc,dc0; |
DCP dc,dc0; |
|
|
} |
} |
} |
} |
|
|
void restore_mvar(vl,p,v,r) |
void restore_mvar(VL vl,P p,V v,P *r) |
VL vl; |
|
P p; |
|
V v; |
|
P *r; |
|
{ |
{ |
P s,u,a,b,x; |
P s,u,a,b,x; |
DCP dc; |
DCP dc; |
|
|
} |
} |
} |
} |
|
|
void getdeglist(p,v,d) |
void getdeglist(P p,V v,NODE *d) |
P p; |
|
V v; |
|
NODE *d; |
|
{ |
{ |
NODE n,n0,d0,d1,d2; |
NODE n,n0,d0,d1,d2; |
DCP dc; |
DCP dc; |
|
|
*d = d0; |
*d = d0; |
} |
} |
} |
} |
void Pmergelist(arg,rp) |
|
NODE arg; |
void Pmergelist(NODE arg,LIST *rp) |
LIST *rp; |
|
{ |
{ |
NODE n; |
NODE n; |
|
|
|
|
MKLIST(*rp,n); |
MKLIST(*rp,n); |
} |
} |
|
|
void mergedeglist(d0,d1,dr) |
void mergedeglist(NODE d0,NODE d1,NODE *dr) |
NODE d0,d1,*dr; |
|
{ |
{ |
NODE t0,t,dt; |
NODE t0,t,dt; |
Q d; |
Q d; |
Line 1035 NODE d0,d1,*dr; |
|
Line 1139 NODE d0,d1,*dr; |
|
} |
} |
} |
} |
|
|
void Pptomp(arg,rp) |
void Pptomp(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
ptomp(QTOS((Q)ARG1(arg)),(P)ARG0(arg),rp); |
int mod; |
|
|
|
if ( argc(arg) == 1 ) { |
|
if ( !current_mod ) |
|
error("ptomp : current_mod is not set"); |
|
else |
|
mod = current_mod; |
|
} else |
|
mod = QTOS((Q)ARG1(arg)); |
|
ptomp(mod,(P)ARG0(arg),rp); |
} |
} |
|
|
void Pmptop(arg,rp) |
void Pmptop(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
mptop((P)ARG0(arg),rp); |
mptop((P)ARG0(arg),rp); |
} |
} |
|
|
void Pptolmp(arg,rp) |
void Pptolmp(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
ptolmp((P)ARG0(arg),rp); |
ptolmp((P)ARG0(arg),rp); |
} |
} |
|
|
void Plmptop(arg,rp) |
void Plmptop(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
lmptop((P)ARG0(arg),rp); |
lmptop((P)ARG0(arg),rp); |
} |
} |
|
|
void Pptogf2n(arg,rp) |
void Psf_galois_action(NODE arg,P *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
ptogf2n((Obj)ARG0(arg),rp); |
sf_galois_action(ARG0(arg),ARG1(arg),rp); |
} |
} |
|
|
void Pgf2ntop(arg,rp) |
/* |
NODE arg; |
sf_embed(F,B,PM) |
P *rp; |
F : an element of GF(pn) |
|
B : the image of the primitive root of GF(pn) |
|
PM : order of GF(pm) |
|
*/ |
|
|
|
void Psf_embed(NODE arg,P *rp) |
{ |
{ |
extern V up2_var; |
int k,pm; |
|
|
|
/* GF(pn)={0,1,a,a^2,...}->GF(pm)={0,1,b,b^2,...}; a->b^k */ |
|
k = CONT((GFS)ARG1(arg)); |
|
pm = QTOS((Q)ARG2(arg)); |
|
sf_embed((P)ARG0(arg),k,pm,rp); |
|
} |
|
|
|
void Psf_log(NODE arg,Q *rp) |
|
{ |
|
int k; |
|
|
|
if ( !ARG0(arg) ) |
|
error("sf_log : invalid armument"); |
|
k = CONT((GFS)ARG0(arg)); |
|
STOQ(k,*rp); |
|
} |
|
|
|
void Psf_find_root(NODE arg,GFS *rp) |
|
{ |
|
P p; |
|
Obj t; |
|
int d; |
|
UM u; |
|
int *root; |
|
|
|
p = (P)ARG0(arg); |
|
simp_ff((Obj)p,&t); p = (P)t; |
|
d = getdeg(VR(p),p); |
|
u = W_UMALLOC(d); |
|
ptosfum(p,u); |
|
root = (int *)ALLOCA(d*sizeof(int)); |
|
find_rootsf(u,root); |
|
MKGFS(IFTOF(root[0]),*rp); |
|
} |
|
|
|
void Psf_minipoly(NODE arg,P *rp) |
|
{ |
|
Obj t; |
|
P p1,p2; |
|
int d1,d2; |
|
UM up1,up2,m; |
|
|
|
p1 = (P)ARG0(arg); simp_ff((Obj)p1,&t); p1 = (P)t; |
|
p2 = (P)ARG1(arg); simp_ff((Obj)p2,&t); p2 = (P)t; |
|
d1 = getdeg(VR(p1),p1); up1 = W_UMALLOC(d1); ptosfum(p1,up1); |
|
d2 = getdeg(VR(p2),p2); up2 = W_UMALLOC(d2); ptosfum(p2,up2); |
|
m = W_UMALLOC(d2); |
|
minipolysf(up1,up2,m); |
|
sfumtop(VR(p2),m,&p1); |
|
sfptop(p1,rp); |
|
} |
|
|
|
void Pptosfp(NODE arg,P *rp) |
|
{ |
|
ptosfp(ARG0(arg),rp); |
|
} |
|
|
|
void Psfptop(NODE arg,P *rp) |
|
{ |
|
sfptop((P)ARG0(arg),rp); |
|
} |
|
|
|
void Psfptopsfp(NODE arg,P *rp) |
|
{ |
|
sfptopsfp((P)ARG0(arg),VR((P)ARG1(arg)),rp); |
|
} |
|
|
|
void Pptogf2n(NODE arg,GF2N *rp) |
|
{ |
|
ptogf2n((Obj)ARG0(arg),rp); |
|
} |
|
|
|
void Pgf2ntop(NODE arg,P *rp) |
|
{ |
if ( argc(arg) == 2 ) |
if ( argc(arg) == 2 ) |
up2_var = VR((P)ARG1(arg)); |
up2_var = VR((P)ARG1(arg)); |
gf2ntop((GF2N)ARG0(arg),rp); |
gf2ntop((GF2N)ARG0(arg),rp); |
} |
} |
|
|
void Pgf2ntovect(arg,rp) |
void Pgf2ntovect(NODE arg,VECT *rp) |
NODE arg; |
|
VECT *rp; |
|
{ |
{ |
gf2ntovect((GF2N)ARG0(arg),rp); |
gf2ntovect((GF2N)ARG0(arg),rp); |
} |
} |
|
|
void Pptogfpn(arg,rp) |
void Pptogfpn(NODE arg,GFPN *rp) |
NODE arg; |
|
GF2N *rp; |
|
{ |
{ |
ptogfpn((Obj)ARG0(arg),rp); |
ptogfpn((Obj)ARG0(arg),rp); |
} |
} |
|
|
void Pgfpntop(arg,rp) |
void Pgfpntop(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
extern V up_var; |
|
|
|
if ( argc(arg) == 2 ) |
if ( argc(arg) == 2 ) |
up_var = VR((P)ARG1(arg)); |
up_var = VR((P)ARG1(arg)); |
gfpntop((GFPN)ARG0(arg),rp); |
gfpntop((GFPN)ARG0(arg),rp); |
} |
} |
|
|
void Pureverse(arg,rp) |
void Pureverse(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p,r; |
UP p,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Putrunc(arg,rp) |
void Putrunc(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p,r; |
UP p,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Pudecomp(arg,rp) |
void Pudecomp(NODE arg,LIST *rp) |
NODE arg; |
|
LIST *rp; |
|
{ |
{ |
P u,l; |
P u,l; |
UP p,up,low; |
UP p,up,low; |
|
|
MKLIST(*rp,n0); |
MKLIST(*rp,n0); |
} |
} |
|
|
void Purembymul(arg,rp) |
void Purembymul(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
|
|
* p2*inv = 1 mod x^d2 |
* p2*inv = 1 mod x^d2 |
*/ |
*/ |
|
|
void Purembymul_precomp(arg,rp) |
void Purembymul_precomp(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2,inv,r; |
UP p1,p2,inv,r; |
|
|
|
|
} |
} |
} |
} |
|
|
void Puinvmod(arg,rp) |
void Puinvmod(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p,r; |
UP p,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Purevinvmod(arg,rp) |
void Purevinvmod(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p,pr,r; |
UP p,pr,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Ppwrmod_ff(arg,rp) |
void Ppwrmod_ff(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2; |
UP p1,p2; |
|
|
|
|
case FF_GF2N: |
case FF_GF2N: |
powermodup_gf2n(p1,&p2); break; |
powermodup_gf2n(p1,&p2); break; |
case FF_GFPN: |
case FF_GFPN: |
|
case FF_GFS: |
|
case FF_GFSN: |
powermodup(p1,&p2); break; |
powermodup(p1,&p2); break; |
default: |
default: |
error("pwrmod_ff : current_ff is not set"); |
error("pwrmod_ff : current_ff is not set"); |
|
|
uptop(p2,rp); |
uptop(p2,rp); |
} |
} |
|
|
void Pgeneric_pwrmod_ff(arg,rp) |
void Pgeneric_pwrmod_ff(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP g,f,r; |
UP g,f,r; |
|
|
|
|
case FF_GF2N: |
case FF_GF2N: |
generic_powermodup_gf2n(g,f,(Q)ARG2(arg),&r); break; |
generic_powermodup_gf2n(g,f,(Q)ARG2(arg),&r); break; |
case FF_GFPN: |
case FF_GFPN: |
|
case FF_GFS: |
|
case FF_GFSN: |
generic_powermodup(g,f,(Q)ARG2(arg),&r); break; |
generic_powermodup(g,f,(Q)ARG2(arg),&r); break; |
default: |
default: |
error("generic_pwrmod_ff : current_ff is not set"); |
error("generic_pwrmod_ff : current_ff is not set"); |
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Ppwrtab_ff(arg,rp) |
void Ppwrtab_ff(NODE arg,VECT *rp) |
NODE arg; |
|
VECT *rp; |
|
{ |
{ |
UP f,xp; |
UP f,xp; |
UP *tab; |
UP *tab; |
|
|
case FF_GF2N: |
case FF_GF2N: |
powertabup_gf2n(f,xp,tab); break; |
powertabup_gf2n(f,xp,tab); break; |
case FF_GFPN: |
case FF_GFPN: |
|
case FF_GFS: |
|
case FF_GFSN: |
powertabup(f,xp,tab); break; |
powertabup(f,xp,tab); break; |
default: |
default: |
error("pwrtab_ff : current_ff is not set"); |
error("pwrtab_ff : current_ff is not set"); |
|
|
uptop(tab[i],(P *)&BDY(r)[i]); |
uptop(tab[i],(P *)&BDY(r)[i]); |
} |
} |
|
|
void Pkpwrmod_lm(arg,rp) |
void Pkpwrmod_lm(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2; |
UP p1,p2; |
|
|
|
|
uptop(p2,rp); |
uptop(p2,rp); |
} |
} |
|
|
void Pkgeneric_pwrmod_lm(arg,rp) |
void Pkgeneric_pwrmod_lm(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP g,f,r; |
UP g,f,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Pkpwrtab_lm(arg,rp) |
void Pkpwrtab_lm(NODE arg,VECT *rp) |
NODE arg; |
|
VECT *rp; |
|
{ |
{ |
UP f,xp; |
UP f,xp; |
UP *tab; |
UP *tab; |
|
|
uptop(tab[i],(P *)&BDY(r)[i]); |
uptop(tab[i],(P *)&BDY(r)[i]); |
} |
} |
|
|
void Plazy_lm(arg,rp) |
void Plazy_lm(NODE arg,Q *rp) |
NODE arg; |
|
Q *rp; |
|
{ |
{ |
lm_lazy = QTOS((Q)ARG0(arg)); |
lm_lazy = QTOS((Q)ARG0(arg)); |
*rp = 0; |
*rp = 0; |
} |
} |
|
|
void Pkmul(arg,rp) |
void Pkmul(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P n1,n2; |
P n1,n2; |
|
|
|
|
kmulp(CO,n1,n2,rp); |
kmulp(CO,n1,n2,rp); |
} |
} |
|
|
void Pksquare(arg,rp) |
void Pksquare(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P n1; |
P n1; |
|
|
|
|
ksquarep(CO,n1,rp); |
ksquarep(CO,n1,rp); |
} |
} |
|
|
void Pktmul(arg,rp) |
void Pktmul(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Pumul(arg,rp) |
void Pumul(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P a1,a2; |
P a1,a2; |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
if ( !a1 || !a2 || NUM(a1) || NUM(a2) ) |
if ( !a1 || !a2 || NUM(a1) || NUM(a2) ) |
mulp(CO,a1,a2,rp); |
mulp(CO,a1,a2,rp); |
else { |
else { |
if ( !uzpcheck(a1) || !uzpcheck(a2) || VR(a1) != VR(a2) ) |
if ( !uzpcheck((Obj)a1) || !uzpcheck((Obj)a2) || VR(a1) != VR(a2) ) |
error("umul : invalid argument"); |
error("umul : invalid argument"); |
ptoup(a1,&p1); |
ptoup(a1,&p1); |
ptoup(a2,&p2); |
ptoup(a2,&p2); |
|
|
} |
} |
} |
} |
|
|
void Pusquare(arg,rp) |
void Pusquare(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,r; |
|
|
ptoup((P)ARG0(arg),&p1); |
ptoup((P)ARG0(arg),&p1); |
hybrid_squareup(0,p1,&r); |
hybrid_squareup(0,p1,&r); |
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Putmul(arg,rp) |
void Putmul(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Pumul_ff(arg,rp) |
void Pumul_ff(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
P a1,a2; |
P a1,a2; |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
simp_ff((Obj)p,rp); |
simp_ff((Obj)p,rp); |
} |
} |
|
|
void Pusquare_ff(arg,rp) |
void Pusquare_ff(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,r; |
P p; |
P p; |
|
|
ptoup((P)ARG0(arg),&p1); |
ptoup((P)ARG0(arg),&p1); |
|
|
simp_ff((Obj)p,rp); |
simp_ff((Obj)p,rp); |
} |
} |
|
|
void Putmul_ff(arg,rp) |
void Putmul_ff(NODE arg,Obj *rp) |
NODE arg; |
|
Obj *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,p2,r; |
P p; |
P p; |
|
|
simp_ff((Obj)p,rp); |
simp_ff((Obj)p,rp); |
} |
} |
|
|
void Phfmul_lm(arg,rp) |
void Phfmul_lm(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP p1,p2,r; |
UP p1,p2,r; |
UP hi,lo,mid,t,s,p10,p11,p20,p21; |
UP hi,lo,mid,t,s,p10,p11,p20,p21; |
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Pfmultest(arg,rp) |
void Pfmultest(NODE arg,LIST *rp) |
NODE arg; |
|
LIST *rp; |
|
{ |
{ |
P p1,p2,r; |
P p1,p2,r; |
int d1,d2; |
int d1,d2; |
|
|
} |
} |
} |
} |
|
|
void Pkmulum(arg,rp) |
void Pkmulum(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P p1,p2; |
P p1,p2; |
int d1,d2,mod; |
int d1,d2,mod; |
|
|
umtop(VR(p1),wr,rp); |
umtop(VR(p1),wr,rp); |
} |
} |
|
|
void Pksquareum(arg,rp) |
void Pksquareum(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P p1; |
P p1; |
int d1,mod; |
int d1,mod; |
|
|
umtop(VR(p1),wr,rp); |
umtop(VR(p1),wr,rp); |
} |
} |
|
|
void Ptracemod_gf2n(arg,rp) |
void Ptracemod_gf2n(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
UP g,f,r; |
UP g,f,r; |
|
|
|
|
uptop(r,rp); |
uptop(r,rp); |
} |
} |
|
|
void Pumul_specialmod(arg,rp) |
void Pumul_specialmod(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P a1,a2; |
P a1,a2; |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
if ( !a1 || !a2 || NUM(a1) || NUM(a2) ) |
if ( !a1 || !a2 || NUM(a1) || NUM(a2) ) |
mulp(CO,a1,a2,rp); |
mulp(CO,a1,a2,rp); |
else { |
else { |
if ( !uzpcheck(a1) || !uzpcheck(a2) || VR(a1) != VR(a2) ) |
if ( !uzpcheck((Obj)a1) || !uzpcheck((Obj)a2) || VR(a1) != VR(a2) ) |
error("umul_specialmod : invalid argument"); |
error("umul_specialmod : invalid argument"); |
ptoup(a1,&p1); |
ptoup(a1,&p1); |
ptoup(a2,&p2); |
ptoup(a2,&p2); |
|
|
} |
} |
} |
} |
|
|
void Pusquare_specialmod(arg,rp) |
void Pusquare_specialmod(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P a1; |
P a1; |
UP p1,r; |
UP p1,r; |
|
|
if ( !a1 || NUM(a1) ) |
if ( !a1 || NUM(a1) ) |
mulp(CO,a1,a1,rp); |
mulp(CO,a1,a1,rp); |
else { |
else { |
if ( !uzpcheck(a1) ) |
if ( !uzpcheck((Obj)a1) ) |
error("usquare_specialmod : invalid argument"); |
error("usquare_specialmod : invalid argument"); |
ptoup(a1,&p1); |
ptoup(a1,&p1); |
n = BDY((LIST)ARG1(arg)); |
n = BDY((LIST)ARG1(arg)); |
|
|
} |
} |
} |
} |
|
|
void Putmul_specialmod(arg,rp) |
void Putmul_specialmod(NODE arg,P *rp) |
NODE arg; |
|
P *rp; |
|
{ |
{ |
P a1,a2; |
P a1,a2; |
UP p1,p2,r; |
UP p1,p2,r; |
|
|
if ( !a1 || !a2 || NUM(a1) || NUM(a2) ) |
if ( !a1 || !a2 || NUM(a1) || NUM(a2) ) |
mulp(CO,a1,a2,rp); |
mulp(CO,a1,a2,rp); |
else { |
else { |
if ( !uzpcheck(a1) || !uzpcheck(a2) || VR(a1) != VR(a2) ) |
if ( !uzpcheck((Obj)a1) || !uzpcheck((Obj)a2) || VR(a1) != VR(a2) ) |
error("utmul_specialmod : invalid argument"); |
error("utmul_specialmod : invalid argument"); |
ptoup(a1,&p1); |
ptoup(a1,&p1); |
ptoup(a2,&p2); |
ptoup(a2,&p2); |