Home | History | Annotate | Line # | Download | only in mpz
      1      1.1  mrg /* Test mpz_nextprime.
      2      1.1  mrg 
      3  1.1.1.4  mrg Copyright 2009, 2015, 2018 Free Software Foundation, Inc.
      4      1.1  mrg 
      5  1.1.1.2  mrg This file is part of the GNU MP Library test suite.
      6      1.1  mrg 
      7  1.1.1.2  mrg The GNU MP Library test suite is free software; you can redistribute it
      8  1.1.1.2  mrg and/or modify it under the terms of the GNU General Public License as
      9  1.1.1.2  mrg published by the Free Software Foundation; either version 3 of the License,
     10  1.1.1.2  mrg or (at your option) any later version.
     11  1.1.1.2  mrg 
     12  1.1.1.2  mrg The GNU MP Library test suite is distributed in the hope that it will be
     13  1.1.1.2  mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1.1.2  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     15  1.1.1.2  mrg Public License for more details.
     16      1.1  mrg 
     17  1.1.1.2  mrg You should have received a copy of the GNU General Public License along with
     18  1.1.1.3  mrg the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
     19      1.1  mrg 
     20      1.1  mrg 
     21      1.1  mrg #include <stdio.h>
     22      1.1  mrg #include <stdlib.h>
     23      1.1  mrg 
     24      1.1  mrg #include "gmp-impl.h"
     25      1.1  mrg #include "tests.h"
     26      1.1  mrg 
     27      1.1  mrg void
     28      1.1  mrg refmpz_nextprime (mpz_ptr p, mpz_srcptr t)
     29      1.1  mrg {
     30      1.1  mrg   mpz_add_ui (p, t, 1L);
     31      1.1  mrg   while (! mpz_probab_prime_p (p, 10))
     32      1.1  mrg     mpz_add_ui (p, p, 1L);
     33      1.1  mrg }
     34      1.1  mrg 
     35      1.1  mrg void
     36  1.1.1.2  mrg run (const char *start, int reps, const char *end, short diffs[])
     37      1.1  mrg {
     38      1.1  mrg   mpz_t x, y;
     39      1.1  mrg   int i;
     40      1.1  mrg 
     41      1.1  mrg   mpz_init_set_str (x, start, 0);
     42      1.1  mrg   mpz_init (y);
     43      1.1  mrg 
     44      1.1  mrg   for (i = 0; i < reps; i++)
     45      1.1  mrg     {
     46      1.1  mrg       mpz_nextprime (y, x);
     47      1.1  mrg       mpz_sub (x, y, x);
     48  1.1.1.4  mrg       if (diffs != NULL &&
     49  1.1.1.4  mrg 	  (! mpz_fits_sshort_p (x) || diffs[i] != (short) mpz_get_ui (x)))
     50      1.1  mrg 	{
     51      1.1  mrg 	  gmp_printf ("diff list discrepancy\n");
     52      1.1  mrg 	  abort ();
     53      1.1  mrg 	}
     54  1.1.1.4  mrg       mpz_swap (x, y);
     55      1.1  mrg     }
     56      1.1  mrg 
     57      1.1  mrg   mpz_set_str (y, end, 0);
     58      1.1  mrg 
     59      1.1  mrg   if (mpz_cmp (x, y) != 0)
     60      1.1  mrg     {
     61      1.1  mrg       gmp_printf ("got  %Zx\n", x);
     62      1.1  mrg       gmp_printf ("want %Zx\n", y);
     63      1.1  mrg       abort ();
     64      1.1  mrg     }
     65      1.1  mrg 
     66      1.1  mrg   mpz_clear (y);
     67      1.1  mrg   mpz_clear (x);
     68      1.1  mrg }
     69      1.1  mrg 
     70      1.1  mrg extern short diff1[];
     71      1.1  mrg extern short diff3[];
     72      1.1  mrg extern short diff4[];
     73      1.1  mrg extern short diff5[];
     74  1.1.1.4  mrg extern short diff6[];
     75      1.1  mrg 
     76      1.1  mrg int
     77      1.1  mrg main (int argc, char **argv)
     78      1.1  mrg {
     79      1.1  mrg   int i;
     80      1.1  mrg   int reps = 20;
     81      1.1  mrg   gmp_randstate_ptr rands;
     82      1.1  mrg   mpz_t bs, x, nxtp, ref_nxtp;
     83      1.1  mrg   unsigned long size_range;
     84      1.1  mrg 
     85      1.1  mrg   tests_start();
     86      1.1  mrg   rands = RANDS;
     87      1.1  mrg 
     88      1.1  mrg   run ("2", 1000, "0x1ef7", diff1);
     89      1.1  mrg 
     90      1.1  mrg   run ("3", 1000 - 1, "0x1ef7", NULL);
     91      1.1  mrg 
     92      1.1  mrg   run ("0x8a43866f5776ccd5b02186e90d28946aeb0ed914", 50,
     93      1.1  mrg        "0x8a43866f5776ccd5b02186e90d28946aeb0eeec5", diff3);
     94      1.1  mrg 
     95  1.1.1.4  mrg   run ("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C", 50, /* 2^148 - 148 */
     96      1.1  mrg        "0x100000000000000000000000000000000010ab", diff4);
     97      1.1  mrg 
     98      1.1  mrg   run ("0x1c2c26be55317530311facb648ea06b359b969715db83292ab8cf898d8b1b", 50,
     99      1.1  mrg        "0x1c2c26be55317530311facb648ea06b359b969715db83292ab8cf898da957", diff5);
    100      1.1  mrg 
    101  1.1.1.4  mrg   run ("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80", 50, /* 2^128 - 128 */
    102  1.1.1.4  mrg        "0x10000000000000000000000000000155B", diff6);
    103  1.1.1.4  mrg 
    104      1.1  mrg   mpz_init (bs);
    105      1.1  mrg   mpz_init (x);
    106      1.1  mrg   mpz_init (nxtp);
    107      1.1  mrg   mpz_init (ref_nxtp);
    108      1.1  mrg 
    109  1.1.1.4  mrg   TESTS_REPS (reps, argv, argc);
    110      1.1  mrg 
    111      1.1  mrg   for (i = 0; i < reps; i++)
    112      1.1  mrg     {
    113      1.1  mrg       mpz_urandomb (bs, rands, 32);
    114      1.1  mrg       size_range = mpz_get_ui (bs) % 8 + 2; /* 0..1024 bit operands */
    115      1.1  mrg 
    116      1.1  mrg       mpz_urandomb (bs, rands, size_range);
    117      1.1  mrg       mpz_rrandomb (x, rands, mpz_get_ui (bs));
    118      1.1  mrg 
    119      1.1  mrg /*      gmp_printf ("%ld: %Zd\n", mpz_sizeinbase (x, 2), x); */
    120      1.1  mrg 
    121      1.1  mrg       mpz_nextprime (nxtp, x);
    122      1.1  mrg       refmpz_nextprime (ref_nxtp, x);
    123      1.1  mrg       if (mpz_cmp (nxtp, ref_nxtp) != 0)
    124      1.1  mrg 	abort ();
    125      1.1  mrg     }
    126      1.1  mrg 
    127      1.1  mrg   mpz_clear (bs);
    128      1.1  mrg   mpz_clear (x);
    129      1.1  mrg   mpz_clear (nxtp);
    130      1.1  mrg   mpz_clear (ref_nxtp);
    131      1.1  mrg 
    132      1.1  mrg   tests_end ();
    133      1.1  mrg   return 0;
    134      1.1  mrg }
    135      1.1  mrg 
    136      1.1  mrg short diff1[] =
    137      1.1  mrg {
    138      1.1  mrg   1,2,2,4,2,4,2,4,6,2,6,4,2,4,6,6,
    139      1.1  mrg   2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6,
    140      1.1  mrg   2,10,2,6,6,4,6,6,2,10,2,4,2,12,12,4,
    141      1.1  mrg   2,4,6,2,10,6,6,6,2,6,4,2,10,14,4,2,
    142      1.1  mrg   4,14,6,10,2,4,6,8,6,6,4,6,8,4,8,10,
    143      1.1  mrg   2,10,2,6,4,6,8,4,2,4,12,8,4,8,4,6,
    144      1.1  mrg   12,2,18,6,10,6,6,2,6,10,6,6,2,6,6,4,
    145      1.1  mrg   2,12,10,2,4,6,6,2,12,4,6,8,10,8,10,8,
    146      1.1  mrg   6,6,4,8,6,4,8,4,14,10,12,2,10,2,4,2,
    147      1.1  mrg   10,14,4,2,4,14,4,2,4,20,4,8,10,8,4,6,
    148      1.1  mrg   6,14,4,6,6,8,6,12,4,6,2,10,2,6,10,2,
    149      1.1  mrg   10,2,6,18,4,2,4,6,6,8,6,6,22,2,10,8,
    150      1.1  mrg   10,6,6,8,12,4,6,6,2,6,12,10,18,2,4,6,
    151      1.1  mrg   2,6,4,2,4,12,2,6,34,6,6,8,18,10,14,4,
    152      1.1  mrg   2,4,6,8,4,2,6,12,10,2,4,2,4,6,12,12,
    153      1.1  mrg   8,12,6,4,6,8,4,8,4,14,4,6,2,4,6,2,
    154      1.1  mrg   6,10,20,6,4,2,24,4,2,10,12,2,10,8,6,6,
    155      1.1  mrg   6,18,6,4,2,12,10,12,8,16,14,6,4,2,4,2,
    156      1.1  mrg   10,12,6,6,18,2,16,2,22,6,8,6,4,2,4,8,
    157      1.1  mrg   6,10,2,10,14,10,6,12,2,4,2,10,12,2,16,2,
    158      1.1  mrg   6,4,2,10,8,18,24,4,6,8,16,2,4,8,16,2,
    159      1.1  mrg   4,8,6,6,4,12,2,22,6,2,6,4,6,14,6,4,
    160      1.1  mrg   2,6,4,6,12,6,6,14,4,6,12,8,6,4,26,18,
    161      1.1  mrg   10,8,4,6,2,6,22,12,2,16,8,4,12,14,10,2,
    162      1.1  mrg   4,8,6,6,4,2,4,6,8,4,2,6,10,2,10,8,
    163      1.1  mrg   4,14,10,12,2,6,4,2,16,14,4,6,8,6,4,18,
    164      1.1  mrg   8,10,6,6,8,10,12,14,4,6,6,2,28,2,10,8,
    165      1.1  mrg   4,14,4,8,12,6,12,4,6,20,10,2,16,26,4,2,
    166      1.1  mrg   12,6,4,12,6,8,4,8,22,2,4,2,12,28,2,6,
    167      1.1  mrg   6,6,4,6,2,12,4,12,2,10,2,16,2,16,6,20,
    168      1.1  mrg   16,8,4,2,4,2,22,8,12,6,10,2,4,6,2,6,
    169      1.1  mrg   10,2,12,10,2,10,14,6,4,6,8,6,6,16,12,2,
    170      1.1  mrg   4,14,6,4,8,10,8,6,6,22,6,2,10,14,4,6,
    171      1.1  mrg   18,2,10,14,4,2,10,14,4,8,18,4,6,2,4,6,
    172      1.1  mrg   2,12,4,20,22,12,2,4,6,6,2,6,22,2,6,16,
    173      1.1  mrg   6,12,2,6,12,16,2,4,6,14,4,2,18,24,10,6,
    174      1.1  mrg   2,10,2,10,2,10,6,2,10,2,10,6,8,30,10,2,
    175      1.1  mrg   10,8,6,10,18,6,12,12,2,18,6,4,6,6,18,2,
    176      1.1  mrg   10,14,6,4,2,4,24,2,12,6,16,8,6,6,18,16,
    177      1.1  mrg   2,4,6,2,6,6,10,6,12,12,18,2,6,4,18,8,
    178      1.1  mrg   24,4,2,4,6,2,12,4,14,30,10,6,12,14,6,10,
    179      1.1  mrg   12,2,4,6,8,6,10,2,4,14,6,6,4,6,2,10,
    180      1.1  mrg   2,16,12,8,18,4,6,12,2,6,6,6,28,6,14,4,
    181      1.1  mrg   8,10,8,12,18,4,2,4,24,12,6,2,16,6,6,14,
    182      1.1  mrg   10,14,4,30,6,6,6,8,6,4,2,12,6,4,2,6,
    183      1.1  mrg   22,6,2,4,18,2,4,12,2,6,4,26,6,6,4,8,
    184      1.1  mrg   10,32,16,2,6,4,2,4,2,10,14,6,4,8,10,6,
    185      1.1  mrg   20,4,2,6,30,4,8,10,6,6,8,6,12,4,6,2,
    186      1.1  mrg   6,4,6,2,10,2,16,6,20,4,12,14,28,6,20,4,
    187      1.1  mrg   18,8,6,4,6,14,6,6,10,2,10,12,8,10,2,10,
    188      1.1  mrg   8,12,10,24,2,4,8,6,4,8,18,10,6,6,2,6,
    189      1.1  mrg   10,12,2,10,6,6,6,8,6,10,6,2,6,6,6,10,
    190      1.1  mrg   8,24,6,22,2,18,4,8,10,30,8,18,4,2,10,6,
    191      1.1  mrg   2,6,4,18,8,12,18,16,6,2,12,6,10,2,10,2,
    192      1.1  mrg   6,10,14,4,24,2,16,2,10,2,10,20,4,2,4,8,
    193      1.1  mrg   16,6,6,2,12,16,8,4,6,30,2,10,2,6,4,6,
    194      1.1  mrg   6,8,6,4,12,6,8,12,4,14,12,10,24,6,12,6,
    195      1.1  mrg   2,22,8,18,10,6,14,4,2,6,10,8,6,4,6,30,
    196      1.1  mrg   14,10,2,12,10,2,16,2,18,24,18,6,16,18,6,2,
    197      1.1  mrg   18,4,6,2,10,8,10,6,6,8,4,6,2,10,2,12,
    198      1.1  mrg   4,6,6,2,12,4,14,18,4,6,20,4,8,6,4,8,
    199      1.1  mrg   4,14,6,4,14,12,4,2,30,4,24,6,6,12,12,14,
    200      1.1  mrg   6,4,2,4,18,6,12,8
    201      1.1  mrg };
    202      1.1  mrg 
    203      1.1  mrg short diff3[] =
    204      1.1  mrg {
    205      1.1  mrg   33,32,136,116,24,22,104,114,76,278,238,162,36,44,388,134,
    206      1.1  mrg   130,26,312,42,138,28,24,80,138,108,270,12,330,130,98,102,
    207      1.1  mrg   162,34,36,170,90,34,14,6,24,66,154,218,70,132,188,88,
    208      1.1  mrg   80,82
    209      1.1  mrg };
    210      1.1  mrg 
    211      1.1  mrg short diff4[] =
    212      1.1  mrg {
    213  1.1.1.4  mrg   239,92,64,6,104,24,46,258,68,18,54,100,68,154,26,4,
    214      1.1  mrg   38,142,168,42,18,26,286,104,136,116,40,2,28,110,52,78,
    215      1.1  mrg   104,24,54,96,4,626,196,24,56,36,52,102,48,156,26,18,
    216      1.1  mrg   42,40
    217      1.1  mrg };
    218      1.1  mrg 
    219      1.1  mrg short diff5[] =
    220      1.1  mrg {
    221      1.1  mrg   268,120,320,184,396,2,94,108,20,318,274,14,64,122,220,108,
    222      1.1  mrg   18,174,6,24,348,32,64,116,268,162,20,156,28,110,52,428,
    223      1.1  mrg   196,14,262,30,194,120,300,66,268,12,428,370,212,198,192,130,
    224      1.1  mrg   30,80
    225      1.1  mrg };
    226  1.1.1.4  mrg 
    227  1.1.1.4  mrg short diff6[] =
    228  1.1.1.4  mrg {
    229  1.1.1.4  mrg   179,30,84,108,112,36,42,110,52,132,60,30,326,114,496,92,100,
    230  1.1.1.4  mrg   272,36,54,90,4,2,24,40,398,150,72,60,16,8,4,80,16,2,342,112,
    231  1.1.1.4  mrg   14,136,236,40,18,50,192,198,204,40,266,42,274
    232  1.1.1.4  mrg };
    233