Commit | Line | Data |
---|---|---|
051b1e55 | 1 | #ifndef lint |
3bc5312c | 2 | static char sccsid[] = "@(#)mult.c 5.2 (Berkeley) %G%"; |
051b1e55 | 3 | #endif not lint |
c86b49fe SL |
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 | } |