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

数学计算

开发平台:

Unix_Linux

  1. /* Exercise the lc2exp random functions.
  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. /* a=0 and c=0 produces zero results always. */
  20. void
  21. check_zero (unsigned long m2exp)
  22. {
  23.   gmp_randstate_t  r;
  24.   mpz_t            a;
  25.   unsigned long    c;
  26.   int              i;
  27.   mpz_init_set_ui (a, 0L);
  28.   c = 0L;
  29.   gmp_randinit_lc_2exp (r, a, c, m2exp);
  30.   gmp_randseed_ui (r, 0L);
  31.   for (i = 0; i < 5; i++)
  32.     {
  33.       mpz_urandomb (a, r, 123L);
  34.       if (mpz_sgn (a) != 0)
  35.         {
  36.           printf ("check_zero m2exp=%lu: didn't get zeron", m2exp);
  37.           gmp_printf ("  rand=%#Zxn", a);
  38.           abort ();
  39.         }
  40.     }
  41.   mpz_clear (a);
  42.   gmp_randclear (r);
  43. }
  44. /* negative a */
  45. void
  46. check_nega (void)
  47. {
  48.   gmp_randstate_t  r;
  49.   mpz_t            a;
  50.   unsigned long    c, m2exp;
  51.   int              i;
  52.   mpz_init (a);
  53.   mpz_setbit (a, 1000L);
  54.   mpz_neg (a, a);
  55.   c = 0L;
  56.   m2exp = 45L;
  57.   gmp_randinit_lc_2exp (r, a, c, m2exp);
  58.   gmp_randseed_ui (r, 0L);
  59.   for (i = 0; i < 5; i++)
  60.     {
  61.       mpz_urandomb (a, r, 123L);
  62.       if (mpz_sgn (a) != 0)
  63.         printf ("check_nega m2exp=%lu: didn't get zeron", m2exp);
  64.     }
  65.   mpz_clear (a);
  66.   gmp_randclear (r);
  67. }
  68. void
  69. check_bigc (void)
  70. {
  71.   gmp_randstate_t  r;
  72.   mpz_t            a;
  73.   unsigned long    c, m2exp, bits;
  74.   int              i;
  75.   mpz_init_set_ui (a, 0L);
  76.   c = ULONG_MAX;
  77.   m2exp = 8;
  78.   gmp_randinit_lc_2exp (r, a, c, m2exp);
  79.   gmp_randseed_ui (r, 0L);
  80.   for (i = 0; i < 20; i++)
  81.     {
  82.       bits = 123L;
  83.       mpz_urandomb (a, r, bits);
  84.       if (mpz_sgn (a) < 0 || mpz_sizeinbase (a, 2) > bits)
  85.         {
  86.           printf     ("check_bigc: mpz_urandomb out of rangen");
  87.           printf     ("   m2exp=%lun", m2exp);
  88.           gmp_printf ("   rand=%#ZXn", a);
  89.           gmp_printf ("   sizeinbase2=%un", mpz_sizeinbase (a, 2));
  90.         }
  91.     }
  92.   mpz_clear (a);
  93.   gmp_randclear (r);
  94. }
  95. void
  96. check_bigc1 (void)
  97. {
  98.   gmp_randstate_t  r;
  99.   mpz_t            a;
  100.   unsigned long    c, m2exp;
  101.   int              i;
  102.   mpz_init_set_ui (a, 0L);
  103.   c = ULONG_MAX;
  104.   m2exp = 2;
  105.   gmp_randinit_lc_2exp (r, a, c, m2exp);
  106.   gmp_randseed_ui (r, 0L);
  107.   for (i = 0; i < 20; i++)
  108.     {
  109.       mpz_urandomb (a, r, 1L);
  110.       if (mpz_cmp_ui (a, 1L) != 0)
  111.         {
  112.           printf     ("check_bigc1: mpz_urandomb didn't give 1n");
  113.           printf     ("   m2exp=%lun", m2exp);
  114.           gmp_printf ("   got rand=%#ZXn", a);
  115.           abort ();
  116.         }
  117.     }
  118.   mpz_clear (a);
  119.   gmp_randclear (r);
  120. }
  121. /* Checks parameters which triggered an assertion failure in the past.
  122.    Happened when limbs(a)+limbs(c) < bits_to_limbs(m2exp).  */
  123. void
  124. check_bigm (void)
  125. {
  126.   gmp_randstate_t rstate;
  127.   mpz_t a;
  128.   mpz_init_set_ui (a, 5L);
  129.   gmp_randinit_lc_2exp (rstate, a, 1L, 384L);
  130.   mpz_urandomb (a, rstate, 20L);
  131.   gmp_randclear (rstate);
  132.   mpz_clear (a);
  133. }
  134. /* Checks for seeds bigger than the modulus.  */
  135. void
  136. check_bigs (void)
  137. {
  138.   gmp_randstate_t rstate;
  139.   mpz_t sd, a;
  140.   int i;
  141.   mpz_init (sd);
  142.   mpz_setbit (sd, 300L);
  143.   mpz_sub_ui (sd, sd, 1L);
  144.   mpz_clrbit (sd, 13L);
  145.   mpz_init_set_ui (a, 123456789L);
  146.   gmp_randinit_lc_2exp (rstate, a, 5L, 64L);
  147.   for (i = 0; i < 20; i++)
  148.     {
  149.       mpz_neg (sd, sd);
  150.       gmp_randseed (rstate, sd);
  151.       mpz_mul_ui (sd, sd, 7L);
  152.       mpz_urandomb (a, rstate, 80L);
  153.     }
  154.   gmp_randclear (rstate);
  155.   mpz_clear (a);
  156.   mpz_clear (sd);
  157. }
  158. int
  159. main (void)
  160. {
  161.   tests_start ();
  162.   check_zero (2L);
  163.   check_zero (7L);
  164.   check_zero (32L);
  165.   check_zero (64L);
  166.   check_zero (1000L);
  167.   check_nega ();
  168.   check_bigc ();
  169.   check_bigc1 ();
  170.   check_bigm ();
  171.   check_bigs ();
  172.   tests_end ();
  173.   exit (0);
  174. }