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

数学计算

开发平台:

Unix_Linux

  1. /* Exercise mpz_bin_ui and mpz_bin_uiui.
  2. Copyright 2000, 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 "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. void
  20. try_mpz_bin_ui (mpz_srcptr want, mpz_srcptr n, unsigned long k)
  21. {
  22.   mpz_t  got;
  23.   mpz_init (got);
  24.   mpz_bin_ui (got, n, k);
  25.   MPZ_CHECK_FORMAT (got);
  26.   if (mpz_cmp (got, want) != 0)
  27.     {
  28.       printf ("mpz_bin_ui wrongn");
  29.       printf ("  n="); mpz_out_str (stdout, 10, n); printf ("n");
  30.       printf ("  k=%lun", k);
  31.       printf ("  got="); mpz_out_str (stdout, 10, got); printf ("n");
  32.       printf ("  want="); mpz_out_str (stdout, 10, want); printf ("n");
  33.       abort();
  34.     }
  35.   mpz_clear (got);
  36. }
  37. void
  38. try_mpz_bin_uiui (mpz_srcptr want, unsigned long n, unsigned long k)
  39. {
  40.   mpz_t  got;
  41.   mpz_init (got);
  42.   mpz_bin_uiui (got, n, k);
  43.   MPZ_CHECK_FORMAT (got);
  44.   if (mpz_cmp (got, want) != 0)
  45.     {
  46.       printf ("mpz_bin_uiui wrongn");
  47.       printf ("  n=%lun", n);
  48.       printf ("  k=%lun", k);
  49.       printf ("  got="); mpz_out_str (stdout, 10, got); printf ("n");
  50.       printf ("  want="); mpz_out_str (stdout, 10, want); printf ("n");
  51.       abort();
  52.     }
  53.   mpz_clear (got);
  54. }
  55. void
  56. samples (void)
  57. {
  58.   static const struct {
  59.     const char     *n;
  60.     unsigned long  k;
  61.     const char     *want;
  62.   } data[] = {
  63.     {   "0",  0, "1"   },
  64.     {   "0",  1, "0"   },
  65.     {   "0",  2, "0"   },
  66.     {   "0",  3, "0"   },
  67.     {   "0",  4, "0"   },
  68.     {   "0", 123456, "0" },
  69.     {   "1",  0, "1"   },
  70.     {   "1",  1, "1"   },
  71.     {   "1",  2, "0"   },
  72.     {   "1",  3, "0"   },
  73.     {   "1",  4, "0"   },
  74.     {   "1", 123456, "0" },
  75.     {   "2",  0, "1"   },
  76.     {   "2",  1, "2"   },
  77.     {   "2",  2, "1"   },
  78.     {   "2",  3, "0"   },
  79.     {   "2",  4, "0"   },
  80.     {   "2", 123456, "0" },
  81.     {   "3",  0, "1"   },
  82.     {   "3",  1, "3"   },
  83.     {   "3",  2, "3"   },
  84.     {   "3",  3, "1"   },
  85.     {   "3",  4, "0"   },
  86.     {   "3",  5, "0"   },
  87.     {   "3", 123456, "0" },
  88.     {   "4",  0, "1"   },
  89.     {   "4",  1, "4"   },
  90.     {   "4",  2, "6"   },
  91.     {   "4",  3, "4"   },
  92.     {   "4",  4, "1"   },
  93.     {   "4",  5, "0"   },
  94.     {   "4",  6, "0"   },
  95.     {   "4", 123456, "0" },
  96.     {   "10",  0, "1"   },
  97.     {   "10",  1, "10"  },
  98.     {   "10",  2, "45"  },
  99.     {   "10",  3, "120" },
  100.     {   "10",  4, "210" },
  101.     {   "10",  5, "252" },
  102.     {   "10",  6, "210" },
  103.     {   "10",  7, "120" },
  104.     {   "10",  8, "45"  },
  105.     {   "10",  9, "10"  },
  106.     {   "10", 10, "1"   },
  107.     {   "10", 11,     "0" },
  108.     {   "10", 12,     "0" },
  109.     {   "10", 123456, "0" },
  110.     /* negatives, using bin(-n,k)=bin(n+k-1,k) */
  111.     {   "-1",  0,  "1"  },
  112.     {   "-1",  1, "-1"  },
  113.     {   "-1",  2,  "1"  },
  114.     {   "-1",  3, "-1"  },
  115.     {   "-1",  4,  "1"  },
  116.     {   "-2",  0,  "1"  },
  117.     {   "-2",  1, "-2"  },
  118.     {   "-2",  2,  "3"  },
  119.     {   "-2",  3, "-4"  },
  120.     {   "-2",  4,  "5"  },
  121.     {   "-2",  5, "-6"  },
  122.     {   "-2",  6,  "7"  },
  123.     {   "-3",  0,   "1"  },
  124.     {   "-3",  1,  "-3"  },
  125.     {   "-3",  2,   "6"  },
  126.     {   "-3",  3, "-10"  },
  127.     {   "-3",  4,  "15"  },
  128.     {   "-3",  5, "-21"  },
  129.     {   "-3",  6,  "28"  },
  130.     {   "40", 20,  "137846528820" },
  131.     {   "60", 30,  "118264581564861424" },
  132.   };
  133.   mpz_t  n, want;
  134.   int    i;
  135.   mpz_init (n);
  136.   mpz_init (want);
  137.   for (i = 0; i < numberof (data); i++)
  138.     {
  139.       mpz_set_str_or_abort (n, data[i].n, 0);
  140.       mpz_set_str_or_abort (want, data[i].want, 0);
  141.       try_mpz_bin_ui (want, n, data[i].k);
  142.       if (mpz_fits_ulong_p (n))
  143. try_mpz_bin_uiui (want, mpz_get_ui (n), data[i].k);
  144.     }
  145.   mpz_clear (n);
  146.   mpz_clear (want);
  147. }
  148. /* Test some bin(2k,k) cases.  This produces some biggish numbers to
  149.    exercise the limb accumulating code.  */
  150. void
  151. twos (void)
  152. {
  153.   mpz_t          n, want;
  154.   unsigned long  k;
  155.   mpz_init (n);
  156.   mpz_init (want);
  157.   mpz_set_ui (want, (unsigned long) 2);
  158.   for (k = 1; k < 200; k++)
  159.     {
  160.       mpz_set_ui (n, 2*k);
  161.       try_mpz_bin_ui (want, n, k);
  162.       try_mpz_bin_uiui (want, 2*k, k);
  163.       mpz_mul_ui (want, want, 2*(2*k+1));
  164.       mpz_fdiv_q_ui (want, want, k+1);
  165.     }
  166.   mpz_clear (n);
  167.   mpz_clear (want);
  168. }
  169. int
  170. main (void)
  171. {
  172.   tests_start ();
  173.   samples ();
  174.   twos ();
  175.   tests_end ();
  176.   exit (0);
  177. }