Add some basic letsimp tests based on bug #3950
[maxima.git] / share / fourier_elim / rtest_fourier_elim.mac
blob9ab41b013a607d4113f8a8c0f1fd8dd9c9b20870
1 /* Let's place the known bugs at the end. */
3 (kill(all), reset(), load("fourier_elim"), 0);
4 0$
6 fourier_elim([max(x,0) > 0],[x]);
7 [0 < x]$
9 fourier_elim([max(x,0) >= 0],[x]);
10 universalset$
12 fourier_elim([min(x,0) >= 0],[x]);
13 [x=0] or [0 < x]$
15 fourier_elim([abs(x) <= 1],[x]);
16 [x=1] or [x=-1] or [-1<x,x<1]$
18 fourier_elim([0 < 1],[]);
19 universalset$
21 fourier_elim([0 < 1],[x]);
22 universalset$
24 fourier_elim([0 >= 1],[]);
25 emptyset$
27 fourier_elim([0 > 1],[x]);
28 emptyset$
30 fourier_elim([abs(x) < 1],[x]);
31 [-1 < x, x < 1]$
33 fourier_elim([],[]);
34 universalset$
36 fourier_elim([x # inf],[x]);
37 universalset$
39 fourier_elim([-x # inf],[x]);
40 universalset$
42 fourier_elim([x # minf],[x,y]);
43 universalset$
45 fourier_elim([-x # minf],[x,y]);
46 universalset$
48 fourier_elim([x # %i],[x,y,z]);
49 universalset$
51 fourier_elim([-x # %i],[x]);
52 universalset$
54 fourier_elim([x # 0],[x]);
55 [x < 0] or [0 < x]$
57 fourier_elim([-x # 0],[x]);
58 [0 < x] or [x < 0]$
60 fourier_elim([x # 10],[x]);
61 [x < 10] or [10 < x]$
63 fourier_elim([-x # 10],[x]);
64 [-10 < x] or [x < -10]$
66 fourier_elim([x^2 # 100],[x]);
67 [-10 < x,x < 10] or [10 < x] or [x < -10]$
69 fourier_elim([-x^2 # 100],[x]);
70 universalset$
72 fourier_elim([x = 5, x <= 5],[x]);
73 [x=5]$
75 fourier_elim([x = 5, x >= 5],[x]);
76 [x=5]$
78 fourier_elim([x = 5, x < 5],[x]);
79 emptyset$
81 fourier_elim([x = 5],[x]);
82 [x = 5]$
84 fourier_elim([x = 5, x = 6],[x]);
85 emptyset$
87 fourier_elim([x = 5, x < 6],[x]);
88 [x = 5]$
90 fourier_elim([x = 5, x > 6],[x]);
91 emptyset$
93 fourier_elim([x = 5, x >= 5],[x]);
94 [x = 5]$
96 fourier_elim([x = 5, x >= 0],[x]);
97 [x = 5]$
99 fourier_elim([x = y, y = 7],[x,y]);
100 [x=7, y=7]$
102 fourier_elim([x = 2*y + 1, y = 7],[x,y]);
103 [x=15, y=7]$
105 fourier_elim([x + y = 2, x - y = 0],[x,y]);
106 [x=1, y=1]$
108 fourier_elim([x + y = 2, x - y = 0],[]);
109 [y-x=0,y+x-2=0]$
111 (eqs : [0 < x, x < 1, 0 < y, y < 1, 0 < z, x+y+z < 4],0);
114 fourier_elim(eqs,[z,y,x]);
115 [0<z,z<-y-x+4,0<y,y<1,0<x,x<1]$
117 fourier_elim(eqs,[x,y,z]);
118 [0<x,x<min(1,-z-y+4),0<y,y<min(1,4-z),0<z,z<4]$
120 fourier_elim(fourier_elim(eqs,[y,x,z]),[z,y,x]);
121 [0<z,z<-y-x+4,0<y,y<1,0<x,x<1]$
123 (remvalue(eqs),0);
126 fourier_elim([x^2 > 0],[x]);
127 [x < 0] or [0 < x]$
129 fourier_elim([x^3 > 0],[x]);
130 [0 < x]$
132 fourier_elim([x^4 > 0],[x]);
133 [x < 0] or [0 < x]$
135 fourier_elim([x^2 >= 0],[x]);
136 'universalset$
138 fourier_elim([x^2 <= 0],[x]);
139 [x = 0]$
141 fourier_elim([x^2 + 1 < 0], [x]);
142 'emptyset$
144 fourier_elim([x^2 + 1 > 0], [x]);
145 'universalset$
147 fourier_elim([x^2 + 1 >= 0], [x]);
148 'universalset$
150 fourier_elim([x^2 + 1 # 0], [x]);
151 'universalset$
153 fourier_elim([2^x < 2^y], [x, y]);
154 [x < y]$
156 fourier_elim([1.5^x > 1.5^y], [x, y]);
157 [y < x]$
159 fourier_elim([a * b > 0],[a,b]);
160 [0<a,0<b] or [a<0,b<0]$
162 fourier_elim([x >= x],[x]);
163 'universalset$
165 fourier_elim([1 >= 1/10],[]);
166 'universalset$
168 fourier_elim([x^2 # 100],[x]);
169 [-10 < x,x < 10] or [10 < x] or [x < -10]$
171 fourier_elim([x # inf, x # minf],[]);
172 'universalset$
174 fourier_elim([x # inf],[]);
175 'universalset$
177 fourier_elim([x # %i],[]);
178 'universalset$
180 fourier_elim([1-x > 0, x - %e > 0],[x]);
181 'emptyset$
183 fourier_elim([-1/a > 0],[a]);
184 [a < 0]$
186 fourier_elim([x # infinity],[x]);
187 'universalset$
189 fourier_elim([x^2-1 < 0],[x]);
190 [-1 < x, x < 1]$
192 fourier_elim([(x^2+1) < 0],[x]);
193 'emptyset$
195 fourier_elim([x^2 < 0],[x]);
196 'emptyset$
198 fourier_elim([x^2+1 = 0],[x]);
199 'emptyset$
201 fourier_elim([x /(1 + x^2) <  1],[x]);
202 [x^2-x+1>0]$
204 fourier_elim([x*(1-x) > 0, (x-12) * (1/2-x) > 0],[x]);
205 [1/2 < x,x < 1]$
207 fourier_elim([(x-12) * (1/2-x) > 0],[x]);
208 [1/2 < x, x < 12]$
210 fourier_elim([y >= 0, y <= 0],[y]);
211 [y = 0]$
213 fourier_elim([(x-5) / (x-7) <= 10],[x]);
214 [x = 65/9] or [65/9 < x] or [x < 7]$
216 fourier_elim([x*(1-x) < 0, (x-6)*(10-x) < 0],[x]);
217 [10 < x] or [1 < x,x < 6] or [x < 0]$
219 fourier_elim([x*y*z < 0],[x,y,z]);
220 [x<0,0<y,0<z] or [0<x,y<0,0<z] or [0<x,0<y,z<0] or [x<0,y<0,z<0]$
222 fourier_elim([1 = 1],[]);
223 'universalset$
225 fourier_elim([1 = 1, x + y < 1, x - y > 1],[x,y]);
226 [y+1<x,x<1-y,y<0]$
228 fourier_elim([1 = -1, x + y < 1, x - y > 1],[x,y]);
229 emptyset$
231 fourier_elim([1 = 0],[]);
232 'emptyset$
234 fourier_elim([inf = 0],[]);
235 'emptyset$
237 fourier_elim([inf = minf],[]);
238 'emptyset$
240 fourier_elim([sqrt(2) = sqrt(5)],[]);
241 'emptyset$
243 fourier_elim([sqrt(2) # sqrt(5)],[]);
244 'universalset$
246 fourier_elim([max(x,y) < 1, min(x,y) > -1],[x,y]);
247 [-1<x,x<1,-1<y,y<1]$
250 fourier_elim([min(x,0) > 0],[x]);
251 'emptyset$
253 fourier_elim([x[1] + x[2] < 1, x[1] - x[2] > -1], [x[1], x[2]]);
254 [x[2]-1<x[1],x[1]<1-x[2],x[2]<1]$
256 fourier_elim([rat(x+y) < 1, x - y > -1],[x, rat(y)]);
257 [y-1<x,x<1-y,y<1]$
259 fourier_elim([rat(x*(1-x)) < 0, rat((x-6)*(10-x)) < 0],[x]);
260 [10 < x] or [1 < x,x < 6] or [x < 0]$
262 fourier_elim([x * (x+1) * (x+2) < 0],[y,x]);
263 [-1 < x,x < 0] or [x < -2]$
265 fourier_elim([x * (x+1) * (x+2) < 0, x > -2],[y,x]);
266 [-1 < x,x < 0]$
268 fourier_elim([x * (x+1) * (x+2) < 0, x > -2, x > 0],[y,x]);
269 'emptyset$
271 fourier_elim([x < 1 and x > 5],[x]);
272 'emptyset$
274 fourier_elim([x < 1 or x > 5],[x]);
275 [5 < x] or [x < 1]$
277 fourier_elim([y+x=2,x-y=0, y < 8],[x,y]);
278 [x = 1,y = 1]$
280 fourier_elim([y+x=2,x-y=0, y < 1],[x,y]);
281 'emptyset$
283 fourier_elim([y+x=2,x-y=0, y < 8],[x,y]);
284 [x = 1,y = 1]$
286 fourier_elim([abs(x) + abs(x/2) + abs(x/3) =  1],[x]);
287 [x=-6/11] or [x=6/11]$
289 fourier_elim([abs(x) + abs(x/2) + abs(x/3) #  1],[x]);
290 [x = 0] or [0 < x,x < 6/11] or [-6/11 < x,x < 0] or [x < -6/11] or [6/11 < x]$
292 fourier_elim([max(x,6) < max(x,7)],[x]);
293 [x<6] or [x=6] or [6<x,x<7]$
295 fourier_elim([max(x,6) < max(x,7) - 1],[x]);
296 'emptyset$
298 fourier_elim([max(x,-x) = abs(x)],[x]);
299 'universalset$
301 fourier_elim([max(x,-x) # abs(x)],[x]);
302 'emptyset$
304 fourier_elim([max(x,-x) < abs(x)],[x]);
305 'emptyset$
307 fourier_elim([min(x,1) < max(x,1)],[x]);
308 [1<x] or [x<1]$
310 fourier_elim([max(x,-x/2) < 1],[x]);
311 [-2<x,x<1]$
313 fourier_elim([abs(x - abs(x-1)) + abs(x) < 1],[x]);
314 [0<x,x<1/2] or [x=1/2] or [1/2<x,x<2/3]$  /* [0 < x, x < 2/3] is better */
316 fourier_elim([x * (x-1) < a * (a - 1)],[x,a]);
317 [1-a<x,x<a,1/2<a] or [a<x,x<1-a,a<1/2]$
319 fourier_elim([x < 3.14], [x]);
320 [x < 3.14]$
322 fourier_elim([x > 3.14],[x]);
323 [3.14 < x]$
325 fourier_elim([2.78b0 *  x > 3.14b0],[x]);
326 [1.129496402877698b0 < x]$
328 fourier_elim([min(x,0) >= 0],[x]);
329 [x=0] or [0<x]$
331 /* This answer isn't wrong, but it could be simplified. */
333 fourier_elim([abs(x - abs(x - abs(x - 23))) > abs(x-1)],[x]);
334 [x<1] or [x=1] or [1<x,x<6] or [11<x,x<23/2] or [x=23/2] or [23/2<x,x<12]$
336 fourier_elim([sqrt(5) * x < 1],[x]);
337 [x<1/sqrt(5)]$
339 fourier_elim([sqrt(2) < x + y, x < sqrt(5), y  < 1],[x,y]);
340 [sqrt(2)-y<x,x<sqrt(5),sqrt(2)-sqrt(5)<y,y<1]$
342 fourier_elim([max(x,y) < min(x,y)],[x,y]);
343 'emptyset$
345 fourier_elim([min(x,y) < max(x,y)],[x,y]);
346 [x<y] or [y<x]$
348 fourier_elim([min(x,y) <= max(x,y)],[x,y]);
349 [x=y] or [x<y] or [y<x]$
351 fourier_elim([0>=x,0=z],[x,z]);
352 [x=0,z=0] or [z=0,x<0]$
354 fourier_elim(x < 1 and x >= 1,[x]);
355 'emptyset$
357 fourier_elim(x <= 1 and x >= 1,[x]);
358 [x = 1]$
360 fourier_elim([log(x) > log(a)],[x, a]);
361 [a<x,0<a]$
363 /* SF bug 1952642 */
365 fourier_elim([abs(x)>1], [x]);
366 [x<-1] or [1<x]$
368 /* SF bug 2030675 */
370 fourier_elim([f(abs(x)) < 0],[x]);
371 [- f(abs(x)) > 0]$
373 fourier_elim([f(abs(x)) > 0],[x]);
374 [f(abs(x)) > 0]$
376 fourier_elim([log(x) < log(a)],[x,a]);
377 [0 < x, x < a, 0 < a]$
379 /* affine_p tests */
381 affine_p(0,[]);
382 true$
384 affine_p(2*%pi*%i,[x,y,z]);
385 true$
387 affine_p(0,[x]);
388 true$
390 affine_p(x,[x]);
391 true$
393 affine_p(x[1],[x[1]]);
394 true$
396 affine_p(y,[x]);
397 true$
399 affine_p(a*x,[x]);
400 true$
402 affine_p(a*x,[x,y]);
403 true$
405 affine_p(a*x+y,[x,y]);
406 true$
408 affine_p(a*x+y*sin(q),[x,y]);
409 true$
411 affine_p((x-y)/(a-b),[x,y]);
412 true$
414 affine_p((x^2-y^2)/(x-y),[x,y]);
415 true$
417 affine_p(sin(x),[x]);
418 false$
420 affine_p(x*y,[x,y]);
421 false$
423 affine_p(1/x,[x]);
424 false$
426 affine_p([1,2],[]);
427 false$
429 affine_p(x=y,[]);
430 false$
432 affine_p(taylor(x,x,0,1),[x]);
433 false$
435 affine_p((x^2+y^2)/(x-y),[x,y]);
436 false$
438 affine_p(x[1]^2,[x[1]]);
439 false$
441 affine_p(x[1]*y[1],[x[1],y[1]]);
442 false$
444 /* actual regressions */
446 fourier_elim(x = y*z,[x,y,z]); /* #2628 fourier elimination on equality */
447 [y*z-x=0]$
449 /* known bugs!  */
450 fourier_elim([x < 1/a],[x]);
451 [x < 1/a]$
453 fourier_elim([x - cos(z) < 0],[x]);
454 [x < cos(z)]$
456 fourier_elim([x - z^42 < 0],[x]);
457 [x < z^42]$
459 /* I think this bug is related to linsolve([x=3.14],[x]) --> [x = 157/50]. Even when
460 keepfloat is true, linsolve converts floats to rationals. */
461 fourier_elim([x<=3.14],[x]);
462 [x = 3.14] or [x < 3.14]$
464 /* end of known bugs */
466 /* #3799 fourier_elim returns non-(in)equations */
468 fourier_elim([x0 + 2*x1 + 2 <= 0, -3*x0 + 4*x1 - 4 <= 0], [x0,x1]);
469 [x0=-8/5,x1=-1/5] or [x0=(4*x1-4)/3,x1<-1/5] or [x0=-2*x1-2,x1<-1/5] or [(4*x1)/3-4/3<x0,x0<-2*x1-2,x1<-1/5]$
471 xxx : fourier_elim([x0 + 2*x1 + 2 <= 0, -3*x0 + 4*x1 - 4 <= 0], [x0]);
472 [x0=-2*x1-2,5*x1+1=0] or [x0=(4*x1-4)/3,-6*(5*x1+1)>0] or [x0=-2*x1-2,-2*(5*x1+1)>0] or [(4*x1)/3-4/3<x0,x0<-2*x1-2,-
473 6*(5*x1+1)>0]$
475 fourier_elim(subst(x1=-1/5, xxx),[x0]);
476 [x0=-8/5]$
478 fourier_elim(subst(x1=-1/5, [x0 + 2*x1 + 2 <= 0, -3*x0 + 4*x1 - 4 <= 0]), [x0]);
479 [x0=-8/5]$
481 fourier_elim([a=0],[a]);
482 [a=0]$
484 fourier_elim([a=0],[]);
485 [a=0]$
487 fourier_elim([a=k,a>k],[a]);
488 emptyset$
490 fourier_elim([a=k,a>k],[k]);
491 emptyset$
493 fourier_elim([a=k,a>k],[]);
494 [a-k>0,k-a=0]$
496 fourier_elim([0<=b+x,b<=x],[b,x]);
497 [b=0,x=0] or [b=x,0<x] or [b=-x,0<x] or [-x<b,b<x,0<x]$
499 fourier_elim([0<=b+x,b<=x],[x,b]);
500 [x=0,b=0] or [x=b,0<b] or [x=-b,b<0] or [max(-b,b)<x]$
502 xxx : fourier_elim([0<=b+x,b<=x],[b]);
503 [b=x,x=0] or [b=x,2*x>0] or [b=-x,2*x>0] or [-x<b,b<x,2*x>0]$
505 fourier_elim(xxx,[b,x]);
506 [-x<b,b<x,0<x] or [b=-x,0<x] or [b=x,0<x] or [b=0,x=0]$
508 xxx : fourier_elim([0<=b+x,b<=x],[b]);
509 [b=x,x=0] or [b=x,2*x>0] or [b=-x,2*x>0] or [-x<b,b<x,2*x>0]$
511 fourier_elim(subst(x=107,xxx),[b]);
512 [-107<b,b<107] or [b=-107] or [b=107]$
514 /* #2783 fourier_elim and "domain : complex"  */
516 block([domain : complex], fourier_elim((x-1)/(x-5) <= 1/3,[x]));
517  [x=-1] or [-1<x,x<5]$
519 (remvalue(xxx),0);
522 values;
525 contexts;
526 [initial,global]$