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