Home | History | Annotate | Line # | Download | only in mpz
dive.c revision 1.1.1.1.2.1
      1          1.1   mrg /* Test mpz_mul, mpz_divexact.
      2          1.1   mrg 
      3          1.1   mrg Copyright 1996, 2001, 2002 Free Software Foundation, Inc.
      4          1.1   mrg 
      5  1.1.1.1.2.1  yamt This file is part of the GNU MP Library test suite.
      6          1.1   mrg 
      7  1.1.1.1.2.1  yamt The GNU MP Library test suite is free software; you can redistribute it
      8  1.1.1.1.2.1  yamt and/or modify it under the terms of the GNU General Public License as
      9  1.1.1.1.2.1  yamt published by the Free Software Foundation; either version 3 of the License,
     10  1.1.1.1.2.1  yamt or (at your option) any later version.
     11  1.1.1.1.2.1  yamt 
     12  1.1.1.1.2.1  yamt The GNU MP Library test suite is distributed in the hope that it will be
     13  1.1.1.1.2.1  yamt useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1.1.1.2.1  yamt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     15  1.1.1.1.2.1  yamt Public License for more details.
     16          1.1   mrg 
     17  1.1.1.1.2.1  yamt You should have received a copy of the GNU General Public License along with
     18  1.1.1.1.2.1  yamt the GNU MP Library test suite.  If not, see http://www.gnu.org/licenses/.  */
     19          1.1   mrg 
     20          1.1   mrg #include <stdio.h>
     21          1.1   mrg #include <stdlib.h>
     22          1.1   mrg 
     23          1.1   mrg #include "gmp.h"
     24          1.1   mrg #include "gmp-impl.h"
     25          1.1   mrg #include "tests.h"
     26          1.1   mrg 
     27          1.1   mrg int
     28          1.1   mrg main (int argc, char **argv)
     29          1.1   mrg {
     30          1.1   mrg   mpz_t op1, op2;
     31          1.1   mrg   mpz_t prod, quot;
     32          1.1   mrg   mp_size_t size;
     33          1.1   mrg   int i;
     34          1.1   mrg   int reps = 5000;
     35          1.1   mrg   gmp_randstate_ptr rands;
     36          1.1   mrg   mpz_t bs;
     37          1.1   mrg   unsigned long bsi, size_range;
     38          1.1   mrg 
     39          1.1   mrg   tests_start ();
     40          1.1   mrg   TESTS_REPS (reps, argv, argc);
     41          1.1   mrg 
     42          1.1   mrg   rands = RANDS;
     43          1.1   mrg 
     44          1.1   mrg   mp_trace_base = -16;
     45          1.1   mrg 
     46          1.1   mrg   mpz_init (bs);
     47          1.1   mrg 
     48          1.1   mrg   mpz_init (op1);
     49          1.1   mrg   mpz_init (op2);
     50          1.1   mrg   mpz_init (prod);
     51          1.1   mrg   mpz_init (quot);
     52          1.1   mrg 
     53          1.1   mrg   for (i = 0; i < reps; i++)
     54          1.1   mrg     {
     55          1.1   mrg       mpz_urandomb (bs, rands, 32);
     56          1.1   mrg       size_range = mpz_get_ui (bs) % 17 + 2; /* 0..2047 bit operands */
     57          1.1   mrg 
     58          1.1   mrg       mpz_urandomb (bs, rands, size_range);
     59          1.1   mrg       size = mpz_get_ui (bs);
     60          1.1   mrg       mpz_rrandomb (op1, rands, size);
     61          1.1   mrg 
     62          1.1   mrg       do
     63          1.1   mrg 	{
     64          1.1   mrg 	  mpz_urandomb (bs, rands, size_range);
     65          1.1   mrg 	  size = mpz_get_ui (bs);
     66          1.1   mrg 	  mpz_rrandomb (op2, rands, size);
     67          1.1   mrg 	}
     68          1.1   mrg       while (mpz_sgn (op2) == 0);
     69          1.1   mrg 
     70          1.1   mrg       mpz_urandomb (bs, rands, 2);
     71          1.1   mrg       bsi = mpz_get_ui (bs);
     72          1.1   mrg       if ((bsi & 1) != 0)
     73          1.1   mrg 	mpz_neg (op1, op1);
     74          1.1   mrg       if ((bsi & 2) != 0)
     75          1.1   mrg 	mpz_neg (op2, op2);
     76          1.1   mrg 
     77          1.1   mrg       mpz_mul (prod, op1, op2);
     78          1.1   mrg 
     79          1.1   mrg       mpz_divexact (quot, prod, op2);
     80          1.1   mrg       MPZ_CHECK_FORMAT (quot);
     81          1.1   mrg 
     82          1.1   mrg       if (mpz_cmp (quot, op1) != 0)
     83          1.1   mrg         {
     84          1.1   mrg           printf ("Wrong results:\n");
     85          1.1   mrg           mpz_trace ("  got     ", quot);
     86          1.1   mrg           mpz_trace ("  want    ", op1);
     87          1.1   mrg           mpz_trace ("  dividend", prod);
     88          1.1   mrg           mpz_trace ("  divisor ", op2);
     89          1.1   mrg           abort ();
     90          1.1   mrg         }
     91          1.1   mrg     }
     92          1.1   mrg 
     93          1.1   mrg   mpz_clear (bs);
     94          1.1   mrg   mpz_clear (op1);
     95          1.1   mrg   mpz_clear (op2);
     96          1.1   mrg   mpz_clear (prod);
     97          1.1   mrg   mpz_clear (quot);
     98          1.1   mrg 
     99          1.1   mrg   tests_end ();
    100          1.1   mrg   exit (0);
    101          1.1   mrg }
    102