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