Blame tests/t-modlinv.c

Packit 5c3484
/* Test binvert_limb.
Packit 5c3484
Packit 5c3484
Copyright 2000-2003 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library test suite.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is free software; you can redistribute it
Packit 5c3484
and/or modify it under the terms of the GNU General Public License as
Packit 5c3484
published by the Free Software Foundation; either version 3 of the License,
Packit 5c3484
or (at your option) any later version.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is distributed in the hope that it will be
Packit 5c3484
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5c3484
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 5c3484
Public License for more details.
Packit 5c3484
Packit 5c3484
You should have received a copy of the GNU General Public License along with
Packit 5c3484
the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
#include <stdio.h>
Packit 5c3484
#include <stdlib.h>
Packit 5c3484
#include <string.h>
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "gmp-impl.h"
Packit 5c3484
#include "longlong.h"
Packit 5c3484
#include "tests.h"
Packit 5c3484
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
one (mp_limb_t n)
Packit 5c3484
{
Packit 5c3484
  mp_limb_t  inv, prod;
Packit 5c3484
Packit 5c3484
  binvert_limb (inv, n);
Packit 5c3484
  prod = (inv * n) & GMP_NUMB_MASK;
Packit 5c3484
  if (prod != 1)
Packit 5c3484
    {
Packit 5c3484
      printf ("binvert_limb wrong\n");
Packit 5c3484
      mp_limb_trace ("  n       ", n);
Packit 5c3484
      mp_limb_trace ("  got     ", inv);
Packit 5c3484
      mp_limb_trace ("  product ", prod);
Packit 5c3484
      abort ();
Packit 5c3484
    }
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
some (void)
Packit 5c3484
{
Packit 5c3484
  int  i;
Packit 5c3484
  for (i = 0; i < 10000; i++)
Packit 5c3484
    one (refmpn_random_limb () | 1);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
all (void)
Packit 5c3484
{
Packit 5c3484
  mp_limb_t  n;
Packit 5c3484
Packit 5c3484
  n = 1;
Packit 5c3484
  do {
Packit 5c3484
    one (n);
Packit 5c3484
    n += 2;
Packit 5c3484
  } while (n != 1);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (int argc, char *argv[])
Packit 5c3484
{
Packit 5c3484
  tests_start ();
Packit 5c3484
Packit 5c3484
  if (argc >= 2 && strcmp (argv[1], "-a") == 0)
Packit 5c3484
    {
Packit 5c3484
      /* it's feasible to run all values on a 32-bit limb, but not a 64-bit */
Packit 5c3484
      all ();
Packit 5c3484
    }
Packit 5c3484
  else
Packit 5c3484
    {
Packit 5c3484
      some ();
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  tests_end ();
Packit 5c3484
  exit (0);
Packit 5c3484
}