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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpn_scan0 and mpn_scan1.
  2. Copyright 2002 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. #define SIZE  ((mp_size_t) 3)
  20. mp_limb_t  x[SIZE+1];
  21. void
  22. check (void)
  23. {
  24.   unsigned long  i, got, want;
  25.   x[SIZE] = 1;
  26.   for (i = 0; i < SIZE*GMP_NUMB_BITS; i++)
  27.     {
  28.       got = refmpn_scan1 (x, i);
  29.       want = mpn_scan1 (x, i);
  30.       if (got != want)
  31.         {
  32.           printf ("mpn_scan1n");
  33.           printf ("  i     %lun", i);
  34.           printf ("  got   %lun", got);
  35.           printf ("  want  %lun", want);
  36.           mpn_trace ("  x    ", x, SIZE);
  37.           abort ();
  38.         }
  39.     }
  40.   x[SIZE] = 0;
  41.   for (i = 0; i < SIZE*GMP_NUMB_BITS; i++)
  42.     {
  43.       got = refmpn_scan0 (x, i);
  44.       want = mpn_scan0 (x, i);
  45.       if (got != want)
  46.         {
  47.           printf ("mpn_scan0n");
  48.           printf ("  i     %lun", i);
  49.           printf ("  got   %lun", got);
  50.           printf ("  want  %lun", want);
  51.           mpn_trace ("  x    ", x, SIZE);
  52.           abort ();
  53.         }
  54.     }
  55. }
  56. void
  57. check_twobits (void)
  58. {
  59. #define TWOBITS(a, b) 
  60.   ((CNST_LIMB(1) << (a)) | (CNST_LIMB(1) << (b)))
  61.   refmpn_zero (x, SIZE);
  62.   x[0] = TWOBITS (1, 0);
  63.   check ();
  64.   refmpn_zero (x, SIZE);
  65.   x[0] = TWOBITS (GMP_NUMB_BITS-1, 1);
  66.   check ();
  67.   refmpn_zero (x, SIZE);
  68.   x[0] = CNST_LIMB(1);
  69.   x[1] = CNST_LIMB(1);
  70.   check ();
  71.   refmpn_zero (x, SIZE);
  72.   x[0] = CNST_LIMB(1) << (GMP_NUMB_BITS-1);
  73.   x[1] = CNST_LIMB(1);
  74.   check ();
  75.   refmpn_zero (x, SIZE);
  76.   x[1] = TWOBITS (1, 0);
  77.   check ();
  78.   refmpn_zero (x, SIZE);
  79.   x[1] = CNST_LIMB(1);
  80.   x[2] = CNST_LIMB(1);
  81.   check ();
  82. }
  83. /* This is unused, it takes too long, especially on 64-bit systems. */
  84. void
  85. check_twobits_exhaustive (void)
  86. {
  87.   unsigned long  i, j;
  88.   for (i = 0; i < GMP_NUMB_BITS * SIZE; i++)
  89.     {
  90.       for (j = 0; j < GMP_NUMB_BITS * SIZE; j++)
  91.         {
  92.           refmpn_zero (x, SIZE);
  93.           refmpn_setbit (x, i);
  94.           refmpn_setbit (x, j);
  95.           check ();
  96.         }
  97.     }
  98. }
  99. void
  100. check_rand (void)
  101. {
  102.   int  i;
  103.   for (i = 0; i < 100; i++)
  104.     {
  105.       refmpn_random2 (x, SIZE);
  106.       check ();
  107.     }
  108. }
  109. int
  110. main (void)
  111. {
  112.   mp_trace_base = -16;
  113.   tests_start ();
  114.   check_twobits ();
  115.   check_rand ();
  116.   tests_end ();
  117.   exit (0);
  118. }