]> www.ginac.de Git - cln.git/blob - tests/test_I_div.cc
Fix crashes in find_univpoly_ring and related functions
[cln.git] / tests / test_I_div.cc
1 #include "test_I.h"
2
3 int test_I_div (int iterations)
4 {
5         int error = 0;
6         int i;
7         // Check floor.
8         for (i = iterations; i > 0; i--) {
9                 cl_I a = testrandom_I();
10                 cl_I b = testrandom_I();
11                 if (b != 0) {
12                         cl_I_div_t qr = floor2(a,b);
13                         const cl_I& q = qr.quotient;
14                         const cl_I& r = qr.remainder;
15                         ASSERT2(a == q*b+r, a,b);
16                         ASSERT2(b >= 0 ? (r >= 0 && r < b) : (r <= 0 && r > b), a,b);
17                 }
18         }
19         // Check ceiling.
20         for (i = iterations; i > 0; i--) {
21                 cl_I a = testrandom_I();
22                 cl_I b = testrandom_I();
23                 if (b != 0) {
24                         cl_I_div_t qr = ceiling2(a,b);
25                         const cl_I& q = qr.quotient;
26                         const cl_I& r = qr.remainder;
27                         ASSERT2(a == q*b+r, a,b);
28                         ASSERT2(b >= 0 ? (r <= 0 && r > -b) : (r >= 0 && r < -b), a,b);
29                 }
30         }
31         // Check truncate.
32         for (i = iterations; i > 0; i--) {
33                 cl_I a = testrandom_I();
34                 cl_I b = testrandom_I();
35                 if (b != 0) {
36                         cl_I_div_t qr = truncate2(a,b);
37                         const cl_I& q = qr.quotient;
38                         const cl_I& r = qr.remainder;
39                         ASSERT2(a == q*b+r, a,b);
40                         if (b >= 0)
41                                 if (a >= 0)
42                                         { ASSERT2(r >= 0 && r < b, a,b); }
43                                 else
44                                         { ASSERT2(r <= 0 && r > -b, a,b); }
45                         else
46                                 if (a >= 0)
47                                         { ASSERT2(r >= 0 && r < -b, a,b); }
48                                 else
49                                         { ASSERT2(r <= 0 && r > b, a,b); }
50                 }
51         }
52         // Check round.
53         for (i = iterations; i > 0; i--) {
54                 cl_I a = testrandom_I();
55                 cl_I b = testrandom_I();
56                 if (b != 0) {
57                         cl_I_div_t qr = round2(a,b);
58                         const cl_I& q = qr.quotient;
59                         const cl_I& r = qr.remainder;
60                         ASSERT2(a == q*b+r, a,b);
61                         ASSERT2(2*abs(r) <= abs(b), a,b);
62                         if (2*abs(r) == abs(b))
63                                 ASSERT2(evenp(q), a,b);
64                 }
65         }
66         return error;
67 }