|
|
1.1 root 1: /*
2: double
3: dgcd(a,b)
4: double a,b;
5: {
6: double n,d,q,r;
7:
8: n = a;
9: d = b;
10: while(d != 0){
11: modf(n/d, &q);
12: r = n - q*d;
13: n = d;
14: d = r;
15: }
16: if(n<0) n = -n;
17: return(n);
18: }
19: */
20:
21: /*
22: * dinv computes and returns the g.c.d g = (a,b)
23: * and then provides numbers c,d such that
24: * a*c + b*d = g
25: *
26: * cf. Gauss D.A. Sect. 27.
27: */
28: double
29: dinv(a, b, c, d)
30: double a, b;
31: double *c, *d;
32: {
33: double num, den, q, r;
34: double temp;
35: double oldx = 0;
36: double newx = 1;
37: double oldy = 1;
38: double newy = 0;
39:
40: num = b;
41: den = a;
42: while(den != 0){
43: modf(num/den, &q);
44: r = num - q*den;
45: temp = newx;
46: newx = oldx - q*newx;
47: oldx = temp;
48: temp = newy;
49: newy = oldy - q*newy;
50: oldy = temp;
51: num = den;
52: den = r;
53: }
54: if(num <0){
55: num = -num;
56: oldx = -oldx;
57: oldy = -oldy;
58: }
59: *c = oldx;
60: *d = oldy;
61: return(num);
62: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.