Use 1//2 instead of ((rat simp) 1 2)
[maxima.git] / share / algebra / charsets / INTRODUCTION
blob70fdcfd59e7c2ce01137e167453f407c724fbab7
1 This is a short introduction to the charsets package written by
2 D. Wang in Maple and translated to Maxima by Dan Stanger partly
3 mechanically with the help of an ocaml translator he wrote. The
4 original Maple package can be found on the web, but doesn't work any
5 more under recent versions of Maple, even having corrected the most
6 obvious problems ( replacing " by % and "" by %%, removing the last
7 instructions which aim at creating a Maple package). However it can be
8 read into Maple and some functions can be called. The maxima package
9 was also non functional, there are obviously many errors which need
10 corrections, inexistent maxima functions, etc. I (Michel Talon) have
11 corrected a number of these errors to the point that a fair number of
12 tests in the test suite run and provide the expected result.  This is
13 sufficient to compute charsets of different types and try to solve non
14 linear systems of equations. However i have not touched at all to the
15 functions trying to form irreducible charsets, because they are very
16 complex, and there are already many problems before them.
18 History
20 Charsets are a way to study systems of multivariate polynomial
21 equations, or systems of non linear differential partial
22 equations. They have been invented in this context by J.F. Ritt in his
23 book "Differential Algebra" (AMS 1950) but it was the Chinese
24 mathematician Wu Wen-Tsun who recognized that the same method could be
25 used to study polynomial ideals and get a technique for mechanical
26 proof of geometry theorems. This work is described in "Basic
27 principles of mechanical theorem proving in elementary geometry" (
28 J. Sys. Sci. & Math. Scis. 4 (1984)) a very good and readable paper
29 which can also be found in his Collected papers "Selected papers of
30 Wen-Tsun Wu" (World Scientific 2008) as paper 12. At the same time
31 Bruno Buchberger invented Groebner bases, which have a similar aim of
32 providing a finite algorithm for deciding if a polynomial belongs to
33 an ideal.  This technique and all the related algebra is excellently
34 described in the book "Ideals, Varieties, and Algorithms" by D. Cox,
35 J. Little and D. O'Shea (Springer 1997), which has a short description 
36 of charsets. Finally there is an available working Maple package of
37 mechanical geometry proofs called RENE in honour of Descartes by
38 Doron Zeilberger
39 http://www.math.rutgers.edu/~zeilberg/PG/RENE
41 But the most systematic application of these cartesian methods to
42 geometry is due to Wu Wen-Tsun and his students, particularly Dongming
43 Wang and Shang-Ching Chou. The last one has a book "Mechanical
44 geometry theorem proving" (Reidel 1988) which contains a clear
45 exposition of the method followed by the proof of 512 geometry
46 theorems. The first one has: "Elimination Practice: Software Tools and
47 Applications" (Imperial College Press 2004) which is supposed to
48 describe the algorithms is the present package, and several other
49 books. The description below is based on Wu Wen-Tsun 's paper.
51 Polynomial ordering
53 One considers polynomials in several variables u1,...,ue and
54 x1,...,xN.  The variables u are considered as parameters and the x are
55 the true variables.  In geometry problems the u may be the abscissas
56 of some points and the x their ordinates. Any ways this implies that
57 the polynomial ring is of the form K[x1,...,xN] where K is itself a
58 ring and not a field, which has implication for division of
59 polynomials (K is the ring of polynomials in u). First one orders
60 variables.  All the u are before all the x, and one fixes an order
61 such as x1 < x2 < .... < xN. Then one orders monomials using the
62 so-called lex or plex ordering (used in Groebner theory among other
63 orders, such as grevlex).  This means that a monomial is larger than
64 another one if he has a bigger variable to a higher degree, failing
65 that one goes to the next bigger one, etc. Hence x1*x2*x3 < x1*x4 and
66 x1*x2*x3 < x1*x2^2*x3. This is a total order on monomials compatible
67 with the product.  For any polynomial F one can thus find the higher
68 monomial in it, called the leading monomial, which contains the
69 highest variable z=xm (1<= m <=N). One calls m the class of the
70 polynomial and one can expand F= a0*z^P + a1*z^{p-1} +...+ap where the
71 aj are polynomials in x1,...,x{m-1}. The term a0(x1,...,x{m-1}),
72 coefficient of the highest power of xm is called the initial of F
73 (much used in the package, as well as in Groebner theory).
75 There exists a partial ordering between polynomials called rank. (In
76 the package several weak versions of this notion are defined). We say
77 that F has lower rank than G if either F has lower class than G
78 (i.e. there appears a higher variable in G than in F), or if they have
79 the same class p, the degree of F in xp is less than the degree of G
80 in xp. If they are of the same degree in xp one says they have the
81 same rank (one may imagine discriminating on x{p-1} but this
82 definition doesn't). Two polynomials of class 0 (which only contain u
83 variables) are of the same rank. If F is of class p one has F =
84 f0*xp^m + ... and for any other polynomial G one can do euclidean
85 division with respect to variable xp to write
87 f0^s G = Q*F + R
89 where Q is the quotient, R the remainder, such that the degree of R in
90 xp is less than m and the factor f0^s is introduced with s minimal,
91 because we are not allowed to do divisions in our ring. So each time
92 we want to cancel a power of xp in G using f0*xp^m we have to multiply
93 G by f0. Anyways R is called the reduction of G by F.
95 We can now define ascending sets ("as" in the package) as ordered sets
96 of polynomials [A1,...,Ar] such that either . r=1 and A1 # 0 called
97 contradictory because there is no common zero . r > 1 then class(A1) <
98 class(A2) < ... < class(Ar) meaning that the system is strictly
99 triangular. Moreover the polynomials are respectively reduced, which
100 means that Aj is reduced with respect to Ai for j>i, that is Aj
101 contains the leading variable of Ai to a lowest power, which can
102 always be achieved by division.  Necessarily r <= N.
104 One can define a partial order on ascending sets. Consider two
105 ascending sets [A1,...,Ar] and [B1,...,Bs].  We say that B < A , B has
106 lower rank than A, if either there is an index j such that A1 has the
107 same rank as B1, etc, A{j-1} has the same rank as B{j-1} while Bj has
108 lower rank that Bj, or in the case where s>r and all Bj have the same
109 rank as Aj (meaning same leading variable to same power).  Hence if by
110 is obtained from A by adjunction of some permissible element, it is
111 considered of lower rank. If sets [A] and [B] have same length and
112 corresponding elements of same rank they are of the same rank. One can
113 see that a decreasing sequence of ascending sets necessarily
114 stabilizes (all sets have same rank) in a finite number of steps.  A
115 minimal ascending set is called a basic set. This is what the package
116 computes, using the following algorithm. Let be given a set of
117 polynomials S, we want to study the ideal generated by S. First choose
118 an ascending set in S. Start from a polynomial of lowest
119 class, then if it exists a polynomial of second lowest class, etc.
120 Reduce A2 with respect to A1, then A3 with respect to A1 and A2, etc.
121 Let [A1,...,Ar] be the ascending set so obtained. It is a basic set
122 since one cannot extend it. For any other
123 polynomial B in the given polynomial set, not in [A] proceed as
124 follows: divide B successively by Ar, ... ,A1:
126 Ir^{sr} B = Qr*Ar + R{r-1},   where Ir is the initial of A_r, sr minimal
127 I{r-1}^{s{r-1}} R{r-1} = Q{r-1}*A{r-1} + R{r-2}, I{r-1} initial of A{r-1}, etc.
128 ....
129 I_1^s1 R1 = Q1*A1 + R0  where I_1 is the initial of A1 and s1 is mainimal.
130 By combination we get
131 I1^s1 ....Ir^sr B = Q'1*A1 + ... + Q'r*Ar + R 
133 where R=R0, the I are the initials of the set [A], the Q' are
134 polynomials, and the s are minimal. This is called pseudo division of
135 B by the ascending set [A] and R is the pseudo remainder, and is
136 implemented by charsets_prem in the package.  Of course R is reduced
137 with respect to all polynomials in [A]. For all polynomials B in the
138 given set S, add to set the pseudo remainders R of B with respect to
139 [A].  Note they all lie in the ideal generated by S. We get a new set
140 S1. Form a basic set in S1 like above, it will be of lower rank than
141 the previous one. Continue in the same way until the decreasing
142 sequence of basic sets stabilize. Then we have obtained what is called
143 a charset. Any polynomial can be pseudo-divided by the charset [A] and
144 the pseudo remainder vanishes if and only if the polynomial is in the
145 ideal generated by S otherwise one could add the remainder to S and
146 get a basic set of lower rank. Hence this algorithm gives a way to
147 decide in a finite number of steps if a polynomial belongs to the
148 ideal generated by S.
150 Zeros of polynomial sets.
152 One of the aims of these constructions is to find the common zeros of
153 a set of multivariate polynomials. This is called an algebraic
154 variety, or more precisely an affine part of an algebraic variety (if
155 one considers a projective algebraic variety). Since a charset is
156 strictly triangular, one can solve the equations successively variable
157 by variable, like with the Gaussian pivoting method for linear
158 equations. Since the divisions involved in the procedure introduce
159 initials in the game one has to be careful with the results. Let
160 [A1,...,Ar] be the charset, with initials I1,...,Ir.  For any
161 polynomial G in the given set S one has: I1^s1 ....Ir^sr G = Q1*A1 +
162 ... + Qr*Ar thus any common zero of S is also a common zero of [A],
163 and any common zero of [A] which is not a zero of The I_j is a common
164 zero of S. The problems comes with the zeros of the initials, which in
165 geometry problems correspond to exceptional configurations of the
166 figures. The package tries to work around this difficulty by adding
167 initials to the given polynomial sets and recomputing charsets, thus
168 obtaining series of charsets. Unfortunately this works only partly at present.
170 There is a second difficulty related to the irreducibility of the
171 charsets, which is also related to the irreducibility of the above
172 algebraic variety.  Recall the theorems in algebra: if V is the
173 algebraic variety which is the common set of zeros of an ideal J, then
174 Hilbert's theorem say that V is vacuous if and only if J contains the
175 constant polynomial 1, and in general, a polynomial P vanishes on V if
176 and only if some power of P belongs to J. The necessity of the power
177 is easily seen, since taking for J the ideal generated by x^2 and y^2,
178 and for P the polynomial x*y which vanishes on V={(x=0,y=0)}, we see
179 that only p^2 belongs to J. An ideal is prime if when x*y belongs to J
180 either x or y belongs to J. This generalizes prime numbers.  An ideal
181 is primary if when x*y belongs to J and x doesn't, then some power y^m
182 belongs to J.  This generalizes powers of prime numbers. The Lasker
183 Noether theorem says that polynomial ideals can be uniquely decomposed
184 as products of primary ideals
185 https://en.wikipedia.org/wiki/Primary_decomposition 
186 and this corresponds to the decomposition of an algebraic variety into
187 irreducible components. The package contains functions to do this sort
188 of decompositions, but at present they don't work. The relation with
189 charsets is that one defines an irreducible charset [A] as a charset
190 such that, not only each A_j is irreducible, but much more strongly,
191 A2 is irreducible in the extension obtained by adding the roots of A1,
192 etc. Hence this entails studying factorization not only on Q but on
193 extensions. The package is supposed to do that. To clarify the
194 condition take this example from Chou's book. A1=x1^2-u1,
195 A2=x2^2-2*x1*x2+u1. Of course A1 is irreducible for generic u1, but as
196 soon as one considers the extension obtained by adding a root x1, then
197 A2=(x2-x1)^2 becomes reducible. Then one has the theorem that if [A]
198 is an irreducible ascending chain and J is the ideal of polynomials
199 having zero pseudo remainder with [A], then J is a prime ideal,
200 defining an irreducible variety, and [A] is its charset. All of this
201 is described in Chou's book, and may be necessary for the proof of
202 some geometrical theorems in exceptional cases.
204 Mechanical geometry theorem proving
206 The main aim of these techniques is to be able to prove geometry
207 theorems by using "analytic geometry" in the tradition of RenĂ©
208 Descartes.  The idea is to state the hypothesis of the theorem as a
209 collection of polynomial equations, the conclusion being another
210 polynomial equation. So the problem boils down to the ability to
211 manipulate the hypothesis so as to deduce the conclusion.  If we want
212 to do that mechanically, we need to consider the ideal generated by
213 the hypothesis, and see if the conclusion (or a power of the
214 conclusion) belongs to this ideal. One problem linked to
215 irreducibility is that the hypothesis may define a reducible variety,
216 and the conclusion may hold only on one component. Apparently
217 such misbehaviour is rare. Let us look at an example from Chou's
218 book, Simson's theorem. Let ABC be a triangle and D a point on the
219 circumscribed circle of center O. Let E, F, G the orthogonal projections 
220 of D on the three sides BC, CA, AB. Show that E, F, G are aligned.
221 A judicious choice of parameters and variables is:
222 A=(0,0), B=(u1,0), C=(u2,u3), O=(x2,x1), D=(x3,u4), E=(x5,x4),
223 F=(x7,x6), G=(x3,0).  Note that D and G have same abscissa.  
224 Let us list the hypothesis:
225 h1: 2*u2*x2+2*u3*x1-u3^2-u2^2           h1=0 <=> OA=OC
226 h2: 2*u1*x2-u1^2                        h2=0 <=> OA=OB
227 h3: -x3^2+2*x2*x3+2*u4*x1-u4^2          h3=0 <=> OA=OD
228 h4: u3*x5+(u1-u2)*x4-u1*u3              h4=0 <=> EBC collinear
229 h5: (u2-u1)*x5+u3*x4+(u1-u2)*x3-u3*u4   h5=0 <=> DE perp BC
230 h6: u3*x7-u2*x6                         h6=0 <=> AFC collinear
231 h7: u2*x7+u3*x6-u2*x3-u3*u4             h7=0 <=> DF perp AC
232 The conclusion EFG aligned reads g=0 with
233 g: x4*x7+(x3-x5)*x6-x3*x4          
234 Let us apply  charsets to this situation. After having loaded charsets.mac
235 in maxima and loaded the above values of polynomials one gets:
236 (%i11) ps:[h1,h2,h3,h4,h5,h6,h7]$
238 (%i12) ord:[x1,x2,x3,x4,x5,x6,x7]$
240 (%i13) charsets_charset(ps,ord,triset);
242 (%o13) [2*u3*x1-u3^2-u2^2+u1*u2,2*u2*x2+2*u3*x1-u3^2-u2^2,
243         2*x3*x2+2*u4*x1-x3^2-u4^2,
244         (u4-x4)*u3^2+((-u1+x3)*u2+u1^2-x3*u1)*u3-x4*u2^2+2*x4*u1*u2-x4*u1^2,
245         (u4-x4)*u3+(x3-x5)*u2+(-x3+x5)*u1,(u4-x6)*u3^2+x3*u2*u3-x6*u2^2,
246         (u4-x6)*u3+(x3-x7)*u2]
247 (%i14) charsets_premas(g,%,ord);
249 (%o14) 0
251 Here premas is the pseudo remainder with respect to an ascending
252 set. Since it is 0, g belongs to the ideal generated by
253 h1,...,h7. Hence the theorem is true. Note that the charset produced
254 is indeed triangular, the first polynomial only depends on x1, the
255 second on x1 and x2, the third x1,x2,x3, etc.Also note that the
256 initials of these 7 polynomials are respectively 2*u3, 2*u2, 2*x2,
257 -u2^2+2*u1*u2-u1^2, u1-u2, -u3^2-u2^2, -u2. So their vanishing
258 corresponds to u1=u2 or u2 or u3 vanishing or finally x2
259 vanishing. When u1=u2 the triangle is rectangle at B and O is the
260 middle of AC. The triangle EDG is rectangle at D. the situation is not
261 obviously degenerate, and the theorem is still true, but cannot be
262 asserted by the above computation (except by passing to the limit of
263 moving C on the circle).  For u2=0 the triangle is rectangle at A and
264 we have the same situation. But u3=0 means that C is on AB and the
265 triangle degenerates. Finally x2=0 means that OA perp AB, whhich
266 implies that AP is tangent to the circle and thus A=B so the triangle
267 is also degenerate.
270 Documentation of some functions
272 From the Maple help file
274 For computing a characteristic set of a polynomial set ps, the invocation is
275 CALLING SEQUENCE: charsets_charset(PS,X)  or  charsets_charset(PS,X,medset)
276                 or  charsets_charset(PS,X,medset,'Y')
277 PARAMETERS:  PS         - set or list of (multivariate) polynomials in X
278              X          - set or list of names,
279                          (not including parameters),
280              medset     - medial set: 'basset' (basic set),
281                           'wbasset' (weak-basic set),
282                           'qbasset' (quasi-basic set),
283                           'charsetn' (nearly characteristic set - default),
284                           'wcharsetn' (nearly weak-characteristic set),
285                           'qcharsetn' (nearly quasi-characteristic set),
286                           'triset' (triangularized set),
287                           'trisetc' (strong triangularized set),
288              Y          - (a name) list of reordered names,
290  SYNOPSIS :   
292 - charset(PS,X,medset)  computes  a  (weak-, quasi-)  characteristic  set of
293   the polynomial set PS with respect to the variables X.  The  resulting set
294   CS  is returned as a list of polynomials.  CS  is  a characteristic set if
295   medset is 'basset',  'charsetn'  or  'trisetc';  a weak-characteristic set
296   if it is  'wbasset'  or  'wcharsetn';  a quasi-characteristic set if it is
297   'qbasset', 'qcharsetn' or 'triset'.
298 - In any case,  the zero relation  Zero(CS/J) -< Zero(PS) -< Zero(CS) holds,
299   where  Zero(PS)  denotes the set of common zeros of the polynomials in PS,
300   Zero(CS/J) = Zero(CS) minus Zero(J),  J is  the  product  of  initials  of
301   polynomials in  CS  and  -< stands for ``be contained in``.
302 - A list  of  variables  X := [x[1], x[2] ,..., x[n]]  induces  the ordering
303   x[1] < x[2] < ... < x[n].
304 - If the variables are given as a set X := {x[1], x[2] ,..., x[n]}, they are
305   are  automatically  reordered  to  be "heuristically optimal"; The list of
306   reordered variables is assigned to the fourth argument 'Y' if it appears.
308 The signification of this terminology is briefly discussed in the accompanying
309 paper of Domning Wang. In principle all these functions work in maxima.
310 Except that, since at that time maxima didn't have sets, one cannot specify sets
311 of variables and automatic reordering doesn't occur, so that Y is useless.
312 However one can call explicitly charsets_reorder to get a heuristic good order
313 for the variables. I have not seen this being very effective. Example:
315 (%i1) load("charsets.mac");
317 ; file: /home/michel/Documents/pro/charsets/charsets_set.lisp
318 ; in: DEFUN $CHARSETS_UNORDEREDP
319 ;     (DEFUN MAXIMA::$CHARSETS_UNORDEREDP (MAXIMA::A MAXIMA::B) T)
321 ; caught STYLE-WARNING:
322 ;   The variable A is defined but never used.
324 ; caught STYLE-WARNING:
325 ;   The variable B is defined but never used.
327 ; compilation unit finished
328 ;   caught 2 STYLE-WARNING conditions
329 (%o1)                            charsets.mac
330 (%i2) ps: [x^2-3*x*z+2, x*y+z^3, 5*y^2-3*z^3-7];
331                             2       3             3      2
332 (%o2)           [- 3 x z + x  + 2, z  + x y, - 3 z  + 5 y  - 7]
333 (%i3) charsets_charset(ps,[x,y,z],basset);
334              12       11       10        9         8        7        6        5
335 (%o3)/R/ [5 x   - 81 x   + 60 x   - 486 x  - 4803 x  - 972 x  + 800 x  - 648 x
336            4        2            4      6      4       2                 2
337    + 1200 x  + 960 x  + 320, 27 x  y + x  + 6 x  + 12 x  + 8, - 3 x z + x  + 2]
338 (%i4) charsets_charset(ps,[x,y,z],triset);
339              12       11       10        9         8        7        6        5
340 (%o4)/R/ [5 x   - 81 x   + 60 x   - 486 x  - 4803 x  - 972 x  + 800 x  - 648 x
341             4        2         6               4       2                 2
342     + 1200 x  + 960 x  + 320, x  + (27 y + 6) x  + 12 x  + 8, - 3 x z + x  + 2]
343 (%i5) charsets_charset(ps,[x,y,z],trisetc);
344              12       11       10        9         8        7        6        5
345 (%o5)/R/ [5 x   - 81 x   + 60 x   - 486 x  - 4803 x  - 972 x  + 800 x  - 648 x
346             4        2         6               4       2                 2
347     + 1200 x  + 960 x  + 320, x  + (27 y + 6) x  + 12 x  + 8, - 3 x z + x  + 2]
348 (%i6) charsets_charset(ps,[z,y,x],trisetc);
349               12        11       9        8        6        3
350 (%o6)/R/ [25 z   - 135 z   + 60 z  - 315 z  + 176 z  + 168 z  + 196, 
351                        6         4      3           7        6        3
352                     5 z  + 15 y z  + 6 z  + 14, 15 z  - 5 x z  - 6 x z  - 14 x]
353 (%i7) charsets_charset(ps,[z,x,y],trisetc);
354               12        11       9        8        6        3
355 (%o7)/R/ [25 z   - 135 z   + 60 z  - 315 z  + 176 z  + 168 z  + 196, 
356         6        4      3                   7        6       4        3
357      5 z  - 9 x z  + 6 z  - 21 x z + 14, 9 z  + 5 y z  + 21 z  + 6 y z  + 14 y]
360 As can be seen, changing the order of variables may change significantly the result,
361 and some trial and error may give simpler results. If one wants to solve the system
362 of equations, note the first one gives z, and the next two ones give x and y
363 linearly knowing z.
365 There are modifications of the algorithms aiming at factorizing a maximum of 
366 extra variables introduced in the computation. They are called charsets_mcharset
367 and have the same syntax as the previous ones. For example:
368 (%i15) charsets_mcharset(ps,[y,x,z],trisetc);
369                    12           11          10           9           8
370 (%o15)/R/ [[15625 y   + 151875 y   - 97500 y   - 850500 y  + 294675 y
371             7           6            5           4           3           2
372  + 1786050 y  - 522808 y  - 1666980 y  + 577563 y  + 583443 y  - 374556 y
373                       2           3                 4       2
374  + 117649, 3 y x + 5 y  - 7, (45 y  - 63 y) z + 25 y  - 52 y  + 49], [x]]
376 which means that x has been factorized. Note this is not the result claimed by
377 the Maple help file, so it may be false.
379 In the hope of taming the problems coming from initials there are functions computing
380 series of charsets, in which the initials are successively added to the game. See
381 D. Wang's paper for that.  These functions are charsets_charser, for example:
382 (%i23) ps2: [x1*x3-3*x2-1, -2*x4*x1-x3*x2*x4+2*x3, x2*x4^2-x4*x1+x3]$
384 (%i24) charsets_charser(ps2,[x1,x2,x3,x4]);
385                  5        4         2                3
386 (%o24)/R/ [[27 x2  + 27 x2  + (18 x1  + 36 x1 + 9) x2
387          2                2        2
388  + (12 x1  + 24 x1 + 1) x2  + (2 x1  + 4 x1) x2, x1 x3 - 3 x2 - 1, 
389        2                        2
390 3 x4 x2  + (x4 - 6) x2 + 2 x4 x1  - 2], 
391                  2                           2                     2
392 [x1, 3 x2 + 1, x3  - 12 x3, (x4 + 6) x3], [x1 , 3 x2 + 1, x1 x3, x4  x1], 
393                      2
394 [x1, 3 x2 + 1, x3, x4 ]]
396 Which is the result given in Maple help. One sees here a collection of charsets. One can put
397 the arguments basset, charsetn or trisetc to the invocation. Here this doesn't change much.
398 Finally one can call charsets_premas to see if a polynomial belongs to the ideal generated
399 by the given polynomial set as shown above. Unfortunately most of the other functions
400 in the package don't work at present, in particular those which deal with irreducibility.
402 TODO
404 When the Maple package has been translated, sets were not available in Maxima,
405 while they are heavily used in the maple package. This is a big source of divergence 
406 with the maple code, and maybe the cause of several problems. It would be nice to
407 use only maxima sets in the package and see what happens. It would also be nice to
408 introduce some of the functions in charsets_powers.lisp in the core maxima code,
409 since having the basic definitions for multivariate polynomials in a CAS seems to me
410 requisite. For example the definition of the leading term, the degree of a polynomial
411 etc. Maxima only knows polynomials in one variable, which is severely lacking.
412 Then it would be nice to continue debugging the package. Having a working version
413 of the Maple code would help tracing functions and compare with what happens in Maxima.
414 I have spent a lot of time trying to make charsets_triser work, without success.
415 I have been able to run the function adjoina under Maple and check that it does the same
416 thing in Maxima. However triser always end up looping or going into error.... In the course
417 of doing that i have found a number of small errors scattered everywhere, in particular in
418 support files like charsets_set.lisp  charsets_powers.lisp. I have been obliged to write
419 another support file charsets_length.lisp, which could perhaps be replaced by the much simpler
420 version contributed by R. Fateman fateman-len.lisp. One can find on the web another charsets
421 package:
422 http://www.mmrc.iss.ac.cn/~dwang/files/wsolve.txt
423 which may be of interest for understanding some points.