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