1% Tests of the COMPACT package.
2
3% Author: Anthony C. Hearn.
4
5% First some simple examples.
6
7aa := {cos(x)^2+sin(x)^2-1};
8
9
10             2         2
11aa := {cos(x)  + sin(x)  - 1}
12
13
14xx := 2*cos(x)^2+2*sin(x)^2-2;
15
16
17               2         2
18xx := 2*(cos(x)  + sin(x)  - 1)
19
20
21compact(xx,aa);
22
23
240
25
26
27xx := (1-cos(x)^2)^4;
28
29
30            8           6           4           2
31xx := cos(x)  - 4*cos(x)  + 6*cos(x)  - 4*cos(x)  + 1
32
33
34compact(xx,aa);
35
36
37      8
38sin(x)
39
40
41% These examples are from Lars Hornfeldt.
42
43% This should be cos x^10*sin x^10.
44
45compact(((1-(sin x)**2)**5)*((1-(cos x)**2)**5)
46	    *(((sin x)**2+(cos x)**2)**5),
47	{cos x^2+sin x^2=1});
48
49
50      10           2       4         10           8           2
51sin(x)  *(10*cos(x) *sin(x)  - sin(x)   + 5*sin(x)  - 5*sin(x)  + 1)
52
53
54% This example illustrates the problem in the above. It is cos(x)^6.
55
56compact(-3cos(x)^2*sin(x)^2-sin(x)^6+1,{cos x^2+sin x^2-1});
57
58
59           2       2         6
60 - 3*cos(x) *sin(x)  - sin(x)  + 1
61
62
63compact(s*(1-(sin x**2))+c*(1-(cos x)**2)+(sin x)**2+(cos x)**2,
64	{cos x^2+sin x^2=1});
65
66
67      2           2
68cos(x) *s + sin(x) *c + 1
69
70
71xx := s*(1-(sin x**2))+c*(1-(cos x)**2)+(sin x)**2+(cos x)**2
72	*((sin x)**2+(cos x)**2)*(sin x)**499*(cos x)**499;
73
74
75            503       499         501       501         2           2
76xx := cos(x)   *sin(x)    + cos(x)   *sin(x)    - cos(x) *c - sin(x) *s
77
78               2
79       + sin(x)  + c + s
80
81
82compact(xx,{cos(x)^2+sin(x)^2=1});
83
84
85      501       499         2           2           2
86cos(x)   *sin(x)    + cos(x) *s + sin(x) *c + sin(x)
87
88
89compact((s*(1-(sin x**2))+c*(1-(cos x)**2)+(sin x)**2+(cos x)**2)
90	     *((sin x)**2+(cos x)**2)*(sin x)**499*(cos x)**499,
91	 {cos x^2+sin x^2=1});
92
93
94      499       499        2           2
95cos(x)   *sin(x)   *(cos(x) *s + sin(x) *c + 1)
96
97
98compact(df((1-(sin x)**2)**4,x),{cos x^2+sin x^2=1});
99
100
101                         2       2         6
1028*cos(x)*sin(x)*(3*cos(x) *sin(x)  + sin(x)  - 1)
103
104
105% End of Lars Hornfeld examples.
106
107xx := a*(cos(x)+2*sin(x))^3-w*(cos(x)-sin(x))^2;
108
109
110            3             2                  2                     2
111xx := cos(x) *a + 6*cos(x) *sin(x)*a - cos(x) *w + 12*cos(x)*sin(x) *a
112
113                                     3           2
114       + 2*cos(x)*sin(x)*w + 8*sin(x) *a - sin(x) *w
115
116
117compact(xx,aa);
118
119
120                2                                            3
12111*cos(x)*sin(x) *a + 2*cos(x)*sin(x)*w + cos(x)*a + 2*sin(x) *a + 6*sin(x)*a
122
123 - w
124
125
126xx := (1-cos(x)^2)^2+(1-sin(x)^2)^2;
127
128
129            4           2         4           2
130xx := cos(x)  - 2*cos(x)  + sin(x)  - 2*sin(x)  + 2
131
132
133compact(xx,aa);
134
135
136           2       2
137 - 2*cos(x) *sin(x)  + 1
138
139
140xx := (c^2-1)^6+7(s-1)^4+23(c+s)^5;
141
142
143       12      10       8       6       5        4         4        3  2
144xx := c   - 6*c   + 15*c  - 20*c  + 23*c  + 115*c *s + 15*c  + 230*c *s
145
146              2  3      2          4       5      4       3       2
147       + 230*c *s  - 6*c  + 115*c*s  + 23*s  + 7*s  - 28*s  + 42*s  - 28*s + 8
148
149
150compact(xx,{c+s=1});
151
152
153 12      10       8       6       4      2
154c   - 6*c   + 15*c  - 20*c  + 22*c  - 6*c  + 24
155
156
157yy := (c+1)^6*s^6+7c^4+23;
158
159
160       6  6      5  6       4  6      4       3  6       2  6        6    6
161yy := c *s  + 6*c *s  + 15*c *s  + 7*c  + 20*c *s  + 15*c *s  + 6*c*s  + s  + 23
162
163
164compact(yy,{c+s=1});
165
166
167 6  6      5  6       4  6      4       3  6       2  6        6    6
168c *s  + 6*c *s  + 15*c *s  + 7*c  + 20*c *s  + 15*c *s  + 6*c*s  + s  + 23
169
170
171zz := xx^3+c^6*s^6$
172
173
174
175compact(zz,{c+s=1});
176
177
178 36       34        32        30         28         26          24          22
179c   - 18*c   + 153*c   - 816*c   + 3081*c   - 8820*c   + 20019*c   - 37272*c
180
181          20          18           16           14           12      11
182 + 58854*c   - 81314*c   + 100488*c   - 111840*c   + 111341*c   - 6*c
183
184          10       9          8      7          6          4          2
185 - 97545*c   - 20*c  + 80439*c  - 6*c  - 53783*c  + 40608*c  - 10368*c  + 13824
186
187
188xx := (c+s)^5 - 55(1-s)^2 + 77(1-c)^3 + (c+2s)^8;
189
190
191       8       7          6  2        5  3    5         4  4      4
192xx := c  + 16*c *s + 112*c *s  + 448*c *s  + c  + 1120*c *s  + 5*c *s
193
194               3  5       3  2       3         2  6       2  3        2
195       + 1792*c *s  + 10*c *s  - 77*c  + 1792*c *s  + 10*c *s  + 231*c
196
197                 7        4                8    5       2
198       + 1024*c*s  + 5*c*s  - 231*c + 256*s  + s  - 55*s  + 110*s + 22
199
200
201% This should reduce to something like:
202
203yy := 1 - 55c^2 + 77s^3 + (1+s)^8;
204
205
206             2    8      7       6       5       4        3       2
207yy :=  - 55*c  + s  + 8*s  + 28*s  + 56*s  + 70*s  + 133*s  + 28*s  + 8*s + 2
208
209
210% The result contains the same number but different terms.
211
212compact(xx,{c+s=1});
213
214
215 8      7       6       5       4        3       2
216s  + 8*s  + 28*s  + 56*s  + 70*s  + 133*s  - 27*s  + 118*s - 53
217
218
219compact(yy,{c+s=1});
220
221
222 8      7       6       5       4        3       2
223s  + 8*s  + 28*s  + 56*s  + 70*s  + 133*s  - 27*s  + 118*s - 53
224
225
226% Test showing order of expressions is important.
227
228d2:= - 4*r3a**2 - 4*r3b**2 - 4*r3c**2 + 3*r3**2$
229
230
231
232d1:=  4 * r3a**2 * r3
233   +  4 * r3b**2 * r3
234   +  4 * r3c**2 * r3
235   + 16 * r3a * r3b * r3c
236   -      r3**3$
237
238
239
240d0:= 16 * r3a**4
241   + 16 * r3b**4
242   + 16 * r3c**4
243   +       r3**4
244   - 32 * r3a**2 * r3b**2
245   - 32 * r3a**2 * r3c**2
246   - 32 * r3b**2 * r3c**2
247   -  8 * r3a**2 *  r3**2
248   -  8 * r3b**2 *  r3**2
249   -  8 * r3c**2 *  r3**2
250   - 64 * r3a * r3b * r3c * r3$
251
252
253
254alist := { c0 = d0, c1 = d1, c2 = d2}$
255
256
257
258blist := { c2 = d2, c1 = d1, c0 = d0}$
259
260
261
262d:= d2 * l*l + d1 * l + d0;
263
264
265        2   2      2    2      2    2      2    2       3             2
266d := 3*l *r3  - 4*l *r3a  - 4*l *r3b  - 4*l *r3c  - l*r3  + 4*l*r3*r3a
267
268                  2             2                        4       2    2
269      + 4*l*r3*r3b  + 4*l*r3*r3c  + 16*l*r3a*r3b*r3c + r3  - 8*r3 *r3a
270
271            2    2       2    2                             4         2    2
272      - 8*r3 *r3b  - 8*r3 *r3c  - 64*r3*r3a*r3b*r3c + 16*r3a  - 32*r3a *r3b
273
274              2    2         4         2    2         4
275      - 32*r3a *r3c  + 16*r3b  - 32*r3b *r3c  + 16*r3c
276
277
278compact(d,alist);
279
280
281                2
282c0 + c1*l + c2*l
283 % Works fine.
284
285compact(d,blist);
286
287
288    2                    2           2         3                          4
289c2*l  - c2*l*r3 + 2*c2*r3  + 8*c2*r3a  + 2*l*r3  + 16*l*r3a*r3b*r3c - 5*r3
290
291        2    2                             4         4         2    2         4
292 - 24*r3 *r3a  - 64*r3*r3a*r3b*r3c + 48*r3a  + 16*r3b  - 32*r3b *r3c  + 16*r3c
293 % Only c2=d2 is applied.
294
295% This example illustrates why parallel application of the individual
296% side relations is necessary.
297
298lst:={x1=a+b+c, x2=a-b-c, x3=-a+b-c, x4=-a-b+c};
299
300
301lst := {x1=a + b + c,
302
303        x2=a - b - c,
304
305        x3= - a + b - c,
306
307        x4= - a - b + c}
308
309
310z1:=(a+b+c)*(a-b-c)*(-a+b-c);
311
312
313          3    2      2        2                2    3    2        2    3
314z1 :=  - a  + a *b - a *c + a*b  + 2*a*b*c + a*c  - b  - b *c + b*c  + c
315    % This is x1*x2*x3.
316
317z2:=(a+b+c)*(a-b-c)*(-a+b-c)*(-a-b+c);
318
319
320       4      2  2      2  2    4      2  2    4
321z2 := a  - 2*a *b  - 2*a *c  + b  - 2*b *c  + c
322   % This is x1*x2*x3*x4.
323
324compact(z1,lst);
325
326
327                       2
328x1*(4*a*b + 2*c*x1 - x1 )
329 % Not the best solution but better than nothing.
330
331compact(z2,lst);
332
333
334 4      2  2      2  2    4      2  2    4
335a  - 2*a *b  - 2*a *c  + b  - 2*b *c  + c
336 % Does nothing.
337
338end;
339
340Tested on x86_64-pc-windows CSL
341Time (counter 1): 16 ms
342
343End of Lisp run after 0.01+0.04 seconds
344real 0.21
345user 0.03
346sys 0.06
347