github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/mini-gmp/tests/t-reuse.c (about)

     1  /* Test that routines allow reusing a source variable as destination.
     2  
     3  Copyright 1996, 1999-2002, 2009, 2012 Free Software Foundation, Inc.
     4  
     5  This file is part of the GNU MP Library test suite.
     6  
     7  The GNU MP Library test suite is free software; you can redistribute it
     8  and/or modify it under the terms of the GNU General Public License as
     9  published by the Free Software Foundation; either version 3 of the License,
    10  or (at your option) any later version.
    11  
    12  The GNU MP Library test suite is distributed in the hope that it will be
    13  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
    15  Public License for more details.
    16  
    17  You should have received a copy of the GNU General Public License along with
    18  the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
    19  
    20  #include <stdlib.h>
    21  #include <stdio.h>
    22  #include <string.h>
    23  
    24  #include "testutils.h"
    25  
    26  #define COUNT 100
    27  
    28  void dump3 (const char *, mpz_t, mpz_t, mpz_t);
    29  void mpz_check_format (const mpz_t);
    30  
    31  typedef void (*dss_func) (mpz_t, const mpz_t, const mpz_t);
    32  typedef void (*dsi_func) (mpz_t, const mpz_t, unsigned long int);
    33  typedef unsigned long int (*dsi_div_func) (mpz_t, const mpz_t, unsigned long int);
    34  typedef unsigned long int (*ddsi_div_func) (mpz_t, mpz_t, const mpz_t, unsigned long int);
    35  typedef void (*ddss_div_func) (mpz_t, mpz_t, const mpz_t, const mpz_t);
    36  typedef void (*ds_func) (mpz_t, const mpz_t);
    37  
    38  
    39  void
    40  mpz_xinvert (mpz_t r, const mpz_t a, const mpz_t b)
    41  {
    42    int res;
    43    res = mpz_invert (r, a, b);
    44    if (res == 0)
    45      mpz_set_ui (r, 0);
    46  }
    47  
    48  dss_func dss_funcs[] =
    49  {
    50    mpz_add, mpz_sub, mpz_mul,
    51    mpz_cdiv_q, mpz_cdiv_r, mpz_fdiv_q, mpz_fdiv_r, mpz_tdiv_q, mpz_tdiv_r,
    52    mpz_xinvert,
    53    mpz_gcd, mpz_lcm, mpz_and, mpz_ior, mpz_xor
    54  };
    55  const char *dss_func_names[] =
    56  {
    57    "mpz_add", "mpz_sub", "mpz_mul",
    58    "mpz_cdiv_q", "mpz_cdiv_r", "mpz_fdiv_q", "mpz_fdiv_r", "mpz_tdiv_q", "mpz_tdiv_r",
    59    "mpz_xinvert",
    60    "mpz_gcd", "mpz_lcm", "mpz_and", "mpz_ior", "mpz_xor"
    61  };
    62  char dss_func_division[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
    63  
    64  dsi_func dsi_funcs[] =
    65  {
    66    /* Don't change order here without changing the code in main(). */
    67    mpz_add_ui, mpz_mul_ui, mpz_sub_ui,
    68    mpz_fdiv_q_2exp, mpz_fdiv_r_2exp,
    69    mpz_cdiv_q_2exp, mpz_cdiv_r_2exp,
    70    mpz_tdiv_q_2exp, mpz_tdiv_r_2exp,
    71    mpz_mul_2exp,
    72    mpz_pow_ui
    73  };
    74  const char *dsi_func_names[] =
    75  {
    76    "mpz_add_ui", "mpz_mul_ui", "mpz_sub_ui",
    77    "mpz_fdiv_q_2exp", "mpz_fdiv_r_2exp",
    78    "mpz_cdiv_q_2exp", "mpz_cdiv_r_2exp",
    79    "mpz_tdiv_q_2exp", "mpz_tdiv_r_2exp",
    80    "mpz_mul_2exp",
    81    "mpz_pow_ui"
    82  };
    83  
    84  dsi_div_func dsi_div_funcs[] =
    85  {
    86    mpz_cdiv_q_ui, mpz_cdiv_r_ui,
    87    mpz_fdiv_q_ui, mpz_fdiv_r_ui,
    88    mpz_tdiv_q_ui, mpz_tdiv_r_ui
    89  };
    90  const char *dsi_div_func_names[] =
    91  {
    92    "mpz_cdiv_q_ui", "mpz_cdiv_r_ui",
    93    "mpz_fdiv_q_ui", "mpz_fdiv_r_ui",
    94    "mpz_tdiv_q_ui", "mpz_tdiv_r_ui"
    95  };
    96  
    97  ddsi_div_func ddsi_div_funcs[] =
    98  {
    99    mpz_cdiv_qr_ui,
   100    mpz_fdiv_qr_ui,
   101    mpz_tdiv_qr_ui
   102  };
   103  const char *ddsi_div_func_names[] =
   104  {
   105    "mpz_cdiv_qr_ui",
   106    "mpz_fdiv_qr_ui",
   107    "mpz_tdiv_qr_ui"
   108  };
   109  
   110  ddss_div_func ddss_div_funcs[] =
   111  {
   112    mpz_cdiv_qr,
   113    mpz_fdiv_qr,
   114    mpz_tdiv_qr
   115  };
   116  const char *ddss_div_func_names[] =
   117  {
   118    "mpz_cdiv_qr",
   119    "mpz_fdiv_qr",
   120    "mpz_tdiv_qr"
   121  };
   122  
   123  ds_func ds_funcs[] =
   124  {
   125    mpz_abs, mpz_com, mpz_neg, mpz_sqrt
   126  };
   127  const char *ds_func_names[] =
   128  {
   129    "mpz_abs", "mpz_com", "mpz_neg", "mpz_sqrt"
   130  };
   131  
   132  
   133  #define FAIL(class,indx,op1,op2,op3) \
   134    do {									\
   135    class##_funcs[indx] = 0;						\
   136    dump3 (class##_func_names[indx], op1, op2, op3);			\
   137    failures++;								\
   138    } while (0)
   139  #define FAIL2(fname,op1,op2,op3) \
   140    do {									\
   141    dump3 (#fname, op1, op2, op3);						\
   142    failures++;								\
   143    } while (0)
   144  
   145  void
   146  testmain (int argc, char **argv)
   147  {
   148    unsigned i;
   149    int pass, reps = COUNT;
   150    mpz_t in1, in2, in3;
   151    unsigned long int in2i;
   152    mp_size_t size;
   153    mpz_t res1, res2, res3;
   154    mpz_t ref1, ref2, ref3;
   155    mpz_t t;
   156    unsigned long int r1, r2;
   157    long failures = 0;
   158    mpz_t bs;
   159    unsigned long bsi, size_range;
   160  
   161    mpz_init (bs);
   162  
   163    mpz_init (in1);
   164    mpz_init (in2);
   165    mpz_init (in3);
   166    mpz_init (ref1);
   167    mpz_init (ref2);
   168    mpz_init (ref3);
   169    mpz_init (res1);
   170    mpz_init (res2);
   171    mpz_init (res3);
   172    mpz_init (t);
   173  
   174    for (pass = 1; pass <= reps; pass++)
   175      {
   176        mini_urandomb (bs, 32);
   177        size_range = mpz_get_ui (bs) % 12 + 2;
   178  
   179        mini_urandomb (bs, size_range);
   180        size = mpz_get_ui (bs);
   181        mini_rrandomb (in1, size);
   182  
   183        mini_urandomb (bs, size_range);
   184        size = mpz_get_ui (bs);
   185        mini_rrandomb (in2, size);
   186  
   187        mini_urandomb (bs, size_range);
   188        size = mpz_get_ui (bs);
   189        mini_rrandomb (in3, size);
   190  
   191        mini_urandomb (bs, 3);
   192        bsi = mpz_get_ui (bs);
   193        if ((bsi & 1) != 0)
   194  	mpz_neg (in1, in1);
   195        if ((bsi & 2) != 0)
   196  	mpz_neg (in2, in2);
   197        if ((bsi & 4) != 0)
   198  	mpz_neg (in3, in3);
   199  
   200        for (i = 0; i < sizeof (dss_funcs) / sizeof (dss_func); i++)
   201  	{
   202  	  if (dss_funcs[i] == 0)
   203  	    continue;
   204  	  if (dss_func_division[i] && mpz_sgn (in2) == 0)
   205  	    continue;
   206  
   207  	  (dss_funcs[i]) (ref1, in1, in2);
   208  	  mpz_check_format (ref1);
   209  
   210  	  mpz_set (res1, in1);
   211  	  (dss_funcs[i]) (res1, res1, in2);
   212  	  mpz_check_format (res1);
   213  	  if (mpz_cmp (ref1, res1) != 0)
   214  	    FAIL (dss, i, in1, in2, NULL);
   215  
   216  	  mpz_set (res1, in2);
   217  	  (dss_funcs[i]) (res1, in1, res1);
   218  	  mpz_check_format (res1);
   219  	  if (mpz_cmp (ref1, res1) != 0)
   220  	    FAIL (dss, i, in1, in2, NULL);
   221  	}
   222  
   223        for (i = 0; i < sizeof (ddss_div_funcs) / sizeof (ddss_div_func); i++)
   224  	{
   225  	  if (ddss_div_funcs[i] == 0)
   226  	    continue;
   227  	  if (mpz_sgn (in2) == 0)
   228  	    continue;
   229  
   230  	  (ddss_div_funcs[i]) (ref1, ref2, in1, in2);
   231  	  mpz_check_format (ref1);
   232  	  mpz_check_format (ref2);
   233  
   234  	  mpz_set (res1, in1);
   235  	  (ddss_div_funcs[i]) (res1, res2, res1, in2);
   236  	  mpz_check_format (res1);
   237  	  mpz_check_format (res2);
   238  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   239  	    FAIL (ddss_div, i, in1, in2, NULL);
   240  
   241  	  mpz_set (res2, in1);
   242  	  (ddss_div_funcs[i]) (res1, res2, res2, in2);
   243  	  mpz_check_format (res1);
   244  	  mpz_check_format (res2);
   245  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   246  	    FAIL (ddss_div, i, in1, in2, NULL);
   247  
   248  	  mpz_set (res1, in2);
   249  	  (ddss_div_funcs[i]) (res1, res2, in1, res1);
   250  	  mpz_check_format (res1);
   251  	  mpz_check_format (res2);
   252  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   253  	    FAIL (ddss_div, i, in1, in2, NULL);
   254  
   255  	  mpz_set (res2, in2);
   256  	  (ddss_div_funcs[i]) (res1, res2, in1, res2);
   257  	  mpz_check_format (res1);
   258  	  mpz_check_format (res2);
   259  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   260  	    FAIL (ddss_div, i, in1, in2, NULL);
   261  	}
   262  
   263        for (i = 0; i < sizeof (ds_funcs) / sizeof (ds_func); i++)
   264  	{
   265  	  if (ds_funcs[i] == 0)
   266  	    continue;
   267  	  if (strcmp (ds_func_names[i], "mpz_sqrt") == 0
   268  	      && mpz_sgn (in1) < 0)
   269  	    continue;
   270  
   271  	  (ds_funcs[i]) (ref1, in1);
   272  	  mpz_check_format (ref1);
   273  
   274  	  mpz_set (res1, in1);
   275  	  (ds_funcs[i]) (res1, res1);
   276  	  mpz_check_format (res1);
   277  	  if (mpz_cmp (ref1, res1) != 0)
   278  	    FAIL (ds, i, in1, in2, NULL);
   279  	}
   280  
   281        in2i = mpz_get_ui (in2);
   282  
   283        for (i = 0; i < sizeof (dsi_funcs) / sizeof (dsi_func); i++)
   284  	{
   285  	  if (dsi_funcs[i] == 0)
   286  	    continue;
   287  	  if (strcmp (dsi_func_names[i], "mpz_fdiv_q_2exp") == 0)
   288  	    /* Limit exponent to something reasonable for the division
   289  	       functions.  Without this, we'd  normally shift things off
   290  	       the end and just generate the trivial values 1, 0, -1.  */
   291  	    in2i %= 0x1000;
   292  	  if (strcmp (dsi_func_names[i], "mpz_mul_2exp") == 0)
   293  	    /* Limit exponent more for mpz_mul_2exp to save time.  */
   294  	    in2i %= 0x100;
   295  	  if (strcmp (dsi_func_names[i], "mpz_pow_ui") == 0)
   296  	    /* Limit exponent yet more for mpz_pow_ui to save time.  */
   297  	    in2i %= 0x10;
   298  
   299  	  (dsi_funcs[i]) (ref1, in1, in2i);
   300  	  mpz_check_format (ref1);
   301  
   302  	  mpz_set (res1, in1);
   303  	  (dsi_funcs[i]) (res1, res1, in2i);
   304  	  mpz_check_format (res1);
   305  	  if (mpz_cmp (ref1, res1) != 0)
   306  	    FAIL (dsi, i, in1, in2, NULL);
   307  	}
   308  
   309        if (in2i != 0)	  /* Don't divide by 0.  */
   310  	{
   311  	  for (i = 0; i < sizeof (dsi_div_funcs) / sizeof (dsi_div_funcs); i++)
   312  	    {
   313  	      r1 = (dsi_div_funcs[i]) (ref1, in1, in2i);
   314  	      mpz_check_format (ref1);
   315  
   316  	      mpz_set (res1, in1);
   317  	      r2 = (dsi_div_funcs[i]) (res1, res1, in2i);
   318  	      mpz_check_format (res1);
   319  	      if (mpz_cmp (ref1, res1) != 0 || r1 != r2)
   320  		FAIL (dsi_div, i, in1, in2, NULL);
   321  	    }
   322  
   323  	  for (i = 0; i < sizeof (ddsi_div_funcs) / sizeof (ddsi_div_funcs); i++)
   324  	    {
   325  	      r1 = (ddsi_div_funcs[i]) (ref1, ref2, in1, in2i);
   326  	      mpz_check_format (ref1);
   327  
   328  	      mpz_set (res1, in1);
   329  	      r2 = (ddsi_div_funcs[i]) (res1, res2, res1, in2i);
   330  	      mpz_check_format (res1);
   331  	      if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || r1 != r2)
   332  		FAIL (ddsi_div, i, in1, in2, NULL);
   333  
   334  	      mpz_set (res2, in1);
   335  	      (ddsi_div_funcs[i]) (res1, res2, res2, in2i);
   336  	      mpz_check_format (res1);
   337  	      if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0 || r1 != r2)
   338  		FAIL (ddsi_div, i, in1, in2, NULL);
   339  	    }
   340  	}
   341  
   342        if (mpz_sgn (in1) >= 0)
   343  	{
   344  	  mpz_sqrtrem (ref1, ref2, in1);
   345  	  mpz_check_format (ref1);
   346  	  mpz_check_format (ref2);
   347  
   348  	  mpz_set (res1, in1);
   349  	  mpz_sqrtrem (res1, res2, res1);
   350  	  mpz_check_format (res1);
   351  	  mpz_check_format (res2);
   352  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   353  	    FAIL2 (mpz_sqrtrem, in1, NULL, NULL);
   354  
   355  	  mpz_set (res2, in1);
   356  	  mpz_sqrtrem (res1, res2, res2);
   357  	  mpz_check_format (res1);
   358  	  mpz_check_format (res2);
   359  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   360  	    FAIL2 (mpz_sqrtrem, in1, NULL, NULL);
   361  	}
   362  
   363        if (mpz_sgn (in1) >= 0)
   364  	{
   365  	  mpz_root (ref1, in1, in2i % 0x1000 + 1);
   366  	  mpz_check_format (ref1);
   367  
   368  	  mpz_set (res1, in1);
   369  	  mpz_root (res1, res1, in2i % 0x1000 + 1);
   370  	  mpz_check_format (res1);
   371  	  if (mpz_cmp (ref1, res1) != 0)
   372  	    FAIL2 (mpz_root, in1, in2, NULL);
   373  	}
   374  
   375        if (mpz_sgn (in1) >= 0)
   376  	{
   377  	  mpz_rootrem (ref1, ref2, in1, in2i % 0x1000 + 1);
   378  	  mpz_check_format (ref1);
   379  	  mpz_check_format (ref2);
   380  
   381  	  mpz_set (res1, in1);
   382  	  mpz_rootrem (res1, res2, res1, in2i % 0x1000 + 1);
   383  	  mpz_check_format (res1);
   384  	  mpz_check_format (res2);
   385  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   386  	    FAIL2 (mpz_rootrem, in1, in2, NULL);
   387  
   388  	  mpz_set (res2, in1);
   389  	  mpz_rootrem (res1, res2, res2, in2i % 0x1000 + 1);
   390  	  mpz_check_format (res1);
   391  	  mpz_check_format (res2);
   392  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0)
   393  	    FAIL2 (mpz_rootrem, in1, in2, NULL);
   394  	}
   395  
   396        if (pass < reps / 2)	/* run fewer tests since gcdext lots of time */
   397  	{
   398  	  mpz_gcdext (ref1, ref2, ref3, in1, in2);
   399  	  mpz_check_format (ref1);
   400  	  mpz_check_format (ref2);
   401  	  mpz_check_format (ref3);
   402  
   403  	  mpz_set (res1, in1);
   404  	  mpz_gcdext (res1, res2, res3, res1, in2);
   405  	  mpz_check_format (res1);
   406  	  mpz_check_format (res2);
   407  	  mpz_check_format (res3);
   408  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   409  	      || mpz_cmp (ref3, res3) != 0)
   410  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   411  
   412  	  mpz_set (res2, in1);
   413  	  mpz_gcdext (res1, res2, res3, res2, in2);
   414  	  mpz_check_format (res1);
   415  	  mpz_check_format (res2);
   416  	  mpz_check_format (res3);
   417  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   418  	      || mpz_cmp (ref3, res3) != 0)
   419  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   420  
   421  	  mpz_set (res3, in1);
   422  	  mpz_gcdext (res1, res2, res3, res3, in2);
   423  	  mpz_check_format (res1);
   424  	  mpz_check_format (res2);
   425  	  mpz_check_format (res3);
   426  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   427  	      || mpz_cmp (ref3, res3) != 0)
   428  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   429  
   430  	  mpz_set (res1, in2);
   431  	  mpz_gcdext (res1, res2, res3, in1, res1);
   432  	  mpz_check_format (res1);
   433  	  mpz_check_format (res2);
   434  	  mpz_check_format (res3);
   435  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   436  	      || mpz_cmp (ref3, res3) != 0)
   437  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   438  
   439  	  mpz_set (res2, in2);
   440  	  mpz_gcdext (res1, res2, res3, in1, res2);
   441  	  mpz_check_format (res1);
   442  	  mpz_check_format (res2);
   443  	  mpz_check_format (res3);
   444  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   445  	      || mpz_cmp (ref3, res3) != 0)
   446  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   447  
   448  	  mpz_set (res3, in2);
   449  	  mpz_gcdext (res1, res2, res3, in1, res3);
   450  	  mpz_check_format (res1);
   451  	  mpz_check_format (res2);
   452  	  mpz_check_format (res3);
   453  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   454  	      || mpz_cmp (ref3, res3) != 0)
   455  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   456  
   457  	  mpz_set (res1, in1);
   458  	  mpz_gcdext (res1, res2, NULL, res1, in2);
   459  	  mpz_check_format (res1);
   460  	  mpz_check_format (res2);
   461  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   462  	      || mpz_cmp (ref3, res3) != 0)
   463  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   464  
   465  	  mpz_set (res2, in1);
   466  	  mpz_gcdext (res1, res2, NULL, res2, in2);
   467  	  mpz_check_format (res1);
   468  	  mpz_check_format (res2);
   469  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   470  	      || mpz_cmp (ref3, res3) != 0)
   471  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   472  
   473  	  mpz_set (res1, in2);
   474  	  mpz_gcdext (res1, res2, NULL, in1, res1);
   475  	  mpz_check_format (res1);
   476  	  mpz_check_format (res2);
   477  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   478  	      || mpz_cmp (ref3, res3) != 0)
   479  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   480  
   481  	  mpz_set (res2, in2);
   482  	  mpz_gcdext (res1, res2, NULL, in1, res2);
   483  	  mpz_check_format (res1);
   484  	  mpz_check_format (res2);
   485  	  if (mpz_cmp (ref1, res1) != 0 || mpz_cmp (ref2, res2) != 0
   486  	      || mpz_cmp (ref3, res3) != 0)
   487  	    FAIL2 (mpz_gcdext, in1, in2, NULL);
   488  	}
   489  
   490        /* Don't run mpz_powm for huge exponents or when undefined.  */
   491        if (mpz_sizeinbase (in2, 2) < 250 && mpz_sgn (in3) != 0
   492  	  && (mpz_sgn (in2) >= 0 || mpz_invert (t, in1, in3)))
   493  	{
   494  	  mpz_powm (ref1, in1, in2, in3);
   495  	  mpz_check_format (ref1);
   496  
   497  	  mpz_set (res1, in1);
   498  	  mpz_powm (res1, res1, in2, in3);
   499  	  mpz_check_format (res1);
   500  	  if (mpz_cmp (ref1, res1) != 0)
   501  	    FAIL2 (mpz_powm, in1, in2, in3);
   502  
   503  	  mpz_set (res1, in2);
   504  	  mpz_powm (res1, in1, res1, in3);
   505  	  mpz_check_format (res1);
   506  	  if (mpz_cmp (ref1, res1) != 0)
   507  	    FAIL2 (mpz_powm, in1, in2, in3);
   508  
   509  	  mpz_set (res1, in3);
   510  	  mpz_powm (res1, in1, in2, res1);
   511  	  mpz_check_format (res1);
   512  	  if (mpz_cmp (ref1, res1) != 0)
   513  	    FAIL2 (mpz_powm, in1, in2, in3);
   514  	}
   515  
   516        /* Don't run mpz_powm_ui when undefined.  */
   517        if (mpz_sgn (in3) != 0)
   518  	{
   519  	  mpz_powm_ui (ref1, in1, in2i, in3);
   520  	  mpz_check_format (ref1);
   521  
   522  	  mpz_set (res1, in1);
   523  	  mpz_powm_ui (res1, res1, in2i, in3);
   524  	  mpz_check_format (res1);
   525  	  if (mpz_cmp (ref1, res1) != 0)
   526  	    FAIL2 (mpz_powm_ui, in1, in2, in3);
   527  
   528  	  mpz_set (res1, in3);
   529  	  mpz_powm_ui (res1, in1, in2i, res1);
   530  	  mpz_check_format (res1);
   531  	  if (mpz_cmp (ref1, res1) != 0)
   532  	    FAIL2 (mpz_powm_ui, in1, in2, in3);
   533  	}
   534  
   535        {
   536  	r1 = mpz_gcd_ui (ref1, in1, in2i);
   537  	mpz_check_format (ref1);
   538  
   539  	mpz_set (res1, in1);
   540  	r2 = mpz_gcd_ui (res1, res1, in2i);
   541  	mpz_check_format (res1);
   542  	if (mpz_cmp (ref1, res1) != 0)
   543  	  FAIL2 (mpz_gcd_ui, in1, in2, NULL);
   544        }
   545  #if 0
   546        if (mpz_cmp_ui (in2, 1L) > 0 && mpz_sgn (in1) != 0)
   547  	{
   548  	  /* Test mpz_remove */
   549  	  mpz_remove (ref1, in1, in2);
   550  	  mpz_check_format (ref1);
   551  
   552  	  mpz_set (res1, in1);
   553  	  mpz_remove (res1, res1, in2);
   554  	  mpz_check_format (res1);
   555  	  if (mpz_cmp (ref1, res1) != 0)
   556  	    FAIL2 (mpz_remove, in1, in2, NULL);
   557  
   558  	  mpz_set (res1, in2);
   559  	  mpz_remove (res1, in1, res1);
   560  	  mpz_check_format (res1);
   561  	  if (mpz_cmp (ref1, res1) != 0)
   562  	    FAIL2 (mpz_remove, in1, in2, NULL);
   563  	}
   564  #endif
   565        if (mpz_sgn (in2) != 0)
   566  	{
   567  	  /* Test mpz_divexact */
   568  	  mpz_mul (t, in1, in2);
   569  	  mpz_divexact (ref1, t, in2);
   570  	  mpz_check_format (ref1);
   571  
   572  	  mpz_set (res1, t);
   573  	  mpz_divexact (res1, res1, in2);
   574  	  mpz_check_format (res1);
   575  	  if (mpz_cmp (ref1, res1) != 0)
   576  	    FAIL2 (mpz_divexact, t, in2, NULL);
   577  
   578  	  mpz_set (res1, in2);
   579  	  mpz_divexact (res1, t, res1);
   580  	  mpz_check_format (res1);
   581  	  if (mpz_cmp (ref1, res1) != 0)
   582  	    FAIL2 (mpz_divexact, t, in2, NULL);
   583  	}
   584  
   585  #if 0
   586        if (mpz_sgn (in2) > 0)
   587  	{
   588  	  /* Test mpz_divexact_gcd, same as mpz_divexact */
   589  	  mpz_mul (t, in1, in2);
   590  	  mpz_divexact_gcd (ref1, t, in2);
   591  	  mpz_check_format (ref1);
   592  
   593  	  mpz_set (res1, t);
   594  	  mpz_divexact_gcd (res1, res1, in2);
   595  	  mpz_check_format (res1);
   596  	  if (mpz_cmp (ref1, res1) != 0)
   597  	    FAIL2 (mpz_divexact_gcd, t, in2, NULL);
   598  
   599  	  mpz_set (res1, in2);
   600  	  mpz_divexact_gcd (res1, t, res1);
   601  	  mpz_check_format (res1);
   602  	  if (mpz_cmp (ref1, res1) != 0)
   603  	    FAIL2 (mpz_divexact_gcd, t, in2, NULL);
   604  	}
   605  #endif
   606      }
   607  
   608    if (failures != 0)
   609      {
   610        fprintf (stderr, "mpz/reuse: %ld error%s\n", failures, "s" + (failures == 1));
   611        exit (1);
   612      }
   613  
   614    mpz_clear (bs);
   615    mpz_clear (in1);
   616    mpz_clear (in2);
   617    mpz_clear (in3);
   618    mpz_clear (ref1);
   619    mpz_clear (ref2);
   620    mpz_clear (ref3);
   621    mpz_clear (res1);
   622    mpz_clear (res2);
   623    mpz_clear (res3);
   624    mpz_clear (t);
   625  }
   626  
   627  void
   628  dump3 (const char *name, mpz_t in1, mpz_t in2, mpz_t in3)
   629  {
   630    printf ("failure in %s (", name);
   631    mpz_out_str (stdout, -16, in1);
   632    if (in2 != NULL)
   633      {
   634        printf (" ");
   635        mpz_out_str (stdout, -16, in2);
   636      }
   637    if (in3 != NULL)
   638      {
   639        printf (" ");
   640        mpz_out_str (stdout, -16, in3);
   641      }
   642    printf (")\n");
   643  }
   644  
   645  void
   646  mpz_check_format (const mpz_t x)
   647  {
   648    mp_size_t n = x ->_mp_size;
   649    if (n < 0)
   650      n = - n;
   651  
   652    if (n > x->_mp_alloc)
   653      {
   654        fprintf (stderr, "mpz_t size exceeds allocation!\n");
   655        abort ();
   656      }
   657  
   658    if (n > 0 && x->_mp_d[n-1] == 0)
   659      {
   660        fprintf (stderr, "Unnormalized mpz_t!\n");
   661        abort ();
   662      }
   663  }