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