1 long long
simple_rand()2 simple_rand ()
3 {
4 static unsigned long long seed = 47114711;
5 unsigned long long this = seed * 1103515245 + 12345;
6 seed = this;
7 return this >> 8;
8 }
9
10 unsigned long long int
random_bitstring()11 random_bitstring ()
12 {
13 unsigned long long int x;
14 int n_bits;
15 long long ran;
16 int tot_bits = 0;
17
18 x = 0;
19 for (;;)
20 {
21 ran = simple_rand ();
22 n_bits = (ran >> 1) % 16;
23 tot_bits += n_bits;
24
25 if (n_bits == 0)
26 return x;
27 else
28 {
29 x <<= n_bits;
30 if (ran & 1)
31 x |= (1 << n_bits) - 1;
32
33 if (tot_bits > 8 * sizeof (long long) + 6)
34 return x;
35 }
36 }
37 }
38
39 #define ABS(x) ((x) >= 0 ? (x) : -(x))
40
main()41 main ()
42 {
43 long long int i;
44
45 for (i = 0; i < 10000; i++)
46 {
47 unsigned long long x, y;
48 x = random_bitstring ();
49 y = random_bitstring ();
50
51 if (sizeof (int) == sizeof (long long))
52 goto save_time;
53
54 { unsigned long long xx = x, yy = y, r1, r2;
55 if (yy == 0) continue;
56 r1 = xx / yy;
57 r2 = xx % yy;
58 if (r2 >= yy || r1 * yy + r2 != xx)
59 abort ();
60 }
61 { signed long long xx = x, yy = y, r1, r2;
62 if ((unsigned long long) xx << 1 == 0 && yy == -1)
63 continue;
64 r1 = xx / yy;
65 r2 = xx % yy;
66 if (ABS (r2) >= (unsigned long long) ABS (yy) || (signed long long) (r1 * yy + r2) != xx)
67 abort ();
68 }
69 save_time:
70 { unsigned int xx = x, yy = y, r1, r2;
71 if (yy == 0) continue;
72 r1 = xx / yy;
73 r2 = xx % yy;
74 if (r2 >= yy || r1 * yy + r2 != xx)
75 abort ();
76 }
77 { signed int xx = x, yy = y, r1, r2;
78 if ((unsigned int) xx << 1 == 0 && yy == -1)
79 continue;
80 r1 = xx / yy;
81 r2 = xx % yy;
82 if (ABS (r2) >= (unsigned int) ABS (yy) || (signed int) (r1 * yy + r2) != xx || ((xx < 0) != (r2 < 0) && r2))
83 abort ();
84 }
85 { unsigned short xx = x, yy = y, r1, r2;
86 if (yy == 0) continue;
87 r1 = xx / yy;
88 r2 = xx % yy;
89 if (r2 >= yy || r1 * yy + r2 != xx)
90 abort ();
91 }
92 { signed short xx = x, yy = y, r1, r2;
93 r1 = xx / yy;
94 r2 = xx % yy;
95 if (ABS (r2) >= (unsigned short) ABS (yy) || (signed short) (r1 * yy + r2) != xx)
96 abort ();
97 }
98 { unsigned char xx = x, yy = y, r1, r2;
99 if (yy == 0) continue;
100 r1 = xx / yy;
101 r2 = xx % yy;
102 if (r2 >= yy || r1 * yy + r2 != xx)
103 abort ();
104 }
105 { signed char xx = x, yy = y, r1, r2;
106 r1 = xx / yy;
107 r2 = xx % yy;
108 if (ABS (r2) >= (unsigned char) ABS (yy) || (signed char) (r1 * yy + r2) != xx)
109 abort ();
110 }
111 }
112
113 exit (0);
114 }
115