modified: makefile
[GalaxyCodeBases.git] / c_cpp / etc / calc / cal / test3500.cal
blobc8a9a903996fcb340a649e8cd05e957bd7007391
1 /*
2  * test3500 - 3500 series of the regress.cal test suite
3  *
4  * Copyright (C) 1999  Ernest Bowen and Landon Curt Noll
5  *
6  * Primary author:  Ernest Bowen
7  *
8  * Calc is open software; you can redistribute it and/or modify it under
9  * the terms of the version 2.1 of the GNU Lesser General Public License
10  * as published by the Free Software Foundation.
11  *
12  * Calc is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
15  * Public License for more details.
16  *
17  * A copy of version 2.1 of the GNU Lesser General Public License is
18  * distributed with calc under the filename COPYING-LGPL.  You should have
19  * received a copy with calc; if not, write to Free Software Foundation, Inc.
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  *
22  * @(#) $Revision: 30.1 $
23  * @(#) $Id: test3500.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
24  * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/test3500.cal,v $
25  *
26  * Under source code control:   1995/12/18 22:50:46
27  * File existed as early as:    1995
28  *
29  * Share and enjoy!  :-)        http://www.isthe.com/chongo/tech/comp/calc/
30  */
33  * Stringent tests of the functions frem, fcnt, gcdrem.
34  *
35  * testf(n) gives n tests of frem(x,y) and fcnt(x,y) with randomly
36  *      integers x and y generated so that x = f * y^k where f, y and
37  *      k are randomly generated.
38  *
39  * testg(n) gives n tests of gcdrem(x,y) with x and y generated as for
40  *      testf(n).
41  *
42  * testh(n,N) gives n tests of g = gcdrem(x,y) where x and y are products of
43  *      powers of small primes some of which are common to both x and y.
44  *      This test uses f = abs(x) and iteratively f = frem(f,p) where
45  *      p varies over the prime divisors of y; the final value for f
46  *      should equal g.  For both x and y the primes are raised to the
47  *      power rand(N); N defaults to 10.
48  *
49  * If verbose is > 1, the numbers x, y and values for some of the
50  *      functions will be displayed.  Numbers used in testf()
51  *      and testg() occasionally have thousands of digits.
52  *
53  */
56 defaultverbose = 1;     /* default verbose value */
58 define testfrem(x,y,verbose)
60         local f, n;
62         if (isnull(verbose)) verbose = defaultverbose;
64         f = frem(x,y);
65         n = fcnt(x,y);
66         if (verbose > 1)
67                 printf("frem = %d, fcnt = %d\n\n", f, n);
68         if (abs(x) != f * abs(y)^n)
69                 return 1;
70         if (!ismult(x,y) || abs(y) <= 1) {
71                 if (f != abs(x))
72                         return 2;
73                 if (n != 0)
74                         return 3;
75                 return 0;
76         }
77         if (x == 0) {
78                 if (f != 0 || n != 0)
79                         return 4;
80                 return 0;
81         }
82         if (f < 0 || !isint(f) || n <= 0)
83                 return 5;
84         if (ismult(f, y))
85                 return 6;
86         if (!ismult(x, y^n))
87                 return 7;
88         if (ismult(x, y^(n+1)))
89                 return 8;
90         return 0;
93 define testgcdrem(x,y,verbose)
95         local d, q;
97         if (isnull(verbose)) verbose = defaultverbose;
99         d = gcdrem(x,y);
100         if (verbose > 1)
101                 printf("gcdrem = %d\n\n", d);
102         if (y == 0) {
103                 if (d != 1)
104                         return 1;
105                 return 0;
106         }
107         if (x == 0) {
108                 if (d != 0)
109                         return 2;
110                 return 0;
111         }
112         if (d <= 0)
113                 return 3;
114         q = x/d;
115         if (!isint(q))
116                 return 4;
117         if (!isrel(d, y))
118                 return 5;
119         if (!isrel(d, q))
120                 return 6;
121         return 0;
124 define testf(str,n,verbose)
126         local m, x, y, i, k, y1, f1, f, fail;
128         if (isnull(verbose))
129                 verbose = defaultverbose;
130         if (verbose > 0) {
131                 print str:":",:;
132         }
133         m = 0;
134         for (i = 0; i < n; i++) {
135                 y1 = rand(2^rand(1,6));
136                 y = rand(-(2^y1), 1 + 2^y1);
137                 f1 = rand(2^rand(1,11));
138                 f = rand(-(2^f1), 1+2^f1);
139                 k = rand(1,1+2^10);
140                 x = f * y^k;
141                 if (verbose > 1) {
142                         printf("x = %d\n", x);
143                         printf("y = %d\n", y);
144                 }
145                 fail = testfrem(x,y,verbose);
146                 if (fail != 0) {
147                         printf("*** Failure %d on loop %d\n", fail, i);
148                         if (verbose > 1) {
149                                 printf("    x = %d\n", x);
150                                 printf("    y = %d\n", y);
151                         }
152                         m++;
153                 }
154         }
156         if (verbose > 0) {
157                 if (m) {
158                         printf("*** %d error(s)\n", m);
159                 } else {
160                         printf("no errors\n");
161                 }
162         }
163         return m;
167 define testg(str,n,verbose)
169         local m, x, y, i, k, y1, f1, f, fail;
171         if (isnull(verbose))
172                 verbose = defaultverbose;
173         if (verbose > 0) {
174                 print str:":",:;
175         }
176         m = 0;
177         for (i = 0; i < n; i++) {
178                 y1 = rand(2^rand(1,6));
179                 y = rand(-(2^y1), 1 + 2^y1);
180                 f1 = rand(2^rand(1,11));
181                 f = rand(-(2^f1), 1+2^f1);
182                 k = rand(1,1+2^10);
183                 x = f * y^k;
184                 if (verbose > 1) {
185                         printf("x = %d\n", x);
186                         printf("y = %d\n", y);
187                 }
188                 fail = testgcdrem(x,y,verbose);
189                 if (fail != 0) {
190                         printf("*** Failure %d on loop %d\n", fail, i);
191                         if (verbose > 1) {
192                                 printf("    x = %d\n", x);
193                                 printf("    y = %d\n", y);
194                         }
195                         m++;
196                 }
197         }
199         if (verbose > 0) {
200                 if (m) {
201                         printf("*** %d error(s)\n", m);
202                 } else {
203                         printf("no errors\n");
204                 }
205         }
206         return m;
209 define testh(str,n,N,verbose)
211         local m, i, x, y, f, g;
213         if (isnull(verbose))
214                 verbose = defaultverbose;
215         if (verbose > 0) {
216                 print str:":",:;
217         }
218         m = 0;
219         if (isnull(N))
220                 N = 61;
221         for (i = 0; i < n; i ++) {
222                 x = 2^rand(N)*3^rand(N) * 7^rand(N) * 11^rand(N) * 101^rand(N);
223                 y = 2^rand(N) * 3^rand(N) * 5^rand(N) * 11^rand(N) * 53^rand(N);
224                 if (rand(2)) x = -x;
225                 if (rand(2)) y = -y;
227                 if (verbose > 1) {
228                         printf("x = %d\n", x);
229                         printf("y = %d\n", y);
230                 }
231                 f = abs(x);
232                 g = gcdrem(x,y);
233                 if (ismult(y,2)) f = frem(f,2);
234                 if (ismult(y,3)) f = frem(f,3);
235                 if (ismult(y,5)) f = frem(f,5);
236                 if (ismult(y,11)) f = frem(f,11);
237                 if (ismult(y,53)) f = frem(f,53);
239                 if (f != g) {
240                         printf("*** Failure on loop %d\n", i);
241                         if (verbose > 1) {
242                                 printf("    x = %d\n", x);
243                                 printf("    y = %d\n", y);
244                                 printf("    f = %d\n", f);
245                                 printf("    g = %d\n", g);
246                         }
247                         m++;
248                 }
249         }
251         if (verbose > 0) {
252                 if (m) {
253                         printf("*** %d error(s)\n", m);
254                 } else {
255                         printf("no errors\n");
256                 }
257         }
258         return m;
262  * test3500 - perform all of the above tests a bunch of times
263  */
264 define test3500(verbose, tnum, n, N)
266         /* set test parameters */
267         if (isnull(verbose)) {
268                 verbose = defaultverbose;
269         }
270         if (isnull(tnum)) {
271                 tnum = 3501;    /* default test number */
272         }
273         if (isnull(n)) {
274                 n = 200;
275         }
276         if (isnull(N)) {
277                 N = 61;
278         }
280         /*
281          * test a lot of stuff
282          */
283         srand(3500e3500);
284         err += testf(strcat(str(tnum++), ": frem/fcnt"), n, verbose);
285         err += testg(strcat(str(tnum++), ": gcdrem"), n, verbose);
286         err += testh(strcat(str(tnum++),": gcdrem #2"), n, N, verbose);
287         if (verbose > 1) {
288                 if (err) {
289                         print "***", err, "error(s) found in testall";
290                 } else {
291                         print "no errors in testall";
292                 }
293         }
294         return tnum;