1 /* Generate Fibonacci table data.
3 Copyright 2001, 2002, 2004 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
24 int fnum
, fib_limit
, luc_limit
;
27 generate (int numb_bits
)
32 mpz_init_set_ui (limit
, 1L);
33 mpz_mul_2exp (limit
, limit
, numb_bits
);
35 /* fib(2n) > 2^n, so use 2n as a limit for the table size */
36 falloc
= 2 * numb_bits
;
37 f
= (mpz_t
*) xmalloc (falloc
* sizeof (*f
));
39 mpz_init_set_ui (f
[0], 1L); /* F[-1] */
40 mpz_init_set_ui (f
[1], 0L); /* F[0] */
48 /* F[i] = F[i-1] + F[i-2] */
50 mpz_add (f
[i
], f
[i
-1], f
[i
-2]);
51 if (mpz_cmp (f
[i
], limit
) >= 0)
57 /* L[i] = F[i]+2*F[i-1] */
58 mpz_add (l
, f
[i
], f
[i
-1]);
59 mpz_add (l
, l
, f
[i
-1]);
61 if (mpz_cmp (l
, limit
) < 0)
70 header (int numb_bits
)
72 printf ("/* This file generated by gen-fib.c - DO NOT EDIT. */\n");
74 printf ("#if GMP_NUMB_BITS != %d\n", numb_bits
);
75 printf ("Error, error, this data is for %d bits\n", numb_bits
);
78 printf ("#define FIB_TABLE_LIMIT %d\n", fib_limit
);
79 printf ("#define FIB_TABLE_LUCNUM_LIMIT %d\n", luc_limit
);
87 printf ("/* This file generated by gen-fib.c - DO NOT EDIT. */\n");
89 printf ("#include \"gmp.h\"\n");
90 printf ("#include \"gmp-impl.h\"\n");
92 printf ("#if GMP_NUMB_BITS != %d\n", numb_bits
);
93 printf ("Error, error, this data is for %d bits\n", numb_bits
);
96 printf ("const mp_limb_t\n");
97 printf ("__gmp_fib_table[FIB_TABLE_LIMIT+2] = {\n");
99 for (i
= 0; i
< fnum
; i
++)
101 printf (" CNST_LIMB (0x");
102 mpz_out_str (stdout
, 16, f
[i
]);
103 printf ("), /* %d */\n", i
-1);
109 main (int argc
, char *argv
[])
111 int limb_bits
, nail_bits
, numb_bits
;
115 fprintf (stderr
, "Usage: gen-bases <header|table> <limbbits> <nailbits>\n");
119 limb_bits
= atoi (argv
[2]);
120 nail_bits
= atoi (argv
[3]);
124 || nail_bits
>= limb_bits
)
126 fprintf (stderr
, "Invalid limb/nail bits: %d %d\n",
127 limb_bits
, nail_bits
);
130 numb_bits
= limb_bits
- nail_bits
;
132 generate (numb_bits
);
134 if (strcmp (argv
[1], "header") == 0)
136 else if (strcmp (argv
[1], "table") == 0)
140 fprintf (stderr
, "Invalid header/table choice: %s\n", argv
[1]);