=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/gfs.c,v retrieving revision 1.2 retrieving revision 1.5 diff -u -p -r1.2 -r1.5 --- OpenXM_contrib2/asir2000/engine/gfs.c 2001/03/14 06:04:53 1.2 +++ OpenXM_contrib2/asir2000/engine/gfs.c 2001/05/28 08:22:01 1.5 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/gfs.c,v 1.1 2001/03/13 01:10:25 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/gfs.c,v 1.4 2001/03/29 09:49:58 noro Exp $ */ #include "ca.h" @@ -153,6 +153,9 @@ UM dp; { int i,r,rj,j,q; + if ( p == 2 && n == 1 ) + return 1; + for ( i = 0, q = 1; i < n; i++ ) q *= p; for ( r = n==1?2:p; r < q; r++ ) { @@ -194,6 +197,39 @@ int a,b; return r; } +void gfs_galois_action(a,e,c) +GFS a; +Q e; +GFS *c; +{ + Q p; + int i,k; + GFS t,s; + + t = a; + k = QTOS(e); + STOQ(current_gfs_p,p); + for ( i = 0; i < k; i++ ) { + pwrgfs(t,p,&s); t = s; + } + *c = t; +} + +void qtogfs(a,c) +Q a; +GFS *c; +{ + int s; + + s = QTOS(a)%current_gfs_q; + if ( s < 0 ) + s += current_gfs_q; + if ( !s ) + *c = 0; + else + MKGFS(current_gfs_ntoi[s],*c); +} + void mqtogfs(a,c) MQ a; GFS *c; @@ -229,7 +265,7 @@ GFS *b; else if ( OID(a) == O_N && NID(a) == N_M ) mqtogfs(a,b); else if ( OID(a) == O_N && NID(a) == N_Q ) { - ptomp(current_gfs_q,(P)a,&t); mqtogfs(t,b); + ptomp(current_gfs_p,(P)a,&t); mqtogfs(t,b); } else error("ntogfs : invalid argument"); } @@ -398,4 +434,21 @@ GFS a,b; else return 0; } +} + +void randomgfs(r) +GFS *r; +{ + unsigned int t; + + if ( !current_gfs_q1 ) + error("addgfs : current_gfs_q is not set"); + t = mt_genrand()%current_gfs_q; + if ( !t ) + *r = 0; + else { + if ( t == current_gfs_q1 ) + t = 0; + MKGFS(t,*r); + } }