14a1767b4Smrg /* Test mpz_lucnum_ui and mpz_lucnum2_ui.
24a1767b4Smrg 
34a1767b4Smrg Copyright 2001 Free Software Foundation, Inc.
44a1767b4Smrg 
5d25e02daSmrg This file is part of the GNU MP Library test suite.
64a1767b4Smrg 
7d25e02daSmrg The GNU MP Library test suite is free software; you can redistribute it
8d25e02daSmrg and/or modify it under the terms of the GNU General Public License as
9d25e02daSmrg published by the Free Software Foundation; either version 3 of the License,
10d25e02daSmrg or (at your option) any later version.
114a1767b4Smrg 
12d25e02daSmrg The GNU MP Library test suite is distributed in the hope that it will be
13d25e02daSmrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14d25e02daSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15d25e02daSmrg Public License for more details.
164a1767b4Smrg 
17d25e02daSmrg You should have received a copy of the GNU General Public License along with
18f81b1c5bSmrg the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
194a1767b4Smrg 
204a1767b4Smrg #include <stdio.h>
214a1767b4Smrg #include <stdlib.h>
224a1767b4Smrg #include "gmp-impl.h"
234a1767b4Smrg #include "tests.h"
244a1767b4Smrg 
254a1767b4Smrg 
264a1767b4Smrg /* Usage: t-lucnum_ui [n]
274a1767b4Smrg 
284a1767b4Smrg    Test up to L[n], or if n is omitted then the default limit below.  A
294a1767b4Smrg    literal "x" for the limit means continue forever, this being meant only
304a1767b4Smrg    for development.  */
314a1767b4Smrg 
324a1767b4Smrg 
334a1767b4Smrg void
check_sequence(int argc,char * argv[])344a1767b4Smrg check_sequence (int argc, char *argv[])
354a1767b4Smrg {
364a1767b4Smrg   unsigned long  n;
374a1767b4Smrg   unsigned long  limit = 100 * GMP_LIMB_BITS;
384a1767b4Smrg   mpz_t          want_ln, want_ln1, got_ln, got_ln1;
394a1767b4Smrg 
404a1767b4Smrg   if (argc > 1 && argv[1][0] == 'x')
414a1767b4Smrg     limit = ULONG_MAX;
42*671ea119Smrg   else
43*671ea119Smrg     TESTS_REPS (limit, argv, argc);
444a1767b4Smrg 
454a1767b4Smrg   /* start at n==0 */
464a1767b4Smrg   mpz_init_set_si (want_ln1, -1); /* L[-1] */
474a1767b4Smrg   mpz_init_set_ui (want_ln,  2);  /* L[0]   */
484a1767b4Smrg   mpz_init (got_ln);
494a1767b4Smrg   mpz_init (got_ln1);
504a1767b4Smrg 
514a1767b4Smrg   for (n = 0; n < limit; n++)
524a1767b4Smrg     {
534a1767b4Smrg       mpz_lucnum2_ui (got_ln, got_ln1, n);
544a1767b4Smrg       MPZ_CHECK_FORMAT (got_ln);
554a1767b4Smrg       MPZ_CHECK_FORMAT (got_ln1);
564a1767b4Smrg       if (mpz_cmp (got_ln, want_ln) != 0 || mpz_cmp (got_ln1, want_ln1) != 0)
574a1767b4Smrg         {
584a1767b4Smrg           printf ("mpz_lucnum2_ui(%lu) wrong\n", n);
594a1767b4Smrg           mpz_trace ("want ln ", want_ln);
604a1767b4Smrg           mpz_trace ("got  ln ",  got_ln);
614a1767b4Smrg           mpz_trace ("want ln1", want_ln1);
624a1767b4Smrg           mpz_trace ("got  ln1",  got_ln1);
634a1767b4Smrg           abort ();
644a1767b4Smrg         }
654a1767b4Smrg 
664a1767b4Smrg       mpz_lucnum_ui (got_ln, n);
674a1767b4Smrg       MPZ_CHECK_FORMAT (got_ln);
684a1767b4Smrg       if (mpz_cmp (got_ln, want_ln) != 0)
694a1767b4Smrg         {
704a1767b4Smrg           printf ("mpz_lucnum_ui(%lu) wrong\n", n);
714a1767b4Smrg           mpz_trace ("want ln", want_ln);
724a1767b4Smrg           mpz_trace ("got  ln", got_ln);
734a1767b4Smrg           abort ();
744a1767b4Smrg         }
754a1767b4Smrg 
764a1767b4Smrg       mpz_add (want_ln1, want_ln1, want_ln);  /* L[n+1] = L[n] + L[n-1] */
774a1767b4Smrg       mpz_swap (want_ln1, want_ln);
784a1767b4Smrg     }
794a1767b4Smrg 
804a1767b4Smrg   mpz_clear (want_ln);
814a1767b4Smrg   mpz_clear (want_ln1);
824a1767b4Smrg   mpz_clear (got_ln);
834a1767b4Smrg   mpz_clear (got_ln1);
844a1767b4Smrg }
854a1767b4Smrg 
864a1767b4Smrg int
main(int argc,char * argv[])874a1767b4Smrg main (int argc, char *argv[])
884a1767b4Smrg {
894a1767b4Smrg   tests_start ();
904a1767b4Smrg   mp_trace_base = -16;
914a1767b4Smrg 
924a1767b4Smrg   check_sequence (argc, argv);
934a1767b4Smrg 
944a1767b4Smrg   tests_end ();
954a1767b4Smrg   exit (0);
964a1767b4Smrg }
97