Annotation of OpenXM_contrib/gmp/mpz/tests/t-bin.c, Revision 1.1
1.1 ! maekawa 1: /* Exercise mpz_bin_ui and mpz_bin_uiui. */
! 2:
! 3: /*
! 4: Copyright (C) 2000 Free Software Foundation, Inc.
! 5:
! 6: This file is part of the GNU MP Library.
! 7:
! 8: The GNU MP Library is free software; you can redistribute it and/or modify
! 9: it under the terms of the GNU Lesser General Public License as published by
! 10: the Free Software Foundation; either version 2.1 of the License, or (at your
! 11: option) any later version.
! 12:
! 13: The GNU MP Library is distributed in the hope that it will be useful, but
! 14: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 15: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 16: License for more details.
! 17:
! 18: You should have received a copy of the GNU Lesser General Public License
! 19: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 20: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 21: MA 02111-1307, USA.
! 22: */
! 23:
! 24: #include <stdio.h>
! 25: #include "gmp.h"
! 26: #include "gmp-impl.h"
! 27:
! 28:
! 29: void
! 30: try_mpz_bin_ui (mpz_srcptr want, mpz_srcptr n, unsigned long k)
! 31: {
! 32: mpz_t got;
! 33:
! 34: mpz_init (got);
! 35: mpz_bin_ui (got, n, k);
! 36: MPZ_CHECK_FORMAT (got);
! 37: if (mpz_cmp (got, want) != 0)
! 38: {
! 39: printf ("mpz_bin_ui wrong\n");
! 40: printf (" n="); mpz_out_str (stdout, 10, n); printf ("\n");
! 41: printf (" k=%lu\n", k);
! 42: printf (" got="); mpz_out_str (stdout, 10, got); printf ("\n");
! 43: printf (" want="); mpz_out_str (stdout, 10, want); printf ("\n");
! 44: abort();
! 45: }
! 46: mpz_clear (got);
! 47: }
! 48:
! 49:
! 50: void
! 51: try_mpz_bin_uiui (mpz_srcptr want, unsigned long n, unsigned long k)
! 52: {
! 53: mpz_t got;
! 54:
! 55: mpz_init (got);
! 56: mpz_bin_uiui (got, n, k);
! 57: MPZ_CHECK_FORMAT (got);
! 58: if (mpz_cmp (got, want) != 0)
! 59: {
! 60: printf ("mpz_bin_uiui wrong\n");
! 61: printf (" n=%lu\n", n);
! 62: printf (" k=%lu\n", k);
! 63: printf (" got="); mpz_out_str (stdout, 10, got); printf ("\n");
! 64: printf (" want="); mpz_out_str (stdout, 10, want); printf ("\n");
! 65: abort();
! 66: }
! 67: mpz_clear (got);
! 68: }
! 69:
! 70:
! 71: void
! 72: samples (void)
! 73: {
! 74: static const struct {
! 75: const char *n;
! 76: unsigned long k;
! 77: const char *want;
! 78: } data[] = {
! 79:
! 80: { "0", 0, "1" },
! 81: { "0", 1, "0" },
! 82: { "0", 2, "0" },
! 83: { "0", 3, "0" },
! 84: { "0", 4, "0" },
! 85: { "0", 123456, "0" },
! 86:
! 87: { "1", 0, "1" },
! 88: { "1", 1, "1" },
! 89: { "1", 2, "0" },
! 90: { "1", 3, "0" },
! 91: { "1", 4, "0" },
! 92: { "1", 123456, "0" },
! 93:
! 94: { "2", 0, "1" },
! 95: { "2", 1, "2" },
! 96: { "2", 2, "1" },
! 97: { "2", 3, "0" },
! 98: { "2", 4, "0" },
! 99: { "2", 123456, "0" },
! 100:
! 101: { "3", 0, "1" },
! 102: { "3", 1, "3" },
! 103: { "3", 2, "3" },
! 104: { "3", 3, "1" },
! 105: { "3", 4, "0" },
! 106: { "3", 5, "0" },
! 107: { "3", 123456, "0" },
! 108:
! 109: { "4", 0, "1" },
! 110: { "4", 1, "4" },
! 111: { "4", 2, "6" },
! 112: { "4", 3, "4" },
! 113: { "4", 4, "1" },
! 114: { "4", 5, "0" },
! 115: { "4", 6, "0" },
! 116: { "4", 123456, "0" },
! 117:
! 118: { "10", 0, "1" },
! 119: { "10", 1, "10" },
! 120: { "10", 2, "45" },
! 121: { "10", 3, "120" },
! 122: { "10", 4, "210" },
! 123: { "10", 5, "252" },
! 124: { "10", 6, "210" },
! 125: { "10", 7, "120" },
! 126: { "10", 8, "45" },
! 127: { "10", 9, "10" },
! 128: { "10", 10, "1" },
! 129: { "10", 11, "0" },
! 130: { "10", 12, "0" },
! 131: { "10", 123456, "0" },
! 132:
! 133: /* negatives, using bin(-n,k)=bin(n+k-1,k) */
! 134: { "-1", 0, "1" },
! 135: { "-1", 1, "-1" },
! 136: { "-1", 2, "1" },
! 137: { "-1", 3, "-1" },
! 138: { "-1", 4, "1" },
! 139:
! 140: { "-2", 0, "1" },
! 141: { "-2", 1, "-2" },
! 142: { "-2", 2, "3" },
! 143: { "-2", 3, "-4" },
! 144: { "-2", 4, "5" },
! 145: { "-2", 5, "-6" },
! 146: { "-2", 6, "7" },
! 147:
! 148: { "-3", 0, "1" },
! 149: { "-3", 1, "-3" },
! 150: { "-3", 2, "6" },
! 151: { "-3", 3, "-10" },
! 152: { "-3", 4, "15" },
! 153: { "-3", 5, "-21" },
! 154: { "-3", 6, "28" },
! 155:
! 156: { "40", 20, "137846528820" },
! 157: { "60", 30, "118264581564861424" },
! 158: };
! 159:
! 160: mpz_t n, want;
! 161: int i;
! 162:
! 163: mpz_init (n);
! 164: mpz_init (want);
! 165:
! 166: for (i = 0; i < numberof (data); i++)
! 167: {
! 168: mpz_set_str (n, data[i].n, 0);
! 169: mpz_set_str (want, data[i].want, 0);
! 170:
! 171: try_mpz_bin_ui (want, n, data[i].k);
! 172:
! 173: if (mpz_fits_ulong_p (n))
! 174: try_mpz_bin_uiui (want, mpz_get_ui (n), data[i].k);
! 175: }
! 176:
! 177: mpz_clear (n);
! 178: mpz_clear (want);
! 179: }
! 180:
! 181:
! 182: /* Test some bin(2k,k) cases. This produces some biggish numbers to
! 183: exercise the limb accumulating code. */
! 184: void
! 185: twos (void)
! 186: {
! 187: mpz_t n, want;
! 188: unsigned long k;
! 189:
! 190: mpz_init (n);
! 191: mpz_init (want);
! 192:
! 193: mpz_set_ui (want, (unsigned long) 2);
! 194: for (k = 1; k < 200; k++)
! 195: {
! 196: mpz_set_ui (n, 2*k);
! 197: try_mpz_bin_ui (want, n, k);
! 198:
! 199: try_mpz_bin_uiui (want, 2*k, k);
! 200:
! 201: mpz_mul_ui (want, want, 2*(2*k+1));
! 202: mpz_fdiv_q_ui (want, want, k+1);
! 203: }
! 204:
! 205: mpz_clear (n);
! 206: mpz_clear (want);
! 207: }
! 208:
! 209:
! 210: int
! 211: main (void)
! 212: {
! 213: samples ();
! 214: twos ();
! 215:
! 216: exit (0);
! 217: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>