|
|
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.