xref: /original-bsd/lib/libmp/mult.c (revision 92d3de31)
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