Ë
    P/æjfó  ã                   óÎ  — 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    úT/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/sympy/simplify/fu.pyÚTR0r0      s"   € ð �9‰9‹;×ÑÓ×&Ñ&Ó(Ð(ó    c                 ó    — d„ }t        | |«      S )zÎReplace 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Ü—5‘5œ˜Q›‘<ÐÜ˜œCÔ Ø—‘˜‘
ˆAÜ—5‘5œ˜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Ü�q“6œ#˜a›&‘=Ð Ü˜œCÔ Ø—‘˜‘
ˆAÜ�q“6œ#˜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        «      rµt        |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||<   ||<   �Œ% |r¢t%        ||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   è ø€ ò ,Øô # 2¤sÓ+ÒK¨r¯y©yÒ/K¸R¿W¹WÌ¸^Ó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¤˜*Ð$ò >¨ò *=Ø—‘ò*=ä�A—F‘F“˜qÑ ò*=ô ñ =Ø56·V±Vô=ó =ð@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Øò /�Ø—8“8¤ A§F¡F£¨a£Ù(,œ6 !œ9´,¸q³/�DØ˜q“yØŸ™ Q¨ IÕ.ð	/ñ
 Ü$-¨d£Oò #‘L�A‘y˜˜4Ø˜!˜Ø"�D˜’Gð#ô ˜D�z×0Ñ0Ó2�Øò -�AØ˜!™˜t A™w™�AÙ˜!˜Q”xØ ˜˜!šàŸ™ 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‹  ù€ Ø�yŠyØˆIà× Ñ Ó"‰ˆˆ1Ø�9Š9˜Ÿ	š	ØˆIô	@ð ×ÑÓˆÜ(,¨Q¯V©V«X«ÖJ 1¹bÀÀAÀaÁD½k�!�Q—U‘U˜1“X’ÐJˆÐJÙØˆIà×ÑÓˆÜ(,¨Q¯V©V«X«ÖJ 1¹bÀÀAÀaÁD½k�!�Q—U‘U˜1“X’ÐJˆÐJÙØˆIõ	ñ& 	�!�UÔÙ�!�UÔð ˆØó 	'ˆAÜ˜!œSÔ!Ü˜Ÿ™˜q™	¨EÔ2�Ø˜‘6˜a ™d a¨¡dšlØ—H‘HœS §¡¨¡›^¨Q¨q©TÑ1Ô2Ø"&Ð&�A�a‘D˜1˜Qš4ÚØ˜Q™�BØ˜Q’w 1 R¡5¨A¨a©D£=ØŸ™¤# a§f¡f¨Q¡i°¡kÓ"2°Q°q±TÑ!9Ô:Ø'+Ð+˜˜!™˜q šuÜ˜AœsÔ#Ü˜Ÿ™˜q™	¨EÔ2�Ø˜’6˜a ™d a¨¡dœlØ—H‘HœS §¡¨¡›^¨a°©d¨UÑ2Ô3Ø"&Ð&�A�a‘D˜1˜Q›4Û˜!Ÿ(œ( q§v¡v¨a¡y´A·E±EÓ'9Ü˜qŸv™v a™y¬#Ö.Ü˜Ÿ™˜q™	Ÿ™ qÑ)°EÔ:�Ø˜“6˜a ™d a¨¡dœl°°!±·²ØŸœØ—H‘HœS §¡¨¡¨1¡Ó-°°!±¨uÑ4Ô5Ø"&Ð&�A�a‘D˜1˜Q›4ð-	'ñ0 Ü�q¨Q¯W©W«Y×<¡T Q¨º!˜A˜q›DÓ<Ñ<Ð>Ü q§w¡w£y×6™t˜q !²A�a˜“dÓ6Ð7ñ8ˆBà”#¨×/¡  A˜˜1›Ó/Ð0´È×6NÁÀÀ1°q¸!³tÓ6NÐ1OÑOÑOˆBàˆ	ùò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Ø�W‰W‘X˜bŸg™g a™jÓ)Ó*ˆÜ˜"Ô3Ô4ØˆIØ�G‰G�A‰JœŸ™˜a™Ñ×,Ñ,´·±°a±¸"¿'¹'À!¹*Ñ1D×0QÑ0QÓYÐUYÓYð ˆ	ô œœc¤3¬¬S´#´s¼CÄÄcÌ3ÐOˆDØ�”d˜2“h‘¤§¡ Q¡¨¯©°©Ñ 3Ó4ˆBØˆ	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   € �a—k‘kÒ. a§h¡h€ r1   c                 ó4   —  | j                   | j                  Ž S rF   ©rP   r6   r‚   s    r/   r~   z'TR3.<locals>.<lambda>.<locals>.<lambda>þ   s   € �f�a—f‘f˜aŸf™f�o€ 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Ø./¯c©c°_Ð.Dð r1   c                 ó†   — | j                   | j                  d   j                   | j                  d   j                  Ž «      S r4   r„   r|   s    r/   r~   zTR4.<locals>.<lambda>  s2   € Ø�F‰F�>�1—6‘6˜!‘9—>‘> 1§6¡6¨!¡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  ø€ ð
 —	’	˜bŸg™gŸl™l¨aÒ/ØˆIØ�v‰v�~Š~ØˆIà�F‰F�Q‰J˜4ÒØˆIØ�F‰F�S‰L˜TÒ!ØˆIØ�6‰6�QŠ;ØˆIØ�6‰6�QŠ;Ù‘Q�r—w‘w—|‘| A‘Ó'¨Ñ*Ó+Ð+à�v‰v˜‰z˜QŠØ—F‘F˜A‘I�Ù˜Ÿ™Ÿ™ a™Ó)©!©A¨b¯g©g¯l©l¸1©oÓ,>ÀÑ,AÓ*BÀAÑ*EÑEÐEØ—‘˜1’Ø‘ÙØ—6‘6˜A’:Ø�IØ—F‘F˜A‘I‘ä! "§&¡&Ó)�ÙØ�IØ—F‘F˜A‘I�Ù‘Q�r—w‘w—|‘| 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œ#™°C¸SÔ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   € Ø—	’	˜bŸg™gŸl™l¬cÒ1°b·f±fÀ²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  ø€ à�IŠIØ�IŠIØ�G‰G�L‰LœS¤#˜JÑ&Ø�V‰V×Ò "§'¡'×"5Ò"5ØˆIáØ+-×+<Ñ+<Ó+>Ö? a”J˜q•MÒ?‰DˆAˆqÜ�q Ô&ˆDÜ�q Ô&ˆDØ�qŠy˜D AšIÜ˜t D™yÓ)�Ø—9’9 §¡¨¡×!7Ò!7Ü˜BŸG™G›¨Ò)¨b¯g©g°a©j×.?Ò.?Ü˜bŸo™oÓ/Ð0�BØˆIä�Rœ˜b $¨Ð+ˆÜ—‘˜rÓ"ò 		%ˆAØ�v‰vœ#œs˜Ñ#Ø”T˜!“W‘×$Ñ$ Q§V¡V¨A¡YÕ/Ø—(’(˜qŸu™u×/Ò/°A·E±E¸A²IØ—F‘F—K‘K¤C¬ :Ñ-ð ”T˜!Ÿ&™&“\Ñ"×)Ñ)¨1¯6©6¯;©;°q©>Ð*:¸1¿5¹5Ñ*@ÕAà�T‘
×!Ñ! !Õ$ð		%ð ”‰IˆØ”‰IˆÙ‘aœ3˜q›6 Aš:¬¨Q«°!ªØˆIà�D‰zˆÜ”�A“œ˜A›ÓˆÜ�q“ò 	9ˆAØ—‘“ˆBØ—‘“ˆBØ�K‰Kœ˜R "™W›¬¨B°©G«Ñ4°aÑ7Õ8ð	9ô �!‹f�qŠjØ—‘“ˆBØ—‘“ˆBØ�K‰Kœ˜R "™W›¬¨B°©G«Ñ4°aÑ7Ô8ô �!‹f�q‹jñ Ø�K‰Kœ˜AŸE™E›G›Ô%Ü�!‹f�qŠjØ—‘“ˆBØ—‘“ˆBØ�K‰Kœ#˜b 2™g›,˜¬¨R°"©W«Ñ5°qÑ8Ô9ô �!‹f�q‹jñ Ø�K‰Kœ˜AŸE™E›G›Ô%Ü”:œc 4˜jÓ)Ó*Ð*ùò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  r™d}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  ø€ ð —9’9Ø�	äœ §¡Ó(Ó)ˆDÜ�4‹y˜AŠ~Ø�Üœs 4›yÓ)ò "�AØ˜a™�BØ�zØ Ü" 1 q¡5¬#¨d«)Ó4ò 
"˜Ø! !™W˜Ø˜:Ø$Ø  2™g˜Ù  ›g˜Ø #›:Ø&)˜D ™GØ&*˜D ™GØ"&˜CÙ!ñ
"ð	"ñ Ü¨DÖ7 b²BšrÒ7Ð8�BØ—y’yÙ ›V˜à�	ô  Ð%ˆEÙØ�	Ø',Ñ$ˆC��R˜˜A˜uñ Ø˜’8Ø˜r™6 !™8¤C¨¨Q©°©	£NÑ2´3¸¸A¹¸q±y³>ÑAÐAØ˜’6Ø˜a�q�AØ˜#‘vœc 1 q¡5¨!¡)›nÑ,¬S°!°a±%¸±«^Ñ;Ð;à˜’8Ø˜r™6 !™8¤C¨¨Q©°©	£NÑ2´3¸¸A¹¸q±y³>ÑAÐAØ˜’6Ø˜a�q�AØ˜‘uœS ! a¡%¨¡›^Ñ+¬C°°Q±¸±	«NÑ:Ð:ùò1 8s   Â/F2Â7F2©T)rQ   Úprocess_common_addends)r.   rË   s    @r/   r:   zTR9.<locals>.f  s$   ø€ Ø�yŠyØˆ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  ø€ Ø�7‰7œ3¤˜*Ñ$ØˆIà�G‰GˆØ�g‰g�a‰jˆØ�:‹:ÙÜœG C§H¡HÓ-Ó.‘ä˜CŸH™H“~�Ø—‘“
ˆAÜ—‘˜tÓ$ˆAØ�xŠxØœ’8Ü˜q›6¤$¤s¨1£v°UÔ";Ñ;Ü˜A›œt¤C¨£F°%Ô8Ñ8ñ9ð 9ô ˜q›6¤$¤s¨1£v°UÔ";Ñ;Ü˜A›œt¤C¨£F°%Ô8Ñ8ñ9ð 9ð œ’8Ü˜q›6¤# a£&™=¬3¨q«6´#°a³&©=Ñ8Ð8ä˜q›6¤# a£&™=¬3¨q«6´#°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                   �rÎt        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  r™d}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�  ø€ ð —9’9Ø�	äœ §¡Ó(Ó)ˆDÜ�4‹y˜AŠ~Ø�Üœs 4›yÓ)ò "�AØ˜a™�BØ�zØ Ü" 1 q¡5¬#¨d«)Ó4ò 
"˜Ø! !™W˜Ø˜:Ø$Ø  2™g˜Ù  ›g˜Ø #›:Ø&)˜D ™GØ&*˜D ™GØ"&˜CÙ!ñ
"ð	"ñ Ü¨DÖ7 b²BšrÒ7Ð8�BØ—y’yÙ ›V˜à�	ô  Ð/¨$Ñ/ˆEÙØ�	Ø&+Ñ#ˆC��R˜˜A˜tñ Ø˜‘f�Ø˜’8Øœs 1 q¡5›z™>Ð)Øœ3˜q 1™u›:‘~Ð%à˜‘f�Ø˜’8Øœs 1 q¡5›z™>Ð)Øœ3˜q 1™u›:‘~Ð%ùò- 8s   Â/EÂ7Ec                 ó>   — t        t        | j                  «      «      S rF   )Útupler   Úfree_symbolsr|   s    r/   r~   z"TR10i.<locals>.f.<locals>.<lambda>Ñ  s   € œe¤G¨A¯N©NÓ$;Ó<€ 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   ø€ Ø�yŠyØˆIõ6	&ôp $Ø�Ñ<ó>ˆð
 �i‹iÜ¤Ó%ˆEØ—W‘Wò 
+�Ø�Ø—8’8ØŸf™fò "˜ØŸ9›9¨¯©´1·6±6Ò)9Ø "§¡× 2Ó 2Ø! "™I×,Ñ,¨QÔ/Ø"#˜CÙ!ð"ò Øœ!Ÿ%™%‘L×'Ñ'¨Õ*ð
+ð ˆDØò *�Ü  ™(¤IÐ.ò *�AØ˜E’zÜ!&¤s¨5°©8£}Ó!5ò *˜AØ$ Q™x¨™{Ð2Ø (Ü%*¬3¨u°Q©x«=Ó%9ò 	* Ø#(¨¡8¨A¡;Ð#6Ø$,Ü&)¨%°©(°1©+¸¸a¹À¹Ñ*CÓ&D Ù&(¨£g Ø#&¨#£:Ø$(§K¡K°Ô$4Ø26 E¨!¡H¨Q¡KØ26 E¨!¡H¨Q¡KÙ$)ñ	*ñ*ñ*ð*ñ  Ü˜4Ø"Ÿ\™\›^÷#-Øô $'°aÖ(>°º2ªÒ(>Ò#?ó #-ñ -ð /‘ñ ˜“V�Øàˆ	ðQ �iŒiðP ˆ	ùò )?ùó #-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  ø€ Ø�7‰7œ3¤˜*Ñ$ØˆIáØ—‘ˆAÙ�$�q‘&“	ˆAÜ—‘ˆBØ�xŠxØŸ™Ó(‘��AØ�v‰vœc¤3˜ZÑ'Ø�	Ø�w‰w�q‰z˜QŸV™V A™YÒ&Ü˜“I�Ü˜“I�Øœ‘8Ø˜q™D 1 a¡4™K¨Ñ+Ð+à˜Q™3˜q™5 ™8�OØˆIà—‘˜‘×%Ò%ð —7‘7˜1‘:×*Ñ*°DÐ*Ó9‰DˆAˆqØ�s‰s�Q‰w˜!Š|Ø—c‘c˜1‘f˜Q‘h˜qŸs™s‘l�Üœ˜S›“N�Üœ˜S›“N�Ø—7‘7œc’>Ø˜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Ü—m‘m DÓ)ò 5�Ø—~‘~Ó'‘��1Ø—<“< A¨£EØ—v‘v¤#¤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   € ð !¤™ò 	,�Ø˜A‘v�Ø˜8¤C™=Ñ(Ü‘DØ˜X¤c™]Ñ*Ü‘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 )zêSeparate 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§   ø€ Ø�w‰wœ#Š~ØˆIà�g‰g�a‰jˆØ�:Š:ÙÜœG C§H¡HÓ-Ó.‘ä˜CŸH™H“~�Ø—‘“
ˆAÜ—‘˜tÓ$ˆAØ�xŠxÜœ#˜a›&¨Ô.‘ä˜“V�Ü˜“F˜R‘K !¤c¨!£f¨R¡i¡-Ñ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   è ø€ ÒA°BœJ r¬3×/ÑAùs   ‚)Úas_f_sign_1r   ÚNegativeOnerf   rR   r6   Úall)Údirê   r—   r:   r¸   s        r/   rV   zTR12i.<locals>.f.<locals>.okÑ  sk   € Ü˜B“ˆAÙØ‘��1�aØœŸ™Ñ%¨!¯(ª(´s¸1¿6¹6³{ÀaÒ7GÜÑA¸!¿&¹&ÔAÔAØ˜a˜4�Kð 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   € Ø�yŠyœS §¡›\¨QÒ.Ø—w‘w‘��1Ü˜a¤Ô%¬*°Q¼Ô*<Ø˜a˜4�Kð +=Ð%ð /ˆ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Î  € Ø—	’	˜RŸYšY¨"¯)ª)ØˆIà× Ñ Ó"‰ˆˆ1Ø�vŠv˜QŸVšVØˆIàˆò	 ô ”c—m‘m AÓ&Ó'ˆÜ˜vÓ&ó 	*‰EˆAˆrÙ�2“ˆAÙØ‘��1Ü¨Q¯V©VÖ4¨˜!Ÿ&™& ›)Ò4Ð5�ÜŸ™��A‘Ø��q‘	ØØ�yŠyÜ˜B“Z�Ø—9“9Ø—M‘M "§'¡'Ô*Ü !§¡�F˜1’IØ—“ §¡× 1Ò 1°R·W±W×5HÓ5HÙ�r—w‘w“K�ÙØ‘D�A�qÜ°·±Ö8¨A˜aŸf™f Q›iÒ8Ð9�AØŸV™V�C˜‘FØ ! 2§6¡6¡	�F˜1“Iä ›�BØ—y”yØŸ™ b§g¡gÔ.Ü$%§E¡E˜˜q›	ð1	*ñ2 ØˆIò	 ô
 ”c—m‘m¤L°£OÓ4Ó5ˆØˆÜ˜vÓ&ó %	!‰EˆAˆrÙ�2“ˆAÚÙ˜�s“G�ÙÜ !§¡�F˜1“Ià—y’yÜ# B›Z˜ØŸ9š9Ø"ŸM™M¨"¯'©'Ô2Ü()¯©˜F 1™IØ ØŸšØŸF™F×-Ò-°·±×1DÒ1DÙ˜rŸw™w›K˜ÙÜ()¯©˜F 1šIä!'¨£˜BØ!ŸyšyØ &§¡¨b¯g©gÔ 6Ü,-¯E©E  q¡	Ù$á äŸE™E��q‘	ØˆCÜ¨Ö+ A�a—f‘f˜Q“iÒ+Ð,ˆAØ�Q‘ˆBØ×)Ñ)¬!¯%©%Ó0ˆEØÐ ÙØ"�C˜’Fà—G‘G˜A”JØ�1‹Iœ#˜a›&˜Ñ �IðK%	!ñN Ü�f�œc 6˜lÑ*¬3Ø=@¿Y¹Y»[÷1Jð 1JÙ59°Q¸ô 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½  € Ø�yŠyØˆIô �Rœ˜b $¨Ð+ˆÜ—‘˜rÓ"ò 	%ˆAØ�v‰vœ#œs˜Ñ#Ø”T˜!“W‘×$Ñ$ Q§V¡V¨A¡YÕ/à�T‘
×!Ñ! !Õ$ð		%ð
 ”‰IˆØ”‰IˆÜˆq‹6�AŠ:œ#˜a›& 1š*ØˆIØ�D‰zˆÜ�!‹f�qŠjØ—‘“ˆBØ—‘“ˆBØ�K‰K˜œS ›W¤S¨¨b©£\Ñ1´C¸³G¼CÀÀRÁ»LÑ4HÑHÑIÔJô �!‹f�q‹jñ Ø�K‰Kœ˜AŸE™E›G›Ô%Ü�!‹f�qŠjØ—‘“ˆBØ—‘“ˆBØ�K‰K˜œC ›G¤C¨¨R©£LÑ0Ñ0´3°r³7¼3¸rÀB¹w»<Ñ3GÑGÔHô �!‹f�q‹jñ Ø�K‰Kœ˜AŸE™E›G›Ô%Ü�DˆzÐ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  rât        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ž  ø€ Ø�yŠyØˆIÙØ×$Ñ$Ó&‰DˆAˆqÙ�Q˜“7™1˜Q ›7‘?Ð"äœ4Ó ˆØˆØˆØ—‘ò 	 ˆAØ—=‘=“?‰DˆAˆqØ�|Š|¤
¨1¬cÔ 2ØŸ™˜q™	×.Ñ.Ó0‘��AØ�Q‘—‘˜rÔ"Ø��Q’à—‘˜Q•ð	 ð ˆØó 	-ˆAØ�Q‘ˆAØ�F‰FŒHÚØ�Ø˜A™$���RØ˜A‘gØ˜‘F�AØ˜!‘G�Bð ˜A’gð �q’5Ü   A¡ b¡¨¡›^¨A¨q©DÑ0´°R¸±T³Ñ:�Fà�DØ�CÜ" 1›Xò A˜Ø˜a™˜Ü! ! B¡$°Ô7˜ØŸ
™
 2œÜ" 4¨¡9¨dÒ.?°d¸3±iÓ@™ð	Aô # 1›Xò )˜Ø ŸW™W›Y˜Ü! ! B¡$°Ô7˜Ø˜S›	 TÑ)›	Ø# C›yØŸH™H R�Lð)ð —J‘J˜v t™|Õ,ä˜AŸE™E !›H Q™J›�AØ—L‘L  D¨¡G¡Ô,õ5 ð	-ñ> Ü�s˜U‘{Ø26÷&IØ-.ÀÀQÁò&IØ;<”�A�a‘C %Ö(ð&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‹  ø€ Ø�yŠyØˆIáð ×$Ñ$Ó&‰DˆAˆqØœŸ™‰~Ü˜A UÔ+�Ü˜A UÔ+�Ø˜1’9 ¨¢	Ø˜d™�BØ�	àˆØˆØ—‘ò 	:ˆAØ�xŠxØ—}‘}“‘��1ØŸš¨¯ªØ—L‘L ”OØØ‘ä—E‘E�Ü˜A“ˆAÙ˜˜!™Ÿ	™	¬#¬s¨Ñ3ØœŸ™‘:Ø—L‘L •Oà—L‘L  A¡Ô&ØØ‰HˆAˆq�"Ø�N‰N˜A˜qŸ{™{¨A¨q°"°aÐ8Õ9ð#	:ô( ”w˜wÓ'Ó(ˆô �U“ˆô &*¬%°«(£^Ð3ˆÑ"��1�a˜˜B âØ—‘˜A“ˆAÚØ˜A‘J�à�Q‘4—>“> a¨¡d§n£nà˜‘t˜q ™t“|Ø˜R™5 A b¡E›>Ø '§¡¨A£˜AÜ#& q¨¡t¨Q¨q©T£?˜Dð  ! ™t tš|Ø59Ö&:° q¨£tÐ&: Ð&:Ø # A£¨$¡£Ø '§¡¨q°#Õ 6Ø!" 1¡¨¢Ø59Ö&:° q¨£tÐ&: Ð&:Ø # A£¨$¡£Ø '§¡¨q°#Ô 6ä)¨!¨A©$´Ô4Ü$'¡ä$' Ø!ŸL™L¨1¨Q©4¨%°°!±©*±Q°q¸±t·y±yÀ±|³_ÀaÑ5GÑ*GÈ$Ñ)NÔOÙ$à�q‘T˜Q˜q™T’\à˜‘t˜q ™t’|Ø˜R™5 A b¡Eš>Ø '§¡¨A£˜AØ#$ Q¡4˜DÜ)¨!¨A©$´Ô4Ü$'¡ä$' Ø!ŸL™L¨1¨Q©4¨%°°!±©*±Q°q¸±t·y±yÀ±|³_ÀaÑ5GÑ*GÈ$Ñ)NÔOÙ$ð �L‰L˜˜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\  ó‚   ø€ Ü˜2œsÔ#¬
°2·7±7¼CÔ(@ØˆIà�F‰FˆØˆq‰5�AŠ:Ü˜Ÿ™ ! a¡%Ñ(Ó)¨"¯'©'Ñ1Ð1àˆr‰TˆÜ�"”cœ3¡°S¸cÔ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Ë   € ä�rœ3ÔØ�W‰W× Ò  B§F¡F×$5Ò$5¸"¿&¹&×:LÒ:LØˆIä�b—g‘gœsÔ#Ü�r—w‘w—|‘| A‘Ó'¨"¯&©&¨Ñ0Ð0Ü˜Ÿ™¤Ô%Ü�r—w‘w—|‘| A‘Ó'¨"¯&©&¨Ñ0Ð0Ü˜Ÿ™¤Ô%Ü�r—w‘w—|‘| 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>Ä  ó
   € ¨1¨q©5€ 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   ø€ Ü˜2œsÔ#¨¯©¯©¼¼c¸
Ñ(BØˆIä�2”sœC¡°c¸sÔCˆÜ�2”sœC¡°c¸sÔ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                  rŒt        |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                  r…t        |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~  € Ü˜2œsÔ#¬
°2·7±7¼SÄ#¸JÔ(GØˆIØ�~‰~Ó‰ˆˆ1Ø�F‰F�1‰IˆØ�<‹<˜AŸM›MØ�xŠxœJ q¬#Ô.Ø˜˜1™‘XœcÜ" A¨¡E¨1¡9Ó-ö$/Øô %-¨Q°£N´3¸¸A¸a¹C¹À±{Ó3CÓ$Cò $/ð 0ñ 0’à—’œj¨¬CÔ0Ø˜˜1™‘XœaŸm™m¨q°©s°A©gÑ6Ñ6´sÜ?DÀaÈ!ÁeÈQÁYÓ?Oö=QØ:;ô >FÀaÈ»^Ü—M‘M 1Ñ$ñ>%Ü%(¨!¨a°©c©'°1©Ó%5ó>6ò =Qð 8Rñ R‘à—’œz¨!¬SÔ1Ø˜˜1™‘XœcÜ" 1 Q¡3›Zö$)Øô %-¨Q°£N´3¸¸A¸a¹C¹À±{Ó3CÓ$Cò $)ð *ñ *‘à—’œz¨!¬SÔ1Ø˜˜1™‘XœaŸm™m¨a°©cÑ2Ñ2´3Ü?DÀQÀqÁS»zö9KØ:;ô :BÀ!ÀQ»Ü—M‘M 1Ñ$ñ:%Ü%(¨!¨a°©c©'°1©Ó%5ó:6ò 9Kð 4Lñ L�à�yŠyØ�a˜1˜"‘gœh q¨!¨A©#Ó.Ñ.Ñ.�Øˆ	ùò$/ùò=Qùò$)ùò9Ks   Â*(J
Ä/<J
Æ*(J
È(<J 
r   r;   s     r/   ÚTRpowerrK  Ë  s   € ò*ô, �R˜ÓÐr1   c                 ó>   — t        | j                  t        «      «      S )záReturn 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   € ô ˆR�X‰XÔ+Ó,Ó-Ð-r1   c                 ó8   — t        | «      | j                  «       fS rF   )rN  Ú	count_opsr|   s    r/   r~   r~   -  s   € œa ›d A§K¡K£MÐ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œ$ÔØˆr�w‰w¸¿¹ÖA°Aœ˜A wÖ/ÒAÐBÐBÜ	ˆR‹€BØ	‡v�vŒc”3ÔÙ�2‹hˆÙ�C‹L™7 2›;Ò&ØˆBØ�6‰6”#”sÔÜ�R“ˆBØ	‡v�vŒc”3ÔÙ�2‹hˆÜ”(˜3“-Ó ˆÜ�#�r˜3 Ð$¨'Ô2ˆÜŒt�B‹x˜ Ô)Ð)ùò 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ÙØ—‘ò 	8ˆAØ—>‘>Ó#‰DˆAˆqØ�1ŠuØ�B�Ø�B�Ø�!¡‘T˜!”W¨!Ð,Ñ-×4Ñ4°QÕ7ñ	8ñ 
Ø—‘ò 	-ˆAØ”!—%‘%™˜a›Ð!Ñ"×)Ñ)¨!Õ,ñ	-ô Ð5Ó6Ð6à€DØ
€CØò  ˆØ�‰GˆØ‰ˆˆ1Üˆq‹6�AŠ:Ü�QÐ' Ñ'ˆAÙ�Q“%ˆCØ�aŠxØ�Ø�Ø�K‰K˜˜!™Õà�K‰K˜˜!˜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   € ä˜!“Wœd 1›g€N€FˆFØ”&‘�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˜|r–t        ||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Ü�U‰UˆØ�8‹8Ø—N‘NÓ$‰EˆB�Ü�1—6‘6‹{˜QŠ¡cØØ�xŠxÜ˜AŸF™F“|‘à�s�Ø—‘˜“ˆAÜ˜!œSÔ!Ø‘Ü˜AœsÔ#Ø‘Ø—’˜aŸe™e¤q§v¡v™oØ�a‘‘àÙØ˜‘G�Ü˜a¤Ô%ÙØ™à™Ü ¤3Ô'ÙØ™à™Ø—X’X !§%¡%¬1¯6©6¡/Ø˜!‘G‘BàØ¤1§5¡5™�2°A°qÐ8Ð8¨d°A°qÐ8Ð8Ü˜œ3ÔØ‰AÜ˜œ3ÔØˆAØˆ9˜˜ØØœQŸU™U‘?‰R¨ˆØ�1�aˆxˆr1   r   c              3   ó:   •K  — | ]  }|j                   ‰v –— Œ y ­wrF   )r6   )rI   ra   r6   s     €r/   rK   ztrig_split.<locals>.<genexpr>]  s   øè ø€ Ò<¨a˜1Ÿ6™6 Tœ>Ñ<ù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 Ö'˜1ŒG�A�JÒ'�D€A€qØ�X‰X�a‹[�F€BˆØ
�%‰%�‹(×
Ñ
Ó
€CØ€K€BˆÜ‡}�}˜Ÿ
™
Ñ"Ø�V‰V”A—M‘MÓ"ˆØˆS‰Ü	
�‰˜"Ÿ*™*Ñ	$Ø�V‰V”A—M‘MÓ"ˆØˆSˆØ"$ b Ö*˜AˆA�I‰I�KÒ*�D€A€qò?ñD 	�A�sÓ€AØ€yØØ�K€CˆˆRÙ�A�sÓ€AØ€yØØ�K€CˆˆRñ ‘B™"¤¨B´Ô!4Ø#&¨¨B°°R¸Ð#;Ñ ˆˆR��S˜"˜bØ�RˆBˆÙØŠH�"ˆØŠH�"ˆÜ˜!˜QŸV™VÔ$ØØ�B˜˜AŸF™F 1™I q§v¡v¨a¡y´*¸QÄÓ2DÐDÐDá™3Ù‘r™b¡RÜ˜b "§'¡'Ó*´*¸RÀÇÁÓ2IÑIØØ)+¨R¨Ö1 1˜Ÿ›Ò1�ÜÓ<°B¸°8Ô<Ô<ØØ˜B  B§G¡G¨A¡J°·±¸±
¼JÀrÈ2Ï7É7Ó<SÐSÐSÙ‘"™™rÙ�R�Z B J°"°*ÀÀØØŠH�"ˆØŠH�"ˆØ�6‰6�Q—V‘VÒØÙÜ—%‘%ˆCÙÜ—%‘%ˆCØ�#‰:Ø”6‰MˆCØ˜˜B §¡ q¡	¬2¨a©4°Ð6Ð6Ø�‰WœÒØ�1�S‘5‰LˆCØ˜˜B §¡ q¡	¬2¨a©4°Ð6Ð6Ø�‰Wœ	Ò!Ø�1�S‘5‰LˆCØ˜˜B §¡ q¡	¬2¨a©4°Ð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¦  € ð* �8Š8”s˜1Ÿ6™6“{ aÒ'Øà�6‰6�D€A€qØŒQ�]‰]œAŸE™EÐ"Ñ"Ü�E‰EˆØ�8Š8˜Ÿ™˜q™	×+Ò+°·±°q±	¸A²Ø�2˜�rˆqˆAØ�ˆAØ�!�Qˆwˆà !§¡Ö'˜1ŒG�A�JÒ'�D€A€qØ�X‰X�a‹[�F€BˆØ
�%‰%�‹(×
Ñ
Ó
€CÜ‡}�}˜Ÿ
™
Ñ"Ø�V‰V”A—M‘MÓ"ˆØˆØ‰Ü	
�‰˜"Ÿ*™*Ñ	$Ø�V‰V”A—M‘MÓ"ˆØˆØ‰àˆˆˆRØ"$ b Ö*˜AˆA�I‰I�KÒ*�D€A€qØŒA�E‰E�zØ�!ˆ1ˆØ�RˆBˆØ	ˆR‚xØˆdˆØˆSˆàŒA�E‰E�zØ�A�rˆzÐð ùò+ (ùò +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Ø�G‰G�A‰JˆØ—x’xˆAˆaŠC¤S§^¡^À!Ç&Á&Ö4I¸Q°Q°q³SÒ4IÓ%JˆÜ�bœ$ÔÜ”S˜“V‘8ˆOÜ˜œDÔ!Ü�q“6ˆMÜ˜œDÔ!Ü”S˜“V‘8ˆOÜ˜œDÔ!Ü�q“6œ!‘8ˆOÜ˜œDÔ!Ü�q“6ˆMÜ˜œDÔ!Ü�q“6œ!‘8ˆOä% n°r·w±wÑ&>Ó?Ð?ùò 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Ø—7‘7˜1‘:×,Ñ,¨Q°tÐ,Ó<‰ˆˆqØ�J‰J˜œ1Ÿ5™5�zÓ" U¬1¡WÑ,ˆÜ�bœ#ÔÜ˜“7œ1‘9ÐÜ˜œCÔ Ü˜“7ˆNÜ˜œCÔ Ü˜“7œ1‘9ÐÜ˜œCÔ Ü˜“7œ1‘9ÐÜ˜œCÔ Ü˜“7ˆNÜ˜œCÔ Ü˜“7œ1‘9Ðä% n°r·w±wÑ&>Ó?Ð?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Ý.ð �H‰HÔ*Ó+€EØ"'Ö(˜QˆQ”“ŠLÒ(€DØ�[‰[œ˜d›Ó$€Fð  $×$‘t�q˜!ˆQ�ŠFÓ$€Dä‹€Aä�F˜AÓö !@ð @ð @ùò )ùó %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+   € ð& �8‰8”CœÔØˆä”:œg d›mÓ,Ó-Ð-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�Øˆ#ˆs�C˜˜c 3¨¨S°#°t¸TÀ4ÈØˆ(�D˜$  e¨U°Dð:ó;ó <ñ€Sˆ#ˆs�C˜˜c 3¨¨S°#°t¸TÀ4ÈØˆ(�D˜$  e¨U°Dð 
ˆcˆ
�S˜#�J Ð)€à��Sˆz˜C ˜: sÐ+Ð,€à	�3˜Ð˜x¨¨e°SÐ9¸8ÐD€à	ˆeˆ�hÐ€à
ˆC��d˜C  s¨CÐ0€ð 	ˆ#ˆt�S˜#˜tÐ$Øˆ#ˆt�SÐØ	ˆ4��d˜C  c¨4Ð0Øð	€ñ 3ó X*óv'ðT!÷ "'¡£ð ñ 
‰$‰s�7™D¡¡V£X§\¡\°7Ó!;Ó<Ó=Ó
>Ó?€òð 
€ós7òl6òr%òP$òN(@óV.r1   