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