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

数学计算

开发平台:

Unix_Linux

  1. /* Test for mullo function.
  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 "gmp.h"
  15. #include "gmp-impl.h"
  16. #include "tests.h"
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. /* Sizes are up to 2^SIZE_LOG limbs */
  20. #ifndef SIZE_LOG
  21. #define SIZE_LOG 10
  22. #endif
  23. #ifndef COUNT
  24. #define COUNT 10000
  25. #endif
  26. #define MAX_N (1L << SIZE_LOG)
  27. #define MIN_N (1)
  28. int
  29. main (int argc, char **argv)
  30. {
  31.   mp_ptr ap, bp, refp, pp, scratch;
  32.   int count = COUNT;
  33.   int test;
  34.   gmp_randstate_ptr rands;
  35.   TMP_DECL;
  36.   TMP_MARK;
  37.   if (argc > 1)
  38.     {
  39.       char *end;
  40.       count = strtol (argv[1], &end, 0);
  41.       if (*end || count <= 0)
  42. {
  43.   fprintf (stderr, "Invalid test count: %s.n", argv[1]);
  44.   return 1;
  45. }
  46.     }
  47.   tests_start ();
  48.   rands = RANDS;
  49. #define mpn_mullo_itch(n) (0)
  50.   ap = TMP_ALLOC_LIMBS (MAX_N);
  51.   bp = TMP_ALLOC_LIMBS (MAX_N);
  52.   refp = TMP_ALLOC_LIMBS (MAX_N * 2);
  53.   pp = 1+TMP_ALLOC_LIMBS (MAX_N + 2);
  54.   scratch
  55.     = 1+TMP_ALLOC_LIMBS (mpn_mullo_itch (MAX_N) + 2);
  56.   for (test = 0; test < count; test++)
  57.     {
  58.       unsigned size_min;
  59.       unsigned size_range;
  60.       mp_size_t n;
  61.       mp_size_t itch;
  62.       mp_limb_t p_before, p_after, s_before, s_after;
  63.       for (size_min = 1; (1L << size_min) < MIN_N; size_min++)
  64. ;
  65.       /* We generate an in the MIN_N <= n <= (1 << size_range). */
  66.       size_range = size_min
  67. + gmp_urandomm_ui (rands, SIZE_LOG + 1 - size_min);
  68.       n = MIN_N
  69. + gmp_urandomm_ui (rands, (1L << size_range) + 1 - MIN_N);
  70.       mpn_random2 (ap, n);
  71.       mpn_random2 (bp, n);
  72.       mpn_random2 (pp-1, n + 2);
  73.       p_before = pp[-1];
  74.       p_after = pp[n];
  75.       itch = mpn_mullo_itch (n);
  76.       ASSERT_ALWAYS (itch <= mpn_mullo_itch (MAX_N));
  77.       mpn_random2 (scratch-1, itch+2);
  78.       s_before = scratch[-1];
  79.       s_after = scratch[itch];
  80.       mpn_mullo_n (pp, ap, bp, n);
  81.       mpn_mul_n (refp, ap, bp, n);
  82.       if (pp[-1] != p_before || pp[n] != p_after
  83.   || scratch[-1] != s_before || scratch[itch] != s_after
  84.   || mpn_cmp (refp, pp, n) != 0)
  85. {
  86.   printf ("ERROR in test %d, n = %d",
  87.   test, (int) n);
  88.   if (pp[-1] != p_before)
  89.     {
  90.       printf ("before pp:"); mpn_dump (pp -1, 1);
  91.       printf ("keep:   "); mpn_dump (&p_before, 1);
  92.     }
  93.   if (pp[n] != p_after)
  94.     {
  95.       printf ("after pp:"); mpn_dump (pp + n, 1);
  96.       printf ("keep:   "); mpn_dump (&p_after, 1);
  97.     }
  98.   if (scratch[-1] != s_before)
  99.     {
  100.       printf ("before scratch:"); mpn_dump (scratch-1, 1);
  101.       printf ("keep:   "); mpn_dump (&s_before, 1);
  102.     }
  103.   if (scratch[itch] != s_after)
  104.     {
  105.       printf ("after scratch:"); mpn_dump (scratch + itch, 1);
  106.       printf ("keep:   "); mpn_dump (&s_after, 1);
  107.     }
  108.   mpn_dump (ap, n);
  109.   mpn_dump (bp, n);
  110.   mpn_dump (pp, n);
  111.   mpn_dump (refp, n);
  112.   abort();
  113. }
  114.     }
  115.   TMP_FREE;
  116.   tests_end ();
  117.   return 0;
  118. }