t-nextprime.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:6k
源码类别:

数学计算

开发平台:

Unix_Linux

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