Hex Artifact Content
Not logged in

Artifact 77dded05df533fa98d24ccea619cf4a18bf81758:


0000: 2f 2a 20 6d 70 71 5f 69 6e 76 28 64 65 73 74 2c  /* mpq_inv(dest,
0010: 73 72 63 29 20 2d 2d 20 69 6e 76 65 72 74 20 61  src) -- invert a
0020: 20 72 61 74 69 6f 6e 61 6c 20 6e 75 6d 62 65 72   rational number
0030: 2c 20 69 2e 65 2e 20 73 65 74 20 44 45 53 54 20  , i.e. set DEST 
0040: 74 6f 20 53 52 43 0a 20 20 20 77 69 74 68 20 74  to SRC.   with t
0050: 68 65 20 6e 75 6d 65 72 61 74 6f 72 20 61 6e 64  he numerator and
0060: 20 64 65 6e 6f 6d 69 6e 61 74 6f 72 20 73 77 61   denominator swa
0070: 70 70 65 64 2e 0a 0a 43 6f 70 79 72 69 67 68 74  pped...Copyright
0080: 20 31 39 39 31 2c 20 31 39 39 34 2c 20 31 39 39   1991, 1994, 199
0090: 35 2c 20 32 30 30 30 2c 20 32 30 30 31 20 46 72  5, 2000, 2001 Fr
00a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
00b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 0a 0a 54 68  dation, Inc...Th
00c0: 69 73 20 66 69 6c 65 20 69 73 20 70 61 72 74 20  is file is part 
00d0: 6f 66 20 74 68 65 20 47 4e 55 20 4d 50 20 4c 69  of the GNU MP Li
00e0: 62 72 61 72 79 2e 0a 0a 54 68 65 20 47 4e 55 20  brary...The GNU 
00f0: 4d 50 20 4c 69 62 72 61 72 79 20 69 73 20 66 72  MP Library is fr
0100: 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75  ee software; you
0110: 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 74   can redistribut
0120: 65 20 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69  e it and/or modi
0130: 66 79 0a 69 74 20 75 6e 64 65 72 20 74 68 65 20  fy.it under the 
0140: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55  terms of the GNU
0150: 20 4c 65 73 73 65 72 20 47 65 6e 65 72 61 6c 20   Lesser General 
0160: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 61  Public License a
0170: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 0a 74  s published by.t
0180: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65  he Free Software
0190: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74   Foundation; eit
01a0: 68 65 72 20 76 65 72 73 69 6f 6e 20 32 2e 31 20  her version 2.1 
01b0: 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c 20  of the License, 
01c0: 6f 72 20 28 61 74 20 79 6f 75 72 0a 6f 70 74 69  or (at your.opti
01d0: 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65  on) any later ve
01e0: 72 73 69 6f 6e 2e 0a 0a 54 68 65 20 47 4e 55 20  rsion...The GNU 
01f0: 4d 50 20 4c 69 62 72 61 72 79 20 69 73 20 64 69  MP Library is di
0200: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0210: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0220: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 20 62 75  ll be useful, bu
0230: 74 0a 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41  t.WITHOUT ANY WA
0240: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20  RRANTY; without 
0250: 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64  even the implied
0260: 20 77 61 72 72 61 6e 74 79 20 6f 66 20 4d 45 52   warranty of MER
0270: 43 48 41 4e 54 41 42 49 4c 49 54 59 0a 6f 72 20  CHANTABILITY.or 
0280: 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41  FITNESS FOR A PA
0290: 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45  RTICULAR PURPOSE
02a0: 2e 20 20 53 65 65 20 74 68 65 20 47 4e 55 20 4c  .  See the GNU L
02b0: 65 73 73 65 72 20 47 65 6e 65 72 61 6c 20 50 75  esser General Pu
02c0: 62 6c 69 63 0a 4c 69 63 65 6e 73 65 20 66 6f 72  blic.License for
02d0: 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a   more details...
02e0: 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20  You should have 
02f0: 72 65 63 65 69 76 65 64 20 61 20 63 6f 70 79 20  received a copy 
0300: 6f 66 20 74 68 65 20 47 4e 55 20 4c 65 73 73 65  of the GNU Lesse
0310: 72 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  r General Public
0320: 20 4c 69 63 65 6e 73 65 0a 61 6c 6f 6e 67 20 77   License.along w
0330: 69 74 68 20 74 68 65 20 47 4e 55 20 4d 50 20 4c  ith the GNU MP L
0340: 69 62 72 61 72 79 3b 20 73 65 65 20 74 68 65 20  ibrary; see the 
0350: 66 69 6c 65 20 43 4f 50 59 49 4e 47 2e 4c 49 42  file COPYING.LIB
0360: 2e 20 20 49 66 20 6e 6f 74 2c 20 77 72 69 74 65  .  If not, write
0370: 20 74 6f 0a 74 68 65 20 46 72 65 65 20 53 6f 66   to.the Free Sof
0380: 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e  tware Foundation
0390: 2c 20 49 6e 63 2e 2c 20 35 39 20 54 65 6d 70 6c  , Inc., 59 Templ
03a0: 65 20 50 6c 61 63 65 20 2d 20 53 75 69 74 65 20  e Place - Suite 
03b0: 33 33 30 2c 20 42 6f 73 74 6f 6e 2c 0a 4d 41 20  330, Boston,.MA 
03c0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
03d0: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 67   */..#include "g
03e0: 6d 70 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  mp.h".#include "
03f0: 67 6d 70 2d 69 6d 70 6c 2e 68 22 0a 0a 76 6f 69  gmp-impl.h"..voi
0400: 64 0a 6d 70 71 5f 69 6e 76 20 28 4d 50 5f 52 41  d.mpq_inv (MP_RA
0410: 54 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 4d  T *dest, const M
0420: 50 5f 52 41 54 20 2a 73 72 63 29 0a 7b 0a 20 20  P_RAT *src).{.  
0430: 6d 70 5f 73 69 7a 65 5f 74 20 6e 75 6d 5f 73 69  mp_size_t num_si
0440: 7a 65 20 3d 20 73 72 63 2d 3e 5f 6d 70 5f 6e 75  ze = src->_mp_nu
0450: 6d 2e 5f 6d 70 5f 73 69 7a 65 3b 0a 20 20 6d 70  m._mp_size;.  mp
0460: 5f 73 69 7a 65 5f 74 20 64 65 6e 5f 73 69 7a 65  _size_t den_size
0470: 20 3d 20 73 72 63 2d 3e 5f 6d 70 5f 64 65 6e 2e   = src->_mp_den.
0480: 5f 6d 70 5f 73 69 7a 65 3b 0a 0a 20 20 69 66 20  _mp_size;..  if 
0490: 28 6e 75 6d 5f 73 69 7a 65 20 3d 3d 20 30 29 0a  (num_size == 0).
04a0: 20 20 20 20 44 49 56 49 44 45 5f 42 59 5f 5a 45      DIVIDE_BY_ZE
04b0: 52 4f 3b 0a 0a 20 20 69 66 20 28 6e 75 6d 5f 73  RO;..  if (num_s
04c0: 69 7a 65 20 3c 20 30 29 0a 20 20 20 20 7b 0a 20  ize < 0).    {. 
04d0: 20 20 20 20 20 6e 75 6d 5f 73 69 7a 65 20 3d 20       num_size = 
04e0: 2d 6e 75 6d 5f 73 69 7a 65 3b 0a 20 20 20 20 20  -num_size;.     
04f0: 20 64 65 6e 5f 73 69 7a 65 20 3d 20 2d 64 65 6e   den_size = -den
0500: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 64  _size;.    }.  d
0510: 65 73 74 2d 3e 5f 6d 70 5f 64 65 6e 2e 5f 6d 70  est->_mp_den._mp
0520: 5f 73 69 7a 65 20 3d 20 6e 75 6d 5f 73 69 7a 65  _size = num_size
0530: 3b 0a 20 20 64 65 73 74 2d 3e 5f 6d 70 5f 6e 75  ;.  dest->_mp_nu
0540: 6d 2e 5f 6d 70 5f 73 69 7a 65 20 3d 20 64 65 6e  m._mp_size = den
0550: 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  _size;..  /* If 
0560: 64 65 73 74 20 3d 3d 20 73 72 63 20 77 65 20 6d  dest == src we m
0570: 61 79 20 6a 75 73 74 20 73 77 61 70 20 74 68 65  ay just swap the
0580: 20 6e 75 6d 65 72 61 74 6f 72 20 61 6e 64 20 64   numerator and d
0590: 65 6e 6f 6d 69 6e 61 74 6f 72 2c 20 62 75 74 0a  enominator, but.
05a0: 20 20 20 20 20 77 65 20 68 61 76 65 20 74 6f 20       we have to 
05b0: 65 6e 73 75 72 65 20 74 68 65 20 6e 65 77 20 64  ensure the new d
05c0: 65 6e 6f 6d 69 6e 61 74 6f 72 20 69 73 20 70 6f  enominator is po
05d0: 73 69 74 69 76 65 2e 20 20 2a 2f 0a 0a 20 20 69  sitive.  */..  i
05e0: 66 20 28 64 65 73 74 20 3d 3d 20 73 72 63 29 0a  f (dest == src).
05f0: 20 20 20 20 7b 0a 20 20 20 20 20 20 6d 70 5f 73      {.      mp_s
0600: 69 7a 65 5f 74 20 61 6c 6c 6f 63 20 3d 20 64 65  ize_t alloc = de
0610: 73 74 2d 3e 5f 6d 70 5f 6e 75 6d 2e 5f 6d 70 5f  st->_mp_num._mp_
0620: 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 70 5f  alloc;.      mp_
0630: 70 74 72 20 6c 69 6d 62 5f 70 74 72 20 3d 20 64  ptr limb_ptr = d
0640: 65 73 74 2d 3e 5f 6d 70 5f 6e 75 6d 2e 5f 6d 70  est->_mp_num._mp
0650: 5f 64 3b 0a 0a 20 20 20 20 20 20 64 65 73 74 2d  _d;..      dest-
0660: 3e 5f 6d 70 5f 6e 75 6d 2e 5f 6d 70 5f 61 6c 6c  >_mp_num._mp_all
0670: 6f 63 20 3d 20 64 65 73 74 2d 3e 5f 6d 70 5f 64  oc = dest->_mp_d
0680: 65 6e 2e 5f 6d 70 5f 61 6c 6c 6f 63 3b 0a 20 20  en._mp_alloc;.  
0690: 20 20 20 20 64 65 73 74 2d 3e 5f 6d 70 5f 6e 75      dest->_mp_nu
06a0: 6d 2e 5f 6d 70 5f 64 20 3d 20 64 65 73 74 2d 3e  m._mp_d = dest->
06b0: 5f 6d 70 5f 64 65 6e 2e 5f 6d 70 5f 64 3b 0a 0a  _mp_den._mp_d;..
06c0: 20 20 20 20 20 20 64 65 73 74 2d 3e 5f 6d 70 5f        dest->_mp_
06d0: 64 65 6e 2e 5f 6d 70 5f 61 6c 6c 6f 63 20 3d 20  den._mp_alloc = 
06e0: 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 64 65 73  alloc;.      des
06f0: 74 2d 3e 5f 6d 70 5f 64 65 6e 2e 5f 6d 70 5f 64  t->_mp_den._mp_d
0700: 20 3d 20 6c 69 6d 62 5f 70 74 72 3b 0a 20 20 20   = limb_ptr;.   
0710: 20 7d 0a 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a   }.  else.    {.
0720: 20 20 20 20 20 20 64 65 6e 5f 73 69 7a 65 20 3d        den_size =
0730: 20 41 42 53 20 28 64 65 6e 5f 73 69 7a 65 29 3b   ABS (den_size);
0740: 0a 20 20 20 20 20 20 69 66 20 28 64 65 73 74 2d  .      if (dest-
0750: 3e 5f 6d 70 5f 6e 75 6d 2e 5f 6d 70 5f 61 6c 6c  >_mp_num._mp_all
0760: 6f 63 20 3c 20 64 65 6e 5f 73 69 7a 65 29 0a 09  oc < den_size)..
0770: 5f 6d 70 7a 5f 72 65 61 6c 6c 6f 63 20 28 26 28  _mpz_realloc (&(
0780: 64 65 73 74 2d 3e 5f 6d 70 5f 6e 75 6d 29 2c 20  dest->_mp_num), 
0790: 64 65 6e 5f 73 69 7a 65 29 3b 0a 0a 20 20 20 20  den_size);..    
07a0: 20 20 69 66 20 28 64 65 73 74 2d 3e 5f 6d 70 5f    if (dest->_mp_
07b0: 64 65 6e 2e 5f 6d 70 5f 61 6c 6c 6f 63 20 3c 20  den._mp_alloc < 
07c0: 6e 75 6d 5f 73 69 7a 65 29 0a 09 5f 6d 70 7a 5f  num_size).._mpz_
07d0: 72 65 61 6c 6c 6f 63 20 28 26 28 64 65 73 74 2d  realloc (&(dest-
07e0: 3e 5f 6d 70 5f 64 65 6e 29 2c 20 6e 75 6d 5f 73  >_mp_den), num_s
07f0: 69 7a 65 29 3b 0a 0a 20 20 20 20 20 20 4d 50 4e  ize);..      MPN
0800: 5f 43 4f 50 59 20 28 64 65 73 74 2d 3e 5f 6d 70  _COPY (dest->_mp
0810: 5f 6e 75 6d 2e 5f 6d 70 5f 64 2c 20 73 72 63 2d  _num._mp_d, src-
0820: 3e 5f 6d 70 5f 64 65 6e 2e 5f 6d 70 5f 64 2c 20  >_mp_den._mp_d, 
0830: 64 65 6e 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  den_size);.     
0840: 20 4d 50 4e 5f 43 4f 50 59 20 28 64 65 73 74 2d   MPN_COPY (dest-
0850: 3e 5f 6d 70 5f 64 65 6e 2e 5f 6d 70 5f 64 2c 20  >_mp_den._mp_d, 
0860: 73 72 63 2d 3e 5f 6d 70 5f 6e 75 6d 2e 5f 6d 70  src->_mp_num._mp
0870: 5f 64 2c 20 6e 75 6d 5f 73 69 7a 65 29 3b 0a 20  _d, num_size);. 
0880: 20 20 20 7d 0a 7d 0a                                }.}.