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