1: /*
   2:  * Copyright (c) 1980 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char sccsid[] = "@(#)mult.c	5.1 (Berkeley) 4/30/85";
   9: #endif not lint
  10: 
  11: #include <mp.h>
  12: mult(a,b,c) struct mint *a,*b,*c;
  13: {   struct mint x,y,z;
  14:     int sign;
  15:     sign = 1;
  16:     x.val=a->val;
  17:     y.val=b->val;
  18:     z.len=0;
  19:     if(a->len<0)
  20:     {   x.len= -a->len;
  21:         sign= -sign;
  22:     }
  23:     else    x.len=a->len;
  24:     if(b->len<0)
  25:     {   y.len= -b->len;
  26:         sign= -sign;
  27:     }
  28:     else    y.len=b->len;
  29:     if(x.len<y.len) m_mult(&y,&x,&z);
  30:     else m_mult(&x,&y,&z);
  31:     xfree(c);
  32:     if(sign<0) c->len= -z.len;
  33:     else c->len=z.len;
  34:     if(c->len==0) shfree(z.val);
  35:     else c->val=z.val;
  36:     return;
  37: }
  38: #define S2 x=a->val[j];
  39: #define S3 x=x*b->val[i-j];
  40: #define S4 tradd(&carry,&sum,x);
  41: #define S5 c->val[i]=sum.yy.low&077777;
  42: #define S6 sum.xx=sum.xx>>15;
  43: #define S7 sum.yy.high=carry;
  44: m_mult(a,b,c) struct mint *a,*b,*c;
  45: {   long x;
  46:     union {long xx; struct half yy;} sum;
  47:     int carry;
  48:     int i,j;
  49:     c->val=xalloc(a->len+b->len,"m_mult");
  50:     sum.xx=0;
  51:     for(i=0;i<b->len;i++)
  52:     {   carry=0;
  53:         for(j=0;j<i+1;j++)
  54:         {   S2
  55:             S3
  56:             S4
  57:         }
  58:         S5
  59:         S6
  60:         S7
  61:     }
  62:     for(;i<a->len;i++)
  63:     {   carry=0;
  64:         for(j=i-b->len+1;j<i+1;j++)
  65:         {   S2
  66:             S3
  67:             S4
  68:         }
  69:         S5
  70:         S6
  71:         S7
  72:     }
  73:     for(;i<a->len+b->len;i++)
  74:     {   carry=0;
  75:         for(j=i-b->len+1;j<a->len;j++)
  76:         {   S2
  77:             S3
  78:             S4
  79:         }
  80:         S5
  81:         S6
  82:         S7
  83:     }
  84:     if(c->val[i-1]!=0)
  85:         c->len=a->len+b->len;
  86:     else    c->len=a->len+b->len-1;
  87:     return;
  88: }
  89: tradd(a,b,c) long c; int *a; union g {long xx; struct half yy;} *b;
  90: {
  91:     b->xx= b->xx+c;
  92:     if(b->yy.high&0100000)
  93:     {   b->yy.high= b->yy.high&077777;
  94:         *a += 1;
  95:     }
  96:     return;
  97: }

Defined functions

m_mult defined in line 44; used 2 times
tradd defined in line 89; used 1 times
  • in line 40

Defined variables

sccsid defined in line 8; never used

Defined union's

g defined in line 89; never used

Defined macros

S2 defined in line 38; used 3 times
S3 defined in line 39; used 3 times
S4 defined in line 40; used 3 times
S5 defined in line 41; used 3 times
S6 defined in line 42; used 3 times
S7 defined in line 43; used 3 times
Last modified: 1987-02-18
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2697
Valid CSS Valid XHTML 1.0 Strict