summaryrefslogtreecommitdiff
path: root/sys/src/libmp
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-08-29 02:07:52 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-08-29 02:07:52 +0200
commit5852f8a1440ce385a468145c43abfb88751639fe (patch)
tree2a85da31a5e56a63e95464abed43fea6ee182a94 /sys/src/libmp
parent33862ff7936eb8be9380ce1332a3cfd7ed703672 (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.c12
-rw-r--r--sys/src/libmp/port/mpinvert.c14
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);
}