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

Annotation of OpenXM_contrib/gmp/tests/mpz/t-aorsmul.c, Revision 1.1.1.1

1.1       ohara       1: /* Test mpz_addmul, mpz_addmul_ui, mpz_submul, mpz_submul_ui.
                      2:
                      3: Copyright 2001, 2002 Free Software Foundation, Inc.
                      4:
                      5: This file is part of the GNU MP Library.
                      6:
                      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 2.1 of the License, or (at your
                     10: option) any later version.
                     11:
                     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.
                     16:
                     17: You should have received a copy of the GNU Lesser General Public License
                     18: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
                     19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
                     20: MA 02111-1307, USA.
                     21: */
                     22:
                     23:
                     24: #include <stdio.h>
                     25: #include <stdlib.h>
                     26: #include <string.h>
                     27:
                     28: #include "gmp.h"
                     29: #include "gmp-impl.h"
                     30: #include "tests.h"
                     31:
                     32:
                     33: void
                     34: check_one (mpz_srcptr w, mpz_srcptr x, mpz_srcptr y)
                     35: {
                     36:   mpz_t  want, got;
                     37:
                     38:   mpz_init (want);
                     39:   mpz_init (got);
                     40:
                     41:   mpz_mul (want, x, y);
                     42:   mpz_add (want, w, want);
                     43:   mpz_set (got, w);
                     44:   mpz_addmul (got, x, y);
                     45:   MPZ_CHECK_FORMAT (got);
                     46:   if (mpz_cmp (want, got) != 0)
                     47:     {
                     48:       printf ("mpz_addmul fail\n");
                     49:     fail:
                     50:       mpz_trace ("w", w);
                     51:       mpz_trace ("x", x);
                     52:       mpz_trace ("y", y);
                     53:       mpz_trace ("want", want);
                     54:       mpz_trace ("got ", got);
                     55:       abort ();
                     56:     }
                     57:
                     58:   mpz_mul (want, x, y);
                     59:   mpz_sub (want, w, want);
                     60:   mpz_set (got, w);
                     61:   mpz_submul (got, x, y);
                     62:   MPZ_CHECK_FORMAT (got);
                     63:   if (mpz_cmp (want, got) != 0)
                     64:     {
                     65:       printf ("mpz_submul fail\n");
                     66:       goto fail;
                     67:     }
                     68:
                     69:   mpz_clear (want);
                     70:   mpz_clear (got);
                     71: }
                     72:
                     73:
                     74: void
                     75: check_one_ui (mpz_ptr w, mpz_ptr x, unsigned long y)
                     76: {
                     77:   mpz_t  want, got;
                     78:
                     79:   mpz_init (want);
                     80:   mpz_init (got);
                     81:
                     82:   mpz_mul_ui (want, x, (unsigned long) y);
                     83:   mpz_add (want, w, want);
                     84:   mpz_set (got, w);
                     85:   mpz_addmul_ui (got, x, (unsigned long) y);
                     86:   MPZ_CHECK_FORMAT (got);
                     87:   if (mpz_cmp (want, got) != 0)
                     88:     {
                     89:       printf ("mpz_addmul_ui fail\n");
                     90:     fail:
                     91:       mpz_trace ("w", w);
                     92:       mpz_trace ("x", x);
                     93:       printf    ("y=0x%lX   %lu\n", y, y);
                     94:       mpz_trace ("want", want);
                     95:       mpz_trace ("got ", got);
                     96:       abort ();
                     97:     }
                     98:
                     99:   mpz_mul_ui (want, x, y);
                    100:   mpz_sub (want, w, want);
                    101:   mpz_set (got, w);
                    102:   mpz_submul_ui (got, x, y);
                    103:   MPZ_CHECK_FORMAT (got);
                    104:   if (mpz_cmp (want, got) != 0)
                    105:     {
                    106:       printf ("mpz_submul_ui fail\n");
                    107:       goto fail;
                    108:     }
                    109:
                    110:   mpz_clear (want);
                    111:   mpz_clear (got);
                    112: }
                    113:
                    114:
                    115: void
                    116: check_all (mpz_ptr w, mpz_ptr x, mpz_ptr y)
                    117: {
                    118:   int    swap, wneg, xneg, yneg;
                    119:
                    120:   MPZ_CHECK_FORMAT (w);
                    121:   MPZ_CHECK_FORMAT (x);
                    122:   MPZ_CHECK_FORMAT (y);
                    123:
                    124:   for (swap = 0; swap < 2; swap++)
                    125:     {
                    126:       for (wneg = 0; wneg < 2; wneg++)
                    127:         {
                    128:           for (xneg = 0; xneg < 2; xneg++)
                    129:             {
                    130:               for (yneg = 0; yneg < 2; yneg++)
                    131:                 {
                    132:                   check_one (w, x, y);
                    133:
                    134:                   if (mpz_fits_ulong_p (y))
                    135:                     check_one_ui (w, x, mpz_get_ui (y));
                    136:
                    137:                   mpz_neg (y, y);
                    138:                 }
                    139:               mpz_neg (x, x);
                    140:             }
                    141:           mpz_neg (w, w);
                    142:         }
                    143:       mpz_swap (x, y);
                    144:     }
                    145: }
                    146:
                    147: void
                    148: check_data (void)
                    149: {
                    150:   static const struct {
                    151:     mp_limb_t  w[6];
                    152:     mp_limb_t  x[6];
                    153:     mp_limb_t  y[6];
                    154:
                    155:   } data[] = {
                    156:
                    157: #define M GMP_NUMB_MAX
                    158:
                    159:     /* reducing to zero */
                    160:     { { 1 }, { 1 }, { 1 } },
                    161:     { { 2 }, { 1 }, { 2 } },
                    162:     { { 0,1 }, { 0,1 }, { 1 } },
                    163:
                    164:     /* reducing to 1 */
                    165:     { { 0,1 },       { M },       { 1 } },
                    166:     { { 0,0,1 },     { M,M },     { 1 } },
                    167:     { { 0,0,0,1 },   { M,M,M },   { 1 } },
                    168:     { { 0,0,0,0,1 }, { M,M,M,M }, { 1 } },
                    169:
                    170:     /* reducing to -1 */
                    171:     { { M },       { 0,1 },       { 1 } },
                    172:     { { M,M },     { 0,0,1 },     { 1 } },
                    173:     { { M,M,M },   { 0,0,0,1 },   { 1 } },
                    174:     { { M,M,M,M }, { 0,0,0,0,1 }, { 1 } },
                    175:
                    176:     /* carry out of addmul */
                    177:     { { M },     { 1 }, { 1 } },
                    178:     { { M,M },   { 1 }, { 1 } },
                    179:     { { M,M,M }, { 1 }, { 1 } },
                    180:
                    181:     /* borrow from submul */
                    182:     { { 0,1 },     { 1 }, { 1 } },
                    183:     { { 0,0,1 },   { 1 }, { 1 } },
                    184:     { { 0,0,0,1 }, { 1 }, { 1 } },
                    185:
                    186:     /* borrow from submul */
                    187:     { { 0,0,1 },     { 0,1 }, { 1 } },
                    188:     { { 0,0,0,1 },   { 0,1 }, { 1 } },
                    189:     { { 0,0,0,0,1 }, { 0,1 }, { 1 } },
                    190:
                    191:     /* more borrow from submul */
                    192:     { { M }, { 0,1 },       { 1 } },
                    193:     { { M }, { 0,0,1 },     { 1 } },
                    194:     { { M }, { 0,0,0,1 },   { 1 } },
                    195:     { { M }, { 0,0,0,0,1 }, { 1 } },
                    196:
                    197:     /* big borrow from submul */
                    198:     { { 0,0,1 },     { M,M }, { M } },
                    199:     { { 0,0,0,1 },   { M,M }, { M } },
                    200:     { { 0,0,0,0,1 }, { M,M }, { M } },
                    201:
                    202:     /* small w */
                    203:     { { 0,1 }, { M,M },       { M } },
                    204:     { { 0,1 }, { M,M,M },     { M } },
                    205:     { { 0,1 }, { M,M,M,M },   { M } },
                    206:     { { 0,1 }, { M,M,M,M,M }, { M } },
                    207:   };
                    208:
                    209:   mpz_t  w, x, y;
                    210:   int    i;
                    211:
                    212:   mpz_init (w);
                    213:   mpz_init (x);
                    214:   mpz_init (y);
                    215:
                    216:   for (i = 0; i < numberof (data); i++)
                    217:     {
                    218:       mpz_set_n (w, data[i].w, numberof(data[i].w));
                    219:       mpz_set_n (x, data[i].x, numberof(data[i].x));
                    220:       mpz_set_n (y, data[i].y, numberof(data[i].y));
                    221:       check_all (w, x, y);
                    222:     }
                    223:
                    224:   mpz_clear (w);
                    225:   mpz_clear (x);
                    226:   mpz_clear (y);
                    227: }
                    228:
                    229:
                    230: void
                    231: check_random (int argc, char *argv[])
                    232: {
                    233:   gmp_randstate_ptr rands = RANDS;
                    234:   mpz_t  w, x, y;
                    235:   int    i, reps = 2000;
                    236:
                    237:   mpz_init (w);
                    238:   mpz_init (x);
                    239:   mpz_init (y);
                    240:
                    241:   if (argc == 2)
                    242:     reps = atoi (argv[1]);
                    243:
                    244:   for (i = 0; i < reps; i++)
                    245:     {
                    246:       mpz_errandomb (w, rands, 5*BITS_PER_MP_LIMB);
                    247:       mpz_errandomb (x, rands, 5*BITS_PER_MP_LIMB);
                    248:       mpz_errandomb (y, rands, 5*BITS_PER_MP_LIMB);
                    249:       check_all (w, x, y);
                    250:
                    251:       mpz_errandomb (w, rands, 5*BITS_PER_MP_LIMB);
                    252:       mpz_errandomb (x, rands, 5*BITS_PER_MP_LIMB);
                    253:       mpz_errandomb (y, rands, BITS_PER_ULONG);
                    254:       check_all (w, x, y);
                    255:     }
                    256:
                    257:   mpz_clear (w);
                    258:   mpz_clear (x);
                    259:   mpz_clear (y);
                    260: }
                    261:
                    262:
                    263: int
                    264: main (int argc, char *argv[])
                    265: {
                    266:   tests_start ();
                    267:   mp_trace_base = -16;
                    268:
                    269:   check_data ();
                    270:   check_random (argc, argv);
                    271:
                    272:   tests_end ();
                    273:   exit (0);
                    274: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>