1 /* Test mpz_addmul, mpz_addmul_ui, mpz_submul, mpz_submul_ui.
3 Copyright 2001, 2002 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
30 #define M GMP_NUMB_MAX
34 check_one_inplace (mpz_srcptr w, mpz_srcptr y)
42 mpz_add (want, w, want);
44 mpz_addmul (got, got, y);
45 MPZ_CHECK_FORMAT (got);
46 if (mpz_cmp (want, got) != 0)
48 printf ("mpz_addmul inplace fail\n");
52 mpz_trace ("want", want);
53 mpz_trace ("got ", got);
58 mpz_sub (want, w, want);
60 mpz_submul (got, got, y);
61 MPZ_CHECK_FORMAT (got);
62 if (mpz_cmp (want, got) != 0)
64 printf ("mpz_submul inplace fail\n");
73 check_one_ui_inplace (mpz_ptr w, unsigned long y)
80 mpz_mul_ui (want, w, (unsigned long) y);
81 mpz_add (want, w, want);
83 mpz_addmul_ui (got, got, (unsigned long) y);
84 MPZ_CHECK_FORMAT (got);
85 if (mpz_cmp (want, got) != 0)
87 printf ("mpz_addmul_ui fail\n");
90 printf ("y=0x%lX %lu\n", y, y);
91 mpz_trace ("want", want);
92 mpz_trace ("got ", got);
96 mpz_mul_ui (want, w, y);
97 mpz_sub (want, w, want);
99 mpz_submul_ui (got, got, y);
100 MPZ_CHECK_FORMAT (got);
101 if (mpz_cmp (want, got) != 0)
103 printf ("mpz_submul_ui fail\n");
112 check_all_inplace (mpz_ptr w, mpz_ptr y)
116 MPZ_CHECK_FORMAT (w);
117 MPZ_CHECK_FORMAT (y);
119 for (wneg = 0; wneg < 2; wneg++)
121 for (yneg = 0; yneg < 2; yneg++)
123 check_one_inplace (w, y);
125 if (mpz_fits_ulong_p (y))
126 check_one_ui_inplace (w, mpz_get_ui (y));
135 check_one (mpz_srcptr w, mpz_srcptr x, mpz_srcptr y)
142 mpz_mul (want, x, y);
143 mpz_add (want, w, want);
145 mpz_addmul (got, x, y);
146 MPZ_CHECK_FORMAT (got);
147 if (mpz_cmp (want, got) != 0)
149 printf ("mpz_addmul fail\n");
154 mpz_trace ("want", want);
155 mpz_trace ("got ", got);
159 mpz_mul (want, x, y);
160 mpz_sub (want, w, want);
162 mpz_submul (got, x, y);
163 MPZ_CHECK_FORMAT (got);
164 if (mpz_cmp (want, got) != 0)
166 printf ("mpz_submul fail\n");
175 check_one_ui (mpz_ptr w, mpz_ptr x, unsigned long y)
182 mpz_mul_ui (want, x, (unsigned long) y);
183 mpz_add (want, w, want);
185 mpz_addmul_ui (got, x, (unsigned long) y);
186 MPZ_CHECK_FORMAT (got);
187 if (mpz_cmp (want, got) != 0)
189 printf ("mpz_addmul_ui fail\n");
193 printf ("y=0x%lX %lu\n", y, y);
194 mpz_trace ("want", want);
195 mpz_trace ("got ", got);
199 mpz_mul_ui (want, x, y);
200 mpz_sub (want, w, want);
202 mpz_submul_ui (got, x, y);
203 MPZ_CHECK_FORMAT (got);
204 if (mpz_cmp (want, got) != 0)
206 printf ("mpz_submul_ui fail\n");
216 check_all (mpz_ptr w, mpz_ptr x, mpz_ptr y)
218 int swap, wneg, xneg, yneg;
220 MPZ_CHECK_FORMAT (w);
221 MPZ_CHECK_FORMAT (x);
222 MPZ_CHECK_FORMAT (y);
224 for (swap = 0; swap < 2; swap++)
226 for (wneg = 0; wneg < 2; wneg++)
228 for (xneg = 0; xneg < 2; xneg++)
230 for (yneg = 0; yneg < 2; yneg++)
234 if (mpz_fits_ulong_p (y))
235 check_one_ui (w, x, mpz_get_ui (y));
248 check_data_inplace_ui (void)
250 static const struct {
262 { { 123 }, ULONG_MAX },
264 { { M }, ULONG_MAX },
268 { { 123, 456 }, ULONG_MAX },
269 { { M, M }, ULONG_MAX },
271 { { 123, 456, 789 }, 1 },
273 { { 123, 456, 789 }, ULONG_MAX },
274 { { M, M, M }, ULONG_MAX },
283 for (i = 0; i < numberof (data); i++)
285 mpz_set_n (w, data[i].w, (mp_size_t) numberof(data[i].w));
286 mpz_set_ui (y, data[i].y);
287 check_all_inplace (w, y);
297 static const struct {
304 /* reducing to zero */
305 { { 1 }, { 1 }, { 1 } },
306 { { 2 }, { 1 }, { 2 } },
307 { { 0,1 }, { 0,1 }, { 1 } },
310 { { 0,1 }, { M }, { 1 } },
311 { { 0,0,1 }, { M,M }, { 1 } },
312 { { 0,0,0,1 }, { M,M,M }, { 1 } },
313 { { 0,0,0,0,1 }, { M,M,M,M }, { 1 } },
316 { { M }, { 0,1 }, { 1 } },
317 { { M,M }, { 0,0,1 }, { 1 } },
318 { { M,M,M }, { 0,0,0,1 }, { 1 } },
319 { { M,M,M,M }, { 0,0,0,0,1 }, { 1 } },
321 /* carry out of addmul */
322 { { M }, { 1 }, { 1 } },
323 { { M,M }, { 1 }, { 1 } },
324 { { M,M,M }, { 1 }, { 1 } },
326 /* borrow from submul */
327 { { 0,1 }, { 1 }, { 1 } },
328 { { 0,0,1 }, { 1 }, { 1 } },
329 { { 0,0,0,1 }, { 1 }, { 1 } },
331 /* borrow from submul */
332 { { 0,0,1 }, { 0,1 }, { 1 } },
333 { { 0,0,0,1 }, { 0,1 }, { 1 } },
334 { { 0,0,0,0,1 }, { 0,1 }, { 1 } },
336 /* more borrow from submul */
337 { { M }, { 0,1 }, { 1 } },
338 { { M }, { 0,0,1 }, { 1 } },
339 { { M }, { 0,0,0,1 }, { 1 } },
340 { { M }, { 0,0,0,0,1 }, { 1 } },
342 /* big borrow from submul */
343 { { 0,0,1 }, { M,M }, { M } },
344 { { 0,0,0,1 }, { M,M }, { M } },
345 { { 0,0,0,0,1 }, { M,M }, { M } },
348 { { 0,1 }, { M,M }, { M } },
349 { { 0,1 }, { M,M,M }, { M } },
350 { { 0,1 }, { M,M,M,M }, { M } },
351 { { 0,1 }, { M,M,M,M,M }, { M } },
361 for (i = 0; i < numberof (data); i++)
363 mpz_set_n (w, data[i].w, (mp_size_t) numberof(data[i].w));
364 mpz_set_n (x, data[i].x, (mp_size_t) numberof(data[i].x));
365 mpz_set_n (y, data[i].y, (mp_size_t) numberof(data[i].y));
376 check_random (int argc, char *argv[])
378 gmp_randstate_ptr rands = RANDS;
387 reps = atoi (argv[1]);
389 for (i = 0; i < reps; i++)
391 mpz_errandomb (w, rands, 5*GMP_LIMB_BITS);
392 mpz_errandomb (x, rands, 5*GMP_LIMB_BITS);
393 mpz_errandomb (y, rands, 5*GMP_LIMB_BITS);
395 check_all_inplace (w, y);
397 mpz_errandomb (w, rands, 5*GMP_LIMB_BITS);
398 mpz_errandomb (x, rands, 5*GMP_LIMB_BITS);
399 mpz_errandomb (y, rands, BITS_PER_ULONG);
401 check_all_inplace (w, y);
411 main (int argc, char *argv[])
417 check_data_inplace_ui ();
418 check_random (argc, argv);