
    sgf                        d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d Z;d Z<d Z=d=dZ>d Z?d Z@d ZAd>dZBd>dZCd ZDd?d ZEd! ZFd?d"ZGd# ZHd@d%ZId& ZJd?d'ZKd( ZLd) ZMd* ZNd?d+ZOd>d,ZPd>d-ZQd. ZRd>d/ZSd0 ZTd1 ZUe:r< eV eWe8e;e<e=e?e@eBeCeDeEeFeGeIeKeMe>eNeOePeQeLeReSf            \  Z;Z<Z=Z?Z@ZBZCZDZEZFZGZIZKZMZ>ZNZOZPZQZLZRZSeBe;feCe;fe7gZXeIeBe;feCe;fe;gfZYeNeEe;feNeEeHe;fe7gZZe@eHfe7gZ[e@e?e@eKe@eMe@e;fZ\e@e?eGe@e?eIfeBeDeIe@feZeXeFeYe@eFeFe[fe7gZ]d2 fd3Z^dAd4Z_d5j                         Za eb eV ecea eV eW ed       j                  ea                              Zfd6 Zgd$ahd=d7Zid8 Zjd9 Zkd: Zld; Zmd< Zny$)B    )defaultdict)Add)Expr)Factors	gcd_termsfactor_terms)
expand_mul)Mul)piI)Pow)S)ordered)Dummy)sympify	bottom_up)binomial)coshsinhtanhcothsechcschHyperbolicFunction)cossintancotseccscsqrtTrigonometricFunction)perfect_power)factor)greedy)identitydebug)SYMPY_DEBUGc                 Z    | j                         j                         j                         S )zSimplification of rational polynomials, trying to simplify
    the expression, e.g. combine things like 3*x + 2*x, etc....
    )normalr%   expandrvs    D/var/www/html/venv/lib/python3.12/site-packages/sympy/simplify/fu.pyTR0r0      s"     99;&&((    c                      d }t        | |      S )zReplace sec, csc with 1/cos, 1/sin

    Examples
    ========

    >>> from sympy.simplify.fu import TR1, sec, csc
    >>> from sympy.abc import x
    >>> TR1(2*csc(x) + sec(x))
    1/cos(x) + 2/sin(x)
    c                     t        | t              r+| j                  d   }t        j                  t        |      z  S t        | t              r+| j                  d   }t        j                  t        |      z  S | S Nr   )
isinstancer    argsr   Oner   r!   r   r.   as     r/   fzTR1.<locals>.f4   sY    b#
A55Q<C 
A55Q<	r1   r   r.   r:   s     r/   TR1r<   (   s     Rr1   c                      d }t        | |      S )a@  Replace tan and cot with sin/cos and cos/sin

    Examples
    ========

    >>> from sympy.simplify.fu import TR2
    >>> from sympy.abc import x
    >>> from sympy import tan, cot, sin, cos
    >>> TR2(tan(x))
    sin(x)/cos(x)
    >>> TR2(cot(x))
    cos(x)/sin(x)
    >>> TR2(tan(tan(x) - sin(x)/cos(x)))
    0

    c                     t        | t              r&| j                  d   }t        |      t	        |      z  S t        | t
              r&| j                  d   }t	        |      t        |      z  S | S r4   )r5   r   r6   r   r   r   r8   s     r/   r:   zTR2.<locals>.fR   sY    b#
Aq6#a&= C 
Aq6#a&= 	r1   r   r;   s     r/   TR2r?   @   s    $ Rr1   c                 &    fd}t        | |      S )a  Converts ratios involving sin and cos as follows::
        sin(x)/cos(x) -> tan(x)
        sin(x)/(cos(x) + 1) -> tan(x/2) if half=True

    Examples
    ========

    >>> from sympy.simplify.fu import TR2i
    >>> from sympy.abc import x, a
    >>> from sympy import sin, cos
    >>> TR2i(sin(x)/cos(x))
    tan(x)

    Powers of the numerator and denominator are also recognized

    >>> TR2i(sin(x)**2/(cos(x) + 1)**2, half=True)
    tan(x/2)**2

    The transformation does not take place unless assumptions allow
    (i.e. the base must be positive or the exponent must be an integer
    for both numerator and denominator)

    >>> TR2i(sin(x)**a/(cos(x) + 1)**a)
    sin(x)**a/(cos(x) + 1)**a

    c           
         | j                   s| S | j                         \  }}|j                  s|j                  r| S fd|j                         }t	        |j                               D cg c]"  } |||         r||j                  |      f$ }}|s| S |j                         }t	        |j                               D cg c]"  } |||         r||j                  |      f$ }}|s| S fd} |||        |||       g }|D ]"  }t        |t              rt        |j                  d   d      }||v rC||   ||   k(  r8|j                  t        |j                  d         ||   z         d x||<   ||<   usxd|z   }	|	|v s||	   ||   k(  s|j                  t        |j                  d   dz        ||   z         d x||<   ||	<   t        |t              rft        |j                  d   d      }||v s||   ||   k(  s|j                  t        |j                  d         ||    z         d x||<   ||<   ?sC|j                  sQ|j                  d   t        j                  u srt        |j                  d   t              st        |j                  d   j                  d   d      }||v s||   ||   k(  s||   j                   s|j"                  s|j                  t        |j                  d   dz        ||    z         d x||<   ||<   % |rt%        ||j'                         D 
cg c]  \  }
}|s	|
|z   c}}
z    t%        |j'                         D 
cg c]  \  }
}|s	|
|z   c}}
 z  } | t%        |D 
cg c]
  \  }
}|
|z   c}}
 t%        |D 
cg c]
  \  }
}|
|z   c}}
 z  z  } | S c c}w c c}w c c}}
w c c}}
w c c}}
w c c}}
w )Nc                     |j                   xs | j                  xrb | j                  t        t        fv xsH xrD | j
                  xr6 t        | j                        dk\  xr t        d | j                  D              S )N   c              3   f   K   | ])  }t        d  t        j                  |      D               + yw)c              3      K   | ]6  }t        |t              xs  |j                  xr |j                  t        u  8 y wN)r5   r   is_Powbase).0ais     r/   	<genexpr>z8TR2i.<locals>.f.<locals>.ok.<locals>.<genexpr>.<genexpr>   s8      , #2s+Kryy/KRWW^K ,s   <>N)anyr
   	make_args)rI   r9   s     r/   rK   z.TR2i.<locals>.f.<locals>.ok.<locals>.<genexpr>   s3      =01  ,--*, , =s   /1)	
is_integeris_positivefuncr   r   is_Addlenr6   rL   )kehalfs     r/   okzTR2i.<locals>.f.<locals>.ok   sx     . ?3*$ > *=*=AFFq *=  =56VV= =@r1   c                    g }| D ]Y  }|j                   st        |j                        dkD  s)rt        |      n
t	        |      }||k7  sG|j                  ||f       [ |rjt        |      D ]  \  }\  }}| |= |||<    t        | j                         }|D ]/  }| |   ||   z   } ||      r|| |<   |j                  ||f       1 ~y y N   )	rQ   rR   r6   r%   r   append	enumerater
   as_powers_dict)	dddonenewkrS   knewivrU   rV   s	          r/   	factorizez"TR2i.<locals>.f.<locals>.factorize   s    D /88AFFa(,6!9,q/DqyQI.	/
 $-dO #LAy4!"DG# Dz002 -A!tAwA!Qx !aV,-  r1   r   FevaluaterY   rC   )is_Mulas_numer_denomis_Atomr\   listkeyspopr5   r   r   r6   rZ   r   rQ   r   r7   rN   rO   r
   items)r.   nr]   rS   ndoner^   rc   tr9   a1brT   rV   rU   s               @r/   r:   zTR2i.<locals>.fz   s   yyI  "199		I	@ (,QVVXJ1bAaDk!QUU1XJJI(,QVVXJ1bAaDk!QUU1XJJI	& 	!U!U  	'A!S!q	E26adadlHHS^QqT12"&&AaD1Q4QBQw1R5AaD=#affQik"2QqT!9:'++!quAs#q	E26adadlHHS^adU23"&&AaD1Q4!((qvvayAEE'9qvvay#.q	q)E:6adadl!HHS1-!u45"&&AaD1Q4-	'0 qQWWY<TQ!AqD<<>qwwy6tq!Aad678B#/A1/06N1q!t6N1OOOB	A K
 Kn =6/6Ns<   .O OO O 
O%O% 
O+O+$O1O7r   )r.   rU   r:   s    ` r/   TR2irr   ^   s    8Sj Rr1   c                 Z    ddl m fd}| j                  d d       } t        | |      S )aR  Induced formula: example sin(-a) = -sin(a)

    Examples
    ========

    >>> from sympy.simplify.fu import TR3
    >>> from sympy.abc import x, y
    >>> from sympy import pi
    >>> from sympy import cos
    >>> TR3(cos(y - x*(y - x)))
    cos(x*(x - y) + y)
    >>> cos(pi/2 + x)
    -sin(x)
    >>> cos(30*pi/2 + x)
    -cos(x)

    r   signsimpc                 D   t        | t              s| S | j                   | j                  d               } t        | t              s| S | j                  d   t        j
                  dz  z
  j                  t        j
                  dz  | j                  d   z
  j                  cxu rdu rwn | S t        t        t        t        t        t        t        t        t        t        t        t        i} |t        |          t        j
                  dz  | j                  d   z
        } | S )Nr      rC   T)r5   r#   rP   r6   r   PirO   r   r   r   r   r    r!   type)r.   fmapru   s     r/   r:   zTR3.<locals>.f   s    "34IWWXbggaj)*"34IGGAJa,,a"''!*1D0Q0QYUYY 	 c3S#sCc3ODd2hQ 34B	r1   c                 "    t        | t              S rF   )r5   r#   xs    r/   <lambda>zTR3.<locals>.<lambda>   s    *Q 56 r1   c                 *    | j                  d d       S )Nc                 6    | j                   xr | j                  S rF   )	is_numberrf   rm   s    r/   r~   z'TR3.<locals>.<lambda>.<locals>.<lambda>   s    akk.ahh r1   c                 4     | j                   | j                   S rF   rP   r6   r   s    r/   r~   z'TR3.<locals>.<lambda>.<locals>.<lambda>   s    faffaffo r1   replacer|   s    r/   r~   zTR3.<locals>.<lambda>   s    !)).%' r1   )sympy.simplify.simplifyru   r   r   )r.   r:   ru   s     @r/   TR3r      s4    $ 1	 
6	'
(B Rr1   c                 *    | j                  d d       S )a  Identify values of special angles.

        a=  0   pi/6        pi/4        pi/3        pi/2
    ----------------------------------------------------
    sin(a)  0   1/2         sqrt(2)/2   sqrt(3)/2   1
    cos(a)  1   sqrt(3)/2   sqrt(2)/2   1/2         0
    tan(a)  0   sqt(3)/3    1           sqrt(3)     --

    Examples
    ========

    >>> from sympy import pi
    >>> from sympy import cos, sin, tan, cot
    >>> for s in (0, pi/6, pi/4, pi/3, pi/2):
    ...    print('%s %s %s %s' % (cos(s), sin(s), tan(s), cot(s)))
    ...
    1 0 0 zoo
    sqrt(3)/2 1/2 sqrt(3)/3 sqrt(3)
    sqrt(2)/2 sqrt(2)/2 1 1
    1/2 sqrt(3)/2 sqrt(3) sqrt(3)/3
    0 1 zoo 0
    c                     t        | t              xr2 | j                  d   t        z  x}j                  xr |j
                  dv S )Nr   )rY   rC      rw      )r5   r#   r6   r   is_Rationalq)r}   rs     r/   r~   zTR4.<locals>.<lambda>  sC    q/0 Eq	"_Q))E./cc_.D r1   c                     | j                   | j                  d   j                   | j                  d   j                         S r4   r   r|   s    r/   r~   zTR4.<locals>.<lambda>  s2    FF>166!9>>166!9>>23 r1   r   r-   s    r/   TR4r     s     0 ::	E	4	5 5r1   c                 6    fd}t        | |      S )a+  Helper for TR5 and TR6 to replace f**2 with h(g**2)

    Options
    =======

    max :   controls size of exponent that can appear on f
            e.g. if max=4 then f**4 will be changed to h(g**2)**2.
    pow :   controls whether the exponent must be a perfect power of 2
            e.g. if pow=True (and max >= 6) then f**6 will not be changed
            but f**8 will be changed to h(g**2)**4

    >>> from sympy.simplify.fu import _TR56 as T
    >>> from sympy.abc import x
    >>> from sympy import sin, cos
    >>> h = lambda x: 1 - x
    >>> T(sin(x)**3, sin, cos, h, 4, False)
    (1 - cos(x)**2)*sin(x)
    >>> T(sin(x)**6, sin, cos, h, 6, False)
    (1 - cos(x)**2)**3
    >>> T(sin(x)**6, sin, cos, h, 6, True)
    sin(x)**6
    >>> T(sin(x)**8, sin, cos, h, 10, True)
    (1 - cos(x)**2)**4
    c                 J   | j                   r| j                  j                  k(  s| S | j                  j                  s| S | j                  dk  dk(  r| S | j                  kD  dk(  r| S | j                  dk(  r| S | j                  dk(  r(  | j                  j
                  d         dz        S | j                  dz  dk(  rZ| j                  dz  } | j                  j
                  d           | j                  j
                  d         dz        |z  z  S | j                  dk(  rd}nKs!| j                  dz  r| S | j                  dz  }n(t        | j                        }|s| S | j                  dz  }  | j                  j
                  d         dz        |z  S )Nr   TrY   rC   rw   )rG   rH   rP   expis_realr6   r$   )r.   rT   pr:   ghmaxpows      r/   _fz_TR56.<locals>._f=  sg   
 		bgglla/Ivv~~IFFQJ4IFFSLT!I66Q;I66Q;Qrww||A'*++vvzQFFAIa)!Abggll1o,>,A*BA*EEE166A:IFFAI!"&&)IFFAIQrww||A'*+Q..r1   r   )r.   r:   r   r   r   r   r   s    ````` r/   _TR56r   #  s    4!/ !/F Rr1   c                 6    t        | t        t        d ||      S )a  Replacement of sin**2 with 1 - cos(x)**2.

    See _TR56 docstring for advanced use of ``max`` and ``pow``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR5
    >>> from sympy.abc import x
    >>> from sympy import sin
    >>> TR5(sin(x)**2)
    1 - cos(x)**2
    >>> TR5(sin(x)**-2)  # unchanged
    sin(x)**(-2)
    >>> TR5(sin(x)**4)
    (1 - cos(x)**2)**2
    c                     d| z
  S rX    r|   s    r/   r~   zTR5.<locals>.<lambda>u  
    Q r1   r   r   )r   r   r   r.   r   r   s      r/   TR5r   c      $ S#CSAAr1   c                 6    t        | t        t        d ||      S )a  Replacement of cos**2 with 1 - sin(x)**2.

    See _TR56 docstring for advanced use of ``max`` and ``pow``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR6
    >>> from sympy.abc import x
    >>> from sympy import cos
    >>> TR6(cos(x)**2)
    1 - sin(x)**2
    >>> TR6(cos(x)**-2)  #unchanged
    cos(x)**(-2)
    >>> TR6(cos(x)**4)
    (1 - sin(x)**2)**2
    c                     d| z
  S rX   r   r|   s    r/   r~   zTR6.<locals>.<lambda>  r   r1   r   )r   r   r   r   s      r/   TR6r   x  r   r1   c                      d }t        | |      S )a  Lowering the degree of cos(x)**2.

    Examples
    ========

    >>> from sympy.simplify.fu import TR7
    >>> from sympy.abc import x
    >>> from sympy import cos
    >>> TR7(cos(x)**2)
    cos(2*x)/2 + 1/2
    >>> TR7(cos(x)**2 + 1)
    cos(2*x)/2 + 3/2

    c                     | j                   r,| j                  j                  t        k(  r| j                  dk(  s| S dt        d| j                  j
                  d   z        z   dz  S )NrC   rY   r   )rG   rH   rP   r   r   r6   r-   s    r/   r:   zTR7.<locals>.f  sM    		bggllc1bffkIC"'',,q/)**A--r1   r   r;   s     r/   TR7r     s     .
 Rr1   c                 &    fd}t        | |      S )aq  Converting products of ``cos`` and/or ``sin`` to a sum or
    difference of ``cos`` and or ``sin`` terms.

    Examples
    ========

    >>> from sympy.simplify.fu import TR8
    >>> from sympy import cos, sin
    >>> TR8(cos(2)*cos(3))
    cos(5)/2 + cos(1)/2
    >>> TR8(cos(2)*sin(3))
    sin(5)/2 + sin(1)/2
    >>> TR8(sin(2)*sin(3))
    -cos(5)/2 + cos(1)/2
    c                    | j                   s\| j                  rN| j                  j                  t        t
        fv r,| j                  j                  s| j                  j                  s| S r| j                         D cg c]  }t        |       c}\  }}t        |d      }t        |d      }||k7  s||k7  rzt        ||z        } | j                   r`| j                  d   j                  rGt        | j                        dk(  r/| j                  d   j                   rt#        | j%                          } | S t        g t
        g d g i}t#        j&                  |       D ]  }|j                  t        t
        fv r+|t)        |         j+                  |j                  d          F|j                  r|j                  j,                  r~|j                  dkD  ro|j                  j                  t        t
        fv rM|t)        |j                           j/                  |j                  j                  d   g|j                  z         |d    j+                  |        |t           }|t
           }	|r|	st        |      dkD  st        |	      dkD  s| S |d    }t1        t        |      t        |	            }t3        |      D ]Q  }|	j5                         }
|j5                         }|j+                  t        |
|z         t        |
|z
        z   dz         S t        |      dkD  r^|j5                         }
|j5                         }|j+                  t	        |
|z         t	        |
|z
        z   dz         t        |      dkD  r^|r(|j+                  t	        |j5                                      t        |	      dkD  r_|	j5                         }
|	j5                         }|j+                  t	        |
|z          t	        |
|z
        z   dz         t        |	      dkD  r_|	r(|j+                  t        |	j5                                      t        t        t#        |             S c c}w )NFfirstr   rC   rY   )rf   rG   rH   rP   r   r   r   rN   rO   rg   r	   TR8r   r6   r   rR   rQ   r
   as_coeff_MulrM   ry   rZ   
is_Integerextendminrangerk   )r.   ra   rm   r]   newnnewdr6   r9   csrp   a2r   s               r/   r:   zTR8.<locals>.f  sR   IIIIGGLLS#J&VV"''"5"5I+-+<+<+>?aJqM?DAqq&Dq&DqyDAItDy)99!7!7BGG)bggaj.?.?boo/0BIRb$+r" 		%Avv#s#T!W$$QVVAY/((quu//AEEAIFFKKC:- T!&&\"))166;;q>*:155*@AT
!!!$		% IIa3q6A:Q!IDzAAq 	9ABBKKR"WBG4a78	9 !fqjBBKKR"WBG4a78 !fqj KKAEEG%!fqjBBKK#b2g,R"W5q89 !fqj KKAEEG%:c4j)**Y @s   >Qr   r.   r   r:   s    ` r/   r   r     s    "5+n Rr1   c                      d }t        | |      S )ac  Sum of ``cos`` or ``sin`` terms as a product of ``cos`` or ``sin``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR9
    >>> from sympy import cos, sin
    >>> TR9(cos(1) + cos(2))
    2*cos(1/2)*cos(3/2)
    >>> TR9(cos(1) + 2*sin(1) + 2*sin(2))
    cos(1) + 4*sin(3/2)*cos(1/2)

    If no change is made by TR9, no re-arrangement of the
    expression will be made. For example, though factoring
    of common term is attempted, if the factored expression
    was not changed, the original expression will be returned:

    >>> TR9(cos(3) + cos(3)*cos(2))
    cos(3) + cos(2)*cos(3)

    c                 D    | j                   s| S dfd	t        |       S )Nc                 n   | j                   s| S t        t        | j                              }t	        |      dk7  rd}t        t	        |            D ]O  }||   }|t        |dz   t	        |            D ]*  }||   }|||z   } |      }	|	|k7  s|	||<   d ||<   d} O Q |r-t        |D 
cg c]  }
|
s|
	 c}
 } | j                   r |       } | S t        | }|s| S |\  }}}}}}|rc||k(  r,||z  dz  t        ||z   dz        z  t        ||z
  dz        z  S |dk  r||}}d|z  t        ||z   dz        z  t        ||z
  dz        z  S ||k(  r,||z  dz  t        ||z   dz        z  t        ||z
  dz        z  S |dk  r||}}d|z  t        ||z   dz        z  t        ||z
  dz        z  S c c}
w )NrC   FrY   Tr   
rQ   ri   r   r6   rR   r   r   
trig_splitr   r   )r.   r   r6   hitra   rJ   jajwasnewr   splitgcdn1n2r9   rq   iscosdos                     r/   r   zTR9.<locals>.f.<locals>.do  s    99	()D4yA~s4y) "AaBz "1q5#d)4 
"!!W:$ 2g g#:&)DG&*DG"&C!
"	" D7bBr78ByyV	 %E	',$CRAu 8r6!8CQ	N23Aqy>AA6aqA#vc1q5!)n,S!a%^;;8r6!8CQ	N23Aqy>AA6aqAuS!a%^+CQ	N::1 8s   /F27F2T)rQ   process_common_addends)r.   r   s    @r/   r:   zTR9.<locals>.f  s$    yyI<	;| &b"--r1   r   r;   s     r/   TR9r     s    .B.H Rr1   c                 &    fd}t        | |      S )a  Separate sums in ``cos`` and ``sin``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR10
    >>> from sympy.abc import a, b, c
    >>> from sympy import cos, sin
    >>> TR10(cos(a + b))
    -sin(a)*sin(b) + cos(a)*cos(b)
    >>> TR10(sin(a + b))
    sin(a)*cos(b) + sin(b)*cos(a)
    >>> TR10(sin(a + b + c))
    (-sin(a)*sin(b) + cos(a)*cos(b))*sin(c) +     (sin(a)*cos(b) + sin(b)*cos(a))*cos(c)
    c                 N   | j                   t        t        fvr| S | j                   }| j                  d   }|j                  rart        t        |j                              }nt        |j                        }|j                         }t        j                  |      }|j                  r|t        k(  rEt        |      t        t        |      d      z  t        |      t        t        |      d      z  z   S t        |      t        t        |      d      z  t        |      t        t        |      d      z  z
  S |t        k(  r/t        |      t        |      z  t        |      t        |      z  z   S t        |      t        |      z  t        |      t        |      z  z
  S | S )Nr   Fr   )rP   r   r   r6   rQ   ri   r   rk   r   
_from_argsTR10)r.   r:   argr6   r9   rq   r   s         r/   r:   zTR10.<locals>.f`  sE   773*$IGGggaj::GCHH-.CHH~
At$Axx8q6$s1vU";;AtCF%889 9 q6$s1vU";;AtCF%889 9 8q6#a&=3q6#a&=88q6#a&=3q6#a&=88	r1   r   r   s    ` r/   r   r   N  s    $6 Rr1   c                 @    t         
t                d }t        | |      S )a  Sum of products to function of sum.

    Examples
    ========

    >>> from sympy.simplify.fu import TR10i
    >>> from sympy import cos, sin, sqrt
    >>> from sympy.abc import x

    >>> TR10i(cos(1)*cos(3) + sin(1)*sin(3))
    cos(2)
    >>> TR10i(cos(1)*sin(3) + sin(1)*cos(3) + cos(3))
    cos(3) + sin(4)
    >>> TR10i(sqrt(2)*cos(x)*x + sqrt(6)*sin(x)*x)
    2*sqrt(2)*x*sin(x + pi/6)

    c                    | j                   s| S dfd	t        | d       } | j                   rt        t              }| j                  D ]  }d}|j
                  ri|j                  D ]Z  }|j                  s|j                  t        j                  u s-|j                  j                  sD||   j                  |       d} n |r}|t        j                     j                  |        g }|D ]  }t        |z  t        fD ]  }||v st!        t#        ||               D ]z  }||   |   t!        t#        ||               D ]U  }||   |   t%        ||   |   ||   |   z         }	 |	      }
|
|	k7  s4|j                  |
       d ||   |<   d ||   |<    z |   |rAt%        ||j'                         D cg c]  }t%        |D cg c]  }|s|	 c}  c}}z    } n |       } 	 | S | j                   r| S c c}w c c}}w )Nc                    | j                   s| S t        t        | j                              }t	        |      dk7  rd}t        t	        |            D ]O  }||   }|t        |dz   t	        |            D ]*  }||   }|||z   } |      }	|	|k7  s|	||<   d ||<   d} O Q |r-t        |D 
cg c]  }
|
s|
	 c}
 } | j                   r |       } | S t        |ddi}|s| S |\  }}}}}}|r,||z  }||k(  r|t        ||z
        z  S |t        ||z         z  S ||z  }||k(  r|t        ||z         z  S |t        ||z
        z  S c c}
w )NrC   FrY   Ttwor   )r.   r   r6   r   ra   rJ   r   r   r   r   r   r   r   r   r   r9   rq   samer   s                     r/   r   zTR10i.<locals>.f.<locals>.do  s    99	()D4yA~s4y) "AaBz "1q5#d)4 
"!!W:$ 2g g#:&)DG&*DG"&C!
"	" D7bBr78ByyV	 /$/E	&+#CRAt f8s1q5z>)3q1u:~%f8s1q5z>)3q1u:~%- 8s   /E7Ec                 >    t        t        | j                              S rF   )tupler   free_symbolsr|   s    r/   r~   z"TR10i.<locals>.f.<locals>.<lambda>  s    eGANN$;< r1   r   rY   r   )rQ   r   r   ri   r6   rf   rG   r   r   HalfrH   r   rZ   r7   _ROOT3	_invROOT3r   rR   r   values)r.   byradr9   r   rJ   r6   rq   ra   r   r   r   rb   r   r   s                @r/   r:   zTR10i.<locals>.f  s    yyI6	&p $<>
 ii%EWW 
+88ff "99166)9 " 2 2!"I,,Q/"#C!" !%%L''*
+ D * (I. *AEz!&s58}!5 *A$Qx{2 (%*3uQx=%9 	*#(8A;#6$,&)%(1+a*C&D&(g#&#:$(KK$426E!HQK26E!HQK$)	****  4"\\^#- $'a(>2(>#? #- - / V	Q iiP 	 )? #-s   >HHHHH)_ROOT2_rootsr   r;   s     r/   TR10ir   ~  s$    & ~iV Rr1   Nc                 &    fd}t        | |      S )an  Function of double angle to product. The ``base`` argument can be used
    to indicate what is the un-doubled argument, e.g. if 3*pi/7 is the base
    then cosine and sine functions with argument 6*pi/7 will be replaced.

    Examples
    ========

    >>> from sympy.simplify.fu import TR11
    >>> from sympy import cos, sin, pi
    >>> from sympy.abc import x
    >>> TR11(sin(2*x))
    2*sin(x)*cos(x)
    >>> TR11(cos(2*x))
    -sin(x)**2 + cos(x)**2
    >>> TR11(sin(4*x))
    4*(-sin(x)**2 + cos(x)**2)*sin(x)*cos(x)
    >>> TR11(sin(4*x/3))
    4*(-sin(x/3)**2 + cos(x/3)**2)*sin(x/3)*cos(x/3)

    If the arguments are simply integers, no change is made
    unless a base is provided:

    >>> TR11(cos(2))
    cos(2)
    >>> TR11(cos(4), 2)
    -sin(2)**2 + cos(2)**2

    There is a subtle issue here in that autosimplification will convert
    some higher angles to lower angles

    >>> cos(6*pi/7) + cos(3*pi/7)
    -cos(pi/7) + cos(3*pi/7)

    The 6*pi/7 angle is now pi/7 but can be targeted with TR11 by supplying
    the 3*pi/7 base:

    >>> TR11(_, 3*pi/7)
    -sin(3*pi/7)**2 + cos(3*pi/7)**2 + cos(3*pi/7)

    c                 (   | j                   t        t        fvr| S r| j                   } |dz        }t        j                  }|j
                  r|j                         \  }}|j                   t        t        fvr| S | j                  d   |j                  d   k(  r7t              }t              }|t        u r|dz  |dz  z
  |z  S d|z  |z  |z  S | S | j                  d   j                  s| j                  d   j                  d      \  }}|j                  dz  dk(  ro|j                  dz  |z  |j                  z  }t        t        |            }t        t        |            }| j                   t        k(  r
d|z  |z  } | S |dz  |dz  z
  } | S )NrC   r   T)rational)rP   r   r   r   r7   rf   r   r6   	is_Numberr   r   TR11)	r.   r:   ro   cor   r   mr   rH   s	           r/   r:   zTR11.<locals>.f,  so   773*$IA$q&	ABxx(Avvc3Z'	wwqzQVVAY&II8qD1a4K++Q3q58OI%% 771:**D*9DAqssQw!|cc1fQhqsslSNSN77c>1QB 	 A1B	r1   r   )r.   rH   r:   s    ` r/   r   r     s    T!F Rr1   c                      d }t        | |      S )a  
    Helper for TR11 to find half-arguments for sin in factors of
    num/den that appear in cos or sin factors in the den/num.

    Examples
    ========

    >>> from sympy.simplify.fu import TR11, _TR11
    >>> from sympy import cos, sin
    >>> from sympy.abc import x
    >>> TR11(sin(x/3)/(cos(x/6)))
    sin(x/3)/cos(x/6)
    >>> _TR11(sin(x/3)/(cos(x/6)))
    2*sin(x/6)
    >>> TR11(sin(x/6)/(sin(x/3)))
    sin(x/6)/sin(x/3)
    >>> _TR11(sin(x/6)/(sin(x/3)))
    1/(2*cos(x/6))

    c                     t        | t              s| S d }t        || j                               \  }}d } || ||      }  || ||      } | S )Nc                 *   t        t              }t        j                  |       D ]k  }|j	                         \  }}|j
                  s#|dkD  s)|j                  t        t        fv sB|t        |         j                  |j                  d          m |S r4   )r   setr
   rM   as_base_expr   rP   r   r   ry   addr6   )flatr6   firq   rT   s        r/   sincos_argsz%_TR11.<locals>.f.<locals>.sincos_argsk  sx     s#DmmD) 5~~'1<<AEvv#s+T!W))!&&)4	5
 Kr1   c                     |t            D ]L  }|dz  }||t           v rt        }n||t            v rt         }n-t        | |      } ||   j                  |       N | S NrC   )r   r   r   remove)r.   num_argsden_argsnargrU   rP   s         r/   handle_matchz&_TR11.<locals>.f.<locals>.handle_matchw  si     ! 	,Av8C=(DXc]*D"d^%%d+	, Ir1   )r5   r   maprg   )r.   r   r   r   r   s        r/   r:   z_TR11.<locals>.fg  sZ    "d#I
	 !b.?.?.AB(	  "h1"h1	r1   r   r;   s     r/   _TR11r   R  s    *#J Rr1   c                 &    fd}t        | |      S )zSeparate sums in ``tan``.

    Examples
    ========

    >>> from sympy.abc import x, y
    >>> from sympy import tan
    >>> from sympy.simplify.fu import TR12
    >>> TR12(tan(x + y))
    (tan(x) + tan(y))/(-tan(x)*tan(y) + 1)
    c                    | j                   t        k(  s| S | j                  d   }|j                  rrt	        t        |j                              }nt	        |j                        }|j                         }t        j                  |      }|j                  rt        t        |      d      }nt        |      }t        |      |z   dt        |      |z  z
  z  S | S )Nr   Fr   rY   )
rP   r   r6   rQ   ri   r   rk   r   r   TR12)r.   r   r6   r9   rq   tbr   s         r/   r:   zTR12.<locals>.f  s    ww#~Iggaj::GCHH-.CHH~
At$Axx#a&.VFRK!c!fRi-00	r1   r   r   s    ` r/   r   r     s    & Rr1   c                      d }t        | |      S )aK  Combine tan arguments as
    (tan(y) + tan(x))/(tan(x)*tan(y) - 1) -> -tan(x + y).

    Examples
    ========

    >>> from sympy.simplify.fu import TR12i
    >>> from sympy import tan
    >>> from sympy.abc import a, b, c
    >>> ta, tb, tc = [tan(i) for i in (a, b, c)]
    >>> TR12i((ta + tb)/(-ta*tb + 1))
    tan(a + b)
    >>> TR12i((ta + tb)/(ta*tb - 1))
    -tan(a + b)
    >>> TR12i((-ta - tb)/(ta*tb - 1))
    tan(a + b)
    >>> eq = (ta + tb)/(-ta*tb + 1)**2*(-3*ta - 3*tc)/(2*(ta*tc - 1))
    >>> TR12i(eq.expand())
    -3*tan(a + b)*tan(a + c)/(2*(tan(a) + tan(b) - 1))
    c                 @	   | j                   s| j                  s| j                  s| S | j                         \  }}|j                  r|j                  s| S i }d }t        t        j                  |            }t        |      D ]  \  }} ||      }|rK|\  }	}
t        |
j                  D cg c]  }|j                  d    c} }t        j                  ||<   |	||<   \|j                   rGt        |      }|j                  s|j                  |j                         t        j                  ||<   |j                  s|j                  j                  s|j                   j"                  s ||j                         }|rU|\  }	}
t        |
j                  D cg c]  }|j                  d    c} }|j                  ||<   |	|j                  z  ||<   Rt        |      }|j                  sk|j                  |j                         t        j                  ||<    |s| S d }t        t        j                  t%        |                  }d}t        |      D ]  \  }} ||      }|s ||       }|rt        j&                  ||<   n|j                   rFt        |      }|j                  r.|j                  |j                         t        j                  ||<   |j                  r|j                  j                  s|j                   j"                  ro ||j                         }|rt        j                  ||<   n\t        |      }|j                  r.|j                  |j                         t        j                  ||<   +-t        j                  ||<   d}t        |D cg c]  }|j                  d    c} }||   }|j)                  t        j                        }||r|||<   n|j+                  |       ||xx   t-        |       z  cc<    |rjt        | t        | z  t        |j/                         D cg c]4  \  }}t        |j                  D cg c]  }t-        |       c} dz
  |z  6 c}}} z  } | S c c}w c c}w c c}w c c}w c c}}}w )Nc                     t        |       }|r`|\  }}}|t        j                  u rG|j                  r:t	        |j
                        dk(  r!t        d |j
                  D              r||fS y y y y y )NrC   c              3   <   K   | ]  }t        |t                y wrF   )r5   r   )rI   r   s     r/   rK   z/TR12i.<locals>.f.<locals>.ok.<locals>.<genexpr>  s     ABJr3/As   )as_f_sign_1r   NegativeOnerf   rR   r6   all)dir   r   r:   r   s        r/   rV   zTR12i.<locals>.f.<locals>.ok  sk    BA1a%!((s166{a7GA!&&AAa4K B 8H(% r1   r   c                     | j                   rNt        | j                        dk(  r5| j                  \  }}t        |t              rt        |t              r||fS y y y y r   )rQ   rR   r6   r5   r   )nir9   rq   s      r/   rV   zTR12i.<locals>.f.<locals>.ok  sP    yyS\Q.ww1a%*Q*<a4K +=% /yr1   FTrY   )rQ   rf   rG   rg   r6   ri   r
   rM   r[   r   r   r7   r%   r   r   rN   rH   rO   r   r  extract_additivelyrk   r   rl   )r.   rm   r]   dokrV   d_argsra   r  r   r   ro   _r   n_argsr   r
  ednewedrT   r9   s                       r/   r:   zTR12i.<locals>.f  s   		RYY"))I  "1vvQVVI	  cmmA&'v& 	*EAr2A1QVV4!&&)45Aq	yyBZ99MM"''* !F1I 1 1RWW5H5HrwwKDAq8AaffQi89AVVCF !266	F1IByybgg.$%EEq	1	*2 I	 
 cmmLO45v& %	!EAr2AsG !F1Iyy#BZ99"MM"''2()F1I FF--1D1DrwwK()F1I!'B!yy &bgg 6,-EEq	$ EEq	C+AaffQi+,AQB))!%%0E "CFGGAJ1I#a& IK%	!N fc6l*3=@YY[1J 1J59Q 36 !8(A8( 3)+,3-/021 1J ,K KB 	U 5 9^ ,8( 1Js*   +R
R

$R
RR/RRr   r;   s     r/   TR12ir    s    *aF Rr1   c                      d }t        | |      S )a  Change products of ``tan`` or ``cot``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR13
    >>> from sympy import tan, cot
    >>> TR13(tan(3)*tan(2))
    -tan(2)/tan(5) - tan(3)/tan(5) + 1
    >>> TR13(cot(3)*cot(2))
    cot(2)*cot(5) + 1 + cot(3)*cot(5)
    c           	      R   | j                   s| S t        g t        g d g i}t        j                  |       D ]Y  }|j
                  t        t        fv r+|t        |         j                  |j                  d          F|d    j                  |       [ |t           }|t           }t        |      dk  rt        |      dk  r| S |d    }t        |      dkD  rv|j                         }|j                         }|j                  dt        |      t        ||z         z  t        |      t        ||z         z  z   z
         t        |      dkD  rv|r(|j                  t        |j                                      t        |      dkD  rv|j                         }|j                         }|j                  dt        |      t        ||z         z  z   t        |      t        ||z         z  z          t        |      dkD  rv|r(|j                  t        |j                                      t        | S Nr   rC   rY   )rf   r   r   r
   rM   rP   ry   rZ   r6   rR   rk   )r.   r6   r9   ro   r   t1t2s          r/   r:   zTR13.<locals>.f;  s   yyI Rb$+r" 	%Avv#s#T!W$$QVVAY/T
!!!$		%
 IIq6A:#a&1*IDz!fqjBBKKSWSb\1CGCRL4HHIJ !fqj KKAEEG%!fqjBBKKCGCRL003r73rBw<3GGH !fqj KKAEEG%Dzr1   r   r;   s     r/   TR13r  -  s    < Rr1   c                 (    dfd	t        |       S )a  Returns cos(x)*cos(2*x)*...*cos(2**(k-1)*x) -> sin(2**k*x)/(2**k*sin(x))

    Examples
    ========

    >>> from sympy.simplify.fu import TRmorrie, TR8, TR3
    >>> from sympy.abc import x
    >>> from sympy import Mul, cos, pi
    >>> TRmorrie(cos(x)*cos(2*x))
    sin(4*x)/(4*sin(x))
    >>> TRmorrie(7*Mul(*[cos(x) for x in range(10)]))
    7*sin(12)*sin(16)*cos(5)*cos(7)*cos(9)/(64*sin(1)*sin(3))

    Sometimes autosimplification will cause a power to be
    not recognized. e.g. in the following, cos(4*pi/7) automatically
    simplifies to -cos(3*pi/7) so only 2 of the 3 terms are
    recognized:

    >>> TRmorrie(cos(pi/7)*cos(2*pi/7)*cos(4*pi/7))
    -sin(3*pi/7)*cos(3*pi/7)/(4*sin(pi/7))

    A touch by TR8 resolves the expression to a Rational

    >>> TR8(_)
    -1/8

    In this case, if eq is unsimplified, the answer is obtained
    directly:

    >>> eq = cos(pi/9)*cos(2*pi/9)*cos(3*pi/9)*cos(4*pi/9)
    >>> TRmorrie(eq)
    1/16

    But if angles are made canonical with TR3 then the answer
    is not simplified without further work:

    >>> TR3(eq)
    sin(pi/18)*cos(pi/9)*cos(2*pi/9)/2
    >>> TRmorrie(_)
    sin(pi/18)*sin(4*pi/9)/(8*sin(pi/9))
    >>> TR8(_)
    cos(7*pi/18)/(16*sin(pi/9))
    >>> TR3(_)
    1/16

    The original expression would have resolve to 1/16 directly with TR8,
    however:

    >>> TR8(eq)
    1/16

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Morrie%27s_law

    c                    | j                   s| S |r&| j                         \  }} |d       |d      z  S t        t              }i }g }| j                  D ]|  }|j                         \  }}	|	j                  rJt        |t              r:|j                  d   j                         \  }
}||   j                  |
       |	||<   l|j                  |       ~ g }|D ]V  }||   }|j                          |sd}|d   x}}||v r|dz  }|dz  }||v r|dkD  rt        d|z  |z  |z        d|z  z  t        ||z        z  }d }g }t        |      D ]>  }|dz  }t        ||z  d      }|j                  |       t        ||   |xs ||         }@ t        |      D ]F  }|j                         }t        ||z  d      }||xx   |z  cc<   ||   r6|j!                  |       H |j                  ||z         n4t        |j                  d      |z        }|j                  |||   z         |r;Y |r6t#        ||z   |D cg c]  }||   D ]  }t        ||z  d        c}}z    } | S c c}}w )Nr   rY   rC   Frd   )rf   rg   r   ri   r6   r   r   r5   r   r   rZ   sortr   r   r   rk   r   r
   )r.   r   rm   r]   r6   cossotherr   rq   rT   r   r9   r   rS   cccinewargtakeccsra   keyr:   s                        r/   r:   zTRmorrie.<locals>.f  s   yyI$$&DAqQ71Q7?"4  	 A==?DAq||
1c 2q	..0AQr"QQ	   	-AQAFFHA$RAgFA!GB Ag q5 Ab^AqD0RT:FDC"1X Aa!!B$7

2"49d.?d3i@	A #1X ) WWY!!B$7S	T)	#CyHHRL) JJvt|,AEE!HQJALLDG,5 	-> sU{26&I-.Q&I;<AaC%(&I(&I I KB 	&Is   !I.r   r   r;   s    @r/   TRmorrier$  \  s    v7r Rr1   c                 &    fd}t        | |      S )a  Convert factored powers of sin and cos identities into simpler
    expressions.

    Examples
    ========

    >>> from sympy.simplify.fu import TR14
    >>> from sympy.abc import x, y
    >>> from sympy import cos, sin
    >>> TR14((cos(x) - 1)*(cos(x) + 1))
    -sin(x)**2
    >>> TR14((sin(x) - 1)*(sin(x) + 1))
    -cos(x)**2
    >>> p1 = (cos(x) + 1)*(cos(x) - 1)
    >>> p2 = (cos(y) - 1)*2*(cos(y) + 1)
    >>> p3 = (3*(cos(y) - 1))*(3*(cos(y) + 1))
    >>> TR14(p1*p2*p3*(x - 1))
    -18*(x - 1)*sin(x)**2*sin(y)**4

    c           	      `   | j                   s| S rP| j                         \  }}|t        j                  ur+t	        |d      }t	        |d      }||k7  s||k7  r||z  } | S g }g }| j
                  D ]  }|j                  r@|j                         \  }}	|	j                  s|j                  s|j                  |       L|}nt        j                  }	t        |      }
|
r|
d   j                  t        t        fvr9|	t        j                  u r|j                  |       n|j                  ||	z         |
\  }}}|j                  ||	j                  |	|||f        t!        t#        |            }t%        |      }t!        t'        d            x}\  }}}	}}}|r|j)                  d      }|r|d   }||	   j                  r||	   j                  r
||   ||   k(  r||   ||   k7  r|j)                  d      }t+        ||	   ||	         }||	   |k7  r2|D cg c]  }||   	 }}||	xx   |z  cc<   |j-                  d|       n9||	   |k7  r1|D cg c]  }||   	 }}||	xx   |z  cc<   |j-                  d|       t/        ||   t              rt        }nt        }|j                  ||    ||   z   |||   j
                  d         dz  z  |z         F||	   ||	   k(  r||   ||   k(  r}||   ||   k7  rr|j)                  d      }||	   }t/        ||   t              rt        }nt        }|j                  ||    ||   z   |||   j
                  d         dz  z  |z         |j                  ||   ||	   z         |rt%        |      |k7  rt1        | } | S c c}w c c}w )NFr   rY   r   r   rC   )rf   rg   r   r7   TR14r6   rG   r   rN   rO   rZ   r  rP   r   r   r   ri   r   rR   r   rk   r   insertr5   r
   )r.   rm   r]   r   r   r  processr9   rq   rT   r   r   r:   sinotherrj   ro   ABr!  ra   remr   s                         r/   r:   zTR14.<locals>.f  s   yyI $$&DAq~AU+AU+19	dB	 	:Axx}}1LLOEEAA!		#s3:LLOLLA&HAq"NNAq{{Aq"a89#	:( ww'( U &*%(^3"1aBAAAJQ4>>adnntqt|R5AbE> 'AA#&qtQqT?D  !tt|59&:qt&:&: #A$ 'q# 6!"159&:qt&:&: #A$ 'q# 6)!A$4$'$'!LL1Q4%!*Qqtyy|_a5G*G$)NO$qTQqT\tqt|R5AbE> 'AA#$Q4D)!A$4$'$'!LL1Q4%!*Qqtyy|_a5G*G$)NO$ LL1qt$Y \ u:eB	E '; ';s   N&N+r   r   s    ` r/   r'  r'    s    ,^@ Rr1   c                 *    fd}t        | |      S )a  Convert sin(x)**-2 to 1 + cot(x)**2.

    See _TR56 docstring for advanced use of ``max`` and ``pow``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR15
    >>> from sympy.abc import x
    >>> from sympy import sin
    >>> TR15(1 - 1/sin(x)**2)
    -cot(x)**2

    c                 $   t        | t              rt        | j                  t              s| S | j                  }|dz  dk(  r(t        | j                  |dz   z        | j                  z  S d| z  }t        |t        t        d       }||k7  r|} | S )NrC   rY   c                     d| z   S rX   r   r|   s    r/   r~   z!TR15.<locals>.f.<locals>.<lambda>e  
    !a% r1   r   )r5   r   rH   r   r   TR15r   r   r.   rT   iar9   r   r   s       r/   r:   zTR15.<locals>.f\      2s#
277C(@IFFq5A:!a%()"''11rT"c3ScB7B	r1   r   r.   r   r   r:   s    `` r/   r3  r3  L        Rr1   c                 *    fd}t        | |      S )a  Convert cos(x)**-2 to 1 + tan(x)**2.

    See _TR56 docstring for advanced use of ``max`` and ``pow``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR16
    >>> from sympy.abc import x
    >>> from sympy import cos
    >>> TR16(1 - 1/cos(x)**2)
    -tan(x)**2

    c                 $   t        | t              rt        | j                  t              s| S | j                  }|dz  dk(  r(t        | j                  |dz   z        | j                  z  S d| z  }t        |t        t        d       }||k7  r|} | S )NrC   rY   c                     d| z   S rX   r   r|   s    r/   r~   z!TR16.<locals>.f.<locals>.<lambda>  r2  r1   r   )r5   r   rH   r   r   r3  r   r   r4  s       r/   r:   zTR16.<locals>.f}  r6  r1   r   r7  s    `` r/   TR16r<  m  r8  r1   c                      d }t        | |      S )aD  Convert f(x)**-i to g(x)**i where either ``i`` is an integer
    or the base is positive and f, g are: tan, cot; sin, csc; or cos, sec.

    Examples
    ========

    >>> from sympy.simplify.fu import TR111
    >>> from sympy.abc import x
    >>> from sympy import tan
    >>> TR111(1 - 1/tan(x)**2)
    1 - cot(x)**2

    c                 j   t        | t              rB| j                  j                  s.| j                  j
                  r| j                  j                  s| S t        | j                  t              r0t        | j                  j                  d         | j                   z  S t        | j                  t              r0t        | j                  j                  d         | j                   z  S t        | j                  t              r0t        | j                  j                  d         | j                   z  S | S r4   )r5   r   rH   rO   r   rN   is_negativer   r   r6   r   r!   r   r    r-   s    r/   r:   zTR111.<locals>.f  s    r3WW  BFF$5$5"&&:L:LIbggs#rww||A'"&&00%rww||A'"&&00%rww||A'"&&00	r1   r   r;   s     r/   TR111r@    s     Rr1   c                 *    fd}t        | |      S )ah  Convert tan(x)**2 to sec(x)**2 - 1 and cot(x)**2 to csc(x)**2 - 1.

    See _TR56 docstring for advanced use of ``max`` and ``pow``.

    Examples
    ========

    >>> from sympy.simplify.fu import TR22
    >>> from sympy.abc import x
    >>> from sympy import tan, cot
    >>> TR22(1 + tan(x)**2)
    sec(x)**2
    >>> TR22(1 + cot(x)**2)
    csc(x)**2

    c                     t        | t              r"| j                  j                  t        t
        fv s| S t        | t
        t        d       } t        | t        t        d       } | S )Nc                     | dz
  S rX   r   r|   s    r/   r~   z!TR22.<locals>.f.<locals>.<lambda>  
    1q5 r1   r   c                     | dz
  S rX   r   r|   s    r/   r~   z!TR22.<locals>.f.<locals>.<lambda>  rD  r1   )	r5   r   rH   rP   r   r   r   r    r!   r   s    r/   r:   zTR22.<locals>.f  sR    2s#c
(BI2sCcsC2sCcsC	r1   r   r7  s    `` r/   TR22rF    s    $ Rr1   c                      d }t        | |      S )a  Convert sin(x)**n and cos(x)**n with positive n to sums.

    Examples
    ========

    >>> from sympy.simplify.fu import TRpower
    >>> from sympy.abc import x
    >>> from sympy import cos, sin
    >>> TRpower(sin(x)**6)
    -15*cos(2*x)/32 + 3*cos(4*x)/16 - cos(6*x)/32 + 5/16
    >>> TRpower(sin(x)**3*cos(2*x)**4)
    (3*sin(x)/4 - sin(3*x)/4)*(cos(4*x)/2 + cos(8*x)/8 + 3/8)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Power-reduction_formulae

    c                 J   t        | t              r t        | j                  t        t        f      s| S | j                         \  }}|j                  d   }|j                  r-|j                  r |j                  r_t        |t              rOdd|z
  z  t        t        |dz   dz        D cg c]#  }t        ||      t	        |d|z  z
  |z        z  % c} z  } n|j                  rt        |t              r|dd|z
  z  t        j                  |dz
  dz  z  z  t        t        |dz   dz        D cg c]7  }t        ||      t        j                  |z  z  t        |d|z  z
  |z        z  9 c} z  } n|j                  r[t        |t              rKdd|z
  z  t        t        |dz        D cg c]#  }t        ||      t	        |d|z  z
  |z        z  % c} z  } n|j                  rt        |t              rudd|z
  z  t        j                  |dz  z  z  t        t        |dz        D cg c]7  }t        ||      t        j                  |z  z  t	        |d|z  z
  |z        z  9 c} z  } |j                  r| d| z  t        ||dz        z  z  } | S c c}w c c}w c c}w c c}w r  )r5   r   rH   r   r   r   r6   r   rO   is_oddr   r   r   r   r  is_even)r.   rq   rm   r}   rS   s        r/   r:   zTRpower.<locals>.f  s~   2s#
277S#J(GI~~1FF1I<<AMMxxJq#.1Xc"AE19-$/ %-QN3AaC{3C$C $/ 0 0jC01XammqsAg66s?Da!eQY?O=Q:; >Fa^MM1$>%%(!ac'1%5>6 =Q 8R Rz!S11Xc"1Q3Z$) %-QN3AaC{3C$C $) * *z!S11Xammac223?DQqSz9K:; :B!QMM1$:%%(!ac'1%5:6 9K 4L Lyya1"ghq!A#...	$/=Q$)9Ks   *(J
/<J
*(J
(<J 
r   r;   s     r/   TRpowerrK    s    *, Rr1   c                 >    t        | j                  t                    S )zReturn count of trigonometric functions in expression.

    Examples
    ========

    >>> from sympy.simplify.fu import L
    >>> from sympy.abc import x
    >>> from sympy import cos, sin
    >>> L(cos(x)+sin(x))
    2
    )r   countr#   r-   s    r/   LrN    s     RXX+,--r1   c                 8    t        |       | j                         fS rF   )rN  	count_opsr|   s    r/   r~   r~   -  s    adAKKM2 r1   c           	      p   t        t        |      }t        t        |      }| }t        |       } t	        | t
              s2 | j                  | j                  D cg c]  }t        ||       c} S t        |       } | j                  t        t              r@ ||       } ||       ||       k  r|} | j                  t        t              rt        |       } | j                  t        t              r- ||       }t!        t#        |            }t%        || ||g|      } t%        t'        |       | |      S c c}w )a7  Attempt to simplify expression by using transformation rules given
    in the algorithm by Fu et al.

    :func:`fu` will try to minimize the objective function ``measure``.
    By default this first minimizes the number of trig terms and then minimizes
    the number of total operations.

    Examples
    ========

    >>> from sympy.simplify.fu import fu
    >>> from sympy import cos, sin, tan, pi, S, sqrt
    >>> from sympy.abc import x, y, a, b

    >>> fu(sin(50)**2 + cos(50)**2 + sin(pi/6))
    3/2
    >>> fu(sqrt(6)*cos(x) + sqrt(2)*sin(x))
    2*sqrt(2)*sin(x + pi/3)

    CTR1 example

    >>> eq = sin(x)**4 - cos(y)**2 + sin(y)**2 + 2*cos(x)**2
    >>> fu(eq)
    cos(x)**4 - 2*cos(y)**2 + 2

    CTR2 example

    >>> fu(S.Half - cos(2*x)/2)
    sin(x)**2

    CTR3 example

    >>> fu(sin(a)*(cos(b) - sin(b)) + cos(a)*(sin(b) + cos(b)))
    sqrt(2)*sin(a + b + pi/4)

    CTR4 example

    >>> fu(sqrt(3)*cos(x)/2 + sin(x)/2)
    sin(x + pi/3)

    Example 1

    >>> fu(1-sin(2*x)**2/4-sin(y)**2-cos(x)**4)
    -cos(x)**2 + cos(y)**2

    Example 2

    >>> fu(cos(4*pi/9))
    sin(pi/18)
    >>> fu(cos(pi/9)*cos(2*pi/9)*cos(3*pi/9)*cos(4*pi/9))
    1/16

    Example 3

    >>> fu(tan(7*pi/18)+tan(5*pi/18)-sqrt(3)*tan(5*pi/18)*tan(7*pi/18))
    -sqrt(3)

    Objective function example

    >>> fu(sin(x)/cos(x))  # default objective function
    tan(x)
    >>> fu(sin(x)/cos(x), measure=lambda x: -x.count_ops()) # maximize op count
    sin(x)/cos(x)

    References
    ==========

    .. [1] https://www.sciencedirect.com/science/article/pii/S0895717706001609
    )measure)r#  )r&   RL1RL2r   r5   r   rP   r6   fur<   hasr   r   r?   r   r   r   r$  r   rr   )r.   rR  fRL1fRL2r   r9   rv1rv2s           r/   rU  rU  -  s    L #wD#wD
C	Bb$rwwAAAw/ABB	RB	vvc32hCL72;&B66#sRB	vvc32h(3- #r3$'2tBx)) Bs   D3c                 D   t        t              }|rP| j                  D ]@  }|j                         \  }}|dk  r| }| }|||r ||      ndf   j	                  |       B nI|r<| j                  D ],  }|t
        j                   ||      f   j	                  |       . nt        d      g }d}|D ]b  }	||	   }
|	\  }}t        |
      dkD  r1t        |
ddi} ||      }||k7  r|}d}|j	                  ||z         L|j	                  ||
d   z         d |rt        | } | S )a  Apply ``do`` to addends of ``rv`` that (if ``key1=True``) share at least
    a common absolute value of their coefficient and the value of ``key2`` when
    applied to the argument. If ``key1`` is False ``key2`` must be supplied and
    will be the only key applied.
    r   rY   zmust have at least one keyFre   T)
r   ri   r6   r   rZ   r   r7   
ValueErrorrR   r   )r.   r   key2key1abscr9   r   r6   r   rS   rb   r  rT   r   s                 r/   r   r     sE    tD 	8A>>#DAq1uBB!T!W!,-44Q7	8 
 	-A!%%a!"))!,	- 566D
C  G1q6A:Q''AQ%CaxKK!KK!A$  $ZIr1   z~
    TR0 TR1 TR2 TR3 TR4 TR5 TR6 TR7 TR8 TR9 TR10 TR10i TR11
    TR12 TR13 L TR2i TRmorrie TR12i
    TR14 TR15 TR16 TR111 TR22c                  D    t        d      t        d      caadt        z  ay )NrC   r   rY   )r"   r   r   r   r   r1   r/   r   r     s    !Wd1gNFF&Ir1   c           	         t         
t                | |fD cg c]  }t        |       c}\  } }| j                  |      \  }}| j	                  |      j                         }dx}}t        j                  |j                  v r#|j                  t        j                        }| }n>t        j                  |j                  v r"|j                  t        j                        }| }||fD cg c]  }|j                          c}\  } }d }	 |	| |      }
|
y|
\  }}} |	||      }
|
y|
\  }}}|s|s|r#t        |t              r||||||f\  }}}}}}||}}|sS|xs |}|xs |}t        ||j                        sy||||j                  d   |j                  d   t        |t              fS |s|s|r|r|r|rt        ||j                        t        ||j                        ury||fD ch c]  }|j                   c}t        fd||fD              sy||||j                  d   |j                  d   t        ||j                        fS |r|s|r|s
|r	||||y|xs |}|xs |}|j                  |j                  k7  ry|st        j                   }|st        j                   }||u r%|t         z  }||||j                  d   t"        dz  dfS ||z  t$        k(  r$|d|z  z  }||||j                  d   t"        d	z  dfS ||z  t&        k(  r$|d|z  z  }||||j                  d   t"        d
z  dfS yc c}w c c}w c c}w )a)  Return the gcd, s1, s2, a1, a2, bool where

    If two is False (default) then::
        a + b = gcd*(s1*f(a1) + s2*f(a2)) where f = cos if bool else sin
    else:
        if bool, a + b was +/- cos(a1)*cos(a2) +/- sin(a1)*sin(a2) and equals
            n1*gcd*cos(a - b) if n1 == n2 else
            n1*gcd*cos(a + b)
        else a + b was +/- cos(a1)*sin(a2) +/- sin(a1)*cos(a2) and equals
            n1*gcd*sin(a + b) if n1 = n2 else
            n1*gcd*sin(b - a)

    Examples
    ========

    >>> from sympy.simplify.fu import trig_split
    >>> from sympy.abc import x, y, z
    >>> from sympy import cos, sin, sqrt

    >>> trig_split(cos(x), cos(y))
    (1, 1, 1, x, y, True)
    >>> trig_split(2*cos(x), -2*cos(y))
    (2, 1, -1, x, y, True)
    >>> trig_split(cos(x)*sin(y), cos(y)*sin(y))
    (sin(y), 1, 1, x, y, True)

    >>> trig_split(cos(x), -sqrt(3)*sin(x), two=True)
    (2, 1, -1, x, pi/6, False)
    >>> trig_split(cos(x), sin(x), two=True)
    (sqrt(2), 1, 1, x, pi/4, False)
    >>> trig_split(cos(x), -sin(x), two=True)
    (sqrt(2), 1, -1, x, pi/4, False)
    >>> trig_split(sqrt(2)*cos(x), -sqrt(6)*sin(x), two=True)
    (2*sqrt(2), 1, -1, x, pi/6, False)
    >>> trig_split(-sqrt(6)*cos(x), -sqrt(2)*sin(x), two=True)
    (-2*sqrt(2), 1, 1, x, pi/3, False)
    >>> trig_split(cos(x)/sqrt(6), sin(x)/sqrt(2), two=True)
    (sqrt(6)/3, 1, 1, x, pi/6, False)
    >>> trig_split(-sqrt(6)*cos(x)*sin(y), -sqrt(2)*sin(x)*sin(y), two=True)
    (-2*sqrt(2)*sin(y), 1, 1, x, pi/3, False)

    >>> trig_split(cos(x), sin(x))
    >>> trig_split(cos(x), sin(z))
    >>> trig_split(2*cos(x), -sin(x))
    >>> trig_split(cos(x), -sqrt(3)*sin(x))
    >>> trig_split(cos(x)*cos(y), sin(x)*sin(z))
    >>> trig_split(cos(x)*cos(y), sin(x)*sin(y))
    >>> trig_split(-sqrt(6)*cos(x), sqrt(2)*sin(x)*sin(y), two=True)
    NrY   c                 D   dx}}t         j                  }| j                  r;| j                         \  }} t	        | j
                        dkD  s|sy| j                  rt        | j
                        }n| g}|j                  d      } t        | t              r| }nBt        | t              r| }n/| j                  r"| j                  t         j                  u r|| z  }ny|rd|d   }t        |t              r|r|}nJ|}nGt        |t              r|r|}n2|}n/|j                  r"|j                  t         j                  u r||z  }ny|t         j                  ur|||fS d||fS t        | t              r| }nt        | t              r| }||y|t         j                  ur|nd}|||fS )a  Return ``a`` as a tuple (r, c, s) such that
        ``a = (r or 1)*(c or 1)*(s or 1)``.

        Three arguments are returned (radical, c-factor, s-factor) as
        long as the conditions set by ``two`` are met; otherwise None is
        returned. If ``two`` is True there will be one or two non-None
        values in the tuple: c and s or c and r or s and r or s or c with c
        being a cosine function (if possible) else a sine, and s being a sine
        function (if possible) else oosine. If ``two`` is False then there
        will only be a c or s term in the tuple.

        ``two`` also require that either two cos and/or sin be present (with
        the condition that if the functions are the same the arguments are
        different or vice versa) or that a single cosine or a single sine
        be present with an optional radical.

        If the above conditions dictated by ``two`` are not met then None
        is returned.
        NrC   r   )r   r7   rf   r   rR   r6   ri   rk   r5   r   r   rG   r   r   )r9   r   r   r   r   r6   rq   s          r/   pow_cos_sinztrig_split.<locals>.pow_cos_sin  sl   ( AUU88NN$EB166{QcxxAFF|sA!S!As#aeeqvvoaGa%3'XX!%%166/!GB1552Aq88dAq883A3A9QUU?R1axr1   r   c              3   :   K   | ]  }|j                   v   y wrF   )r6   )rI   ra   r6   s     r/   rK   ztrig_split.<locals>.<genexpr>]  s     <a166T><s   rw   FrC   r   r   )r   r   r   r+   r   as_exprr   r  factorsquor5   r   rP   r6   r   r  r7   r   r   r   )r9   rq   r   ra   uaubr   r   r   rc  r   coacasacobcbsbr   r   r   r6   s                       @r/   r   r     s7   f ~!"A'1GAJ'DAqXXa[FB
%%(


CKB}}

"VVAMM"S	
"**	$VVAMM"S"$b*AAIIK*DAq?D 	AsAyKCRAsAyKCR B"B!4#&BR#; RS"bRBH"H"!QVV$BAFF1Iqvvay*Q2DDD3rbRb"''**R2II)+R111<B8<<BBGGAJ
Jr277<SSS"rRZBJ"*H"H"66QVV%%C%%C#:6MCBq	2a466W1S5LCBq	2a466W	!1S5LCBq	2a466 "w ( +x 2s   L5*L:+L?c                    | j                   rt        | j                        dk7  ry| j                  \  }}|t        j                  t        j
                  fv rUt        j
                  }|j                  r4|j                  d   j                  r|j                  d   dk  r	| | }}| }|||fS | j                  D cg c]  }t        |       c}\  }}|j                  |      \  }}|j                  |      j                         }t        j                  |j                  v r$|j                  t        j                        }d}d}	nDt        j                  |j                  v r$|j                  t        j                        }d}d}	ndx}}	||fD cg c]  }|j                          c}\  }}|t        j
                  u r||}}|	|}	}|dk(  r| }|	 }	|t        j
                  u r|||	fS yc c}w c c}w )a  If ``e`` is a sum that can be written as ``g*(a + s)`` where
    ``s`` is ``+/-1``, return ``g``, ``a``, and ``s`` where ``a`` does
    not have a leading negative coefficient.

    Examples
    ========

    >>> from sympy.simplify.fu import as_f_sign_1
    >>> from sympy.abc import x
    >>> as_f_sign_1(x + 1)
    (1, x, 1)
    >>> as_f_sign_1(x - 1)
    (1, x, -1)
    >>> as_f_sign_1(-x + 1)
    (-1, x, -1)
    >>> as_f_sign_1(-x - 1)
    (-1, x, 1)
    >>> as_f_sign_1(2*x + 2)
    (2, x, 1)
    rC   Nr   rY   )rQ   rR   r6   r   r  r7   rf   r   r   r+   r   re  rf  rg  )
rT   r9   rq   r   ra   rh  ri  r   r   r   s
             r/   r  r  v  s   * 88s166{a'66DAqQ]]AEE""EE88q	++q	A2rqAA!Qw !'1GAJ'DAqXXa[FB
%%(


C}}

"VVAMM"	
"**	$VVAMM"R"$b*AAIIK*DAqAEEz!1RB	RxdSAEEzArz + ( +s   :G)G.c                 &    fd}t        | |      S )a2  Replace all hyperbolic functions with trig functions using
    the Osborne rule.

    Notes
    =====

    ``d`` is a dummy variable to prevent automatic evaluation
    of trigonometric/hyperbolic functions.


    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Hyperbolic_function
    c                 ~   t        | t              s| S | j                  d   }|j                  s|z  n/t	        j
                  |j                  D cg c]  }|z  	 c}      }t        | t              rt        t        |      z  S t        | t              rt        |      S t        | t              rt        t        |      z  S t        | t              rt        |      t        z  S t        | t              rt!        |      S t        | t"              rt%        |      t        z  S t'        d| j(                  z        c c}w )Nr   unhandled %s)r5   r   r6   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   NotImplementedErrorrP   )r.   r9   ra   r]   s      r/   r:   z_osborne.<locals>.f  s    "01IGGAJxxAaCS^^!&&4IQQqS4I%Jb$SV8OD!q6MD!SV8OD!q6!8OD!q6MD!q6!8O%nrww&>?? 5Js   D:r   rT   r]   r:   s    ` r/   _osbornerw    s    "@( Q?r1   c                 &    fd}t        | |      S )a1  Replace all trig functions with hyperbolic functions using
    the Osborne rule.

    Notes
    =====

    ``d`` is a dummy variable to prevent automatic evaluation
    of trigonometric/hyperbolic functions.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Hyperbolic_function
    c                 p   t        | t              s| S | j                  d   j                  d      \  }}|j	                  t
        j                  i      |t        z  z   }t        | t              rt        |      t        z  S t        | t              rt        |      S t        | t              rt        |      t        z  S t        | t              rt        |      t        z  S t        | t               rt#        |      S t        | t$              rt'        |      t        z  S t)        d| j*                  z        )Nr   T)as_Addrt  )r5   r#   r6   as_independentxreplacer   r7   r   r   r   r   r   r   r   r   r   r    r   r!   r   ru  rP   )r.   constr}   r9   r]   s       r/   r:   z_osbornei.<locals>.f  s    "34I771:,,Qt,<qJJ155z"U1W,b#719C 7NC 719C 719C 7NC 719%nrww&>??r1   r   rv  s    ` r/   	_osborneir~    s     @( Q?r1   c                 4  	 ddl m	 ddlm | j	                  t
              }|D cg c]  }|t               f c}| j                  t                    }D cg c]	  \  }}||f c}}t               t        |      	fdfS c c}w c c}}w )a  Return an expression containing hyperbolic functions in terms
    of trigonometric functions. Any trigonometric functions initially
    present are replaced with Dummy symbols and the function to undo
    the masking and the conversion back to hyperbolics is also returned. It
    should always be true that::

        t, f = hyper_as_trig(expr)
        expr == f(t)

    Examples
    ========

    >>> from sympy.simplify.fu import hyper_as_trig, fu
    >>> from sympy.abc import x
    >>> from sympy import cosh, sinh
    >>> eq = sinh(x)**2 + cosh(x)**2
    >>> t, f = hyper_as_trig(eq)
    >>> f(fu(t))
    cosh(2*x)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Hyperbolic_function
    r   rt   )collectc           	            t        |       j                  t                          t        j                        S rF   )r~  r|  dictr   ImaginaryUnit)r}   r  r]   repsru   s    r/   r~   zhyper_as_trig.<locals>.<lambda>%  s3    '(!Q  d,3./0+@ r1   )
r   ru   sympy.simplify.radsimpr  atomsr#   r   r|  r  rw  )
r.   trigsro   maskedrS   rb   r  r]   r  ru   s
         @@@@r/   hyper_as_trigr    s    4 1. HH*+E"'(QQL(D[[d$F  $$tq!QF$DAFA !@ @ @ ) %s   BBc                 t    | j                  t        t              s| S t        t	        t        |                   S )a  Convert products and powers of sin and cos to sums.

    Explanation
    ===========

    Applied power reduction TRpower first, then expands products, and
    converts products to sums with TR8.

    Examples
    ========

    >>> from sympy.simplify.fu import sincos_to_sum
    >>> from sympy.abc import x
    >>> from sympy import cos, sin
    >>> sincos_to_sum(16*sin(x)**3*cos(2*x)**2)
    7*sin(x) - 5*sin(3*x) + 3*sin(5*x) - sin(7*x)
    )rV  r   r   r   r	   rK  )exprs    r/   sincos_to_sumr  )  s+    & 88C:gdm,--r1   )F)rw   Fr   rF   )NT)ocollectionsr   sympy.core.addr   sympy.core.exprr   sympy.core.exprtoolsr   r   r   sympy.core.functionr	   sympy.core.mulr
   sympy.core.numbersr   r   sympy.core.powerr   sympy.core.singletonr   sympy.core.sortingr   sympy.core.symbolr   sympy.core.sympifyr   sympy.core.traversalr   (sympy.functions.combinatorial.factorialsr   %sympy.functions.elementary.hyperbolicr   r   r   r   r   r   r   (sympy.functions.elementary.trigonometricr   r   r   r   r    r!   r"   r#   sympy.ntheory.factor_r$   sympy.polys.polytoolsr%   sympy.strategies.treer&   sympy.strategies.corer'   r(   sympyr)   r0   r<   r?   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r$  r'  r3  r<  r@  rF  rK  rN  ri   r   CTR1CTR2CTR3CTR4rS  rT  rU  r   r   fufuncsr  ziplocalsgetFUr   r   r   r  rw  r~  r  r  r   r1   r/   <module>r     s   #    A A *  $   " & # & * =< < <? ? ? / ( ( 1 )0<qh.b5@=@B*B*0HV[|-`AHM`:z Fxv,^tnvrBB@:+\."  C#sCc3S#tT4(D$eUD:; <S#sCc3S#tT4(D$eUD 
c
S#J)SzC:s+,	3xeS98D	eh
CdCsC0 	#tS#t$#tS	4dCc40	 3 X*v'T! "'  
$s7DVX\\7!;<=
>? 
s7l6r%P$N(@V.r1   