zmodpowu.c (683B)
1 /* See LICENSE file for copyright and license details. */ 2 #include "internals.h" 3 4 #define tb libzahl_tmp_pow_b 5 #define td libzahl_tmp_pow_d 6 7 8 void 9 zmodpowu(z_t a, z_t b, unsigned long long int c, z_t d) 10 { 11 if (unlikely(!c)) { 12 if (check(zzero(b))) 13 libzahl_failure(-ZERROR_0_POW_0); 14 else if (check(zzero(d))) 15 libzahl_failure(-ZERROR_DIV_0); 16 else 17 zsetu(a, 1); 18 return; 19 } else if (check(zzero(d))) { 20 libzahl_failure(-ZERROR_DIV_0); 21 } else if (unlikely(zzero(b))) { 22 SET_SIGNUM(a, 0); 23 return; 24 } 25 26 zmod(tb, b, d); 27 zset(td, d); 28 29 if (c & 1) 30 zset(a, tb); 31 else 32 zsetu(a, 1); 33 while (c >>= 1) { 34 zmodsqr(tb, tb, td); 35 if (c & 1) 36 zmodmul(a, a, tb, td); 37 } 38 }