=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/int.c,v retrieving revision 1.5 retrieving revision 1.7 diff -u -p -r1.5 -r1.7 --- OpenXM_contrib2/asir2000/builtin/int.c 2000/08/22 05:03:58 1.5 +++ OpenXM_contrib2/asir2000/builtin/int.c 2000/12/08 02:39:05 1.7 @@ -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/builtin/int.c,v 1.4 2000/08/21 08:31:20 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/int.c,v 1.6 2000/12/05 01:24:50 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -501,6 +501,35 @@ LIST *rp; MKNODE(n1,r,0); MKNODE(n0,q,n1); MKLIST(*rp,n0); } +/* + * gcd = GCD(a,b), ca = a/g, cb = b/g + */ + +void igcd_cofactor(a,b,gcd,ca,cb) +Q a,b; +Q *gcd,*ca,*cb; +{ + N gn,tn; + + if ( !a ) { + if ( !b ) + error("igcd_cofactor : invalid input"); + else { + *ca = 0; + *cb = ONE; + *gcd = b; + } + } else if ( !b ) { + *ca = ONE; + *cb = 0; + *gcd = a; + } else { + gcdn(NM(a),NM(b),&gn); NTOQ(gn,1,*gcd); + divsn(NM(a),gn,&tn); NTOQ(tn,SGN(a),*ca); + divsn(NM(b),gn,&tn); NTOQ(tn,SGN(b),*cb); + } +} + void igcdv(a,rp) VECT a; Q *rp; @@ -868,7 +897,7 @@ Q *rp; UTOQ(r,*rp); } -#if defined(VISUAL) || defined(THINK_C) +#if defined(VISUAL) void srandom(unsigned int); static unsigned int R_Next;