diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-08-29 02:07:52 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-08-29 02:07:52 +0200 |
commit | 5852f8a1440ce385a468145c43abfb88751639fe (patch) | |
tree | 2a85da31a5e56a63e95464abed43fea6ee182a94 /sys/src/libmp | |
parent | 33862ff7936eb8be9380ce1332a3cfd7ed703672 (diff) |
libmp: allow passing nil to v,x,y results of mpextendedgcd(), simplify mpinvert()
Diffstat (limited to 'sys/src/libmp')
-rw-r--r-- | sys/src/libmp/port/mpextendedgcd.c | 12 | ||||
-rw-r--r-- | sys/src/libmp/port/mpinvert.c | 14 |
2 files changed, 14 insertions, 12 deletions
diff --git a/sys/src/libmp/port/mpextendedgcd.c b/sys/src/libmp/port/mpextendedgcd.c index 72e49bce1..562c85a1c 100644 --- a/sys/src/libmp/port/mpextendedgcd.c +++ b/sys/src/libmp/port/mpextendedgcd.c @@ -15,8 +15,16 @@ mpextendedgcd(mpint *a, mpint *b, mpint *v, mpint *x, mpint *y) mpint *u, *A, *B, *C, *D; int g; + if(v == nil){ + v = mpnew(0); + mpextendedgcd(a, b, v, x, y); + mpfree(v); + return; + } + assert(x == nil || (x->flags & MPtimesafe) == 0); + assert(y == nil || (y->flags & MPtimesafe) == 0); assert((a->flags&b->flags) & MPnorm); - assert(((a->flags|b->flags|v->flags|x->flags|y->flags) & MPtimesafe) == 0); + assert(((a->flags|b->flags|v->flags) & MPtimesafe) == 0); if(a->sign < 0 || b->sign < 0){ mpassign(mpzero, v); @@ -104,6 +112,4 @@ mpextendedgcd(mpint *a, mpint *b, mpint *v, mpint *x, mpint *y) mpfree(u); mpfree(a); mpfree(b); - - return; } diff --git a/sys/src/libmp/port/mpinvert.c b/sys/src/libmp/port/mpinvert.c index ee2630702..59713747b 100644 --- a/sys/src/libmp/port/mpinvert.c +++ b/sys/src/libmp/port/mpinvert.c @@ -1,21 +1,17 @@ #include "os.h" #include <mp.h> -#define iseven(a) (((a)->p[0] & 1) == 0) - // use extended gcd to find the multiplicative inverse // res = b**-1 mod m void mpinvert(mpint *b, mpint *m, mpint *res) { - mpint *dc1, *dc2; // don't care + mpint *v; - dc1 = mpnew(0); - dc2 = mpnew(0); - mpextendedgcd(b, m, dc1, res, dc2); - if(mpcmp(dc1, mpone) != 0) + v = mpnew(0); + mpextendedgcd(b, m, v, res, nil); + if(mpcmp(v, mpone) != 0) abort(); + mpfree(v); mpmod(res, m, res); - mpfree(dc1); - mpfree(dc2); } |