libzahl

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