zpowu.c - libzahl - big integer library
HTML git clone git://git.suckless.org/libzahl
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
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 }