Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Matrices/ts_gcd.adb, Revision 1.1.1.1
1.1 maekawa 1: with text_io,integer_io; use text_io,integer_io;
2: with Standard_Random_Numbers; use Standard_Random_Numbers;
3: with Standard_Common_Divisors; use Standard_Common_Divisors;
4: with Multprec_Random_Numbers; use Multprec_Random_Numbers;
5: with Multprec_Integer_Numbers; use Multprec_Integer_Numbers;
6: with Multprec_Integer_Numbers_io; use Multprec_Integer_Numbers_io;
7: with Multprec_Common_Divisors; use Multprec_Common_Divisors;
8:
9: procedure ts_gcd is
10:
11: -- DESCRIPTION :
12: -- Interactive and random tests of gcd-computations, for standard
13: -- and multi-precision integer numbers.
14:
15: procedure Interactive_Test_Standard_GCD is
16:
17: a,b,k,l,d : integer;
18: ans : character;
19:
20: begin
21: loop
22: put("Give a : "); get(a);
23: put("Give b : "); get(b);
24: d := lcm(a,b);
25: put("lcm("); put(a,1); put(','); put(b,1); put(") = "); put(d,1);
26: new_line;
27: gcd(a,b,k,l,d);
28: put("gcd("); put(a,1); put(','); put(b,1); put(") = "); put(d,1);
29: new_line;
30: put(" k = "); put(k,1); new_line;
31: put(" l = "); put(l,1); new_line;
32: put(" k*a + l*b = "); put(k*a + l*b,1); new_line;
33: put("Do you want more tests ? (y/n) "); get(ans);
34: exit when ans /='y';
35: end loop;
36: end Interactive_Test_Standard_GCD;
37:
38: procedure Test_Standard_GCD ( low,upp : in integer ) is
39:
40: -- DESCRIPTION :
41: -- Generates two numbers between low and upp and performs the
42: -- following checks :
43: -- 1) gcd(a,b) = d, same d as in gcd(a,b,k,l,d) ?
44: -- 2) Is k*a + l*b = d, with a,b,k,l,d from gcd(a,b,k,l,d) ?
45:
46: a,b,k,l,d1,d2 : integer;
47:
48: procedure Report_Bug is
49: begin
50: put(" a : "); put(a,1); new_line;
51: put(" b : "); put(b,1); new_line;
52: end Report_Bug;
53:
54: begin
55: a := Random(low,upp);
56: b := Random(low,upp);
57: d1 := gcd(a,b);
58: gcd(a,b,k,l,d2);
59: put(k,1); put("*"); put(a,1); put("+");
60: put(l,1); put("*"); put(b,1); put("="); put(d2,1);
61: if d1 = d2 and k*a + l*b = d2
62: then put(" okay"); new_line;
63: else put(" Bug!"); Report_Bug;
64: end if;
65: end Test_Standard_GCD;
66:
67: procedure Random_Test_Standard_GCD is
68:
69: nb : natural;
70: low,upp : integer;
71:
72: begin
73: put("Give the number of tests : "); get(nb);
74: put("Give a lower bound for the numbers : "); get(low);
75: put("Give an upper bound for the numbers : "); get(upp);
76: for i in 1..nb loop
77: Test_Standard_GCD(low,upp);
78: end loop;
79: end Random_Test_Standard_GCD;
80:
81: procedure Interactive_Test_Multprec_GCD is
82:
83: a,b,k,l,d : Integer_Number;
84: ans : character;
85:
86: begin
87: loop
88: put("Give a : "); get(a);
89: put("Give b : "); get(b);
90: d := lcm(a,b);
91: put("lcm("); put(a); put(','); put(b); put(") = "); put(d);
92: new_line;
93: gcd(a,b,k,l,d);
94: put("gcd("); put(a); put(','); put(b); put(") = "); put(d);
95: new_line;
96: put(" k = "); put(k); new_line;
97: put(" l = "); put(l); new_line;
98: put(" k*a + l*b = "); put(k*a + l*b); new_line;
99: put("Do you want more tests ? (y/n) "); get(ans);
100: exit when ans /='y';
101: end loop;
102: end Interactive_Test_Multprec_GCD;
103:
104: procedure Test_Multprec_GCD ( sz1,sz2 : in natural ) is
105:
106: -- DESCRIPTION :
107: -- Generates two numbers between low and upp and performs the
108: -- following checks :
109: -- 1) gcd(a,b) = d, same d as in gcd(a,b,k,l,d) ?
110: -- 2) Is k*a + l*b = d, with a,b,k,l,d from gcd(a,b,k,l,d) ?
111:
112: a,b,k,l,d1,d2,acc1,acc2 : Integer_Number;
113:
114: procedure Report_Bug is
115: begin
116: put(" a : "); put(a); new_line;
117: put(" b : "); put(b); new_line;
118: end Report_Bug;
119:
120: begin
121: a := Random(sz1);
122: b := Random(sz2);
123: d1 := gcd(a,b);
124: gcd(a,b,k,l,d2);
125: put(k); put("*"); put(a); put("+");
126: put(l); put("*"); put(b); put("="); put(d2);
127: acc1 := k*a;
128: acc2 := l*b;
129: Add(acc1,acc2);
130: if Equal(d1,d2) and Equal(acc1,d2)
131: then put(" okay"); new_line;
132: else put(" Bug!"); Report_Bug;
133: end if;
134: Clear(a); Clear(b); Clear(d1);
135: Clear(k); Clear(l); Clear(d2);
136: Clear(acc1); Clear(acc2);
137: end Test_Multprec_GCD;
138:
139: procedure Random_Test_Multprec_GCD is
140:
141: nb,sz1,sz2 : natural;
142:
143: begin
144: put("Give the number of tests : "); get(nb);
145: put("Give the size of the 1st number : "); get(sz1);
146: put("Give the size of the 2nd number : "); get(sz2);
147: for i in 1..nb loop
148: Test_Multprec_GCD(sz1,sz2);
149: end loop;
150: end Random_Test_Multprec_GCD;
151:
152: procedure Main is
153:
154: ans : character;
155:
156: begin
157: new_line;
158: put_line("Interactive testing of gcd-computations.");
159: loop
160: new_line;
161: put_line("Choose one of the following : ");
162: put_line(" 0. exit this program.");
163: put_line(" 1. interactive gcd of standard integer numbers.");
164: put_line(" 2. gcd of randomly generated standard integer numbers.");
165: put_line(" 3. interactive gcd of multi-precision integer numbers.");
166: put_line(" 4. gcd of random multi-precision integer numbers.");
167: put("Type 0,1,2,3, or 4 to select your choice : "); get(ans);
168: exit when ans = '0';
169: case ans is
170: when '1' => Interactive_Test_Standard_GCD;
171: when '2' => Random_Test_Standard_GCD;
172: when '3' => Interactive_Test_Multprec_GCD;
173: when '4' => Random_Test_Multprec_GCD;
174: when others => null;
175: end case;
176: end loop;
177: end Main;
178:
179: begin
180: Main;
181: end ts_gcd;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>