Initial revision
[LeanCalc.git] / calc / calc / qmath.h
1 /*
2  * qmath - declarations for extended precision rational arithmetic
3  *
4  * Copyright (C) 1999  David I. Bell
5  *
6  * Calc is open software; you can redistribute it and/or modify it under
7  * the terms of the version 2.1 of the GNU Lesser General Public License
8  * as published by the Free Software Foundation.
9  *
10  * Calc is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
13  * Public License for more details.
14  *
15  * A copy of version 2.1 of the GNU Lesser General Public License is
16  * distributed with calc under the filename COPYING-LGPL.  You should have
17  * received a copy with calc; if not, write to Free Software Foundation, Inc.
18  * 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * @(#) $Revision$
21  * @(#) $Id$
22  * @(#) $Source$
23  *
24  * Under source code control:   1993/07/30 19:42:47
25  * File existed as early as:    1993
26  *
27  * Share and enjoy!  :-)        http://www.isthe.com/chongo/tech/comp/calc/
28  */
29
30
31 #if !defined(__QMATH_H__)
32 #define __QMATH_H__
33
34
35 #if defined(CALC_SRC)   /* if we are building from the calc source tree */
36 # include "calc/zmath.h"
37 #else
38 # include <calc/zmath.h>
39 #endif
40
41
42 #define INITCONSTCOUNT 9    /* number of initnumbs[] pre-defined constants */
43
44 /*
45  * Rational arithmetic definitions.
46  */
47 struct number {
48         ZVALUE num;             /* numerator (containing sign) */
49         ZVALUE den;             /* denominator (always positive) */
50         long links;             /* number of links to this value */
51         struct number *next;    /* pointer to next number */
52 };
53
54 typedef struct number NUMBER;
55
56 extern NUMBER _qlge_;
57
58 /*
59  * Input. output, allocation, and conversion routines.
60  */
61 extern NUMBER *qalloc(void);
62 extern NUMBER *qcopy(NUMBER *q);
63 extern NUMBER *uutoq(FULL i1, FULL i2);
64 extern NUMBER *iitoq(long i1, long i2);
65 extern NUMBER *str2q(char *str);
66 extern NUMBER *itoq(long i);
67 extern NUMBER *utoq(FULL i);
68 extern long qtoi(NUMBER *q);
69 extern FULL qtou(NUMBER *q);
70 extern long qparse(char *str, int flags);
71 extern void qfreenum(NUMBER *q);
72 extern void qprintnum(NUMBER *q, int mode);
73 extern void qprintff(NUMBER *q, long width, long precision);
74 extern void qprintfe(NUMBER *q, long width, long precision);
75 extern void qprintfr(NUMBER *q, long width, BOOL force);
76 extern void qprintfd(NUMBER *q, long width);
77 extern void qprintfx(NUMBER *q, long width);
78 extern void qprintfb(NUMBER *q, long width);
79 extern void qprintfo(NUMBER *q, long width);
80 extern void qprintf(char *, ...);
81 extern void shownumbers(void);
82 extern void showredcdata(void);
83 extern void freeredcdata(void);
84 extern void fitprint(NUMBER *, long);
85
86
87
88 /*
89  * Basic numeric routines.
90  */
91 extern NUMBER *qaddi(NUMBER *q, long i);
92 extern NUMBER *qmuli(NUMBER *q, long i);
93 extern NUMBER *qdivi(NUMBER *q, long i);
94 extern NUMBER *qqadd(NUMBER *q1, NUMBER *q2);
95 extern NUMBER *qsub(NUMBER *q1, NUMBER *q2);
96 extern NUMBER *qmul(NUMBER *q1, NUMBER *q2);
97 extern NUMBER *qqdiv(NUMBER *q1, NUMBER *q2);
98 extern NUMBER *qquo(NUMBER *q1, NUMBER *q2, long rnd);
99 extern NUMBER *qmod(NUMBER *q1, NUMBER *q2, long rnd);
100 extern NUMBER *qmin(NUMBER *q1, NUMBER *q2);
101 extern NUMBER *qmax(NUMBER *q1, NUMBER *q2);
102 extern NUMBER *qand(NUMBER *q1, NUMBER *q2);
103 extern NUMBER *qor(NUMBER *q1, NUMBER *q2);
104 extern NUMBER *qxor(NUMBER *q1, NUMBER *q2);
105 extern NUMBER *qandnot(NUMBER *q1, NUMBER *q2);
106 extern NUMBER *qcomp(NUMBER *q);
107 extern NUMBER *qpowermod(NUMBER *q1, NUMBER *q2, NUMBER *q3);
108 extern NUMBER *qpowi(NUMBER *q1, NUMBER *q2);
109 extern NUMBER *qsquare(NUMBER *q);
110 extern NUMBER *qneg(NUMBER *q);
111 extern NUMBER *qsign(NUMBER *q);
112 extern NUMBER *qint(NUMBER *q);
113 extern NUMBER *qfrac(NUMBER *q);
114 extern NUMBER *qnum(NUMBER *q);
115 extern NUMBER *qden(NUMBER *q);
116 extern NUMBER *qinv(NUMBER *q);
117 extern NUMBER *qqabs(NUMBER *q);
118 extern NUMBER *qinc(NUMBER *q);
119 extern NUMBER *qdec(NUMBER *q);
120 extern NUMBER *qshift(NUMBER *q, long n);
121 extern NUMBER *qtrunc(NUMBER *q1, NUMBER *q2);
122 extern NUMBER *qround(NUMBER *q, long places, long rnd);
123 extern NUMBER *qbtrunc(NUMBER *q1, NUMBER *q2);
124 extern NUMBER *qbround(NUMBER *q, long places, long rnd);
125 extern NUMBER *qscale(NUMBER *q, long i);
126 extern BOOL qdivides(NUMBER *q1, NUMBER *q2);
127 extern BOOL qcmp(NUMBER *q1, NUMBER *q2);
128 extern BOOL qcmpi(NUMBER *q, long i);
129 extern FLAG qrel(NUMBER *q1, NUMBER *q2);
130 extern FLAG qreli(NUMBER *q, long i);
131 extern BOOL qisset(NUMBER *q, long i);
132
133
134 /*
135  * More complicated numeric functions.
136  */
137 extern NUMBER *qcomb(NUMBER *q1, NUMBER *q2);
138 extern NUMBER *qgcd(NUMBER *q1, NUMBER *q2);
139 extern NUMBER *qlcm(NUMBER *q1, NUMBER *q2);
140 extern NUMBER *qfact(NUMBER *q);
141 extern NUMBER *qpfact(NUMBER *q);
142 extern NUMBER *qminv(NUMBER *q1, NUMBER *q2);
143 extern NUMBER *qfacrem(NUMBER *q1, NUMBER *q2);
144 extern NUMBER *qperm(NUMBER *q1, NUMBER *q2);
145 extern NUMBER *qgcdrem(NUMBER *q1, NUMBER *q2);
146 extern NUMBER *qlowfactor(NUMBER *q1, NUMBER *q2);
147 extern NUMBER *qfib(NUMBER *q);
148 extern NUMBER *qcfappr(NUMBER *q, NUMBER *epsilon, long R);
149 extern NUMBER *qcfsim(NUMBER *q, long R);
150 extern NUMBER *qisqrt(NUMBER *q);
151 extern NUMBER *qjacobi(NUMBER *q1, NUMBER *q2);
152 extern NUMBER *qiroot(NUMBER *q1, NUMBER *q2);
153 extern NUMBER *qmappr(NUMBER *q, NUMBER *e, long R);
154 extern NUMBER *qlcmfact(NUMBER *q);
155 extern NUMBER *qredcin(NUMBER *q1, NUMBER *q2);
156 extern NUMBER *qredcout(NUMBER *q1, NUMBER *q2);
157 extern NUMBER *qredcmul(NUMBER *q1, NUMBER *q2, NUMBER *q3);
158 extern NUMBER *qredcsquare(NUMBER *q1, NUMBER *q2);
159 extern NUMBER *qredcpower(NUMBER *q1, NUMBER *q2, NUMBER *q3);
160 extern BOOL qprimetest(NUMBER *q1, NUMBER *q2, NUMBER *q3);
161 extern BOOL qissquare(NUMBER *q);
162 extern long qilog2(NUMBER *q);
163 extern long qilog10(NUMBER *q);
164 extern NUMBER *qilog(NUMBER *q, ZVALUE base);
165 extern BOOL qcmpmod(NUMBER *q1, NUMBER *q2, NUMBER *q3);
166 extern BOOL qquomod(NUMBER *q1, NUMBER *q2, NUMBER **retdiv, NUMBER **retmod);
167 extern FLAG qnear(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
168 extern NUMBER *qdigit(NUMBER *q, ZVALUE dpos, ZVALUE base);
169 extern long qprecision(NUMBER *q);
170 extern long qplaces(NUMBER *q, ZVALUE base);
171 extern long qdecplaces(NUMBER *q);
172 extern long qdigits(NUMBER *q, ZVALUE base);
173 extern void setepsilon(NUMBER *q);
174 extern NUMBER *qbitvalue(long i);
175 extern NUMBER *qtenpow(long i);
176
177
178 /*
179  * Transcendental functions.  These all take an epsilon argument to
180  * specify the required accuracy of the calculation.
181  */
182 extern void qsincos(NUMBER *q, long bitnum, NUMBER **vs, NUMBER **vc);
183 extern NUMBER *qsqrt(NUMBER *q, NUMBER *epsilon, long R);
184 extern NUMBER *qpower(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
185 extern NUMBER *qroot(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
186 extern NUMBER *qcos(NUMBER *q, NUMBER *epsilon);
187 extern NUMBER *qsin(NUMBER *q, NUMBER *epsilon);
188 extern NUMBER *qexp(NUMBER *q, NUMBER *epsilon);
189 extern NUMBER *qln(NUMBER *q, NUMBER *epsilon);
190 extern NUMBER *qtan(NUMBER *q, NUMBER *epsilon);
191 extern NUMBER *qsec(NUMBER *q, NUMBER *epsilon);
192 extern NUMBER *qcot(NUMBER *q, NUMBER *epsilon);
193 extern NUMBER *qcsc(NUMBER *q, NUMBER *epsilon);
194 extern NUMBER *qacos(NUMBER *q, NUMBER *epsilon);
195 extern NUMBER *qasin(NUMBER *q, NUMBER *epsilon);
196 extern NUMBER *qatan(NUMBER *q, NUMBER *epsilon);
197 extern NUMBER *qasec(NUMBER *q, NUMBER *epsilon);
198 extern NUMBER *qacsc(NUMBER *q, NUMBER *epsilon);
199 extern NUMBER *qacot(NUMBER *q, NUMBER *epsilon);
200 extern NUMBER *qatan2(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
201 extern NUMBER *qhypot(NUMBER *q1, NUMBER *q2, NUMBER *epsilon);
202 extern NUMBER *qcosh(NUMBER *q, NUMBER *epsilon);
203 extern NUMBER *qsinh(NUMBER *q, NUMBER *epsilon);
204 extern NUMBER *qtanh(NUMBER *q, NUMBER *epsilon);
205 extern NUMBER *qcoth(NUMBER *q, NUMBER *epsilon);
206 extern NUMBER *qsech(NUMBER *q, NUMBER *epsilon);
207 extern NUMBER *qcsch(NUMBER *q, NUMBER *epsilon);
208 extern NUMBER *qacosh(NUMBER *q, NUMBER *epsilon);
209 extern NUMBER *qasinh(NUMBER *q, NUMBER *epsilon);
210 extern NUMBER *qatanh(NUMBER *q, NUMBER *epsilon);
211 extern NUMBER *qasech(NUMBER *q, NUMBER *epsilon);
212 extern NUMBER *qacsch(NUMBER *q, NUMBER *epsilon);
213 extern NUMBER *qacoth(NUMBER *q, NUMBER *epsilon);
214 extern NUMBER *qlegtoleg(NUMBER *q, NUMBER *epsilon, BOOL wantneg);
215 extern NUMBER *qpi(NUMBER *epsilon);
216 extern NUMBER *qcatalan(NUMBER *);
217 extern NUMBER *qbern(ZVALUE z);
218 extern void qfreebern(void);
219 extern NUMBER *qeuler(ZVALUE z);
220 extern void qfreeeuler(void);
221
222
223 /*
224  * pseudo-seed generator
225  */
226 extern NUMBER *pseudo_seed(void);
227
228
229 /*
230  * external swap functions
231  */
232 extern NUMBER *swap_b8_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all);
233 extern NUMBER *swap_b16_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all);
234 extern NUMBER *swap_HALF_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all);
235
236
237 /*
238  * macro expansions to speed this thing up
239  */
240 #define qiszero(q)      (ziszero((q)->num))
241 #define qisneg(q)       (zisneg((q)->num))
242 #define qispos(q)       (zispos((q)->num))
243 #define qisint(q)       (zisunit((q)->den))
244 #define qisfrac(q)      (!zisunit((q)->den))
245 #define qisunit(q)      (zisunit((q)->num) && zisunit((q)->den))
246 #define qisone(q)       (zisone((q)->num) && zisunit((q)->den))
247 #define qisnegone(q)    (zisnegone((q)->num) && zisunit((q)->den))
248 #define qistwo(q)       (zistwo((q)->num) && zisunit((q)->den))
249 #define qiseven(q)      (zisunit((q)->den) && ziseven((q)->num))
250 #define qisodd(q)       (zisunit((q)->den) && zisodd((q)->num))
251 #define qistwopower(q)  (zisunit((q)->den) && zistwopower((q)->num))
252
253 #define qhighbit(q)     (zhighbit((q)->num))
254 #define qlowbit(q)      (zlowbit((q)->num))
255 #define qdivcount(q1, q2)       (zdivcount((q1)->num, (q2)->num))
256 #define qlink(q)        ((q)->links++, (q))
257
258 #define qfree(q)        {if (--((q)->links) <= 0) qfreenum(q);}
259
260
261 /*
262  * Flags for qparse calls
263  */
264 #define QPF_SLASH       0x1     /* allow slash for fractional number */
265 #define QPF_IMAG        0x2     /* allow trailing 'i' for imaginary number */
266
267
268 /*
269  * constants used often by the arithmetic routines
270  */
271 extern NUMBER _qzero_, _qone_, _qnegone_, _qonehalf_, _qneghalf_, _qonesqbase_;
272 extern NUMBER _qtwo_, _qthree_, _qfour_;
273 extern NUMBER * initnumbs[];
274
275
276 #endif /* !__QMATH_H__ */