148370Sbostic /*- 248370Sbostic * %sccs.include.proprietary.c% 348370Sbostic */ 448370Sbostic 519819Sdist #ifndef lint 6*58566Sralph static char sccsid[] = "@(#)mult.c 5.4 (Berkeley) 03/08/93"; 748370Sbostic #endif /* not lint */ 819819Sdist 99949Ssam #include <mp.h> 109949Ssam mult(a,b,c) struct mint *a,*b,*c; 119949Ssam { struct mint x,y,z; 129949Ssam int sign; 139949Ssam sign = 1; 149949Ssam x.val=a->val; 159949Ssam y.val=b->val; 169949Ssam z.len=0; 179949Ssam if(a->len<0) 189949Ssam { x.len= -a->len; 199949Ssam sign= -sign; 209949Ssam } 219949Ssam else x.len=a->len; 229949Ssam if(b->len<0) 239949Ssam { y.len= -b->len; 249949Ssam sign= -sign; 259949Ssam } 269949Ssam else y.len=b->len; 279949Ssam if(x.len<y.len) m_mult(&y,&x,&z); 289949Ssam else m_mult(&x,&y,&z); 299949Ssam xfree(c); 309949Ssam if(sign<0) c->len= -z.len; 319949Ssam else c->len=z.len; 329949Ssam if(c->len==0) shfree(z.val); 339949Ssam else c->val=z.val; 349949Ssam return; 359949Ssam } 369949Ssam #define S2 x=a->val[j]; 379949Ssam #define S3 x=x*b->val[i-j]; 389949Ssam #define S4 tradd(&carry,&sum,x); 399949Ssam #define S5 c->val[i]=sum.yy.low&077777; 409949Ssam #define S6 sum.xx=sum.xx>>15; 419949Ssam #define S7 sum.yy.high=carry; 429949Ssam m_mult(a,b,c) struct mint *a,*b,*c; 439949Ssam { long x; 449949Ssam union {long xx; struct half yy;} sum; 459949Ssam int carry; 469949Ssam int i,j; 479949Ssam c->val=xalloc(a->len+b->len,"m_mult"); 489949Ssam sum.xx=0; 499949Ssam for(i=0;i<b->len;i++) 509949Ssam { carry=0; 519949Ssam for(j=0;j<i+1;j++) 529949Ssam { S2 539949Ssam S3 549949Ssam S4 559949Ssam } 569949Ssam S5 579949Ssam S6 589949Ssam S7 599949Ssam } 609949Ssam for(;i<a->len;i++) 619949Ssam { carry=0; 629949Ssam for(j=i-b->len+1;j<i+1;j++) 639949Ssam { S2 649949Ssam S3 659949Ssam S4 669949Ssam } 679949Ssam S5 689949Ssam S6 699949Ssam S7 709949Ssam } 719949Ssam for(;i<a->len+b->len;i++) 729949Ssam { carry=0; 739949Ssam for(j=i-b->len+1;j<a->len;j++) 749949Ssam { S2 759949Ssam S3 769949Ssam S4 779949Ssam } 789949Ssam S5 799949Ssam S6 809949Ssam S7 819949Ssam } 829949Ssam if(c->val[i-1]!=0) 839949Ssam c->len=a->len+b->len; 849949Ssam else c->len=a->len+b->len-1; 859949Ssam return; 869949Ssam } 87*58566Sralph union g {long xx; struct half yy;}; 88*58566Sralph tradd(a,b,c) long c; int *a; union g *b; 899949Ssam { 909949Ssam b->xx= b->xx+c; 919949Ssam if(b->yy.high&0100000) 929949Ssam { b->yy.high= b->yy.high&077777; 939949Ssam *a += 1; 949949Ssam } 959949Ssam return; 969949Ssam } 97