Home | History | Annotate | Download | only in libtommath
      1 #include <tommath.h>
      2 #ifdef BN_MP_SUB_C
      3 /* LibTomMath, multiple-precision integer library -- Tom St Denis
      4  *
      5  * LibTomMath is a library that provides multiple-precision
      6  * integer arithmetic as well as number theoretic functionality.
      7  *
      8  * The library was designed directly after the MPI library by
      9  * Michael Fromberger but has been written from scratch with
     10  * additional optimizations in place.
     11  *
     12  * The library is free for all purposes without any express
     13  * guarantee it works.
     14  *
     15  * Tom St Denis, tomstdenis (at) gmail.com, http://math.libtomcrypt.com
     16  */
     17 
     18 /* high level subtraction (handles signs) */
     19 int
     20 mp_sub (mp_int * a, mp_int * b, mp_int * c)
     21 {
     22   int     sa, sb, res;
     23 
     24   sa = a->sign;
     25   sb = b->sign;
     26 
     27   if (sa != sb) {
     28     /* subtract a negative from a positive, OR */
     29     /* subtract a positive from a negative. */
     30     /* In either case, ADD their magnitudes, */
     31     /* and use the sign of the first number. */
     32     c->sign = sa;
     33     res = s_mp_add (a, b, c);
     34   } else {
     35     /* subtract a positive from a positive, OR */
     36     /* subtract a negative from a negative. */
     37     /* First, take the difference between their */
     38     /* magnitudes, then... */
     39     if (mp_cmp_mag (a, b) != MP_LT) {
     40       /* Copy the sign from the first */
     41       c->sign = sa;
     42       /* The first has a larger or equal magnitude */
     43       res = s_mp_sub (a, b, c);
     44     } else {
     45       /* The result has the *opposite* sign from */
     46       /* the first number. */
     47       c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS;
     48       /* The second has a larger magnitude */
     49       res = s_mp_sub (b, a, c);
     50     }
     51   }
     52   return res;
     53 }
     54 
     55 #endif
     56 
     57 /* $Source: /cvs/libtom/libtommath/bn_mp_sub.c,v $ */
     58 /* $Revision: 1.3 $ */
     59 /* $Date: 2006/03/31 14:18:44 $ */
     60