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: }

Defined functions

m_add defined in line 2; used 2 times
m_sub defined in line 69; used 1 times
madd defined in line 37; used 14 times
msub defined in line 109; used 8 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 578
Valid CSS Valid XHTML 1.0 Strict