1/* Test mpn_gcd_11.
2
3Copyright 2019 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library test suite.
6
7The GNU MP Library test suite is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 3 of the License,
10or (at your option) any later version.
11
12The GNU MP Library test suite is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15Public License for more details.
16
17You should have received a copy of the GNU General Public License along with
18the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
19
20#include <stdio.h>
21#include <stdlib.h>
22
23#include "gmp-impl.h"
24#include "tests.h"
25
26#ifndef COUNT
27#define COUNT 500000
28#endif
29
30static void
31one_test (mp_limb_t a, mp_limb_t b, mp_limb_t ref)
32{
33  mp_limb_t r = mpn_gcd_11 (a, b);
34  if (r != ref)
35    {
36      gmp_fprintf (stderr,
37		   "gcd_11 (0x%Mx, 0x%Mx) failed, got: 0x%Mx, ref: 0x%Mx\n",
38		   a, b, r, ref);
39      abort();
40    }
41}
42
43int
44main (int argc, char **argv)
45{
46  mpz_t a, b;
47  int count = COUNT;
48  int test;
49  gmp_randstate_ptr rands;
50
51  TESTS_REPS (count, argv, argc);
52
53  tests_start ();
54  rands = RANDS;
55
56  mpz_init (a);
57  mpz_init (b);
58  for (test = 0; test < count; test++)
59    {
60      mp_limb_t al, bl;
61      mp_bitcnt_t asize = 1 + gmp_urandomm_ui(rands, GMP_NUMB_BITS);
62      mp_bitcnt_t bsize = 1 + gmp_urandomm_ui(rands, GMP_NUMB_BITS);
63      if (test & 1)
64	{
65	  mpz_urandomb (a, rands, asize);
66	  mpz_urandomb (b, rands, bsize);
67	}
68      else
69	{
70	  mpz_rrandomb (a, rands, asize);
71	  mpz_rrandomb (b, rands, bsize);
72	}
73
74      mpz_setbit (a, 0);
75      mpz_setbit (b, 0);
76      al = mpz_getlimbn (a, 0);
77      bl = mpz_getlimbn (b, 0);
78      one_test (al, bl, refmpn_gcd_11 (al, bl));
79    }
80
81  mpz_clear (a);
82  mpz_clear (b);
83
84  tests_end ();
85  return 0;
86}
87