|
|
1.1 root 1: #include "mprec.h"
2:
3:
4: /*
5: * Rpow sets the mint pointed to by "c" to the mint pointed to by "a"
6: * raised to the mint pointed to by "b" power. If "b" is negative then
7: * mperr is called with the appropriate error message.
8: * Note that no assumption is made as to the distinctness of "a", "b" and
9: * "c".
10: */
11:
12: void
13: rpow(a, b, c)
14: register mint *a, *b, *c;
15: {
16: mint al, bl;
17: int rem;
18:
19: if (!ispos(b))
20: mperr("negative power");
21:
22: /* make local copies of a and b */
23: minit(&al);
24: mcopy(a, &al);
25: minit(&bl);
26: mcopy(b, &bl);
27:
28: /* form actual power */
29: sdiv(&bl, 2, &bl, &rem);
30: if (rem != 0)
31: mcopy(&al, c);
32: else
33: mcopy(mone, c);
34: while (!zerop(&bl)) {
35: mult(&al, &al, &al);
36: sdiv(&bl, 2, &bl, &rem);
37: if (rem != 0)
38: mult(c, &al, c);
39: }
40:
41: /* clean up garbage */
42: mpfree(al.val);
43: mpfree(bl.val);
44: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.