home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libmp / madd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.2 KB  |  147 lines

  1. #include <mp.h>
  2. m_add(a,b,c) struct mint *a,*b,*c;
  3. {    int carry,i;
  4.     int x;
  5.     short *cval;
  6.     cval=xalloc(a->len+1,"m_add");
  7.     carry=0;
  8.     for(i=0;i<b->len;i++)
  9.     {    x=carry+a->val[i]+b->val[i];
  10.         if(x&0100000)
  11.         {    carry=1;
  12.             cval[i]=x&077777;
  13.         }
  14.         else
  15.         {    carry=0;
  16.             cval[i]=x;
  17.         }
  18.     }
  19.     for(;i<a->len;i++)
  20.     {    x=carry+a->val[i];
  21.         if(x&0100000) cval[i]=x&077777;
  22.         else
  23.         {    carry=0;
  24.             cval[i]=x;
  25.         }
  26.  
  27.     }
  28.     if(carry==1)
  29.     {    cval[i]=1;
  30.         c->len=i+1;
  31.     }
  32.     else c->len=a->len;
  33.     c->val=cval;
  34.     if(c->len==0) shfree(cval);
  35.     return;
  36. }
  37. madd(a,b,c) struct mint *a,*b,*c;
  38. {    struct mint x,y,z;
  39.     int sign;
  40.     x.len=a->len;
  41.     x.val=a->val;
  42.     y.len=b->len;
  43.     y.val=b->val;
  44.     z.len=0;
  45.     sign=1;
  46.     if(x.len>=0)
  47.         if(y.len>=0)
  48.             if(x.len>=y.len) m_add(&x,&y,&z);
  49.             else m_add(&y,&x,&z);
  50.         else
  51.         {    y.len= -y.len;
  52.             msub(&x,&y,&z);
  53.         }
  54.     else    if(y.len<=0)
  55.         {    x.len = -x.len;
  56.             y.len= -y.len;
  57.             sign= -1;
  58.             madd(&x,&y,&z);
  59.         }
  60.         else
  61.         {    x.len= -x.len;
  62.             msub(&y,&x,&z);
  63.         }
  64.      xfree(c);
  65.     c->val=z.val;
  66.     c->len=sign*z.len;
  67.     return;
  68. }
  69. m_sub(a,b,c) struct mint *a,*b,*c;
  70. {    int x,i;
  71.     int borrow;
  72.     short one;
  73.     struct mint mone;
  74.     one=1; mone.len= 1; mone.val= &one;
  75.     c->val=xalloc(a->len,"m_sub");
  76.     borrow=0;
  77.     for(i=0;i<b->len;i++)
  78.     {    x=borrow+a->val[i]-b->val[i];
  79.         if(x&0100000)
  80.         {    borrow= -1;
  81.             c->val[i]=x&077777;
  82.         }
  83.         else
  84.         {    borrow=0;
  85.             c->val[i]=x;
  86.         }
  87.     }
  88.     for(;i<a->len;i++)
  89.     {    x=borrow+a->val[i];
  90.         if(x&0100000) c->val[i]=x&077777;
  91.         else
  92.         {    borrow=0;
  93.             c->val[i]=x;
  94.         }
  95.     }
  96.     if(borrow<0)
  97.     {    for(i=0;i<a->len;i++) c->val[i] ^= 077777;
  98.         c->len=a->len;
  99.         madd(c,&mone,c);
  100.     }
  101.     for(i=a->len-1;i>=0;--i) if(c->val[i]>0)
  102.                 {    if(borrow==0) c->len=i+1;
  103.                     else c->len= -i-1;
  104.                     return;
  105.                 }
  106.     shfree(c->val);
  107.     return;
  108. }
  109. msub(a,b,c) struct mint *a,*b,*c;
  110. {    struct mint x,y,z;
  111.     int sign;
  112.     x.len=a->len;
  113.     y.len=b->len;
  114.     x.val=a->val;
  115.     y.val=b->val;
  116.     z.len=0;
  117.     sign=1;
  118.     if(x.len>=0)
  119.         if(y.len>=0)
  120.             if(x.len>=y.len) m_sub(&x,&y,&z);
  121.             else
  122.             {    sign= -1;
  123.                 msub(&y,&x,&z);
  124.             }
  125.         else
  126.         {    y.len= -y.len;
  127.             madd(&x,&y,&z);
  128.         }
  129.     else    if(y.len<=0)
  130.         {    sign= -1;
  131.             x.len= -x.len;
  132.             y.len= -y.len;
  133.             msub(&y,&x,&z);
  134.         }
  135.         else
  136.         {    x.len= -x.len;
  137.             madd(&x,&y,&z);
  138.             sign= -1;
  139.         }
  140.     if(a==c && x.len!=0) xfree(a);
  141.     else if(b==c && y.len!=0) xfree(b);
  142.     else xfree(c);
  143.     c->val=z.val;
  144.     c->len=sign*z.len;
  145.     return;
  146. }
  147.