=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpq/Attic/mul.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.3 diff -u -p -r1.1.1.2 -r1.1.1.3 --- OpenXM_contrib/gmp/mpq/Attic/mul.c 2000/09/09 14:13:05 1.1.1.2 +++ OpenXM_contrib/gmp/mpq/Attic/mul.c 2003/08/25 16:06:34 1.1.1.3 @@ -1,6 +1,6 @@ /* mpq_mul -- mutiply two rational numbers. -Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc. +Copyright 1991, 1994, 1995, 1996, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -22,19 +22,21 @@ MA 02111-1307, USA. */ #include "gmp.h" #include "gmp-impl.h" + void -#if __STDC__ mpq_mul (mpq_ptr prod, mpq_srcptr op1, mpq_srcptr op2) -#else -mpq_mul (prod, op1, op2) - mpq_ptr prod; - mpq_srcptr op1; - mpq_srcptr op2; -#endif { mpz_t gcd1, gcd2; mpz_t tmp1, tmp2; + if (op1 == op2) + { + /* No need for any GCDs when squaring. */ + mpz_mul (mpq_numref (prod), mpq_numref (op1), mpq_numref (op1)); + mpz_mul (mpq_denref (prod), mpq_denref (op1), mpq_denref (op1)); + return; + } + mpz_init (gcd1); mpz_init (gcd2); mpz_init (tmp1); @@ -48,27 +50,13 @@ mpq_mul (prod, op1, op2) mpz_gcd (gcd1, &(op1->_mp_num), &(op2->_mp_den)); mpz_gcd (gcd2, &(op2->_mp_num), &(op1->_mp_den)); - if (gcd1->_mp_size > 1 || gcd1->_mp_d[0] != 1) - mpz_divexact (tmp1, &(op1->_mp_num), gcd1); - else - mpz_set (tmp1, &(op1->_mp_num)); + mpz_divexact_gcd (tmp1, &(op1->_mp_num), gcd1); + mpz_divexact_gcd (tmp2, &(op2->_mp_num), gcd2); - if (gcd2->_mp_size > 1 || gcd2->_mp_d[0] != 1) - mpz_divexact (tmp2, &(op2->_mp_num), gcd2); - else - mpz_set (tmp2, &(op2->_mp_num)); - mpz_mul (&(prod->_mp_num), tmp1, tmp2); - if (gcd1->_mp_size > 1 || gcd1->_mp_d[0] != 1) - mpz_divexact (tmp1, &(op2->_mp_den), gcd1); - else - mpz_set (tmp1, &(op2->_mp_den)); - - if (gcd2->_mp_size > 1 || gcd2->_mp_d[0] != 1) - mpz_divexact (tmp2, &(op1->_mp_den), gcd2); - else - mpz_set (tmp2, &(op1->_mp_den)); + mpz_divexact_gcd (tmp1, &(op2->_mp_den), gcd1); + mpz_divexact_gcd (tmp2, &(op1->_mp_den), gcd2); mpz_mul (&(prod->_mp_den), tmp1, tmp2);