| #include "precision.h" | |
| /* | |
| * Raise to precision power mod m | |
| */ | |
| precision ppowmod(u, v, m) | |
| precision u, v, m; | |
| { | |
| precision j = pUndef, i = pUndef, n = pUndef; | |
| (void) pparm(m); | |
| pset(&i, pparm(u)); | |
| pset(&n, pparm(v)); | |
| pset(&j, pone); | |
| do { | |
| if (podd(n)) { | |
| pset(&j, pmod(pmul(i, j), m)); | |
| } | |
| pset(&n, phalf(n)); | |
| if (peqz(n)) break; | |
| pset(&i, pmod(pmul(i, i), m)); | |
| } while (1); | |
| pdestroy(i); pdestroy(n); | |
| pdestroy(u); pdestroy(v); pdestroy(m); | |
| return presult(j); | |
| } |