version 1.8, 2001/06/29 09:08:53 |
version 1.9, 2001/10/09 01:36:12 |
|
|
* 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/engine/gfs.c,v 1.7 2001/06/21 07:47:02 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/engine/gfs.c,v 1.8 2001/06/29 09:08:53 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
|
|
Line 59 int *current_gfs_plus1; |
|
Line 59 int *current_gfs_plus1; |
|
int *current_gfs_ntoi; |
int *current_gfs_ntoi; |
int *current_gfs_iton; |
int *current_gfs_iton; |
|
|
void chsgngfs(); |
|
void generate_defpoly_um(); |
|
|
|
struct prim_root_info { |
struct prim_root_info { |
int p; |
int p; |
int extdeg; |
int extdeg; |
Line 473 struct prim_root_info prim_root_info_tab[] = { |
|
Line 470 struct prim_root_info prim_root_info_tab[] = { |
|
{16349,1,0,2}, {16361,1,0,3}, {16363,1,0,2}, {16369,1,0,7}, {16381,1,0,2}, |
{16349,1,0,2}, {16361,1,0,3}, {16363,1,0,2}, {16369,1,0,7}, {16381,1,0,2}, |
}; |
}; |
|
|
void dec_um(p,a,u) |
void dec_um(int p,int a,UM u) |
int p,a; |
|
UM u; |
|
{ |
{ |
int i; |
int i; |
|
|
|
|
* current_gfs_iton[p-1] = 0 |
* current_gfs_iton[p-1] = 0 |
*/ |
*/ |
|
|
void setmod_sf(p,n) |
void setmod_sf(int p,int n) |
int p,n; |
|
{ |
{ |
int r,i,q1,q,t,t1; |
int r,i,q1,q,t,t1; |
UM dp; |
UM dp; |
|
|
if ( !r ) { |
if ( !r ) { |
generate_defpoly_um(p,n,dp); |
generate_defpoly_um(p,n,dp); |
r = generate_primitive_root_enc(p,n,dp); |
r = generate_primitive_root_enc(p,n,dp); |
|
if ( !r ) |
|
error("setmod_sf : primitive root not found"); |
} |
} |
current_gfs_p = p; |
current_gfs_p = p; |
current_gfs_q = q; |
current_gfs_q = q; |
|
|
} |
} |
} |
} |
|
|
int search_defpoly_and_primitive_root(p,n,dp) |
int search_defpoly_and_primitive_root(int p,int n,UM dp) |
int p,n; |
|
UM dp; |
|
{ |
{ |
int l,min,max,mid,p1,i,ind,t; |
int l,min,max,mid,p1,i,ind,t; |
|
|
|
|
return prim_root_info_tab[i].prim_root; |
return prim_root_info_tab[i].prim_root; |
} |
} |
|
|
void generate_defpoly_um(p,n,dp) |
void generate_defpoly_um(int p,int n,UM dp) |
int p,n; |
|
UM dp; |
|
{ |
{ |
int i,j,a,c,q; |
int i,j,a,q; |
UM wf,wdf,wgcd; |
UM wf,wdf,wgcd; |
|
|
wf = W_UMALLOC(n); |
wf = W_UMALLOC(n); |
|
|
} |
} |
} |
} |
|
|
int generate_primitive_root_enc(p,n,dp) |
int generate_primitive_root_enc(int p,int n,UM dp) |
int p,n; |
|
UM dp; |
|
{ |
{ |
int i,r,rj,j,q; |
int i,r,rj,j,q; |
|
|
|
|
if ( j == q-1 ) |
if ( j == q-1 ) |
return r; |
return r; |
} |
} |
|
/* not found */ |
|
return 0; |
} |
} |
|
|
/* [a(p)]*[b(p)] in GF(p^n) -> [a(x)*b(x) mod dp(x)]_{x->p} */ |
/* [a(p)]*[b(p)] in GF(p^n) -> [a(x)*b(x) mod dp(x)]_{x->p} */ |
|
|
int mulremum_enc(p,n,dp,a,b) |
int mulremum_enc(int p,int n,UM dp,int a,int b) |
int p,n; |
|
UM dp; |
|
int a,b; |
|
{ |
{ |
int i,dr,r; |
int i,dr,r; |
UM wa,wb,wc,wq; |
UM wa,wb,wc,wq; |
|
|
return r; |
return r; |
} |
} |
|
|
void gfs_galois_action(a,e,c) |
void gfs_galois_action(GFS a,Q e,GFS *c) |
GFS a; |
|
Q e; |
|
GFS *c; |
|
{ |
{ |
Q p; |
Q p; |
int i,k; |
int i,k; |
|
|
|
|
/* GF(pn)={0,1,a,a^2,...} -> GF(pm)={0,1,b,b^2,...}; a->b^k */ |
/* GF(pn)={0,1,a,a^2,...} -> GF(pm)={0,1,b,b^2,...}; a->b^k */ |
|
|
void gfs_embed(z,k,pm,c) |
void gfs_embed(GFS z,int k,int pm,GFS *c) |
GFS z; |
|
int k,pm; |
|
GFS *c; |
|
{ |
{ |
int t; |
int t; |
|
|
|
|
MKGFS(t,*c); |
MKGFS(t,*c); |
} |
} |
} |
} |
void qtogfs(a,c) |
|
Q a; |
void qtogfs(Q a,GFS *c) |
GFS *c; |
|
{ |
{ |
int s; |
int s; |
|
|
|
|
MKGFS(current_gfs_ntoi[s],*c); |
MKGFS(current_gfs_ntoi[s],*c); |
} |
} |
|
|
void mqtogfs(a,c) |
void mqtogfs(MQ a,GFS *c) |
MQ a; |
|
GFS *c; |
|
{ |
{ |
if ( !a ) |
if ( !a ) |
*c = 0; |
*c = 0; |
|
|
} |
} |
} |
} |
|
|
void gfstomq(a,c) |
void gfstomq(GFS a,MQ *c) |
GFS a; |
|
MQ *c; |
|
{ |
{ |
if ( !a ) |
if ( !a ) |
*c = 0; |
*c = 0; |
|
|
} |
} |
} |
} |
|
|
void ntogfs(a,b) |
void ntogfs(Obj a,GFS *b) |
Obj a; |
|
GFS *b; |
|
{ |
{ |
P t; |
P t; |
|
|
|
|
if ( !a || (OID(a)==O_N && NID(a) == N_GFS) ) |
if ( !a || (OID(a)==O_N && NID(a) == N_GFS) ) |
*b = (GFS)a; |
*b = (GFS)a; |
else if ( OID(a) == O_N && NID(a) == N_M ) |
else if ( OID(a) == O_N && NID(a) == N_M ) |
mqtogfs(a,b); |
mqtogfs((MQ)a,b); |
else if ( OID(a) == O_N && NID(a) == N_Q ) { |
else if ( OID(a) == O_N && NID(a) == N_Q ) { |
ptomp(current_gfs_p,(P)a,&t); mqtogfs(t,b); |
ptomp(current_gfs_p,(P)a,&t); mqtogfs((MQ)t,b); |
} else |
} else |
error("ntogfs : invalid argument"); |
error("ntogfs : invalid argument"); |
} |
} |
|
|
void addgfs(a,b,c) |
void addgfs(GFS a,GFS b,GFS *c) |
GFS a,b; |
|
GFS *c; |
|
{ |
{ |
int ai,bi,ci; |
int ai,bi,ci; |
GFS z; |
GFS z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
ntogfs(b,&z); b = z; |
ntogfs((Obj)b,&z); b = z; |
if ( !a ) |
if ( !a ) |
*c = b; |
*c = b; |
else if ( !b ) |
else if ( !b ) |
|
|
} |
} |
} |
} |
|
|
void subgfs(a,b,c) |
void subgfs(GFS a,GFS b,GFS *c) |
GFS a,b; |
|
GFS *c; |
|
{ |
{ |
GFS t,z; |
GFS t,z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
ntogfs(b,&z); b = z; |
ntogfs((Obj)b,&z); b = z; |
if ( !b ) |
if ( !b ) |
*c = a; |
*c = a; |
else { |
else { |
|
|
} |
} |
} |
} |
|
|
void mulgfs(a,b,c) |
void mulgfs(GFS a,GFS b,GFS *c) |
GFS a,b; |
|
GFS *c; |
|
{ |
{ |
int ai; |
int ai; |
GFS z; |
GFS z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
ntogfs(b,&z); b = z; |
ntogfs((Obj)b,&z); b = z; |
if ( !a || !b ) |
if ( !a || !b ) |
*c = 0; |
*c = 0; |
else { |
else { |
|
|
} |
} |
} |
} |
|
|
void divgfs(a,b,c) |
void divgfs(GFS a,GFS b,GFS *c) |
GFS a,b; |
|
GFS *c; |
|
{ |
{ |
int ai; |
int ai; |
GFS z; |
GFS z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
ntogfs(b,&z); b = z; |
ntogfs((Obj)b,&z); b = z; |
if ( !b ) |
if ( !b ) |
error("divgfs : division by 0"); |
error("divgfs : division by 0"); |
else if ( !a ) |
else if ( !a ) |
|
|
} |
} |
} |
} |
|
|
void chsgngfs(a,c) |
void chsgngfs(GFS a,GFS *c) |
GFS a,*c; |
|
{ |
{ |
int ai; |
int ai; |
GFS z; |
GFS z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
if ( !a ) |
if ( !a ) |
*c = 0; |
*c = 0; |
else if ( current_gfs_q1&1 ) |
else if ( current_gfs_q1&1 ) |
|
|
} |
} |
} |
} |
|
|
void pwrgfs(a,b,c) |
void pwrgfs(GFS a,Q b,GFS *c) |
GFS a; |
|
Q b; |
|
GFS *c; |
|
{ |
{ |
N an,tn,rn; |
N an,tn,rn; |
GFS t,s,z; |
GFS t,s,z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
if ( !b ) |
if ( !b ) |
MKGFS(0,*c); |
MKGFS(0,*c); |
else if ( !a ) |
else if ( !a ) |
|
|
} |
} |
} |
} |
|
|
int cmpgfs(a,b) |
int cmpgfs(GFS a,GFS b) |
GFS a,b; |
|
{ |
{ |
GFS z; |
GFS z; |
|
|
ntogfs(a,&z); a = z; |
ntogfs((Obj)a,&z); a = z; |
if ( !a ) |
if ( !a ) |
return !b ? 0 : -1; |
return !b ? 0 : -1; |
else |
else |
|
|
} |
} |
} |
} |
|
|
void randomgfs(r) |
void randomgfs(GFS *r) |
GFS *r; |
|
{ |
{ |
unsigned int t; |
unsigned int t; |
|
|
|
|
if ( !t ) |
if ( !t ) |
*r = 0; |
*r = 0; |
else { |
else { |
if ( t == current_gfs_q1 ) |
if ( t == (unsigned int)current_gfs_q1 ) |
t = 0; |
t = 0; |
MKGFS(t,*r); |
MKGFS(t,*r); |
} |
} |
|
|
|
|
/* arithmetic operations for 'immediate values of GFS */ |
/* arithmetic operations for 'immediate values of GFS */ |
|
|
int _addsf(a,b) |
int _addsf(int a,int b) |
int a,b; |
|
{ |
{ |
if ( !a ) |
if ( !a ) |
return b; |
return b; |
|
|
} |
} |
} |
} |
|
|
int _chsgnsf(a) |
int _chsgnsf(int a) |
int a; |
|
{ |
{ |
if ( !a ) |
if ( !a ) |
return 0; |
return 0; |
|
|
} |
} |
} |
} |
|
|
int _subsf(a,b) |
int _subsf(int a,int b) |
int a,b; |
|
{ |
{ |
if ( !a ) |
if ( !a ) |
return _chsgnsf(b); |
return _chsgnsf(b); |
|
|
return _addsf(a,_chsgnsf(b)); |
return _addsf(a,_chsgnsf(b)); |
} |
} |
|
|
int _mulsf(a,b) |
int _mulsf(int a,int b) |
int a,b; |
|
{ |
{ |
if ( !a || !b ) |
if ( !a || !b ) |
return 0; |
return 0; |
|
|
} |
} |
} |
} |
|
|
int _invsf(a) |
int _invsf(int a) |
int a; |
|
{ |
{ |
if ( !a ) |
if ( !a ) { |
error("_invsf : division by 0"); |
error("_invsf : division by 0"); |
else { |
/* NOTREACHED */ |
|
return -1; |
|
} else { |
a = current_gfs_q1 - IFTOF(a); |
a = current_gfs_q1 - IFTOF(a); |
return FTOIF(a); |
return FTOIF(a); |
} |
} |
} |
} |
|
|
int _divsf(a,b) |
int _divsf(int a,int b) |
int a,b; |
|
{ |
{ |
if ( !b ) |
if ( !b ) { |
error("_divsf : division by 0"); |
error("_divsf : division by 0"); |
else if ( !a ) |
/* NOTREACHED */ |
|
return -1; |
|
} else if ( !a ) |
return 0; |
return 0; |
else { |
else { |
a = IFTOF(a) - IFTOF(b); |
a = IFTOF(a) - IFTOF(b); |
|
|
} |
} |
} |
} |
|
|
int _pwrsf(a,b) |
int _pwrsf(int a,int b) |
int a,b; |
|
{ |
{ |
GFS at,ct; |
GFS at,ct; |
Q bt; |
Q bt; |
|
|
return FTOIF(0); |
return FTOIF(0); |
} |
} |
|
|
int _itosf(n) |
int _itosf(int n) |
int n; |
|
{ |
{ |
int i; |
int i; |
|
|
|
|
return i; |
return i; |
} |
} |
|
|
int _isonesf(a) |
int _isonesf(int a) |
int a; |
|
{ |
{ |
return a == FTOIF(0); |
return a == FTOIF(0); |
} |
} |