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