[BACK]Return to t-bin.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpz / tests

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>