Ë
    óÿæi ó  ã                   ó   — 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 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/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z: d dl;m<Z< d„ Z=d„ Z>d„ Z?d@d„Z@d„ ZAd„ ZBd„ ZCdAd„ZDdAd„ZEd „ ZFdBd!„ZGd"„ ZHdBd#„ZId$„ ZJdCd&„ZKd'„ ZLdBd(„ZMd)„ ZNd*„ ZOd+„ ZPdBd,„ZQdAd-„ZRdAd.„ZSd/„ ZTdAd0„ZUd1„ ZVd2„ ZWe<r< eX eYe:e=e>e?eAeBeDeEeFeGeHeIeKeMeOe@ePeQeReSeNeTeUf«      «      \  Z=Z>Z?ZAZBZDZEZFZGZHZIZKZMZOZ@ZPZQZRZSZNZTZUeDe=feEe=fe9gZZeKeDe=feEe=fe=gfZ[ePeGe=fePeGeJe=fe9gZ\eBeJfe9gZ]eBeAeBeMeBeOeBe=fZ^eBeAeIeBeAeKfeDeFeKeBfe\eZeHe[eBeHeHe]fe9gZ_d3„ fd4„Z`dDd5„Zad6jÅ                  «       Zc ed eX eeec eX eY ef«       jÎ                  ec«      «      «      «      «      Zhed7„ «       Zied8„ «       Zjed9„ «       Zkd@d:„Zld;„ Zmd<„ Znd=„ Zod>„ Zpd?„ Zqy%)Eé    )Údefaultdict)ÚAdd)Úcacheit)Ú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    úf/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/sympy/simplify/fu.pyÚTR0r1       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     r0   ÚfzTR1.<locals>.f5   sY   € Ü�bœ#ÔØ—‘˜‘
ˆAÜ—5‘5œ˜Q›‘<ÐÜ˜œCÔ Ø—‘˜‘
ˆAÜ—5‘5œ˜Q›‘<ÐØˆ	r2   r   ©r/   r;   s     r0   ÚTR1r=   )   s   € òô �R˜ÓÐr2   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 r5   )r6   r   r7   r   r   r    r9   s     r0   r;   zTR2.<locals>.fS   sY   € Ü�bœ#ÔØ—‘˜‘
ˆAÜ�q“6œ#˜a›&‘=Ð Ü˜œCÔ Ø—‘˜‘
ˆAÜ�q“6œ#˜a›&‘=Ð Øˆ	r2   r   r<   s     r0   ÚTR2r@   A   s   € ò$ô �R˜ÓÐr2   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)r6   r   Úis_PowÚbase)Ú.0Úais     r0   Ú	<genexpr>z8TR2i.<locals>.f.<locals>.ok.<locals>.<genexpr>.<genexpr>Š   s8   è ø€ ð ,Ù*�Bô # 2¤sÓ+ÒK¨r¯y©yÒ/K¸R¿W¹WÌ¸^ÓKÙ*ùs   ‚<>N)Úanyr   Ú	make_args)rJ   r:   s     r0   rL   z.TR2i.<locals>.f.<locals>.ok.<locals>.<genexpr>Š   s3   è ø€ ð =Ù5;°ô ñ ,ÜŸ-™-¨Ô*ó,÷ ,Ù5;ùs   ‚/1)	Ú
is_integerÚis_positiveÚfuncr   r   Úis_AddÚlenr7   rM   )ÚkÚeÚhalfs     €r0   ÚokzTR2i.<locals>.f.<locals>.okƒ   sx   ø€ ð —‘Ò. §¡ò ?Ø—‘œ3¤˜*Ð$ò >¨ò *=Ø—‘ò*=ä�A—F‘F“˜qÑ ò*=ô ñ =Ø56·V²Vó=ó =ð@r2   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é   )	rR   rS   r7   r&   r	   ÚappendÚ	enumerater   Úas_powers_dict)	ÚdÚddoneÚnewkrT   ÚknewÚiÚvrV   rW   s	          €€r0   Ú	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ð %4ô ˜D�z×0Ñ0Ó2�Û�AØ˜!™˜t A™w™�AÙ˜!˜Q”xØ ˜˜!šàŸ™ a¨ VÕ,ð ñ ð r2   r   F©ÚevaluaterZ   rD   )Úis_MulÚas_numer_denomÚis_Atomr]   ÚlistÚkeysÚpopr6   r   r   r7   r[   r   rR   r   r8   rO   rP   r   Úitems)r/   Únr^   rT   Úndoner_   rd   Útr:   Úa1ÚbrU   rW   rV   s               @€r0   r;   zTR2i.<locals>.f{   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ÙØˆIà×ÑÓˆÜ(,¨Q¯V©V«X¬ÓJ© 1¹bÀÀAÀaÁD½k�!�Q—U‘U˜1“X’¨ˆÐ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Ô<©Y¡T Q¨º!˜A˜q›D¨YÒ<Ñ<Ð>Ü q§w¡w¤yÔ6¡y™t˜q !²A�a˜“d yÒ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/   rV   r;   s    ` r0   ÚTR2irs   _   s   ø€ ô8Sôj �R˜ÓÐr2   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   é   rD   T)r6   r$   rQ   r7   r   ÚPirP   r   r   r   r    r!   r"   Útype)r/   Úfmaprv   s     €r0   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Øˆ	r2   c                 ó"   — t        | t        «      S rG   )r6   r$   ©Úxs    r0   Ú<lambda>zTR3.<locals>.<lambda>ü   s   € ”*˜QÔ 5Ô6r2   c                 ó*   — | j                  d„ d„ «      S )Nc                 ó6   — | j                   xr | j                  S rG   )Ú	is_numberrg   ©rn   s    r0   r   z'TR3.<locals>.<lambda>.<locals>.<lambda>þ   s   € �a—k‘kÒ. a§h¡hÐ.r2   c                 ó4   —  | j                   | j                  Ž S rG   ©rQ   r7   rƒ   s    r0   r   z'TR3.<locals>.<lambda>.<locals>.<lambda>ÿ   s   € �f�a—f‘f˜aŸf™f‘or2   ©Úreplacer}   s    r0   r   zTR3.<locals>.<lambda>ý   s   € �!—)‘)Ù.Ù%ô'r2   )Úsympy.simplify.simplifyrv   r‡   r   )r/   r;   rv   s     @r0   ÚTR3r‰   Ó   s4   ø€ õ$ 1ô	ð 
�‰Ù6ñ	'ó
(€Bô �R˜ÓÐr2   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   )rZ   rD   é   rx   é   )r6   r$   r7   r   Úis_RationalÚq)r~   Úrs     r0   r   zTR4.<locals>.<lambda>  sD   € Ü�qÔ/Ó0ò EØ—‘�q‘	œ"‘ˆ_ˆQ×)Ñ)òEØ./¯c©c°_Ð.DðEr2   c                 ó†   — | j                   | j                  d   j                   | j                  d   j                  Ž «      S r5   r…   r}   s    r0   r   zTR4.<locals>.<lambda>   s-   € Ø�F‰F�>�1—6‘6˜!‘9—>‘> 1§6¡6¨!¡9§>¡>Ð2Ô3r2   r†   r.   s    r0   ÚTR4r’     s    € ð0 �:‰:ñ	Eñ	4ó	5ð 5r2   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   TrZ   rD   rx   )rH   rI   rQ   ÚexpÚis_realr7   r%   )r/   rU   Úpr;   ÚgÚhÚmaxÚpows      €€€€€r0   Ú_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Ñ.Ð.r2   r   )r/   r;   r˜   r™   rš   r›   rœ   s    ````` r0   Ú_TR56r�   $  s   ü€ ÷4!/ð !/ôF �R˜ÓÐr2   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 rY   © r}   s    r0   r   zTR5.<locals>.<lambda>v  ó   € ¨¨Qªr2   ©rš   r›   )r�   r   r   ©r/   rš   r›   s      r0   ÚTR5r¤   d  ó   € ô$ �”Sœ#™°C¸SÔAÐAr2   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 rY   r    r}   s    r0   r   zTR6.<locals>.<lambda>‹  r¡   r2   r¢   )r�   r   r   r£   s      r0   ÚTR6r¨   y  r¥   r2   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 )NrD   rZ   r   )rH   rI   rQ   r   r•   r7   r.   s    r0   r;   zTR7.<locals>.fž  sM   € Ø—	’	˜bŸg™gŸl™l¬cÒ1°b·f±fÀ²kØˆIØ”C˜˜"Ÿ'™'Ÿ,™, q™/Ñ)Ó*Ñ*¨AÑ-Ð-r2   r   r<   s     r0   ÚTR7r«   Ž  s   € ò .ô
 �R˜ÓÐr2   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   rD   rZ   )rg   rH   rI   rQ   r   r   r•   rO   rP   rh   r
   ÚTR8r   r7   rŽ   rS   rR   r   Úas_coeff_MulrN   rz   r[   Ú
is_IntegerÚextendÚminÚrangerl   )r/   rb   rn   r^   ÚnewnÚnewdr7   r:   ÚcÚsrq   Úa2r¯   s               €r0   r;   zTR8.<locals>.f·  sN  ø€ à�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–ˆAØ—‘“ˆBØ—‘“ˆBØ�K‰Kœ˜R "™W›¬¨B°©G«Ñ4°aÑ7Õ8ð ô �!‹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    ` r0   r°   r°   ¦  s   ø€ ô"5+ôn �R˜ÓÐr2   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 )NrD   FrZ   Tr   éþÿÿÿ©
rR   rj   r   r7   rS   rµ   r   Ú
trig_splitr   r   )r/   r¯   r7   Úhitrb   rK   ÚjÚajÚwasÚnewrœ   ÚsplitÚgcdÚn1Ún2r:   rr   ÚiscosÚdos                     €r0   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Ù!ñ 5ð	 *ñ Ü©DÓ7©D b²Bšr¨DÑ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)rR   Úprocess_common_addends)r/   rÌ   s    @r0   r;   zTR9.<locals>.f  s$   ø€ Ø�yŠyØˆIõ<	;ô| & b¨"Ó-Ð-r2   r   r<   s     r0   ÚTR9rÏ   ñ  s   € ò.B.ôH �R˜ÓÐr2   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®   )rQ   r   r   r7   rR   rj   r   rl   r   Ú
_from_argsÚTR10)r/   r;   Úargr7   r:   rr   r¯   s         €r0   r;   zTR10.<locals>.fa  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Øˆ	r2   r   r»   s    ` r0   rÓ   rÓ   O  s   ø€ ô$ô6 �R˜ÓÐr2   c                 ó    — 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 )NrD   FrZ   TÚtworÀ   )r/   r¯   r7   rÂ   rb   rK   rÃ   rÄ   rÅ   rÆ   rœ   rÇ   rÈ   rÉ   rÊ   r:   rr   ÚsamerÌ   s                     €r0   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Ù!ñ 5ð	 *ñ Ü©DÓ7©D b²Bšr¨DÑ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 rG   )Útupler   Úfree_symbolsr}   s    r0   r   z"TR10i.<locals>.f.<locals>.<lambda>Î  s   € œe¤G¨A¯N©NÓ$;Ô<r2   r   rZ   rÍ   )rR   rÎ   r   rj   r7   rg   rH   r•   r   ÚHalfrI   r²   r[   r8   Ú_ROOT3Ú	_invROOT3rµ   rS   r   Úvalues)r/   Úbyradr:   rÂ   rK   r7   rr   rb   rÃ   rÅ   rÆ   rc   rœ   rÌ   s                @r0   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Û�Ü ›( 1™*¤i£kÓ2�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Ù$)ñ &:ñ "6ñ 3ð ñ  Ü˜4Ø"Ÿ\™\œ^ô#-Ù+˜ô $'±aÓ(>±a°º2ª°aÑ(>Ò#?Ø+ò#-ñ -ð /‘ñ ˜“V�Øàˆ	ðQ �iŒiðP ˆ	ùò )?ùó #-s   ÇHÇH	ÇH	Ç HÈ	Hr   r<   s     r0   ÚTR10irâ     s   € ò$iôV �R˜ÓÐr2   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 )NrD   r   T)Úrational)rQ   r   r   r   r8   rg   r±   r7   Ú	is_Numberr—   r�   ÚTR11)	r/   r;   rp   Úcor¸   r¹   ÚmrÔ   rI   s	           €r0   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Øˆ	r2   r   )r/   rI   r;   s    ` r0   rç   rç   ÿ  s   ø€ ôT!ôF �R˜ÓÐr2   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 r5   )r   Úsetr   rN   Úas_base_expr²   rQ   r   r   rz   Úaddr7   )Úflatr7   Úfirr   rU   s        r0   Úsincos_argsz%_TR11.<locals>.f.<locals>.sincos_argsh  ss   € ô œsÓ#ˆDÜ—m‘m DÖ)�Ø—~‘~Ó'‘��1Ø—<“< A¨£EØ—v‘v¤#¤s Ò+ØœT !›W™×)Ñ)¨!¯&©&°©)Õ4ð	 *ð
 ˆKr2   c                 ó¶   — |t            D ]L  }|dz  }||t           v rt        }n||t            v rt         }nŒ-t        | |«      } ||   j                  |«       ŒN | S ©NrD   )r   r   rç   Úremove)r/   Únum_argsÚden_argsÚnargrV   rQ   s         r0   Úhandle_matchz&_TR11.<locals>.f.<locals>.handle_matcht  sd   € ð !¤œ�Ø˜A‘v�Ø˜8¤C™=Ñ(Ü‘DØ˜X¤c™]Ñ*Ü‘DàÜ˜"˜d“^�Ø˜‘×%Ñ% dÕ+ð &ð ˆIr2   )r6   r   Úmaprh   )r/   rò   rö   r÷   rù   s        r0   r;   z_TR11.<locals>.fd  sZ   € Ü˜"œdÔ#ØˆIò
	ô ! ¨b×.?Ñ.?Ó.AÓBÑˆ�(ò	ñ  ˜"˜h¨Ó1ˆá˜"˜h¨Ó1ˆØˆ	r2   r   r<   s     r0   Ú_TR11rû   O  s   € ò*#ôJ �R˜ÓÐr2   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®   rZ   )
rQ   r   r7   rR   rj   r   rl   r   rÒ   ÚTR12)r/   rÔ   r7   r:   rr   Útbr¯   s         €r0   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Øˆ	r2   r   r»   s    ` r0   rþ   rþ   Œ  s   ø€ ôô& �R˜ÓÐr2   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 )NrD   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrG   )r6   r   )rJ   rñ   s     r0   rL   z/TR12i.<locals>.f.<locals>.ok.<locals>.<genexpr>Ó  s   è ø€ ÐA¹&°BœJ r¬3×/¹&ùs   ‚)Úas_f_sign_1r   ÚNegativeOnerg   rS   r7   Úall)Údiré   r˜   r;   r¹   s        r0   rW   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¨(Ð%ð r2   r   c                 ó¸   — | j                   rNt        | j                  «      dk(  r5| j                  \  }}t        |t        «      rt        |t        «      r||fS y y y y rô   )rR   rS   r7   r6   r   )Únir:   rr   s      r0   rW   zTR12i.<locals>.f.<locals>.okó  sP   € Ø�yŠyœS §¡›\¨QÒ.Ø—w‘w‘��1Ü˜a¤Ô%¬*°Q¼Ô*<Ø˜a˜4�Kð +=Ð%ð /ˆyr2   FTrZ   )rR   rg   rH   rh   r7   rj   r   rN   r\   r   r   r8   r&   r³   r•   rO   rI   rP   r	   r  Úextract_additivelyrl   r   rm   )r/   rn   r^   ÚdokrW   Úd_argsrb   r  ré   r˜   rp   Ú_r¹   Ún_argsrÂ   r	  ÚedÚnewedrU   r:   s                       r0   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©V¨˜!Ÿ&™& ›)¨VÑ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Ù=H±T°Q¸ô 36Ø !§¢ó8(Ù &˜1”�A• ñ8(ð 3)Ø+,ñ3-Ø/0ó21Ø=Hó1Jð ,Kñ KˆBð ˆ	ùòU 5ùò 9ùò^ ,ùò8(ùô 1Js*   Â+R
ÆR

Î$R
ÑRÑRÑ/RÒRr   r<   s     r0   ÚTR12ir  ¯  s   € ò*aôF �R˜ÓÐr2   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   rD   rZ   )rg   r   r    r   rN   rQ   rz   r[   r7   rS   rl   )r/   r7   r:   rp   r¸   Út1Út2s          r0   r;   zTR13.<locals>.f8  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Ðr2   r   r<   s     r0   ÚTR13r  *  s   € òô< �R˜ÓÐr2   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   rZ   rD   Fre   )rg   rh   r   rj   r7   rî   r²   r6   r   r±   r[   Úsortr   rµ   r´   rl   rõ   r   )r/   r¯   rn   r^   r7   ÚcossÚotherr¸   rr   rU   rè   r:   rÆ   rT   ÚccÚciÚnewargÚtakeÚccsrb   Úkeyr;   s                        €r0   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™˜Ü! ! B¡$°Ô7˜ØŸ
™
 2œÜ" 4¨¡9¨dÒ.?°d¸3±iÓ@™ð	 &ô # 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Ù26¨QÀÀQÄ¸1”�A�a‘C %Ö(ÀÐ(°$ò&Iñ Ið KˆBð ˆ	ùó&Is   É!I.rÍ   r   r<   s    @r0   ÚTRmorrier#  Y  s   ø€ õv7ôr �R˜ÓÐr2   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®   rZ   r�   r   rD   )rg   rh   r   r8   ÚTR14r7   rH   rî   rO   rP   r[   r  rQ   r   r   ræ   rj   r   rS   rµ   rl   r´   Úinsertr6   r   )r/   rn   r^   r¶   r·   r  Úprocessr:   rr   rU   ré   r˜   r;   ÚsiÚnotherrk   rp   ÚAÚBr   rb   Úremr¯   s                         €r0   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Ó&:±T° q¨£t°T Ð&:Ø # A£¨$¡£Ø '§¡¨q°#Õ 6Ø!" 1¡¨¢Ù59Ó&:±T° q¨£t°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    ` r0   r&  r&  Ð  s   ø€ ô,^ô@ �R˜ÓÐr2   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 )NrD   rZ   c                 ó   — d| z   S rY   r    r}   s    r0   r   z!TR15.<locals>.f.<locals>.<lambda>b  ó   € ¨!¨aª%r2   r¢   )r6   r   rI   r   r•   ÚTR15r�   r    ©r/   rU   Úiar:   rš   r›   s       €€r0   r;   zTR15.<locals>.fY  ó‚   ø€ Ü˜2œsÔ#¬
°2·7±7¼CÔ(@ØˆIà�F‰FˆØˆq‰5�AŠ:Ü˜Ÿ™ ! a¡%Ñ(Ó)¨"¯'©'Ñ1Ð1àˆr‰TˆÜ�"”cœ3¡°S¸cÔBˆØ�Š7ØˆBØˆ	r2   r   ©r/   rš   r›   r;   s    `` r0   r2  r2  I  ó   ù€ õ ô �R˜ÓÐr2   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 )NrD   rZ   c                 ó   — d| z   S rY   r    r}   s    r0   r   z!TR16.<locals>.f.<locals>.<lambda>ƒ  r1  r2   r¢   )r6   r   rI   r   r•   r2  r�   r   r3  s       €€r0   r;   zTR16.<locals>.fz  r5  r2   r   r6  s    `` r0   ÚTR16r;  j  r7  r2   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 r5   )r6   r   rI   rP   r•   rO   Úis_negativer   r    r7   r   r"   r   r!   r.   s    r0   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Øˆ	r2   r   r<   s     r0   ÚTR111r?  ‹  s   € òô �R˜ÓÐr2   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 rY   r    r}   s    r0   r   z!TR22.<locals>.f.<locals>.<lambda>Á  ó   € ¨1¨qª5r2   r¢   c                 ó   — | dz
  S rY   r    r}   s    r0   r   z!TR22.<locals>.f.<locals>.<lambda>Â  rC  r2   )	r6   r   rI   rQ   r    r   r�   r!   r"   r£   s    €€r0   r;   zTR22.<locals>.f½  sR   ø€ Ü˜2œsÔ#¨¯©¯©¼¼c¸
Ñ(BØˆIä�2”sœC¡°c¸sÔCˆÜ�2”sœC¡°c¸sÔCˆØˆ	r2   r   r6  s    `` r0   ÚTR22rE  «  s   ù€ õ$ô �R˜ÓÐr2   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  )r6   r   rI   r   r   rî   r7   r²   rP   Úis_oddr   rµ   r   r   r  Úis_even)r/   rr   rn   r~   rT   s        r0   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Ù?O¸!ô >FÀaÈ»^Ü—M‘M 1Ñ$ñ>%Ü%(¨!¨a°©c©'°1©Ó%5ó>6Ø?Oñ=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Ù?I¸!ô :BÀ!ÀQ»Ü—M‘M 1Ñ$ñ:%Ü%(¨!¨a°©c©'°1©Ó%5ó:6Ø?Iñ9Kð 4Lñ L�à�yŠyØ�a˜1˜"‘gœh q¨!¨A©#Ó.Ñ.Ñ.�Øˆ	ùò$/ùò=Qùò$)ùò9Ks   Â*(J
Ä/<J
Æ*(J
È(<J 
r   r<   s     r0   ÚTRpowerrJ  È  s   € ò*ô, �R˜ÓÐr2   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    r0   ÚLrM  ö  s   € ô ˆR�X‰XÔ+Ó,Ó-Ð-r2   c                 ó8   — t        | «      | j                  «       fS rG   )rM  Ú	count_opsr}   s    r0   r   r   *  s   € œa ›d A§K¡K£MÑ2r2   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   r6   r   rQ   r7   Úfur=   Úhasr   r    r@   r   r   r°   r#  r´   rs   )r/   rQ  ÚfRL1ÚfRL2rÅ   r:   Úrv1Úrv2s           r0   rT  rT  *  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   rZ   zmust have at least one keyFrf   T)
r   rj   r7   r±   r[   r   r8   Ú
ValueErrorrS   r   )r/   rÌ   Úkey2Úkey1Úabscr:   r¸   r7   rÂ   rT   rc   r  rU   rÆ   s                 r0   rÎ   rÎ   …  s6  € ô ”tÓ€DÙØ—”ˆAØ—>‘>Ó#‰DˆAˆqØ�1ŠuØ�B�Ø�B�Ø�!¡‘T˜!”W¨!Ð,Ñ-×4Ñ4°QÕ7ñ ñ 
Ø—”ˆAØ”!—%‘%™˜a›Ð!Ñ"×)Ñ)¨!Õ,ñ ô Ð5Ó6Ð6à€DØ
€CÛˆØ�‰GˆØ‰ˆˆ1Üˆq‹6�AŠ:Ü�QÐ' Ñ'ˆAÙ�Q“%ˆCØ�aŠxØ�Ø�Ø�K‰K˜˜!™Õà�K‰K˜˜!˜A™$™Õð ñ Ü�$ˆZˆà€Ir2   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                  ó   — t        d«      S rô   ©r#   r    r2   r0   Ú_ROOT2ra  ¶  ó   € ä�‹7€Nr2   c                  ó   — t        d«      S )NrŒ   r`  r    r2   r0   rÞ   rÞ   »  rb  r2   c                  ó   — dt        d«      z  S )NrZ   rŒ   r`  r    r2   r0   rß   rß   À  s   € àŒT�!‹W‰9Ðr2   c           	      ó€  ‡— | |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)
    rZ   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.
        NrD   r   )r   r8   rg   r±   rS   r7   rj   rl   r6   r   r   rH   r•   rÝ   )r:   rØ   r¸   r¹   rè   r7   rr   s          r0   Ú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ˆr2   Nr   c              3   ó:   •K  — | ]  }|j                   ‰v –— Œ y ­wrG   )r7   )rJ   rb   r7   s     €r0   rL   ztrig_split.<locals>.<genexpr>^  s   øè ø€ Ð<±8¨a˜1Ÿ6™6 Tœ>±8ùs   ƒrx   FrD   rŒ   r�   )r   r,   rÈ   Úas_exprr   r  ÚfactorsÚquor6   r   rQ   r7   r   r  r8   ra  r   rÞ   rß   )r:   rr   rØ   rb   ÚuaÚubrÈ   rÉ   rÊ   rg  ré   ÚcoaÚcaÚsaÚcobÚcbÚsbr¸   r¹   rÃ   r7   s                       @r0   rÁ   rÁ   Å  s?  ø€ ðd "# 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“8‰Oˆ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   ˆL1ÃL6Ç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)
    rD   Nr   éÿÿÿÿrZ   )rR   rS   r7   r   r  r8   rg   ræ   r   r,   rÈ   ri  rj  rk  )
rU   r:   rr   r˜   rb   rl  rm  rÈ   rÉ   rÊ   s
             r0   r  r  w  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)r6   r   r7   rR   r   rÒ   r   r   r   r   r   r   r   r   r    r   r!   r   r"   ÚNotImplementedErrorrQ   )r/   r:   rb   r^   s      €r0   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   ©rU   r^   r;   s    ` r0   Ú_osborner{  °  s   ø€ ô"@ô( �Q˜‹?Ðr2   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_Addrx  )r6   r$   r7   Úas_independentÚxreplacer   r8   r   r   r   r   r   r   r   r    r   r!   r   r"   r   ry  rQ   )r/   Úconstr~   r:   r^   s       €r0   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Ñ&>Ó?Ð?r2   r   rz  s    ` r0   Ú	_osborneir‚  Ø  s   ø€ ô @ô( �Q˜‹?Ðr2   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   ru   )Úcollectc           	      ó‚   •—  ‰ ‰t        | ‰«      j                  t        ‰«      «      «      t        j                  «      S rG   )r‚  r€  Údictr   ÚImaginaryUnit)r~   r„  r^   Úrepsrv   s    €€€€r0   r   zhyper_as_trig.<locals>.<lambda>&  s1   ø€ ©'±(Ü�!�Q‹× Ñ ¤ d£Ó,ó3.Ü/0¯©ô+@r2   )
rˆ   rv   Úsympy.simplify.radsimpr„  Úatomsr$   r   r€  r†  r{  )
r/   Útrigsrp   ÚmaskedrT   rc   r„  r^   rˆ  rv   s
         @@@@r0   Úhyper_as_trigr�  ÿ  s“   û€ õ4 1Ý.ð �H‰HÔ*Ó+€EÙ"'Ó(¡%˜QˆQ”“ŠL %Ñ(€DØ�[‰[œ˜d›Ó$€Fñ  $Ô$™t‘t�q˜!ˆQ�ŠF˜tÒ$€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)
    )rU  r   r   r°   r
   rJ  )Úexprs    r0   Úsincos_to_sumr�  *  s+   € ð& �8‰8”CœÔØˆä”:œg d›mÓ,Ó-Ð-r2   )F)rx   FrÍ   rG   )NT)rÚcollectionsr   Úsympy.core.addr   Úsympy.core.cacher   Ú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*   r1   r=   r@   rs   r‰   r’   r�   r¤   r¨   r«   r°   rÏ   rÓ   râ   rç   rû   rþ   r  r  r#  r&  r2  r;  r?  rE  rJ  rM  rj   rú   ÚCTR1ÚCTR2ÚCTR3ÚCTR4rR  rS  rT  rÎ   rÇ   Úfufuncsr†  ÚzipÚlocalsÚgetÚFUra  rÞ   rß   rÁ   r  r{  r‚  r�  r�  r    r2   r0   Ú<module>r°     sÞ  ðÝ #å Ý $Ý  ß AÑ AÝ *Ý ß $Ý  Ý "Ý &Ý #Ý &Ý *Ý =÷<÷ <ñ <÷?÷ ?ó ?å /Ý (Ý (ß 1å ò)òò0ó<qòh.òb5ò@=ó@Bó*Bò*ó0HòV[ó|-ò`}ó@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Ó!;Ó<Ó=Ó
>Ó?€ð 	ñó 	ðð 	ñó 	ðð 	ñó 	ðóo7òd6òr%òP$òN(@óV.r2   