date and time created 83/03/09 16:22:25 by ralph
[unix-history] / usr / src / lib / libmp / gcd.c
CommitLineData
c3a0d10b
SL
1/* @(#)gcd.c 4.1 %G% */
2
3#include <mp.h>
4gcd(a,b,c) MINT *a,*b,*c;
5{ MINT x,y,z,w;
6 x.len=y.len=z.len=w.len=0;
7 move(a,&x);
8 move(b,&y);
9 while(y.len!=0)
10 { mdiv(&x,&y,&w,&z);
11 move(&y,&x);
12 move(&z,&y);
13 }
14 move(&x,c);
15 xfree(&x);
16 xfree(&y);
17 xfree(&z);
18 xfree(&w);
19 return;
20}
21invert(a, b, c) MINT *a, *b, *c;
22{ MINT x, y, z, w, Anew, Aold;
23 int i = 0;
24 x.len = y.len = z.len = w.len = Aold.len = 0;
25 Anew.len = 1;
26 Anew.val = xalloc(1);
27 *Anew.val = 1;
28 move(b, &x);
29 move(a, &y);
30 while(y.len != 0)
31 { mdiv(&x, &y, &w, &z);
32 move(&Anew, &x);
33 mult(&w, &Anew, &Anew);
34 madd(&Anew, &Aold, &Anew);
35 move(&x, &Aold);
36 move(&y, &x);
37 move(&z, &y);
38 i++;
39 }
40 move(&Aold, c);
41 if( (i&01) == 0) msub(b, c, c);
42 xfree(&x);
43 xfree(&y);
44 xfree(&z);
45 xfree(&w);
46 xfree(&Aold);
47 xfree(&Anew);
48}