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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_lcm and mpz_lcm_ui.
  2. Copyright 2001 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 <string.h>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. #include "tests.h"
  20. void
  21. check_all (mpz_ptr want, mpz_srcptr x_orig, mpz_srcptr y_orig)
  22. {
  23.   mpz_t  got, x, y;
  24.   int    negx, negy, swap, inplace;
  25.   mpz_init (got);
  26.   mpz_init_set (x, x_orig);
  27.   mpz_init_set (y, y_orig);
  28.   for (swap = 0; swap < 2; swap++)
  29.     {
  30.       mpz_swap (x, y);
  31.       for (negx = 0; negx < 2; negx++)
  32. {
  33.   mpz_neg (x, x);
  34.   for (negy = 0; negy < 2; negy++)
  35.     {
  36.       mpz_neg (y, y);
  37.       for (inplace = 0; inplace <= 1; inplace++)
  38. {
  39.   if (inplace)
  40.     { mpz_set (got, x); mpz_lcm (got, got, y); }
  41.   else
  42.     mpz_lcm (got, x, y);
  43.   MPZ_CHECK_FORMAT (got);
  44.   if (mpz_cmp (got, want) != 0)
  45.     {
  46.       printf ("mpz_lcm wrong, inplace=%dn", inplace);
  47.     fail:
  48.       mpz_trace ("x", x);
  49.       mpz_trace ("y", y);
  50.       mpz_trace ("got", got);
  51.       mpz_trace ("want", want);
  52.       abort ();
  53.     }
  54.   if (mpz_fits_ulong_p (y))
  55.     {
  56.       unsigned long  yu = mpz_get_ui (y);
  57.       if (inplace)
  58. { mpz_set (got, x); mpz_lcm_ui (got, got, yu); }
  59.       else
  60. mpz_lcm_ui (got, x, yu);
  61.       if (mpz_cmp (got, want) != 0)
  62. {
  63.   printf ("mpz_lcm_ui wrong, inplace=%dn", inplace);
  64.   printf    ("yu=%lun", yu);
  65.   goto fail;
  66. }
  67.     }
  68. }
  69.     }
  70. }
  71.     }
  72.   mpz_clear (got);
  73.   mpz_clear (x);
  74.   mpz_clear (y);
  75. }
  76. void
  77. check_primes (void)
  78. {
  79.   static unsigned long  prime[] = {
  80.     2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
  81.     101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,
  82.     191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,
  83.     281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,
  84.     389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,
  85.   };
  86.   mpz_t  want, x, y;
  87.   int    i;
  88.   mpz_init (want);
  89.   mpz_init (x);
  90.   mpz_init (y);
  91.   /* New prime each time. */
  92.   mpz_set_ui (want, 1L);
  93.   for (i = 0; i < numberof (prime); i++)
  94.     {
  95.       mpz_set (x, want);
  96.       mpz_set_ui (y, prime[i]);
  97.       mpz_mul_ui (want, want, prime[i]);
  98.       check_all (want, x, y);
  99.     }
  100.   /* Old prime each time. */
  101.   mpz_set (x, want);
  102.   for (i = 0; i < numberof (prime); i++)
  103.     {
  104.       mpz_set_ui (y, prime[i]);
  105.       check_all (want, x, y);
  106.     }
  107.   /* One old, one new each time. */
  108.   mpz_set_ui (want, prime[0]);
  109.   for (i = 1; i < numberof (prime); i++)
  110.     {
  111.       mpz_set (x, want);
  112.       mpz_set_ui (y, prime[i] * prime[i-1]);
  113.       mpz_mul_ui (want, want, prime[i]);
  114.       check_all (want, x, y);
  115.     }
  116.   /* Triplets with A,B in x and B,C in y. */
  117.   mpz_set_ui (want, 1L);
  118.   mpz_set_ui (x, 1L);
  119.   mpz_set_ui (y, 1L);
  120.   for (i = 0; i+2 < numberof (prime); i += 3)
  121.     {
  122.       mpz_mul_ui (want, want, prime[i]);
  123.       mpz_mul_ui (want, want, prime[i+1]);
  124.       mpz_mul_ui (want, want, prime[i+2]);
  125.       mpz_mul_ui (x, x, prime[i]);
  126.       mpz_mul_ui (x, x, prime[i+1]);
  127.       mpz_mul_ui (y, y, prime[i+1]);
  128.       mpz_mul_ui (y, y, prime[i+2]);
  129.       check_all (want, x, y);
  130.     }
  131.   mpz_clear (want);
  132.   mpz_clear (x);
  133.   mpz_clear (y);
  134. }
  135. int
  136. main (int argc, char *argv[])
  137. {
  138.   tests_start ();
  139.   check_primes ();
  140.   tests_end ();
  141.   exit (0);
  142. }