[BACK]Return to mul.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpq

Diff for /OpenXM_contrib/gmp/mpq/Attic/mul.c between version 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2000/09/09 14:13:05 version 1.1.1.3, 2003/08/25 16:06:34
Line 1 
Line 1 
 /* mpq_mul -- mutiply two rational numbers.  /* 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.  This file is part of the GNU MP Library.
   
Line 22  MA 02111-1307, USA. */
Line 22  MA 02111-1307, USA. */
 #include "gmp.h"  #include "gmp.h"
 #include "gmp-impl.h"  #include "gmp-impl.h"
   
   
 void  void
 #if __STDC__  
 mpq_mul (mpq_ptr prod, mpq_srcptr op1, mpq_srcptr op2)  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 gcd1, gcd2;
   mpz_t tmp1, tmp2;    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 (gcd1);
   mpz_init (gcd2);    mpz_init (gcd2);
   mpz_init (tmp1);    mpz_init (tmp1);
Line 48  mpq_mul (prod, op1, op2)
Line 50  mpq_mul (prod, op1, op2)
   mpz_gcd (gcd1, &(op1->_mp_num), &(op2->_mp_den));    mpz_gcd (gcd1, &(op1->_mp_num), &(op2->_mp_den));
   mpz_gcd (gcd2, &(op2->_mp_num), &(op1->_mp_den));    mpz_gcd (gcd2, &(op2->_mp_num), &(op1->_mp_den));
   
   if (gcd1->_mp_size > 1 || gcd1->_mp_d[0] != 1)    mpz_divexact_gcd (tmp1, &(op1->_mp_num), gcd1);
     mpz_divexact (tmp1, &(op1->_mp_num), gcd1);    mpz_divexact_gcd (tmp2, &(op2->_mp_num), gcd2);
   else  
     mpz_set (tmp1, &(op1->_mp_num));  
   
   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);    mpz_mul (&(prod->_mp_num), tmp1, tmp2);
   
   if (gcd1->_mp_size > 1 || gcd1->_mp_d[0] != 1)    mpz_divexact_gcd (tmp1, &(op2->_mp_den), gcd1);
     mpz_divexact (tmp1, &(op2->_mp_den), gcd1);    mpz_divexact_gcd (tmp2, &(op1->_mp_den), gcd2);
   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_mul (&(prod->_mp_den), tmp1, tmp2);    mpz_mul (&(prod->_mp_den), tmp1, tmp2);
   

Legend:
Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>