diff options
Diffstat (limited to '')
| -rw-r--r-- | src/zmodmul.c | 1 | ||||
| -rw-r--r-- | src/zmodpow.c | 2 | ||||
| -rw-r--r-- | src/zmodpowu.c | 5 | ||||
| -rw-r--r-- | src/zpow.c | 2 | ||||
| -rw-r--r-- | src/zpowu.c | 5 |
5 files changed, 11 insertions, 4 deletions
diff --git a/src/zmodmul.c b/src/zmodmul.c index 26d1178..5dd3a6c 100644 --- a/src/zmodmul.c +++ b/src/zmodmul.c @@ -6,6 +6,7 @@ void zmodmul(z_t a, z_t b, z_t c, z_t d) { /* TODO Montgomery modular multiplication */ + /* TODO Kochanski multiplication */ if (unlikely(a == d)) { zset(libzahl_tmp_modmul, d); zmul(a, b, c); diff --git a/src/zmodpow.c b/src/zmodpow.c index 0cec96d..253b3e4 100644 --- a/src/zmodpow.c +++ b/src/zmodpow.c @@ -12,6 +12,8 @@ zmodpow(z_t a, z_t b, z_t c, z_t d) size_t i, j, n, bits; zahl_char_t x; + /* TODO use zmodpowu when possible */ + if (unlikely(zsignum(c) <= 0)) { if (zzero(c)) { if (check(zzero(b))) diff --git a/src/zmodpowu.c b/src/zmodpowu.c index 72aa96f..beb17c2 100644 --- a/src/zmodpowu.c +++ b/src/zmodpowu.c @@ -25,10 +25,11 @@ zmodpowu(z_t a, z_t b, unsigned long long int c, z_t d) zmod(tb, b, d); zset(td, d); - zsetu(a, 1); if (c & 1) - zmodmul(a, a, tb, td); + zset(a, tb); + else + zsetu(a, 1); while (c >>= 1) { zmodsqr(tb, tb, td); if (c & 1) @@ -14,6 +14,8 @@ zpow(z_t a, z_t b, z_t c) * 7↑19 = 7↑10011₂ = 7↑2⁰ ⋅ 7↑2¹ ⋅ 7↑2⁴ where a↑2↑(n + 1) = (a↑2↑n)². */ + /* TODO use zpowu when possible */ + size_t i, j, n, bits; zahl_char_t x; int neg; diff --git a/src/zpowu.c b/src/zpowu.c index 35247c3..5a7676d 100644 --- a/src/zpowu.c +++ b/src/zpowu.c @@ -21,10 +21,11 @@ zpowu(z_t a, z_t b, unsigned long long int c) neg = znegative(b) && (c & 1); zabs(tb, b); - zsetu(a, 1); if (c & 1) - zmul_ll(a, a, tb); + zset(a, tb); + else + zsetu(a, 1); while (c >>= 1) { zsqr_ll(tb, tb); if (c & 1) |
