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