|
|
1.1 root 1: extern char *malloc();
2: #include "stdio.h"
3: #include "mp.h"
4: move(a,b) mint *a,*b;
5: { int i,j;
6: if(a == b)
7: return;
8: xfree(b);
9: b->len=a->len;
10: if((i=a->len)<0)
11: i = -i;
12: if(i==0)
13: return;
14: b->val=xalloc(i,"move");
15: for(j=0;j<i;j++)
16: b->val[j]=a->val[j];
17: return;
18: }
19: dummy(){ }
20: /*ARGSUSED*/
21: short *xalloc(nint,s) char *s;
22: { short *i;
23: extern short *halloc();
24: i = halloc(nint);
25: #ifdef DBG
26: i=(short *)malloc(2*(unsigned)nint+4);
27: if(dbg) fprintf(stderr, "%s: %o\n",s,i);
28: #endif
29: if(i!=NULL) return(i);
30: fatal("mp: no free space");
31: return(0);
32: }
33: fatal(s) char *s;
34: {
35: fprintf(stderr,"%s\n",s);
36: (void) fflush(stdout);
37: sleep(2);
38: abort();
39: }
40: xfree(c) mint *c;
41: {
42: #ifdef DBG
43: if(dbg) fprintf(stderr, "xfree ");
44: #endif
45: if(c->len==0) return;
46: /*shfree(c->val);*/
47: hfree(c->val);
48: c->len=0;
49: return;
50: }
51:
52: mfree(a)
53: mint *a;
54: {
55: xfree(a);
56: hfree(a);
57: }
58: mcan(a) mint *a;
59: { int i,j;
60: if((i=a->len)==0) return;
61: else if(i<0) i= -i;
62: for(j=i;j>0 && a->val[j-1]==0;j--);
63: if(j==i) return;
64: if(j==0) {
65: xfree(a);
66: return;
67: }
68: if(a->len > 0) a->len=j;
69: else a->len = -j;
70: }
71: mint *itom(n)
72: { mint *a;
73: a=(mint *)xalloc(2,"itom");
74: if(n>0) {
75: a->len=1;
76: a->val=xalloc(1,"itom1");
77: *a->val=n;
78: return(a);
79: }
80: else if(n<0) {
81: a->len = -1;
82: a->val=xalloc(1,"itom2");
83: *a->val= -n;
84: return(a);
85: }
86: else {
87: a->len=0;
88: return(a);
89: }
90: }
91: mcmp(a,b) mint *a,*b;
92: { mint c;
93: int res;
94: if(a->len < b->len)
95: return(-1);
96: if(a->len > b->len)
97: return(1);
98: c.len=0;
99: msub(a,b,&c);
100: res=c.len;
101: xfree(&c);
102: if(res < 0)
103: return(-1);
104: else if(res == 0)
105: return(0);
106: else
107: return(1);
108: }
109:
110: dtom(z, r)
111: double z;
112: mint *r;
113: { int i, sgn;
114: static mint *c;
115: if(!c) {
116: c = itom(16384);
117: madd(c, c, c);
118: }
119: if(z < 0) {
120: sgn = 1;
121: z = -z;
122: }
123: else
124: sgn = 0;
125: for(i = 0; z >= 32768; i++)
126: z /= 32768;
127: move(c, r);
128: r->len = 1;
129: r->val[0] = z;
130: while(--i >= 0) {
131: z -= r->val[0];
132: z *= 32768;
133: mult(r, c, r);
134: r->val[0] = z;
135: }
136: if(sgn)
137: r->len = -r->len;
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.