|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 1022 (0x3fe) Types: TextFile Notes: UNIX file Names: »pow.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─ ⟦this⟧ »libmp/pow.c«
#include "mprec.h" /* * Pow sets the mint pointed to by "c" to the mint pointed to by "a" * raised to the mint pointed to by "b" power reduced modulo the * mint pointed to by "m". If "b" is negative then * mperr is called with the appropriate error message. * Note that no assumption is made as to the distinctness of "a", "b", * "m" and "c". */ void pow(a, b, m, c) mint *a, *b, *c; register mint *m; { mint al, bl, cl, quot; int rem; if (!ispos(b)) mperr("negative power"); /* make local copies of a (reduced mod m) and b */ minit(&al); minit("); mdiv(a, m, ", &al); minit(&bl); mcopy(b, &bl); /* form actual power */ minit(&cl); sdiv(&bl, 2, &bl, &rem); if (rem != 0) mcopy(&al, &cl); else mcopy(mone, &cl); while (!zerop(&bl)) { mult(&al, &al, &al); mdiv(&al, m, ", &al); sdiv(&bl, 2, &bl, &rem); if (rem != 0) { mult(&cl, &al, &cl); mdiv(&cl, m, ", &cl); } } /* clean up garbage */ mpfree(al.val); mpfree(bl.val); mintfr(quot.val); *c = cl; }