[Gmp-commit] /var/hg/gmp: Unit test for mpn_gcd_11

mercurial at gmplib.org mercurial at gmplib.org
Thu Aug 8 05:24:29 UTC 2019


details:   /var/hg/gmp/rev/24c0b247b7ca
changeset: 17794:24c0b247b7ca
user:      Niels M?ller <nisse at lysator.liu.se>
date:      Thu Aug 08 07:24:11 2019 +0200
description:
Unit test for mpn_gcd_11

diffstat:

 ChangeLog             |   7 ++++
 tests/mpn/Makefile.am |   2 +-
 tests/mpn/t-gcd_11.c  |  82 +++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/refmpn.c        |  37 ++++++++++++++--------
 tests/tests.h         |   1 +
 5 files changed, 114 insertions(+), 15 deletions(-)

diffs (177 lines):

diff -r fc77a3dc184b -r 24c0b247b7ca ChangeLog
--- a/ChangeLog	Wed Aug 07 17:21:54 2019 +0200
+++ b/ChangeLog	Thu Aug 08 07:24:11 2019 +0200
@@ -1,3 +1,10 @@
+2019-08-08  Niels Möller  <nisse at lysator.liu.se>
+
+	* tests/refmpn.c (refmpn_gcd_11): New function, based on refmpn_gcd_1.
+	(refmpn_gcd_1): Use it.
+	* tests/mpn/t-gcd_11.c: New file, test mpn_gcd_11.
+	* tests/mpn/Makefile.am (check_PROGRAMS): Add t-gcd_11.
+
 2019-08-07  Torbjörn Granlund  <tg at gmplib.org>
 
 	* mpn/alpha/ev67/gcd_11.asm: New file, mostly extracted from gcd_1.asm.
diff -r fc77a3dc184b -r 24c0b247b7ca tests/mpn/Makefile.am
--- a/tests/mpn/Makefile.am	Wed Aug 07 17:21:54 2019 +0200
+++ b/tests/mpn/Makefile.am	Thu Aug 08 07:24:11 2019 +0200
@@ -29,7 +29,7 @@
   t-toom2-sqr t-toom3-sqr t-toom4-sqr t-toom6-sqr t-toom8-sqr		\
   t-div t-mul t-mullo t-sqrlo t-mulmod_bnm1 t-sqrmod_bnm1 t-mulmid	\
   t-hgcd t-hgcd_appr t-matrix22 t-invert t-bdiv t-fib2m			\
-  t-broot t-brootinv t-minvert t-sizeinbase
+  t-broot t-brootinv t-minvert t-sizeinbase t-gcd_11
 
 EXTRA_DIST = toom-shared.h toom-sqr-shared.h
 
diff -r fc77a3dc184b -r 24c0b247b7ca tests/mpn/t-gcd_11.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/mpn/t-gcd_11.c	Thu Aug 08 07:24:11 2019 +0200
@@ -0,0 +1,82 @@
+/* Test mpn_gcd_11.
+
+Copyright 2019 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library test suite.
+
+The GNU MP Library test suite is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 3 of the License,
+or (at your option) any later version.
+
+The GNU MP Library test suite is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
+Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gmp-impl.h"
+#include "tests.h"
+
+#ifndef COUNT
+#define COUNT 10000
+#endif
+
+static void
+one_test (mp_limb_t a, mp_limb_t b, mp_limb_t ref)
+{
+  mp_limb_t r = mpn_gcd_11 (a, b);
+  if (r != ref)
+    {
+      gmp_fprintf (stderr,
+		   "gcd_11 (0x%Mx, 0x%Mx) failed, got: 0x%Mx, ref: 0x%Mx\n",
+		   a, b, r, ref);
+      abort();
+    }
+}
+
+int
+main (int argc, char **argv)
+{
+  mpz_t a, b;
+  int count = COUNT;
+  int test;
+  gmp_randstate_ptr rands;
+
+  TESTS_REPS (count, argv, argc);
+
+  tests_start ();
+  rands = RANDS;
+
+  mpz_init (a);
+  mpz_init (b);
+  for (test = 0; test < count; test++)
+    {
+      mp_limb_t al, bl;
+      mp_bitcnt_t size = 1 + gmp_urandomm_ui(rands, GMP_NUMB_BITS);
+      if (test & 1)
+	{
+	  mpz_urandomb (a, rands, size);
+	  mpz_urandomb (b, rands, size);
+	}
+      else
+	{
+	  mpz_rrandomb (a, rands, size);
+	  mpz_rrandomb (b, rands, size);
+	}
+
+      mpz_setbit (a, 0);
+      mpz_setbit (b, 0);
+      al = mpz_getlimbn (a, 0);
+      bl = mpz_getlimbn (b, 0);
+      one_test (al, bl, refmpn_gcd_11 (al, bl));
+    }
+
+  mpz_clear (a);
+  mpz_clear (b);
+}
diff -r fc77a3dc184b -r 24c0b247b7ca tests/refmpn.c
--- a/tests/refmpn.c	Wed Aug 07 17:21:54 2019 +0200
+++ b/tests/refmpn.c	Thu Aug 08 07:24:11 2019 +0200
@@ -1980,6 +1980,28 @@
 
 
 mp_limb_t
+refmpn_gcd_11 (mp_limb_t x, mp_limb_t y)
+{
+  /* The non-ref function also requires input operands to be odd, but
+     below refmpn_gcd_1 doesn't guarantee that. */
+  ASSERT (x > 0);
+  ASSERT (y > 0);
+  do
+    {
+      while ((x & 1) == 0)  x >>= 1;
+      while ((y & 1) == 0)  y >>= 1;
+
+      if (x < y)
+	MP_LIMB_T_SWAP (x, y);
+
+      x -= y;
+    }
+  while (x != 0);
+
+  return y;
+}
+
+mp_limb_t
 refmpn_gcd_1 (mp_srcptr xp, mp_size_t xsize, mp_limb_t y)
 {
   mp_limb_t  x;
@@ -2002,20 +2024,7 @@
       twos++;
     }
 
-  for (;;)
-    {
-      while ((x & 1) == 0)  x >>= 1;
-      while ((y & 1) == 0)  y >>= 1;
-
-      if (x < y)
-	MP_LIMB_T_SWAP (x, y);
-
-      x -= y;
-      if (x == 0)
-	break;
-    }
-
-  return y << twos;
+  return refmpn_gcd_11 (x, y) << twos;
 }
 
 
diff -r fc77a3dc184b -r 24c0b247b7ca tests/tests.h
--- a/tests/tests.h	Wed Aug 07 17:21:54 2019 +0200
+++ b/tests/tests.h	Thu Aug 08 07:24:11 2019 +0200
@@ -230,6 +230,7 @@
 
 void refmpn_fill (mp_ptr, mp_size_t, mp_limb_t);
 
+mp_limb_t refmpn_gcd_11 (mp_limb_t, mp_limb_t);
 mp_limb_t refmpn_gcd_1 (mp_srcptr, mp_size_t, mp_limb_t);
 mp_limb_t refmpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t);
 


More information about the gmp-commit mailing list