Home | History | Annotate | Line # | Download | only in tests
      1  1.1  mrg /* Tests the (internal) function mpz_lucas_mod
      2  1.1  mrg 
      3  1.1  mrg Copyright 2018, Free Software Foundation, Inc.
      4  1.1  mrg 
      5  1.1  mrg This file is part of the GNU MP Library test suite.
      6  1.1  mrg 
      7  1.1  mrg The GNU MP Library test suite is free software; you can redistribute it
      8  1.1  mrg and/or modify it under the terms of the GNU General Public License as
      9  1.1  mrg published by the Free Software Foundation; either version 3 of the License,
     10  1.1  mrg or (at your option) any later version.
     11  1.1  mrg 
     12  1.1  mrg The GNU MP Library test suite is distributed in the hope that it will be
     13  1.1  mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     15  1.1  mrg Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License along with
     18  1.1  mrg the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
     19  1.1  mrg 
     20  1.1  mrg #include <limits.h>
     21  1.1  mrg #include <stdlib.h>
     22  1.1  mrg #include <stdio.h>
     23  1.1  mrg #include <string.h>
     24  1.1  mrg 
     25  1.1  mrg #include "testutils.h"
     26  1.1  mrg 
     27  1.1  mrg #define MAXBITS 100
     28  1.1  mrg #define COUNT 1000
     29  1.1  mrg 
     30  1.1  mrg void
     31  1.1  mrg testmain (int argc, char **argv)
     32  1.1  mrg {
     33  1.1  mrg   unsigned i;
     34  1.1  mrg   mpz_t m, vr, qr, vm, qm, vt;
     35  1.1  mrg   int resm, resr;
     36  1.1  mrg   long Q;
     37  1.1  mrg   unsigned long b0;
     38  1.1  mrg 
     39  1.1  mrg   mpz_init (m);
     40  1.1  mrg   mpz_init (vr);
     41  1.1  mrg   mpz_init (qr);
     42  1.1  mrg   mpz_init (vm);
     43  1.1  mrg   mpz_init (qm);
     44  1.1  mrg   mpz_init (vt);
     45  1.1  mrg 
     46  1.1  mrg   for (i = 0; i < COUNT; i++)
     47  1.1  mrg     {
     48  1.1  mrg       mini_random_lucm_op (MAXBITS, vr, qr, m, &Q, &b0, &resr);
     49  1.1  mrg       if (b0 == 0)
     50  1.1  mrg 	{
     51  1.1  mrg 	  fprintf (stderr, "lucas_mod: test disabled (%u tests done).\n", i);
     52  1.1  mrg 	  break;
     53  1.1  mrg 	}
     54  1.1  mrg       resm = mpz_lucas_mod (vm, qm, Q, b0, m);
     55  1.1  mrg 
     56  1.1  mrg       if (resr != resm)
     57  1.1  mrg 	{
     58  1.1  mrg 	  if (resm != 0 || mpz_cmp_ui (vm, 0) != 0)
     59  1.1  mrg 	    {
     60  1.1  mrg 	      fprintf (stderr, "mpz_lucas_mod wrong return value (%d != %d):\n", resr, resm);
     61  1.1  mrg 	      fprintf (stderr, "Q = %ld , b0 = %lu\n", Q, b0);
     62  1.1  mrg 	      dump ("m", m);
     63  1.1  mrg 	      dump ("vm", vm);
     64  1.1  mrg 	      dump ("qm", qm);
     65  1.1  mrg 	      abort ();
     66  1.1  mrg 	    }
     67  1.1  mrg 	}
     68  1.1  mrg       else if (resm == 0)
     69  1.1  mrg 	{
     70  1.1  mrg 	  mpz_abs (vr, vr);
     71  1.1  mrg 	  mpz_sub (vt, m, vr);
     72  1.1  mrg 	  mpz_abs (vm, vm);
     73  1.1  mrg 	  mpz_mod (qm, qm, m);
     74  1.1  mrg 	  if (mpz_cmp_ui (qr, 0) < 0)
     75  1.1  mrg 	    mpz_add (qr, qr, m);
     76  1.1  mrg 	  if (mpz_cmp (qm, qr) != 0 ||
     77  1.1  mrg 	      (mpz_cmp (vm, vr) != 0 && mpz_cmp (vm, vt) != 0))
     78  1.1  mrg 	    {
     79  1.1  mrg 	      fprintf (stderr, "mpz_lucas_mod error:\n");
     80  1.1  mrg 	      fprintf (stderr, "Q = %ld , b0 = %lu\n", Q, b0);
     81  1.1  mrg 	      dump ("m", m);
     82  1.1  mrg 	      dump ("vm", vm);
     83  1.1  mrg 	      dump ("vr", vr);
     84  1.1  mrg 	      dump ("vt", vt);
     85  1.1  mrg 	      dump ("qm", qm);
     86  1.1  mrg 	      dump ("qr", qr);
     87  1.1  mrg 	      abort ();
     88  1.1  mrg 	    }
     89  1.1  mrg 
     90  1.1  mrg 	}
     91  1.1  mrg     }
     92  1.1  mrg   mpz_clear (m);
     93  1.1  mrg   mpz_clear (vr);
     94  1.1  mrg   mpz_clear (qr);
     95  1.1  mrg   mpz_clear (vm);
     96  1.1  mrg   mpz_clear (qm);
     97  1.1  mrg   mpz_clear (vt);
     98  1.1  mrg }
     99