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 }