Annotation of OpenXM_contrib/gmp/mpz/tests/t-pow_ui.c, Revision 1.1.1.1
1.1 maekawa 1: /* Test mpz_pow_ui and mpz_ui_pow_ui.
2:
3: Copyright (C) 1997, 1999 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: #include <stdio.h>
23: #include "gmp.h"
24: #include "gmp-impl.h"
25: #include "urandom.h"
26:
27: void debug_mp ();
28: void ref_mpz_pow_ui ();
29:
30: main (argc, argv)
31: int argc;
32: char **argv;
33: {
34: mpz_t base;
35: mpz_t result, ref_result;
36: mp_size_t base_size;
37: unsigned long int exp;
38: int i;
39: int reps = 50000;
40:
41: if (argc == 2)
42: reps = atoi (argv[1]);
43:
44: mpz_init (base);
45: mpz_init (result);
46: mpz_init (ref_result);
47:
48: for (i = 0; i < reps; i++)
49: {
50: base_size = urandom () % 8 - 4;
51: exp = urandom () % 16;
52:
53: mpz_random2 (base, base_size);
54:
55: ref_mpz_pow_ui (ref_result, base, exp);
56:
57: mpz_pow_ui (result, base, exp);
58: if (mpz_cmp (result, ref_result))
59: {
60: fprintf (stderr, "ERROR (mpz_pow_ui):\n");
61: debug_mp (" base = ", base, -16);
62: fprintf (stderr, " exp = %lu (0x%lX)\n", exp, exp);
63: debug_mp (" result = ", result, -16);
64: debug_mp ("ref_result = ", ref_result, -16);
65: abort ();
66: }
67:
68: if (mpz_cmp_ui (base, 0L) >= 0
69: && mpz_cmp_ui (base, ~(unsigned long int) 0) <= 0)
70: {
71: mpz_ui_pow_ui (result, mpz_get_ui (base), exp);
72: if (mpz_cmp (result, ref_result))
73: {
74: fprintf (stderr, "ERROR (mpz_ui_pow_ui):\n");
75: debug_mp (" base = ", base, -16);
76: fprintf (stderr, " exp = %lu (0x%lX)\n", exp, exp);
77: debug_mp (" result = ", result, -16);
78: debug_mp ("ref_result = ", ref_result, -16);
79: abort ();
80: }
81: }
82: }
83:
84: exit (0);
85: }
86:
87: void
88: ref_mpz_pow_ui (w, u, e)
89: mpz_t w;
90: const mpz_t u;
91: unsigned long int e;
92: {
93: mpz_t s, t;
94: unsigned long int i;
95:
96: mpz_init_set_ui (t, 1);
97: mpz_init_set (s, u);
98:
99: if ((e & 1) != 0)
100: mpz_mul (t, t, s);
101:
102: for (i = 2; i <= e; i <<= 1)
103: {
104: mpz_mul (s, s, s);
105: if ((i & e) != 0)
106: mpz_mul (t, t, s);
107: }
108:
109: mpz_set (w, t);
110: mpz_clear (s);
111: mpz_clear (t);
112: }
113:
114: void
115: debug_mp (str, x, base)
116: char *str;
117: mpz_t x;
118: int base;
119: {
120: fprintf (stderr, "%s", str);
121: mpz_out_str (stderr, base, x); fputc ('\n', stderr);
122: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>