|
|
1.1 root 1: #include <mp.h>
2: m_add(a,b,c) struct mint *a,*b,*c;
3: { int carry,i;
4: int x;
5: short *cval;
6: cval=xalloc(a->len+1,"m_add");
7: carry=0;
8: for(i=0;i<b->len;i++)
9: { x=carry+a->val[i]+b->val[i];
10: if(x&0100000)
11: { carry=1;
12: cval[i]=x&077777;
13: }
14: else
15: { carry=0;
16: cval[i]=x;
17: }
18: }
19: for(;i<a->len;i++)
20: { x=carry+a->val[i];
21: if(x&0100000) cval[i]=x&077777;
22: else
23: { carry=0;
24: cval[i]=x;
25: }
26:
27: }
28: if(carry==1)
29: { cval[i]=1;
30: c->len=i+1;
31: }
32: else c->len=a->len;
33: c->val=cval;
34: if(c->len==0) shfree(cval);
35: return;
36: }
37: madd(a,b,c) struct mint *a,*b,*c;
38: { struct mint x,y,z;
39: int sign;
40: x.len=a->len;
41: x.val=a->val;
42: y.len=b->len;
43: y.val=b->val;
44: z.len=0;
45: sign=1;
46: if(x.len>=0)
47: if(y.len>=0)
48: if(x.len>=y.len) m_add(&x,&y,&z);
49: else m_add(&y,&x,&z);
50: else
51: { y.len= -y.len;
52: msub(&x,&y,&z);
53: }
54: else if(y.len<=0)
55: { x.len = -x.len;
56: y.len= -y.len;
57: sign= -1;
58: madd(&x,&y,&z);
59: }
60: else
61: { x.len= -x.len;
62: msub(&y,&x,&z);
63: }
64: xfree(c);
65: c->val=z.val;
66: c->len=sign*z.len;
67: return;
68: }
69: m_sub(a,b,c) struct mint *a,*b,*c;
70: { int x,i;
71: int borrow;
72: short one;
73: struct mint mone;
74: one=1; mone.len= 1; mone.val= &one;
75: c->val=xalloc(a->len,"m_sub");
76: borrow=0;
77: for(i=0;i<b->len;i++)
78: { x=borrow+a->val[i]-b->val[i];
79: if(x&0100000)
80: { borrow= -1;
81: c->val[i]=x&077777;
82: }
83: else
84: { borrow=0;
85: c->val[i]=x;
86: }
87: }
88: for(;i<a->len;i++)
89: { x=borrow+a->val[i];
90: if(x&0100000) c->val[i]=x&077777;
91: else
92: { borrow=0;
93: c->val[i]=x;
94: }
95: }
96: if(borrow<0)
97: { for(i=0;i<a->len;i++) c->val[i] ^= 077777;
98: c->len=a->len;
99: madd(c,&mone,c);
100: }
101: for(i=a->len-1;i>=0;--i) if(c->val[i]>0)
102: { if(borrow==0) c->len=i+1;
103: else c->len= -i-1;
104: return;
105: }
106: shfree(c->val);
107: return;
108: }
109: msub(a,b,c) struct mint *a,*b,*c;
110: { struct mint x,y,z;
111: int sign;
112: x.len=a->len;
113: y.len=b->len;
114: x.val=a->val;
115: y.val=b->val;
116: z.len=0;
117: sign=1;
118: if(x.len>=0)
119: if(y.len>=0)
120: if(x.len>=y.len) m_sub(&x,&y,&z);
121: else
122: { sign= -1;
123: msub(&y,&x,&z);
124: }
125: else
126: { y.len= -y.len;
127: madd(&x,&y,&z);
128: }
129: else if(y.len<=0)
130: { sign= -1;
131: x.len= -x.len;
132: y.len= -y.len;
133: msub(&y,&x,&z);
134: }
135: else
136: { x.len= -x.len;
137: madd(&x,&y,&z);
138: sign= -1;
139: }
140: if(a==c && x.len!=0) xfree(a);
141: else if(b==c && y.len!=0) xfree(b);
142: else xfree(c);
143: c->val=z.val;
144: c->len=sign*z.len;
145: return;
146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.