From c9110b350af5f22c32dc7523999a2aeae6e51517 Mon Sep 17 00:00:00 2001 From: mdw Date: Sat, 17 Jun 2000 11:34:46 +0000 Subject: [PATCH] More hacking for the signs of the outputs. --- mp-gcd.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/mp-gcd.c b/mp-gcd.c index c772512..38f95d4 100644 --- a/mp-gcd.c +++ b/mp-gcd.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: mp-gcd.c,v 1.3 1999/12/10 23:18:39 mdw Exp $ + * $Id: mp-gcd.c,v 1.4 2000/06/17 11:34:46 mdw Exp $ * * Extended GCD calculation * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: mp-gcd.c,v $ + * Revision 1.4 2000/06/17 11:34:46 mdw + * More hacking for the signs of the outputs. + * * Revision 1.3 1999/12/10 23:18:39 mdw * Change interface for suggested destinations. * @@ -300,15 +303,32 @@ void mp_gcd(mp **gcd, mp **xx, mp **yy, mp *a, mp *b) /* --- Sort out the signs --- * * * Note that %$ax + by = a(x - b) + b(y + a)$%. + * + * This is currently bodgy. It needs sorting out at some time. */ if (yy) { if (y->f & MP_NEG) { - y = mp_add(y, y, a); - x = mp_sub(x, x, b); + do { + y = mp_add(y, y, a); + x = mp_sub(x, x, b); + } while (y->f & MP_NEG); + } else { + while (MP_CMP(y, >=, a)) { + y = mp_sub(y, y, a); + x = mp_add(x, x, b); + } } - } else if (x->f & MP_NEG) - x = mp_add(x, x, b); + } else { + if (x->f & MP_NEG) { + do + x = mp_add(x, x, b); + while (x->f & MP_NEG); + } else { + while (MP_CMP(x, >=, b)) + x = mp_sub(x, x, b); + } + } /* --- Twiddle the signs --- */ -- 2.11.0