xref: /csrg-svn/lib/libmp/mult.c (revision 9949)
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