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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_lucnum_ui and mpz_lucnum2_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 "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. /* Usage: t-lucnum_ui [n]
  20.    Test up to L[n], or if n is omitted then the default limit below.  A
  21.    literal "x" for the limit means continue forever, this being meant only
  22.    for development.  */
  23. void
  24. check_sequence (int argc, char *argv[])
  25. {
  26.   unsigned long  n;
  27.   unsigned long  limit = 100 * GMP_LIMB_BITS;
  28.   mpz_t          want_ln, want_ln1, got_ln, got_ln1;
  29.   if (argc > 1 && argv[1][0] == 'x')
  30.     limit = ULONG_MAX;
  31.   else if (argc > 1)
  32.     limit = atoi (argv[1]);
  33.   /* start at n==0 */
  34.   mpz_init_set_si (want_ln1, -1); /* L[-1] */
  35.   mpz_init_set_ui (want_ln,  2);  /* L[0]   */
  36.   mpz_init (got_ln);
  37.   mpz_init (got_ln1);
  38.   for (n = 0; n < limit; n++)
  39.     {
  40.       mpz_lucnum2_ui (got_ln, got_ln1, n);
  41.       MPZ_CHECK_FORMAT (got_ln);
  42.       MPZ_CHECK_FORMAT (got_ln1);
  43.       if (mpz_cmp (got_ln, want_ln) != 0 || mpz_cmp (got_ln1, want_ln1) != 0)
  44.         {
  45.           printf ("mpz_lucnum2_ui(%lu) wrongn", n);
  46.           mpz_trace ("want ln ", want_ln);
  47.           mpz_trace ("got  ln ",  got_ln);
  48.           mpz_trace ("want ln1", want_ln1);
  49.           mpz_trace ("got  ln1",  got_ln1);
  50.           abort ();
  51.         }
  52.       mpz_lucnum_ui (got_ln, n);
  53.       MPZ_CHECK_FORMAT (got_ln);
  54.       if (mpz_cmp (got_ln, want_ln) != 0)
  55.         {
  56.           printf ("mpz_lucnum_ui(%lu) wrongn", n);
  57.           mpz_trace ("want ln", want_ln);
  58.           mpz_trace ("got  ln", got_ln);
  59.           abort ();
  60.         }
  61.       mpz_add (want_ln1, want_ln1, want_ln);  /* L[n+1] = L[n] + L[n-1] */
  62.       mpz_swap (want_ln1, want_ln);
  63.     }
  64.   mpz_clear (want_ln);
  65.   mpz_clear (want_ln1);
  66.   mpz_clear (got_ln);
  67.   mpz_clear (got_ln1);
  68. }
  69. int
  70. main (int argc, char *argv[])
  71. {
  72.   tests_start ();
  73.   mp_trace_base = -16;
  74.   check_sequence (argc, argv);
  75.   tests_end ();
  76.   exit (0);
  77. }