1from sympy import ( 2 Add, Mul, S, Symbol, cos, cot, pi, I, sin, sqrt, tan, root, csc, sec, 3 powsimp, symbols, sinh, cosh, tanh, coth, sech, csch, Dummy, Rational) 4from sympy.simplify.fu import ( 5 L, TR1, TR10, TR10i, TR11, _TR11, TR12, TR12i, TR13, TR14, TR15, TR16, 6 TR111, TR2, TR2i, TR3, TR5, TR6, TR7, TR8, TR9, TRmorrie, _TR56 as T, 7 TRpower, hyper_as_trig, fu, process_common_addends, trig_split, 8 as_f_sign_1) 9from sympy.testing.randtest import verify_numerically 10from sympy.abc import a, b, c, x, y, z 11 12 13def test_TR1(): 14 assert TR1(2*csc(x) + sec(x)) == 1/cos(x) + 2/sin(x) 15 16 17def test_TR2(): 18 assert TR2(tan(x)) == sin(x)/cos(x) 19 assert TR2(cot(x)) == cos(x)/sin(x) 20 assert TR2(tan(tan(x) - sin(x)/cos(x))) == 0 21 22 23def test_TR2i(): 24 # just a reminder that ratios of powers only simplify if both 25 # numerator and denominator satisfy the condition that each 26 # has a positive base or an integer exponent; e.g. the following, 27 # at y=-1, x=1/2 gives sqrt(2)*I != -sqrt(2)*I 28 assert powsimp(2**x/y**x) != (2/y)**x 29 30 assert TR2i(sin(x)/cos(x)) == tan(x) 31 assert TR2i(sin(x)*sin(y)/cos(x)) == tan(x)*sin(y) 32 assert TR2i(1/(sin(x)/cos(x))) == 1/tan(x) 33 assert TR2i(1/(sin(x)*sin(y)/cos(x))) == 1/tan(x)/sin(y) 34 assert TR2i(sin(x)/2/(cos(x) + 1)) == sin(x)/(cos(x) + 1)/2 35 36 assert TR2i(sin(x)/2/(cos(x) + 1), half=True) == tan(x/2)/2 37 assert TR2i(sin(1)/(cos(1) + 1), half=True) == tan(S.Half) 38 assert TR2i(sin(2)/(cos(2) + 1), half=True) == tan(1) 39 assert TR2i(sin(4)/(cos(4) + 1), half=True) == tan(2) 40 assert TR2i(sin(5)/(cos(5) + 1), half=True) == tan(5*S.Half) 41 assert TR2i((cos(1) + 1)/sin(1), half=True) == 1/tan(S.Half) 42 assert TR2i((cos(2) + 1)/sin(2), half=True) == 1/tan(1) 43 assert TR2i((cos(4) + 1)/sin(4), half=True) == 1/tan(2) 44 assert TR2i((cos(5) + 1)/sin(5), half=True) == 1/tan(5*S.Half) 45 assert TR2i((cos(1) + 1)**(-a)*sin(1)**a, half=True) == tan(S.Half)**a 46 assert TR2i((cos(2) + 1)**(-a)*sin(2)**a, half=True) == tan(1)**a 47 assert TR2i((cos(4) + 1)**(-a)*sin(4)**a, half=True) == (cos(4) + 1)**(-a)*sin(4)**a 48 assert TR2i((cos(5) + 1)**(-a)*sin(5)**a, half=True) == (cos(5) + 1)**(-a)*sin(5)**a 49 assert TR2i((cos(1) + 1)**a*sin(1)**(-a), half=True) == tan(S.Half)**(-a) 50 assert TR2i((cos(2) + 1)**a*sin(2)**(-a), half=True) == tan(1)**(-a) 51 assert TR2i((cos(4) + 1)**a*sin(4)**(-a), half=True) == (cos(4) + 1)**a*sin(4)**(-a) 52 assert TR2i((cos(5) + 1)**a*sin(5)**(-a), half=True) == (cos(5) + 1)**a*sin(5)**(-a) 53 54 i = symbols('i', integer=True) 55 assert TR2i(((cos(5) + 1)**i*sin(5)**(-i)), half=True) == tan(5*S.Half)**(-i) 56 assert TR2i(1/((cos(5) + 1)**i*sin(5)**(-i)), half=True) == tan(5*S.Half)**i 57 58 59def test_TR3(): 60 assert TR3(cos(y - x*(y - x))) == cos(x*(x - y) + y) 61 assert cos(pi/2 + x) == -sin(x) 62 assert cos(30*pi/2 + x) == -cos(x) 63 64 for f in (cos, sin, tan, cot, csc, sec): 65 i = f(pi*Rational(3, 7)) 66 j = TR3(i) 67 assert verify_numerically(i, j) and i.func != j.func 68 69 70def test__TR56(): 71 h = lambda x: 1 - x 72 assert T(sin(x)**3, sin, cos, h, 4, False) == sin(x)*(-cos(x)**2 + 1) 73 assert T(sin(x)**10, sin, cos, h, 4, False) == sin(x)**10 74 assert T(sin(x)**6, sin, cos, h, 6, False) == (-cos(x)**2 + 1)**3 75 assert T(sin(x)**6, sin, cos, h, 6, True) == sin(x)**6 76 assert T(sin(x)**8, sin, cos, h, 10, True) == (-cos(x)**2 + 1)**4 77 78 # issue 17137 79 assert T(sin(x)**I, sin, cos, h, 4, True) == sin(x)**I 80 assert T(sin(x)**(2*I + 1), sin, cos, h, 4, True) == sin(x)**(2*I + 1) 81 82 83def test_TR5(): 84 assert TR5(sin(x)**2) == -cos(x)**2 + 1 85 assert TR5(sin(x)**-2) == sin(x)**(-2) 86 assert TR5(sin(x)**4) == (-cos(x)**2 + 1)**2 87 88 89def test_TR6(): 90 assert TR6(cos(x)**2) == -sin(x)**2 + 1 91 assert TR6(cos(x)**-2) == cos(x)**(-2) 92 assert TR6(cos(x)**4) == (-sin(x)**2 + 1)**2 93 94 95def test_TR7(): 96 assert TR7(cos(x)**2) == cos(2*x)/2 + S.Half 97 assert TR7(cos(x)**2 + 1) == cos(2*x)/2 + Rational(3, 2) 98 99 100def test_TR8(): 101 assert TR8(cos(2)*cos(3)) == cos(5)/2 + cos(1)/2 102 assert TR8(cos(2)*sin(3)) == sin(5)/2 + sin(1)/2 103 assert TR8(sin(2)*sin(3)) == -cos(5)/2 + cos(1)/2 104 assert TR8(sin(1)*sin(2)*sin(3)) == sin(4)/4 - sin(6)/4 + sin(2)/4 105 assert TR8(cos(2)*cos(3)*cos(4)*cos(5)) == \ 106 cos(4)/4 + cos(10)/8 + cos(2)/8 + cos(8)/8 + cos(14)/8 + \ 107 cos(6)/8 + Rational(1, 8) 108 assert TR8(cos(2)*cos(3)*cos(4)*cos(5)*cos(6)) == \ 109 cos(10)/8 + cos(4)/8 + 3*cos(2)/16 + cos(16)/16 + cos(8)/8 + \ 110 cos(14)/16 + cos(20)/16 + cos(12)/16 + Rational(1, 16) + cos(6)/8 111 assert TR8(sin(pi*Rational(3, 7))**2*cos(pi*Rational(3, 7))**2/(16*sin(pi/7)**2)) == Rational(1, 64) 112 113def test_TR9(): 114 a = S.Half 115 b = 3*a 116 assert TR9(a) == a 117 assert TR9(cos(1) + cos(2)) == 2*cos(a)*cos(b) 118 assert TR9(cos(1) - cos(2)) == 2*sin(a)*sin(b) 119 assert TR9(sin(1) - sin(2)) == -2*sin(a)*cos(b) 120 assert TR9(sin(1) + sin(2)) == 2*sin(b)*cos(a) 121 assert TR9(cos(1) + 2*sin(1) + 2*sin(2)) == cos(1) + 4*sin(b)*cos(a) 122 assert TR9(cos(4) + cos(2) + 2*cos(1)*cos(3)) == 4*cos(1)*cos(3) 123 assert TR9((cos(4) + cos(2))/cos(3)/2 + cos(3)) == 2*cos(1)*cos(2) 124 assert TR9(cos(3) + cos(4) + cos(5) + cos(6)) == \ 125 4*cos(S.Half)*cos(1)*cos(Rational(9, 2)) 126 assert TR9(cos(3) + cos(3)*cos(2)) == cos(3) + cos(2)*cos(3) 127 assert TR9(-cos(y) + cos(x*y)) == -2*sin(x*y/2 - y/2)*sin(x*y/2 + y/2) 128 assert TR9(-sin(y) + sin(x*y)) == 2*sin(x*y/2 - y/2)*cos(x*y/2 + y/2) 129 c = cos(x) 130 s = sin(x) 131 for si in ((1, 1), (1, -1), (-1, 1), (-1, -1)): 132 for a in ((c, s), (s, c), (cos(x), cos(x*y)), (sin(x), sin(x*y))): 133 args = zip(si, a) 134 ex = Add(*[Mul(*ai) for ai in args]) 135 t = TR9(ex) 136 assert not (a[0].func == a[1].func and ( 137 not verify_numerically(ex, t.expand(trig=True)) or t.is_Add) 138 or a[1].func != a[0].func and ex != t) 139 140 141def test_TR10(): 142 assert TR10(cos(a + b)) == -sin(a)*sin(b) + cos(a)*cos(b) 143 assert TR10(sin(a + b)) == sin(a)*cos(b) + sin(b)*cos(a) 144 assert TR10(sin(a + b + c)) == \ 145 (-sin(a)*sin(b) + cos(a)*cos(b))*sin(c) + \ 146 (sin(a)*cos(b) + sin(b)*cos(a))*cos(c) 147 assert TR10(cos(a + b + c)) == \ 148 (-sin(a)*sin(b) + cos(a)*cos(b))*cos(c) - \ 149 (sin(a)*cos(b) + sin(b)*cos(a))*sin(c) 150 151 152def test_TR10i(): 153 assert TR10i(cos(1)*cos(3) + sin(1)*sin(3)) == cos(2) 154 assert TR10i(cos(1)*cos(3) - sin(1)*sin(3)) == cos(4) 155 assert TR10i(cos(1)*sin(3) - sin(1)*cos(3)) == sin(2) 156 assert TR10i(cos(1)*sin(3) + sin(1)*cos(3)) == sin(4) 157 assert TR10i(cos(1)*sin(3) + sin(1)*cos(3) + 7) == sin(4) + 7 158 assert TR10i(cos(1)*sin(3) + sin(1)*cos(3) + cos(3)) == cos(3) + sin(4) 159 assert TR10i(2*cos(1)*sin(3) + 2*sin(1)*cos(3) + cos(3)) == \ 160 2*sin(4) + cos(3) 161 assert TR10i(cos(2)*cos(3) + sin(2)*(cos(1)*sin(2) + cos(2)*sin(1))) == \ 162 cos(1) 163 eq = (cos(2)*cos(3) + sin(2)*( 164 cos(1)*sin(2) + cos(2)*sin(1)))*cos(5) + sin(1)*sin(5) 165 assert TR10i(eq) == TR10i(eq.expand()) == cos(4) 166 assert TR10i(sqrt(2)*cos(x)*x + sqrt(6)*sin(x)*x) == \ 167 2*sqrt(2)*x*sin(x + pi/6) 168 assert TR10i(cos(x)/sqrt(6) + sin(x)/sqrt(2) + 169 cos(x)/sqrt(6)/3 + sin(x)/sqrt(2)/3) == 4*sqrt(6)*sin(x + pi/6)/9 170 assert TR10i(cos(x)/sqrt(6) + sin(x)/sqrt(2) + 171 cos(y)/sqrt(6)/3 + sin(y)/sqrt(2)/3) == \ 172 sqrt(6)*sin(x + pi/6)/3 + sqrt(6)*sin(y + pi/6)/9 173 assert TR10i(cos(x) + sqrt(3)*sin(x) + 2*sqrt(3)*cos(x + pi/6)) == 4*cos(x) 174 assert TR10i(cos(x) + sqrt(3)*sin(x) + 175 2*sqrt(3)*cos(x + pi/6) + 4*sin(x)) == 4*sqrt(2)*sin(x + pi/4) 176 assert TR10i(cos(2)*sin(3) + sin(2)*cos(4)) == \ 177 sin(2)*cos(4) + sin(3)*cos(2) 178 179 A = Symbol('A', commutative=False) 180 assert TR10i(sqrt(2)*cos(x)*A + sqrt(6)*sin(x)*A) == \ 181 2*sqrt(2)*sin(x + pi/6)*A 182 183 184 c = cos(x) 185 s = sin(x) 186 h = sin(y) 187 r = cos(y) 188 for si in ((1, 1), (1, -1), (-1, 1), (-1, -1)): 189 for argsi in ((c*r, s*h), (c*h, s*r)): # explicit 2-args 190 args = zip(si, argsi) 191 ex = Add(*[Mul(*ai) for ai in args]) 192 t = TR10i(ex) 193 assert not (ex - t.expand(trig=True) or t.is_Add) 194 195 c = cos(x) 196 s = sin(x) 197 h = sin(pi/6) 198 r = cos(pi/6) 199 for si in ((1, 1), (1, -1), (-1, 1), (-1, -1)): 200 for argsi in ((c*r, s*h), (c*h, s*r)): # induced 201 args = zip(si, argsi) 202 ex = Add(*[Mul(*ai) for ai in args]) 203 t = TR10i(ex) 204 assert not (ex - t.expand(trig=True) or t.is_Add) 205 206 207def test_TR11(): 208 209 assert TR11(sin(2*x)) == 2*sin(x)*cos(x) 210 assert TR11(sin(4*x)) == 4*((-sin(x)**2 + cos(x)**2)*sin(x)*cos(x)) 211 assert TR11(sin(x*Rational(4, 3))) == \ 212 4*((-sin(x/3)**2 + cos(x/3)**2)*sin(x/3)*cos(x/3)) 213 214 assert TR11(cos(2*x)) == -sin(x)**2 + cos(x)**2 215 assert TR11(cos(4*x)) == \ 216 (-sin(x)**2 + cos(x)**2)**2 - 4*sin(x)**2*cos(x)**2 217 218 assert TR11(cos(2)) == cos(2) 219 220 assert TR11(cos(pi*Rational(3, 7)), pi*Rational(2, 7)) == -cos(pi*Rational(2, 7))**2 + sin(pi*Rational(2, 7))**2 221 assert TR11(cos(4), 2) == -sin(2)**2 + cos(2)**2 222 assert TR11(cos(6), 2) == cos(6) 223 assert TR11(sin(x)/cos(x/2), x/2) == 2*sin(x/2) 224 225def test__TR11(): 226 227 assert _TR11(sin(x/3)*sin(2*x)*sin(x/4)/(cos(x/6)*cos(x/8))) == \ 228 4*sin(x/8)*sin(x/6)*sin(2*x),_TR11(sin(x/3)*sin(2*x)*sin(x/4)/(cos(x/6)*cos(x/8))) 229 assert _TR11(sin(x/3)/cos(x/6)) == 2*sin(x/6) 230 231 assert _TR11(cos(x/6)/sin(x/3)) == 1/(2*sin(x/6)) 232 assert _TR11(sin(2*x)*cos(x/8)/sin(x/4)) == sin(2*x)/(2*sin(x/8)), _TR11(sin(2*x)*cos(x/8)/sin(x/4)) 233 assert _TR11(sin(x)/sin(x/2)) == 2*cos(x/2) 234 235 236def test_TR12(): 237 assert TR12(tan(x + y)) == (tan(x) + tan(y))/(-tan(x)*tan(y) + 1) 238 assert TR12(tan(x + y + z)) ==\ 239 (tan(z) + (tan(x) + tan(y))/(-tan(x)*tan(y) + 1))/( 240 1 - (tan(x) + tan(y))*tan(z)/(-tan(x)*tan(y) + 1)) 241 assert TR12(tan(x*y)) == tan(x*y) 242 243 244def test_TR13(): 245 assert TR13(tan(3)*tan(2)) == -tan(2)/tan(5) - tan(3)/tan(5) + 1 246 assert TR13(cot(3)*cot(2)) == 1 + cot(3)*cot(5) + cot(2)*cot(5) 247 assert TR13(tan(1)*tan(2)*tan(3)) == \ 248 (-tan(2)/tan(5) - tan(3)/tan(5) + 1)*tan(1) 249 assert TR13(tan(1)*tan(2)*cot(3)) == \ 250 (-tan(2)/tan(3) + 1 - tan(1)/tan(3))*cot(3) 251 252 253def test_L(): 254 assert L(cos(x) + sin(x)) == 2 255 256 257def test_fu(): 258 259 assert fu(sin(50)**2 + cos(50)**2 + sin(pi/6)) == Rational(3, 2) 260 assert fu(sqrt(6)*cos(x) + sqrt(2)*sin(x)) == 2*sqrt(2)*sin(x + pi/3) 261 262 263 eq = sin(x)**4 - cos(y)**2 + sin(y)**2 + 2*cos(x)**2 264 assert fu(eq) == cos(x)**4 - 2*cos(y)**2 + 2 265 266 assert fu(S.Half - cos(2*x)/2) == sin(x)**2 267 268 assert fu(sin(a)*(cos(b) - sin(b)) + cos(a)*(sin(b) + cos(b))) == \ 269 sqrt(2)*sin(a + b + pi/4) 270 271 assert fu(sqrt(3)*cos(x)/2 + sin(x)/2) == sin(x + pi/3) 272 273 assert fu(1 - sin(2*x)**2/4 - sin(y)**2 - cos(x)**4) == \ 274 -cos(x)**2 + cos(y)**2 275 276 assert fu(cos(pi*Rational(4, 9))) == sin(pi/18) 277 assert fu(cos(pi/9)*cos(pi*Rational(2, 9))*cos(pi*Rational(3, 9))*cos(pi*Rational(4, 9))) == Rational(1, 16) 278 279 assert fu( 280 tan(pi*Rational(7, 18)) + tan(pi*Rational(5, 18)) - sqrt(3)*tan(pi*Rational(5, 18))*tan(pi*Rational(7, 18))) == \ 281 -sqrt(3) 282 283 assert fu(tan(1)*tan(2)) == tan(1)*tan(2) 284 285 expr = Mul(*[cos(2**i) for i in range(10)]) 286 assert fu(expr) == sin(1024)/(1024*sin(1)) 287 288 # issue #18059: 289 assert fu(cos(x) + sqrt(sin(x)**2)) == cos(x) + sqrt(sin(x)**2) 290 291 assert fu((-14*sin(x)**3 + 35*sin(x) + 6*sqrt(3)*cos(x)**3 + 9*sqrt(3)*cos(x))/((cos(2*x) + 4))) == \ 292 7*sin(x) + 3*sqrt(3)*cos(x) 293 294 295def test_objective(): 296 assert fu(sin(x)/cos(x), measure=lambda x: x.count_ops()) == \ 297 tan(x) 298 assert fu(sin(x)/cos(x), measure=lambda x: -x.count_ops()) == \ 299 sin(x)/cos(x) 300 301 302def test_process_common_addends(): 303 # this tests that the args are not evaluated as they are given to do 304 # and that key2 works when key1 is False 305 do = lambda x: Add(*[i**(i%2) for i in x.args]) 306 process_common_addends(Add(*[1, 2, 3, 4], evaluate=False), do, 307 key2=lambda x: x%2, key1=False) == 1**1 + 3**1 + 2**0 + 4**0 308 309 310def test_trig_split(): 311 assert trig_split(cos(x), cos(y)) == (1, 1, 1, x, y, True) 312 assert trig_split(2*cos(x), -2*cos(y)) == (2, 1, -1, x, y, True) 313 assert trig_split(cos(x)*sin(y), cos(y)*sin(y)) == \ 314 (sin(y), 1, 1, x, y, True) 315 316 assert trig_split(cos(x), -sqrt(3)*sin(x), two=True) == \ 317 (2, 1, -1, x, pi/6, False) 318 assert trig_split(cos(x), sin(x), two=True) == \ 319 (sqrt(2), 1, 1, x, pi/4, False) 320 assert trig_split(cos(x), -sin(x), two=True) == \ 321 (sqrt(2), 1, -1, x, pi/4, False) 322 assert trig_split(sqrt(2)*cos(x), -sqrt(6)*sin(x), two=True) == \ 323 (2*sqrt(2), 1, -1, x, pi/6, False) 324 assert trig_split(-sqrt(6)*cos(x), -sqrt(2)*sin(x), two=True) == \ 325 (-2*sqrt(2), 1, 1, x, pi/3, False) 326 assert trig_split(cos(x)/sqrt(6), sin(x)/sqrt(2), two=True) == \ 327 (sqrt(6)/3, 1, 1, x, pi/6, False) 328 assert trig_split(-sqrt(6)*cos(x)*sin(y), 329 -sqrt(2)*sin(x)*sin(y), two=True) == \ 330 (-2*sqrt(2)*sin(y), 1, 1, x, pi/3, False) 331 332 assert trig_split(cos(x), sin(x)) is None 333 assert trig_split(cos(x), sin(z)) is None 334 assert trig_split(2*cos(x), -sin(x)) is None 335 assert trig_split(cos(x), -sqrt(3)*sin(x)) is None 336 assert trig_split(cos(x)*cos(y), sin(x)*sin(z)) is None 337 assert trig_split(cos(x)*cos(y), sin(x)*sin(y)) is None 338 assert trig_split(-sqrt(6)*cos(x), sqrt(2)*sin(x)*sin(y), two=True) is \ 339 None 340 341 assert trig_split(sqrt(3)*sqrt(x), cos(3), two=True) is None 342 assert trig_split(sqrt(3)*root(x, 3), sin(3)*cos(2), two=True) is None 343 assert trig_split(cos(5)*cos(6), cos(7)*sin(5), two=True) is None 344 345 346def test_TRmorrie(): 347 assert TRmorrie(7*Mul(*[cos(i) for i in range(10)])) == \ 348 7*sin(12)*sin(16)*cos(5)*cos(7)*cos(9)/(64*sin(1)*sin(3)) 349 assert TRmorrie(x) == x 350 assert TRmorrie(2*x) == 2*x 351 e = cos(pi/7)*cos(pi*Rational(2, 7))*cos(pi*Rational(4, 7)) 352 assert TR8(TRmorrie(e)) == Rational(-1, 8) 353 e = Mul(*[cos(2**i*pi/17) for i in range(1, 17)]) 354 assert TR8(TR3(TRmorrie(e))) == Rational(1, 65536) 355 # issue 17063 356 eq = cos(x)/cos(x/2) 357 assert TRmorrie(eq) == eq 358 # issue #20430 359 eq = cos(x/2)*sin(x/2)*cos(x)**3 360 assert TRmorrie(eq) == sin(2*x)*cos(x)**2/4 361 362 363def test_TRpower(): 364 assert TRpower(1/sin(x)**2) == 1/sin(x)**2 365 assert TRpower(cos(x)**3*sin(x/2)**4) == \ 366 (3*cos(x)/4 + cos(3*x)/4)*(-cos(x)/2 + cos(2*x)/8 + Rational(3, 8)) 367 for k in range(2, 8): 368 assert verify_numerically(sin(x)**k, TRpower(sin(x)**k)) 369 assert verify_numerically(cos(x)**k, TRpower(cos(x)**k)) 370 371 372def test_hyper_as_trig(): 373 from sympy.simplify.fu import _osborne as o, _osbornei as i, TR12 374 375 eq = sinh(x)**2 + cosh(x)**2 376 t, f = hyper_as_trig(eq) 377 assert f(fu(t)) == cosh(2*x) 378 e, f = hyper_as_trig(tanh(x + y)) 379 assert f(TR12(e)) == (tanh(x) + tanh(y))/(tanh(x)*tanh(y) + 1) 380 381 d = Dummy() 382 assert o(sinh(x), d) == I*sin(x*d) 383 assert o(tanh(x), d) == I*tan(x*d) 384 assert o(coth(x), d) == cot(x*d)/I 385 assert o(cosh(x), d) == cos(x*d) 386 assert o(sech(x), d) == sec(x*d) 387 assert o(csch(x), d) == csc(x*d)/I 388 for func in (sinh, cosh, tanh, coth, sech, csch): 389 h = func(pi) 390 assert i(o(h, d), d) == h 391 # /!\ the _osborne functions are not meant to work 392 # in the o(i(trig, d), d) direction so we just check 393 # that they work as they are supposed to work 394 assert i(cos(x*y + z), y) == cosh(x + z*I) 395 assert i(sin(x*y + z), y) == sinh(x + z*I)/I 396 assert i(tan(x*y + z), y) == tanh(x + z*I)/I 397 assert i(cot(x*y + z), y) == coth(x + z*I)*I 398 assert i(sec(x*y + z), y) == sech(x + z*I) 399 assert i(csc(x*y + z), y) == csch(x + z*I)*I 400 401 402def test_TR12i(): 403 ta, tb, tc = [tan(i) for i in (a, b, c)] 404 assert TR12i((ta + tb)/(-ta*tb + 1)) == tan(a + b) 405 assert TR12i((ta + tb)/(ta*tb - 1)) == -tan(a + b) 406 assert TR12i((-ta - tb)/(ta*tb - 1)) == tan(a + b) 407 eq = (ta + tb)/(-ta*tb + 1)**2*(-3*ta - 3*tc)/(2*(ta*tc - 1)) 408 assert TR12i(eq.expand()) == \ 409 -3*tan(a + b)*tan(a + c)/(tan(a) + tan(b) - 1)/2 410 assert TR12i(tan(x)/sin(x)) == tan(x)/sin(x) 411 eq = (ta + cos(2))/(-ta*tb + 1) 412 assert TR12i(eq) == eq 413 eq = (ta + tb + 2)**2/(-ta*tb + 1) 414 assert TR12i(eq) == eq 415 eq = ta/(-ta*tb + 1) 416 assert TR12i(eq) == eq 417 eq = (((ta + tb)*(a + 1)).expand())**2/(ta*tb - 1) 418 assert TR12i(eq) == -(a + 1)**2*tan(a + b) 419 420 421def test_TR14(): 422 eq = (cos(x) - 1)*(cos(x) + 1) 423 ans = -sin(x)**2 424 assert TR14(eq) == ans 425 assert TR14(1/eq) == 1/ans 426 assert TR14((cos(x) - 1)**2*(cos(x) + 1)**2) == ans**2 427 assert TR14((cos(x) - 1)**2*(cos(x) + 1)**3) == ans**2*(cos(x) + 1) 428 assert TR14((cos(x) - 1)**3*(cos(x) + 1)**2) == ans**2*(cos(x) - 1) 429 eq = (cos(x) - 1)**y*(cos(x) + 1)**y 430 assert TR14(eq) == eq 431 eq = (cos(x) - 2)**y*(cos(x) + 1) 432 assert TR14(eq) == eq 433 eq = (tan(x) - 2)**2*(cos(x) + 1) 434 assert TR14(eq) == eq 435 i = symbols('i', integer=True) 436 assert TR14((cos(x) - 1)**i*(cos(x) + 1)**i) == ans**i 437 assert TR14((sin(x) - 1)**i*(sin(x) + 1)**i) == (-cos(x)**2)**i 438 # could use extraction in this case 439 eq = (cos(x) - 1)**(i + 1)*(cos(x) + 1)**i 440 assert TR14(eq) in [(cos(x) - 1)*ans**i, eq] 441 442 assert TR14((sin(x) - 1)*(sin(x) + 1)) == -cos(x)**2 443 p1 = (cos(x) + 1)*(cos(x) - 1) 444 p2 = (cos(y) - 1)*2*(cos(y) + 1) 445 p3 = (3*(cos(y) - 1))*(3*(cos(y) + 1)) 446 assert TR14(p1*p2*p3*(x - 1)) == -18*((x - 1)*sin(x)**2*sin(y)**4) 447 448 449def test_TR15_16_17(): 450 assert TR15(1 - 1/sin(x)**2) == -cot(x)**2 451 assert TR16(1 - 1/cos(x)**2) == -tan(x)**2 452 assert TR111(1 - 1/tan(x)**2) == 1 - cot(x)**2 453 454 455def test_as_f_sign_1(): 456 assert as_f_sign_1(x + 1) == (1, x, 1) 457 assert as_f_sign_1(x - 1) == (1, x, -1) 458 assert as_f_sign_1(-x + 1) == (-1, x, -1) 459 assert as_f_sign_1(-x - 1) == (-1, x, 1) 460 assert as_f_sign_1(2*x + 2) == (2, x, 1) 461 assert as_f_sign_1(x*y - y) == (y, x, -1) 462 assert as_f_sign_1(-x*y + y) == (-y, x, -1) 463