Ë
    óÿæiU«  ã                   óà  — d Z ddl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
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: e
d	k(  rd
Z;ndZ;dZ<e
d	k(  rdZ=ndZ=dZ>i Z?dZ@i ZAdZBdZCi ZDdZEdZFdZGi ZHddgZI ed eeB«      dz   «      D ]  ZJeI eKdeJz  eB«      dz   gdeJdz
  z  z  z  ZIŒ  d„ ZLd„ ZMd„ ZNd„ ZOdXd„ZPeLd„ «       ZQeLd„ «       ZR	  ed«      ZS ed «      ZT ed!«      ZU ed"«      ZVd#„ ZWeLdYd$„«       ZXd%„ ZYd&„ ZZeLd'„ «       Z[eLd(„ «       Z\ eMe\«      Z] eMeX«      Z^ eMe[«      Z_ eMeY«      Z` eMeQ«      Za eMeR«      ZbeLd)„ «       ZceLd*„ «       Zd eMed«      Ze eMec«      Zfefd+„Zgd,„ Zhd-„ Ziefd.„Zjefd/„ZkdZd0„Zld1„ Zmd2„ Znd[d3„Zod4„ Zpefd5„Zqd6„ Zrd7„ Zsd8„ Ztd9„ Zud:„ Zvefd;„Zwefd<„Zxefd=„Zyefd>„Zzefd?„Z{efd@„Z|efdA„Z}efdB„Z~d[dC„ZdD„ Z€dE„ Z�dF„ Z‚efdG„ZƒedfdH„Z„dI„ Z…eddfdJ„Z†efdK„Z‡efdL„ZˆefdM„Z‰efdN„ZŠefdO„Z‹efdP„ZŒefdQ„Z�efdR„ZŽefdS„Z�dZdT„Z�dZdU„Z‘e
dVk(  r	 ddl’m“c m”c m•Z– e–jh                  Z4e–�j                  Zƒe–jâ                  Zqe–�j                  Z‡e–�j                  Zˆe–jÎ                  Zge–�j"                  Z‘e–�j                   Z�e–jØ                  Zlyy# e—e˜f$ r  e™dW«       Y yw xY w)\a(  
This module implements computation of elementary transcendental
functions (powers, logarithms, trigonometric and hyperbolic
functions, inverse trigonometric and hyperbolic) for real
floating-point numbers.

For complex and interval implementations of the same functions,
see libmpc and libmpi.

é    N)Úbisecté   )Úxrange)ÚMPZÚMPZ_ZEROÚMPZ_ONEÚMPZ_TWOÚMPZ_FIVEÚBACKEND)-Úround_floorÚround_ceilingÚ
round_downÚround_upÚround_nearestÚ
round_fastÚComplexResultÚbitcountÚbctableÚlshiftÚrshiftÚgiant_stepsÚ
sqrt_fixedÚfrom_intÚto_intÚfrom_man_expÚto_fixedÚto_floatÚ
from_floatÚfrom_rationalÚ	normalizeÚfzeroÚfoneÚfnoneÚfhalfÚfinfÚfninfÚfnanÚmpf_cmpÚmpf_signÚmpf_absÚmpf_posÚmpf_negÚmpf_addÚmpf_subÚmpf_mulÚmpf_divÚ	mpf_shiftÚmpf_rdiv_intÚmpf_pow_intÚmpf_sqrtÚreciprocal_rndÚnegative_rndÚmpf_perturbÚ
isqrt_fast)ÚifibÚpythonéX  i�  iÜ  éÈ   é   iÐ  iÄ	  é	   é   i¸  é   é   é   c                 ór   ‡ — d‰ _         d‰ _        ˆ fd„}‰ j                  |_        ‰ j                  |_        |S )zè
    Decorator for caching computed values of mathematical
    constants. This decorator should be applied to a
    function taking a single argument prec as input and
    returning a fixed-point value with the given precision.
    éÿÿÿÿNc                 óº   •— ‰j                   }| |k  r‰j                  || z
  z	  S t        | dz  dz   «      } ‰|fi |¤Ž‰_        |‰_         ‰j                  || z
  z	  S )NgÍÌÌÌÌÌð?é
   )Ú	memo_precÚmemo_valÚint)ÚprecÚkwargsrG   ÚnewprecÚfs       €úk/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mpmath/libmp/libelefun.pyÚgzconstant_memo.<locals>.g^   sd   ø€ Ø—K‘Kˆ	Ø�9ÒØ—:‘: )¨D¡.Ñ1Ð1Ü�d˜4‘i ‘lÓ#ˆÙ�wÑ) &Ñ)ˆŒ
ØˆŒØ�z‰z˜g d™lÑ+Ð+ó    )rG   rH   Ú__name__Ú__doc__)rM   rO   s   ` rN   Úconstant_memorS   U   s5   ø€ ð €A„KØ€A„Jô,ð —‘€A„JØ—	‘	€A„IØ€HrP   c                 ó@   ‡ — t         fˆ fd„	}‰ j                  |_        |S )zÿ
    Create a function that computes the mpf value for a mathematical
    constant, given a function that computes the fixed-point value.

    Assumptions: the constant is positive and has magnitude ~= 1;
    the fixed-point function rounds to floor.
    c                 óx   •— | dz   } ‰|«      }|t         t        fv r|dz  }t        d|| t        |«      | |«      S )Nr?   r   r   )r   r   r    r   )rJ   ÚrndÚwpÚvÚfixeds       €rN   rM   zdef_mpf_constant.<locals>.fr   sF   ø€ Ø�B‰YˆÙ�"‹IˆØ”8œ]Ð+Ñ+Ø�‰FˆAÜ˜˜A ˜s¤H¨Q£K°°sÓ;Ð;rP   )r   rR   )rY   rM   s   ` rN   Údef_mpf_constantrZ   j   s   ø€ ô õ <ð —‘€A„IØ€HrP   c                 ó   — ||z
  dk(  r7t        d|z  dz   «      }|s|dz  rt        || dz  z  |fS t         || dz  z  |fS ||z   dz  }t        | |||«      \  }}}t        | |||«      \  }	}
}|
|z  ||	z  z   ||
z  ||z  fS )Nr   rB   é   )r   r   Úbsp_acot)ÚqÚaÚbÚ
hyperbolicÚa1ÚmÚp1Úq1Úr1Úp2Úq2Úr2s               rN   r]   r]   {   s­   € Øˆ1�u�‚zÜ��1‘�q‘‹\ˆÙ˜˜1šÜ˜B  A¡™I rÐ)Ð)ä�8˜R ! Q¡$™Y¨Ð*Ð*Ø	
ˆ1‰ˆq‰€AÜ˜!˜Q  :Ó.�J€BˆˆBÜ˜!˜Q  :Ó.�J€BˆˆBØˆb‰5�2�b‘5‰=˜"˜R™%  B¡Ð&Ð&rP   c                 ó�   — t        d|z  t        j                  | «      z  dz   «      }t        | d||«      \  }}}||z   |z  || z  z  S )zœ
    Compute acot(a) or acoth(a) for an integer a with binary splitting; see
    http://numbers.computation.free.fr/Constants/Algorithms/splitting.html
    çffffffÖ?r?   r   )rI   ÚmathÚlogr]   )r_   rJ   ra   ÚNÚpr^   Úrs          rN   Ú
acot_fixedrq   ‰   sQ   € ô
 	ˆD�4‰KœŸ™ ›Ñ# bÑ(Ó)€AÜ�q˜!˜A˜zÓ*�G€A€qˆ!Øˆq‰S�4‰K˜1˜Q™3ÑÐrP   Fc                 ó€   — d}t         }| D ]-  \  }}|t        |«      t        t        |«      ||z   |«      z  z  }Œ/ ||z	  S )zì
    Evaluate a Machin-like formula, i.e., a linear combination of
    acot(n) or acoth(n) for specific integer values of n, using fixed-
    point arithmetic. The input should be a list [(c, n), ...], giving
    c*acot[h](n) + ...
    rF   )r   r   rq   )ÚcoefsrJ   ra   Ú	extraprecÚsr_   r`   s          rN   Úmachinrv   ’   sJ   € ð €IÜ€AÛ‰ˆˆ1Ø	ŒS�‹V”j¤ Q£¨¨i©¸ÓDÑDÑD‰ð à�‰NÐrP   c                 ó    — t        g d¢| d«      S )zz
    Computes ln(2). This is done with a hyperbolic Machin-type formula,
    with binary splitting at high precision.
    ))é   é   )éþÿÿÿiÁ  )r=   i-"  T©rv   ©rJ   s    rN   Ú	ln2_fixedr}   ¢   s   € ô Ò3°T¸4Ó@Ð@rP   c                 ó    — t        g d¢| d«      S )zN
    Computes ln(10). This is done with a hyperbolic Machin-type formula.
    ))é.   é   )é"   é1   )r?   é¡   Tr{   r|   s    rN   Ú
ln10_fixedr„   ª   s   € ô
 Ò1°4¸Ó>Ð>rP   iqcÏ i¦-~ i@Å	 é   c                 óp  — || z
  dk(  rOt        d|z  dz
  d|z  dz
  z  d|z  dz
  z  «      }|dz  t        dz  z  dz  }d|z  |z  t        t        |z  z   z  }n[|r|dk  rt	        d	| |«       | |z   dz  }t        | ||dz   |«      \  }}	}
t        |||dz   |«      \  }}}|	|z  }||z  }|
|z  ||z  z   }|||fS )
z×
    Computes the sum from a to b of the series in the Chudnovsky
    formula. Returns g, p, q where p/q is the sum as an exact
    fraction and g is a temporary value used to save work
    for recursive calls.
    r   é   é   rB   r\   é   rD   é   z  binary splitting)r   ÚCHUD_CÚCHUD_AÚCHUD_BÚprintÚbs_chudnovsky)r_   r`   ÚlevelÚverboserO   ro   r^   ÚmidÚg1rd   re   Úg2rg   rh   s                 rN   r�   r�   Ó   sð   € ð 	ˆ�sˆa‚xÜ��1‘�Q‘˜˜1™˜Q™‘  1¡ Q¡Ñ'Ó(ˆØˆq‰D”6˜1‘9Ñ Ñ"ˆØ�!‰G�a‰Kœ6¤&¨¡(™?Ñ+‰á�u˜q’yÜÐ&¨¨1Ô-Ø�‰s�Q‰hˆÜ" 1 c¨5°©7°GÓ<‰
ˆˆB�Ü" 3¨¨5°©7°GÓ<‰
ˆˆB�Øˆr‰EˆØˆr‰EˆØˆr‰E�B�r‘E‰MˆØˆa�ˆ7€NrP   c                 óØ   — t        | dz  dz  dz   «      }|rt        d|«       t        d|d|«      \  }}}t        t        d| z  z  «      }|t        z  |z  |t
        |z  z   t        z  z  }|S )z“
    Compute floor(pi * 2**prec) as a big integer.

    This is done using Chudnovsky's series (see comments in
    libelefun.py for details).
    gÿ¢v	O“
@g biå ],@rB   zbinary splitting with N =r   )rI   rŽ   r�   r8   r‹   rŒ   ÚCHUD_D)	rJ   r‘   Úverbose_basern   rO   ro   r^   ÚsqrtCrX   s	            rN   Úpi_fixedr™   é   sx   € ô 	ˆD�Ñ˜lÑ*¨QÑ.Ó/€AÙÜÐ)¨1Ô-Ü˜A˜q ! WÓ-�G€A€qˆ!Ü”v  $¡Ñ'Ó(€EØ	Œ&‰�‰˜!œF 1™H™*¤fÑ,Ñ-€AØ€HrP   c                 ó   — t        | «      dz  S )Né´   )r™   r|   s    rN   Údegree_fixedrœ   ú   s   € Ü�D‹>˜3ÑÐrP   c                 óš   — || z
  dk(  rt         t        |«      fS | |z   dz  }t        | |«      \  }}t        ||«      \  }}||z  |z   ||z  fS )ze
    Sum series for exp(1)-1 between a, b, returning the result
    as an exact fraction (p, q).
    r   rB   )r   r   Úbspe)r_   r`   rc   rd   re   rg   rh   s          rN   rž   rž   ý   s^   € ð
 	ˆ�sˆa‚xÜœ˜A›ˆÐØ	
ˆ1‰ˆq‰€AÜ�!�Q‹Z�F€BˆÜ�!�Q‹Z�F€BˆØˆb‰5�‰8�R˜‘Uˆ?ÐrP   c                 ó„   — t        d| z  t        j                  | «      z  dz   «      }t        d|«      \  }}||z   | z  |z  S )zö
    Computes exp(1). This is done using the ordinary Taylor series for
    exp, with binary splitting. For a description of the algorithm,
    see:

        http://numbers.computation.free.fr/Constants/
            Algorithms/splitting.html
    gš™™™™™ñ?r?   r   )rI   rl   rm   rž   )rJ   rn   ro   r^   s       rN   Úe_fixedr    	  sF   € ô 	ˆC�‰H”T—X‘X˜d“^Ñ# bÑ(Ó)€AÜ��!‹9�D€A€qØˆq‰S�4‰K˜!ÑÐrP   c                 óT   — | dz  } t        t        d| z  z  «      t        | z  z   }|dz	  S )z2
    Computes the golden ratio, (1+sqrt(5))/2
    rF   rB   é   )r8   r
   r   )rJ   r_   s     rN   Ú	phi_fixedr£     s2   € ð
 	ˆB�J€DÜ”8˜a ™fÑ%Ó&¬'°T©/Ñ:€AØ�‰7€NrP   c           	      ód   — | dz   }t        t        t        t        |«      d«      |«      | dz
  «      S )NrF   r   )r   Úmpf_logr1   Úmpf_pi)rJ   rW   s     rN   Úln_sqrt2pi_fixedr§   *  s.   € à	�‰€Bä”GœI¤f¨R£j°!Ó4°bÓ9¸4À¹6ÓBÐBrP   c                 ó,   — t        t        | «      | «      S ©N)r   r™   r|   s    rN   Úsqrtpi_fixedrª   0  s   € ä”h˜t“n dÓ+Ð+rP   c           	      óÌ  — | \  }}}}|\  }}	}
}|r|
dk  rt        d«      ‚|
dk\  rt        | d|z  |	|
z  z  ||«      S |
dk(  r}|	dk(  r6|r't        t        t	        | |dz   t
        |   «      ||«      S t	        | ||«      S |r$t        t	        | |dz   t
        |   «      |	 ||«      S t        t	        | |dz   |«      |	||«      S t        | |dz   |«      }t        t        ||«      ||«      S )zV
    Compute s**t. Raises ComplexResult if s is negative and t is
    fractional.
    r   z,negative number raised to a fractional powerrD   r   rF   )	r   r3   r0   r"   r4   r5   r¥   Úmpf_expr/   )ru   ÚtrJ   rV   ÚssignÚsmanÚsexpÚsbcÚtsignÚtmanÚtexpÚtbcÚcs                rN   Úmpf_powr·   >  s  € ð
 Ñ€Eˆ4��sØÑ€Eˆ4��sÙ�˜’ÜÐJÓKÐKØˆq‚yÜ˜1˜r E™k¨T°4©ZÑ8¸$ÀÓDÐDàˆr‚zØ�1Š9ÙÜœt¤X¨a°°b±Ü" 3Ñ'ó&)Ø*.°ó5ð 5ä˜A˜t SÓ)Ð)áÜ"¤8¨A¨t°B©wÜ" 3Ñ'ó$)Ø+/¨%°°só<ð <äœx¨¨4°©7°CÓ8¸$ÀÀcÓJÐJô 	��4˜‘7˜CÓ €AÜ”7˜1˜a“= $¨Ó,Ð,rP   c                 ó¬  — |dk(  r| | z  dfS t        | «      }d}d|dt        |«      z  z   dz   z  }t        \  }}}}		 |dz  rM|| z  }||z   }|	|dz
  z  }	|	t        t        ||	z	  «         z   }	|	|kD  r||	|z
  z	  }||	|z
  z  }|}	|dz  }|s	 ||fS | | z  } ||z   }||z   dz
  }|t        t        | |z	  «         z   }||kD  r| ||z
  z	  } |||z
  z  }|}|dz  }Œ™)z‡n-th power of a fixed point number with precision prec

       Returns the power in the form man, exp,
       man * 2**exp ~= y**n
    rB   r   rŠ   r   )r   r"   r   rI   )
ÚyÚnrJ   ÚbcÚexpÚworkprecÚ_ÚpmÚpeÚpbcs
             rN   Úint_pow_fixedrÂ   Z  s?  € ð 	ˆA‚vØ�!‘�aˆxˆÜ	�!‹€BØ
€CØ�D˜1œX a›[™=Ñ(¨1Ñ,Ñ-€HÜ�N€A€rˆ2ˆsØ
ØˆqŠ5Ø�A‘ˆBØ�C‘ˆBØ�2˜‘6‰MˆCØœ¤ B¨#¡I£Ñ/Ñ/ˆCØ�XŠ~Ø˜C ™LÑ)�Ø�c˜H‘nÑ$�Ø�Ø�‰FˆAÙØð ˆrˆ6€Mð ˆa‰CˆØ�#‰gˆØ�"‰W�q‰[ˆØ”'œ#˜a 2™g›,Ñ'Ñ'ˆØ�Š=Ø�b˜‘kÑ"ˆAØ�2˜‘=Ñ ˆCØˆBØ�‰Fˆð+ rP   c                 óô  — d}	 t        | |||z  z
  «      }t        t        |d|z  z  «      «      }d}|}	|}
t        |||z   «      D ]e  }t        ||dz
  |
«      \  }}t        ||dz
  |
z  |z
  |z
  |	z
  «      }t        | d|z  |z
  |	z   «      |z  }||dz
  t        |||
z
  «      z  z   |z  }|}
Œg |S # t        $ r? t	        |«      }t	        |«      }t        d||«      }t        |||«      }t        |«      }Y ŒÆw xY w)Né2   g      ð?r   rF   rB   )r   r   rI   ÚOverflowErrorr   r2   r·   r   r   rÂ   r   )r¹   rº   rJ   Úexp1ÚstartÚy1rp   ÚfnÚextraÚextra1Úprevpro   r¿   rÀ   ri   ÚBs                   rN   Únthroot_fixedrÎ   �  s,  € Ø€EðÜ�A�t˜a ™g‘~Ó&ˆÜ”�B˜˜Q™‘KÓ Ó!ˆð €EØ€FØ€EÜ˜  U¡
Ö+ˆÜ˜q ! A¡# uÓ-‰ˆˆBÜ�B˜˜1™˜e™ a™¨"Ñ,¨vÑ5Ó6ˆÜ�1�a˜‘c˜$‘h˜v‘oÓ&¨Ñ*ˆØ�!�A‘#œ  1 U¡7Ó+Ñ+Ñ+¨aÑ/ˆØ‰ð ,ð €Høô ò Ü�b˜%Ó ˆÜ�a‹[ˆÜ˜!˜R Ó'ˆÜ�B˜˜EÓ"ˆÜ�1‹IŠðús   „,B/ Â/AC7Ã6C7c                 óð  — | \  }}}}|rt        d«      ‚|sM| t        k(  rt        S | t        k(  r|dkD  rt        S |dk(  rt        S t        S |st        S |dk  rt        S t        S d}|dk  rI|dk(  rt        S |dk(  rt        | ||«      S |dk(  rt        t        | ||«      S t        |   }d}d}	||	z  }| }|d	kD  r||d
k\  s|t        dd|dz  z  z   «      k  r`|dz   }
t        |«      }t        d||
«      }t        | ||
|«      }t        |d   |d   |d   |d   ||«      } |rt        t        | |	z
  |«      S | S |d|z  z   ||z  z
  }
|dkD  r|
|
dz  z  }
|
|
|z  z
  }
||
z
  }d}||z   }|dk  rd}| }|r	|||z  z  }n|||z  z  }t        ||«      }d}||z   |dz
  |
z  z
  |z  |z
  }d}|r|dk(  s|dk(  rd}n|dk(  s|dk(  rd}t        ||z   ||
|«      }t        ||||«      } |rt        t        | |	z
  |«      S | S )zanth-root of a positive number

    Use the Newton method when faster, otherwise use x**(1/n)
    znth root of a negative numberr   FrB   r   rD   Trˆ   r?   i N  éé   gÍÌÌÌÌL<@g×£p=
×ã?rF   r\   Úur¶   ÚdrM   )r   r'   r!   r"   r%   r+   r0   r5   rI   r   r2   r·   r    r   rÎ   r   )ru   rº   rJ   rV   ÚsignÚmanr¼   r»   Úflag_inverseÚextra_inverseÚprec2rÉ   Únthrp   ÚshiftÚsign1ÚesrÊ   rÆ   Ú	rnd_shifts                       rN   Úmpf_nthrootrÝ   ¦  s�  € ð
 Ñ€Dˆ#ˆs�BÙÜÐ;Ó<Ð<ÙØ”Š9ÜˆKØ”Š:Ø�1ŠuÜ�Ø�AŠvÜ�ÜˆKáÜˆKØˆqŠ5ÜˆLÜˆØ€LØˆ1‚uØ�Š6ÜˆKØ�Š6Ü˜1˜d CÓ(Ð(Ø�Š7Üœ4  D¨#Ó.Ð.ä˜SÑ!ˆØˆØˆØ�ÑˆØˆBˆØˆ2‚v�1˜’: ¬¨C°$¸¸D¹±.Ñ,@Ó(AÒ!AØ�r‘	ˆÜ�a‹[ˆÜ˜1˜b %Ó(ˆÜ�A�s˜E 3Ó'ˆÜ�a˜‘d˜A˜a™D ! A¡$¨¨!©¨d°CÓ8ˆÙÜœ4  D¨Ñ$6¸Ó<Ð<àˆHà�1�Q‘3‰J˜$˜q™&Ñ!€Eð 	ˆ2‚vØ�˜‘ÑˆØ˜˜a™‘ˆà�‰J€Eà€EØ	ˆU‰€BØ	ˆA‚vØˆØˆSˆÙØ��A‘‰‰à��A‘‰ˆÜ
��eÓ
€CØ€EØ�‰Y˜˜!™˜U‘{Ñ" QÑ&¨%Ñ/€DØ€IÙØ�#Š:˜ šØ‰Ià�#Š:˜ šØˆIÜ
˜˜I™ q¨%°Ó
6€CÜ�S˜$  cÓ*€AÙÜ”t˜Q  ]Ñ 2°CÓ8Ð8àˆrP   c                 ó   — t        | d||«      S )zcubic root of a positive numberr\   )rÝ   )ru   rJ   rV   s      rN   Úmpf_cbrtrß   ù  s   € ä�q˜!˜T 3Ó'Ð'rP   c                 óB  — | t         v rt         |    \  }}||k\  r|||z
  z	  S |dz   }|t        k  r3|€t        |«      }t        | «      }| ||z
  z  }t	        ||«      ||z  z   }n"t        t        t        | «      |dz   «      |«      }| t        k  r||ft         | <   |||z
  z	  S )z`
    Fast computation of log(n), caching the value for small n,
    intended for zeta sums.
    rF   rˆ   )	Úlog_int_cacheÚLOG_TAYLOR_SHIFTr}   r   Úlog_taylor_cachedr   r¥   r   ÚMAX_LOG_INT_CACHE)	rº   rJ   Úln2ÚvalueÚvprecrW   rp   ÚxrX   s	            rN   Úlog_int_fixedré     s»   € ð
 	ŒMÑÜ$ QÑ'‰ˆˆuØ�DŠ=Ø˜U T™\Ñ*Ð*Ø	�‰€BØ	ÔÒØˆ;Ü˜B“-ˆCÜ�Q‹KˆØ�"�Q‘$‰KˆÜ˜a Ó$ q¨¡uÑ,‰ä”WœX a›[¨"¨Q©$Ó/°Ó4ˆØÔÒØ˜r˜7Œ�aÑØ��D‘‰>ÐrP   c                 ót   — d}	 | |z   dz	  }|dkD  rt        | |z
  «      dk  r| S t        | |z  «      }|} |dz  }Œ6)z^
    Fixed-point computation of agm(a,b), assuming
    a, b both close to unit magnitude.
    r   r   rŠ   r=   )Úabsr8   )r_   r`   rJ   ÚiÚanews        rN   Ú	agm_fixedrî     sS   € ð
 	
€AØ
Ø�!‘�a‰xˆØˆqŠ5”S˜˜4™“[ 1’_ØˆHÜ�q˜‘s‹OˆØˆØ	ˆQ‰ˆð rP   c                 óR  — | | z  |z	  }|x}x}}|r||z  |z	  }||z  |z	  }||z  }|rŒ|t         |z  z  }||z  |dz
  z	  }|t        | |z  «      z  |z	  }| x}x}}|r||z  |z	  }||z  |z	  }||z  }|rŒt         |z  |dz  z   }||z  |z	  }t        |||«      }t        |«      |z  |z  S )a*  
    Fixed-point computation of -log(x) = log(1/x), suitable
    for large precision. It is required that 0 < x < 1. The
    algorithm used is the Sasaki-Kanada formula

        -log(x) = pi/agm(theta2(x)^2,theta3(x)^2). [1]

    For faster convergence in the theta functions, x should
    be chosen closer to 0.

    Guard bits must be added by the caller.

    HYPOTHESIS: if x = 2^(-n), n bits need to be added to
    account for the truncation to a fixed-point number,
    and this is the only significant cancellation error.

    The number of bits lost to roundoff is small and can be
    considered constant.

    [1] Richard P. Brent, "Fast Algorithms for High-Precision
        Computation of Elementary Functions (extended abstract)",
        http://wwwmaths.anu.edu.au/~brent/pd/RNC7-Brent.pdf

    rB   r   )r   r8   rî   r™   )rè   rJ   Úx2ru   r_   r`   r­   ro   s           rN   Úlog_agmrñ   )  sý   € ð2 ˆA‰#�$‰€Bà€N€A€NˆˆAÙ
Øˆr‰T�d‰NˆØˆq‰S�T‰MˆØ	ˆQ‰ˆò ð Œ'�4‰-Ñ€AØ	
ˆ1‰��Q‘‰€AØ	
Œ:�a˜‘gÓÑ	 Ñ%€Aà€M€A€MˆˆAÙ
Øˆr‰T�d‰NˆØˆq‰S�T‰MˆØ	ˆQ‰ˆò ô 
�$‰˜1˜a™4Ñ €AØ	
ˆ1‰ˆt‰€Aä�!�Q˜Ó€AÜ�T‹N˜dÑ" qÑ(Ð(rP   c                 óD  — t        |«      D ]  }t        | |z  «      } Œ t        |z  }| |z
  |z  | |z   z  }|dk  }|r| }||z  |z	  }||z  |z	  }|}	|dz  }
||z  |z	  }d}|r%|	||z  z  }	|dz  }|
||z  z  }
||z  |z	  }|dz  }|rŒ%|
|z  |z	  }
|	|
z   d|z   z  }|r| S |S )a:  
    Fixed-point calculation of log(x). It is assumed that x is close
    enough to 1 for the Taylor series to converge quickly. Convergence
    can be improved by specifying r > 0 to compute
    log(x^(1/2^r))*2^r, at the cost of performing r square roots.

    The caller must provide sufficient guard bits.
    r   r\   rˆ   rB   r   )r   r8   r   )rè   rJ   rp   rì   ÚonerX   rÓ   Úv2Úv4Ús0Ús1Úkru   s                rN   Ú
log_taylorrù   X  sý   € ô �AŽYˆÜ�q˜$‘wÓ‰ð ä
�T‰/€CØ
ˆC‰%�$‰˜!˜C™%Ñ €AØˆq‰5€DÙØˆBˆØ
ˆA‰#�$‰€BØ
ˆR‰%�D‰€BØ	
€BØ	
ˆA‰€BØ	
ˆ2‰�$‰€AØ	€AÙ
Ø
ˆa�1‰f‰ˆØ	ˆQ‰ˆØ
ˆa�1‰f‰ˆØˆr‰T�d‰NˆØ	ˆQ‰ˆò ð ˆR‰%�D‰€BØ	ˆB‰�A�a‘CÑ€AÙØˆrˆ	Ø€HrP   c                 ó¼  — | |t         z
  z	  }t        |   }||z
  }||ft        v rt        ||f   \  }}n&||t         z
  z  }t        ||d«      }||ft        ||f<   ||z  }||z  }| |z
  |z  |z  }||z  t        |z  |z   z  }||z  |z	  }	|	|	z  |z	  }
|}|dz  }||
z  |z	  }d}|r%|||z  z  }|dz  }|||z  z  }||
z  |z	  }|dz  }|rŒ%||	z  |z	  }||z   dz  }||z   S )zd
    Fixed-point computation of log(x), assuming x in (0.5, 2)
    and prec <= LOG_TAYLOR_PREC.
    r=   r\   rˆ   rB   r   )râ   Úcache_prec_stepsÚlog_taylor_cacherù   r	   )rè   rJ   rº   Úcached_precÚdprecr_   Úlog_arÑ   rX   rô   rõ   rö   r÷   rø   ru   s                  rN   rã   rã   z  sU  € ð
 	
ˆdÔ#Ñ#Ñ$€AÜ" 4Ñ(€KØ˜$Ñ€EØ	ˆ;ÐÔ+Ñ+Ü# A { NÑ3‰ˆ‰5à�+Ô 0Ñ0Ñ1ˆÜ˜1˜k¨1Ó-ˆØ,-¨u¨:Ô˜˜K˜Ñ(Øˆ%�K€AØ	ˆe�O€EØ
ˆa‰%�D‰˜QÑ€AØ	
ˆd‰œ D™¨AÑ-Ñ.€AØ
ˆA‰#�$‰€BØ
ˆR‰%�D‰€BØ	
€BØ	
ˆA‰€BØ	
ˆ2‰�$‰€AØ	€AÙ
Ø
ˆa�‰d‰
ˆØ	ˆQ‰ˆØ
ˆa�‰d‰
ˆØˆr‰T�d‰NˆØ	ˆQ‰ˆò ð ˆR‰%�D‰€BØ	ˆB‰�1‰€AØ�1‰9ÐrP   c                 ó@  — | \  }}}}|s-| t         k(  rt        S | t        k(  rt        S | t        k(  rt        S |rt	        d«      ‚|dz   }|dk(  r#|st         S t        |t        |«      z  | ||«      S ||z   }t        |«      }	|	dk  r^d|	z
  }
|
rt        |z  |z
  }n|t        |dz
  z  z
  }t        |«      }||z
  }||kD  r!t        |
||	|z
  ||d«      }t        ||
||«      S ||z  }|	dkD  r)t        |	«      |kD  rt        |t        |«      z  | ||«      S |t        k  r-t        t        |||z
  «      |«      }|r[||t        |«      z  z  }nI| t        z  }||z
  }t!        | |«      } || z  }t#        t%        | |«      |«       }||t        |«      z  z  }t        || ||«      S )zj
    Compute the natural logarithm of the mpf value x. If x is negative,
    ComplexResult is raised.
    zlogarithm of a negative numberr?   r   rº   i'  )r!   r&   r%   r'   r   r   r}   rë   r   r   r    r7   ÚLOG_TAYLOR_PRECrã   r   ÚLOG_AGM_MAG_PREC_RATIOr1   rñ   r   )rè   rJ   rV   rÓ   rÔ   r¼   r»   rW   ÚmagÚabs_magr²   r³   rµ   Úcancellationr­   rc   Úoptimal_magrº   s                     rN   r¥   r¥   œ  sâ  € ð
 Ñ€Dˆ#ˆs�Bñ Ø”Š:œe�|Ø”Š9œT�kØ”Š9œT�kÙÜÐ<Ó=Ð=Ø	�‰€Bð ˆa‚xÙÜˆLÜ˜C¤	¨"£Ñ-°¨s°D¸#Ó>Ð>Ø
ˆb‰&€CÜ�#‹h€Gð �!‚|à�'‘	ˆÙÜ˜R‘K 3Ñ&‰Dàœ' B q¡D™/Ñ*ˆDÜ�t‹nˆØ˜C‘xˆØ˜"ÒÜ˜%  w¨r¡z°3¸¸SÓAˆAÜ˜q %¨¨sÓ3Ð3à�,ÑˆBð �‚Ü�GÓ˜rÒ!Ü ¤I¨b£MÑ 1°B°3¸¸cÓBÐBð 
Œ_ÒÜœf S¨"¨R©%Ó0°"Ó5ˆÙØ�”Y˜r“]Ñ"Ñ"‰Aà�cÔ1Ñ1ˆØ˜#ÑˆÜ�a˜‹OˆØ
�ˆ|ÑˆÜ”X˜a “_ bÓ)Ð)ˆØ	ˆQŒy˜‹}‰_ÑˆÜ˜˜B˜3  cÓ*Ð*rP   c           
      ó  — |d   s|| }} | d   se|d   s,| |cxk(  rt         k(  rt        S  t        | |fv rt        S t        S | t         k(  rt	        t        |«      ||«      S | t        k(  rt        S t        S t        | | «      }t        ||«      }d}t        ||||z   «      }t        |t        d«      }|d   |d   z   }	|t         k(  s	|	| dz  k  r#t        ||||z   t        |d   |d   «      z
  «      }t        t	        |||«      d«      S )z1
    Computes log(sqrt(a^2+b^2)) accurately.
    r   r?   rF   rB   r\   rD   )r!   r&   r'   r%   r¥   r*   r/   r-   r#   Úminr1   )
r_   r`   rJ   rV   Úa2Úb2rÊ   Úh2Ú	cancelledÚmag_cancelleds
             rN   Úmpf_log_hypotr  ä  s  € ð
 ˆQŠ4Ø�!ˆ1ˆàˆQŠ4à�ŠtØ�AŒœŠÜ�ð ä˜˜1�v‰~Ü�äˆKà”Š:äœ7 1›: t¨SÓ1Ð1Ø”Š9ÜˆKÜˆä	��1‹€BÜ	��1‹€BØ€Eä	��R˜˜e™Ó	$€BÜ˜œE 2Ó&€IØ˜a‘L ¨1¡Ñ-€Mð ”EÒ˜]¨e¨V°Q©YÒ6Ü�R˜˜T %™Z¬¨B¨q©E°"°Q±%Ó(8Ñ8Ó9ˆÜ”W˜R  sÓ+¨RÓ0Ð0rP   c                 óÌ  — |dk\  r(t        j                  t        | |dz
  z	  «      dz  «      }n$t        j                  t        | «      d|z  z  «      }d}t        t        |dz  «      d|z
  z	  «      }d}t	        ||«      D ]U  }||z  }|||z
  z  }t        ||«      \  }}||z  |z  }|t        | ||z
  «      z
  |z  t        |z  |dz  |z	  z   z  }	||	z
  }|}ŒW t        |||z
  «      S )Néd   é5   g      @Cg       @rÄ   rB   )rl   ÚatanrI   r   r   Úcos_sin_fixedr   r   )
rè   rJ   rp   rÌ   Úextra_prW   ÚcosÚsinÚtanr_   s
             rN   Úatan_newtonr    s   € Øˆs‚{Ü�I‰I”c˜1˜t B™w™<Ó)¨'Ñ1Ó2‰ä�I‰I”c˜!“f˜S $™YÑ&Ó'ˆØ€EÜŒC��G‘Ó  E¡Ñ*Ó+€AØ€GÜ˜% Ö&ˆØ
ˆg‰ˆØ�"�U‘(‰OˆÜ   BÓ'‰ˆˆSØ�b‰y˜SÑ ˆØ”&˜˜D ™GÓ$Ñ$¨Ñ+´'¸2±+À3ÈÁ6ÈBÁ,Ñ1OÑPˆØ�‰EˆØ‰ð 'ô �!�U˜4‘ZÓ Ð rP   c                 óÄ   — dt        |dz
  «      z  dz   }||z
  }| |ft        v rt        | |f   \  }}n%| |t        z
  z  }t        ||«      }||ft        | |f<   ||z	  ||z	  fS )Nr   r?   )r   Úatan_taylor_cacheÚATAN_TAYLOR_SHIFTr  )rº   rJ   r×   rþ   r_   Úatan_as         rN   Úatan_taylor_get_cachedr  "  s†   € ð
 ”˜$˜q™&Ó!Ñ" bÑ(€EØ�D‰L€EØ	ˆ5€zÔ&Ñ&Ü% a¨ hÑ/‰	ˆ‰6à�%Ô+Ñ+Ñ,ˆÜ˜Q Ó&ˆØ'(¨& kÔ˜!˜U˜(Ñ#Ø�‰J˜& E™/Ð*Ð*rP   c                 ó8  — | |t         z
  z	  }t        ||«      \  }}| |z
  }||z  |dz  |z	  ||z  |z	  z   t        |z  z   z  x}}|dz  |z	  }||z  |z	  }	|dz  }
||	z  |z	  }d}|r%|||z  z  }|dz  }|
||z  z  }
||	z  |z	  }|dz  }|rŒ%|
|z  |z	  }
||
z
  }||z   S )NrB   r\   rˆ   )r  r  r   )rè   rJ   rº   r_   r  rÒ   rö   rX   rô   rõ   r÷   rø   ru   s                rN   Úatan_taylorr  1  sø   € Ø	
ˆtÔ%Ñ%Ñ	&€AÜ& q¨$Ó/�I€A€vØ	ˆA‰€AØ�4‰i˜a ™d d™l¨q°©s°d©{Ñ;¼wÈ$¹ÑOÑPÐP€BˆØ
ˆQ‰$�$‰,€BØ
ˆr‰'�dÑ	€BØ	
ˆA‰€BØ	
ˆR‰�DÑ€AØ	€AÙ
Ø
ˆa�1‰f‰ˆØ	ˆQ‰ˆØ
ˆa�1‰f‰ˆØ�‰V˜ÑˆØ	ˆQ‰ˆò ð ˆr‰'�dÑ	€BØ
ˆR‰€AØ�A‰:ÐrP   c           	      ó~   — | st        t        ||«      d«      S t        t        t        |t        |   «      d«      «      S )NrD   )r1   r¦   r,   r6   )rÓ   rJ   rV   s      rN   Úatan_infr!  E  s7   € ÙÜœ  cÓ*¨BÓ/Ð/Ü”9œV D¬,°sÑ*;Ó<¸bÓAÓBÐBrP   c                 ó  — | \  }}}}|sA| t         k(  rt         S | t        k(  rt        d||«      S | t        k(  rt        d||«      S t        S ||z   }||dz   kD  rt        |||«      S | |dz   kD  rt        | d|z
  ||«      S |dz   t        |«      z   }|dk\  rt        d| |«      } d}	nd}	t        | |«      }
|r|
 }
|t        k  rt        |
|«      }nt        |
|«      }|	rt        |«      dz	  dz   |z
  }|r| }t        || ||«      S )Nr   r   r?   é   rB   TF)r!   r%   r!  r&   r'   r7   rë   r2   r   ÚATAN_TAYLOR_PRECr  r  r™   r   )rè   rJ   rV   rÓ   rÔ   r¼   r»   r  rW   Ú
reciprocalr­   r_   s               rN   Úmpf_atanr&  J  s0  € ØÑ€Dˆ#ˆs�BÙØ”Š:œe�|Ø”Š9œX a¨¨sÓ3Ð3Ø”Š:œh q¨$°Ó4Ð4ÜˆØ
�‰(€Cà
ˆT�"‰W‚}Ü˜˜d CÓ(Ð(à€tˆd�2‰g‚~Ü˜1˜a ™f d¨CÓ0Ð0Ø	�‰”S˜“XÑ	€Bà
ˆa‚xÜ˜˜A˜rÓ"ˆØ‰
àˆ
Ü��B‹€AÙØˆBˆØ	ÔÒÜ˜˜2Ó‰ä˜˜2ÓˆÙÜ�r‹l˜A‰o˜qÑ  AÑ%ˆÙØˆBˆÜ˜˜B˜3  cÓ*Ð*rP   c           	      óò  — |\  }}}}| \  }}	}
}|	sŸ| t         k(  r)|t        k7  r t        |«      dk\  rt         S t        ||«      S | t        t
        fv rY|t        t
        fv rt        S | t        k(  rt        t        ||«      d«      S t        t        t        |t        |   «      d«      «      S t        S |r't        t        t        | «      ||t        |   «      «      S |sX|t        k(  rt        S |t        k(  rt         S |t
        k(  rt        ||«      S | t         k(  rt         S t        t        ||«      d«      S t        t        | ||dz   «      |dz   «      }|rt        t        |dz   «      |||«      S t        |||«      S )Nr   rD   rŠ   )r!   r'   r)   r¦   r%   r&   r1   r,   r6   Ú	mpf_atan2r&  r0   r-   r+   )r¹   rè   rJ   rV   ÚxsignÚxmanÚxexpÚxbcÚysignÚymanÚyexpÚybcÚtquos                rN   r(  r(  m  s`  € ØÑ€Eˆ4��sØÑ€Eˆ4��sÙØ”Š:˜!œtš)Ü˜‹{˜aÒÜ�Ü˜$ Ó$Ð$Ø””u�ÑØ”Tœ5�MÑ!Ü�à”DŠyÜ ¤¨¨cÓ!2°BÓ7Ð7äœ9¤V¨D´,¸sÑ2CÓ%DÀbÓIÓJÐJÜˆÙÜ”y¤¨£¨Q°´lÀ3Ñ6GÓHÓIÐIÙØ”Š9ÜˆKØ”Š9ÜˆLØ”Š:Ü˜$ Ó$Ð$Ø”Š:ÜˆLÜœ  cÓ*¨BÓ/Ð/Ü”G˜A˜q $ q¡&Ó)¨4°©6Ó2€DÙÜ”v˜d 1™f“~ t¨T°3Ó7Ð7ä�t˜T 3Ó'Ð'rP   c           
      ó  — | \  }}}}||z   dkD  r| t         t        fvrt        d«      ‚|dz   }t        | | «      }t	        t         t        t        t         ||«      |«      |«      }	t        | |	|«      }
t        t        |
||«      d«      S )Nr   z%asin(x) is real only for -1 <= x <= 1é   r   )
r"   r#   r   r/   r-   r4   r.   r0   r1   r&  ©rè   rJ   rV   rÓ   rÔ   r¼   r»   rW   r_   r`   r¶   s              rN   Úmpf_asinr5  �  sˆ   € ØÑ€Dˆ#ˆs�BØ	ˆ#�v�‚z�a¤¤e˜}Ñ,ÜÐCÓDÐDà	�‰€BÜ��1‹€AÜ””hœw¤t¨Q°Ó3°RÓ8¸"Ó=€AÜ��1�bÓ€AÜ”X˜a  sÓ+¨QÓ/Ð/rP   c                 ó:  — | \  }}}}||z   dkD  r.| t         t        fvrt        d«      ‚| t        k(  rt        ||«      S |dz   }t	        | | «      }t        t        t         ||«      |«      }	t        |	t        t         | |«      |«      }
t        t        |
||«      d«      S )Nr   z%acos(x) is real only for -1 <= x <= 1r3  r   )r"   r#   r   r¦   r/   r4   r.   r0   r-   r1   r&  r4  s              rN   Úmpf_acosr7  ›  s�   € àÑ€Dˆ#ˆs�BØ	ˆC�x�!‚|Ø”Tœ5�MÑ!ÜÐ GÓHÐHØ”Š:Ü˜$ Ó$Ð$Ø	�‰€BÜ��1‹€AÜ”œ˜q "Ó% rÓ*€AÜ�”7œ4  BÓ'¨Ó,€AÜ”X˜a  sÓ+¨QÓ/Ð/rP   c                 ó6  — |dz   }| \  }}}}||z   }|dk  r|| k  rt        | d|z
  ||«      S || z  }t        t        t        | | «      t        |«      |«      }	t        t        | «      |	|«      }	|rt        t        |	|t        |   «      «      S t        |	||«      S )Nr?   éøÿÿÿr   )	r7   r4   r-   r/   r"   r*   r,   r¥   r6   )
rè   rJ   rV   rW   rÓ   rÔ   r¼   r»   r  r^   s
             rN   Ú	mpf_asinhr:  ©  s¬   € Ø	�‰€BØÑ€Dˆ#ˆs�BØ
ˆb‰&€CØ
ˆR‚xØ�"�Š9Ü˜q ! D¡&¨$°Ó4Ð4Ø
�ˆt‰ˆô 	”œ  A›¬¨bÓ1°2Ó6€AÜ”˜“
˜A˜rÓ"€AÙÜ”w˜q $¬°SÑ(9Ó:Ó;Ð;ä�q˜$ Ó$Ð$rP   c                 óÂ   — |dz   }t        | t        «      dk(  rt        d«      ‚t        t	        t        | | «      t        |«      |«      }t        t	        | ||«      ||«      S )Nr3  rD   z acosh(x) is real only for x >= 1)r(   r"   r   r4   r-   r/   r#   r¥   )rè   rJ   rV   rW   r^   s        rN   Ú	mpf_acoshr<  º  sY   € à	�‰€BÜˆq”$Ó˜2ÒÜÐ>Ó?Ð?Ü”œ  1›¤u¨bÓ1°2Ó6€AÜ”7˜1˜a Ó$ d¨CÓ0Ð0rP   c           	      óz  — | \  }}}}|s|r| t         t        fv r| S t        d«      ‚||z   }|dkD  r$|dk(  r|dk(  rt        t        g|   S t        d«      ‚|dz   }|dk  r|| k  rt        | |||«      S || z  }t        | t        |«      }	t        t        | |«      }
t        t        t        |	|
|«      ||«      d«      S )Nz&atanh(x) is real only for -1 <= x <= 1r   r   r3  r9  rD   )r!   r'   r   r%   r&   r7   r-   r"   r.   r1   r¥   r0   )rè   rJ   rV   rÓ   rÔ   r¼   r»   r  rW   r_   r`   s              rN   Ú	mpf_atanhr>  Â  sÚ   € àÑ€Dˆ#ˆs�BÙ‘SØ”œ�ÑØˆHÜÐDÓEÐEØ
ˆs‰(€CØ
ˆQ‚wØ�!Š8˜˜qšÜœ%�= Ñ&Ð&ÜÐDÓEÐEØ	�‰€BØ
ˆR‚xØ�"�Š9Ü˜q $¨¨cÓ2Ð2Ø
�ˆt‰ˆÜ�”4˜Ó€AÜ”�a˜Ó€AÜ”WœW Q¨¨2Ó.°°cÓ:¸BÓ?Ð?rP   c                 ó¢  — | \  }}}}|s| t         k(  rt        S | S t        ||z   «      }|dk\  r2|dk  s|t        |«      k  rt	        t        t        | «      «      ||«      S ||z   dz   }t        |«      }	t        t        |	d«      t        |«      }
t        |	| |«      }t        | |«      }t        |||«      }t        |||«      }t        ||
||«      }|S )Nr   rF   r?   r   )r&   r'   rë   r   r   r9   r   Úmpf_phir-   r1   r#   r·   Ú
mpf_cos_pir0   r.   )rè   rJ   rV   rÓ   rÔ   r¼   r»   ÚsizerW   r_   r`   rÑ   rX   s                rN   Úmpf_fibonaccirC  ×  s×   € ØÑ€Dˆ#ˆs�BÙØ”Š:ÜˆKØˆäˆs�2‰v‹;€DØ
ˆa‚xà�"Š9˜¤¨£Ò.ÜœD¤¨£›O¨T°3Ó7Ð7à	�‰�rÑ	€BÜ�‹€AÜ”	˜!˜Q“¤¨Ó+€AÜ��1�bÓ€AÜ�1�bÓ€AÜ��1�bÓ€AÜ��1�bÓ€AÜ��1�d˜CÓ €AØ€HrP   c                 ó’  — | dk  r|  } d}nd}t        d|dz  z  «      }t        | «      |z
  }t        d||z   «      }ddt        || «      z  z   }||z   }| ||z
  z  } t        |z  }|dk(  }	|t        k  ro| | z  |z	  x}
}|
|
z  |z	  }t
        x}}d}|r5||dz
  |z  z  }||z  }|dz  }||dz
  |z  z  }||z  }|dz  }||z  |z	  }|rŒ5|
|z  |z	  }|	r	||z
  |z   }ná||z   |z   }nØt        d|dz  z  «      }| | z  |z	  x}
}||
g}t        d|«      D ]  }|j                  |d   |
z  |z	  «       Œ t
        g|z  }d}|rPt        |«      D ]4  }||dz
  |z  z  }|	r|dz  r||xx   |z  cc<   n||xx   |z  cc<   |dz  }Œ6 ||d   z  |z	  }|rŒPt        d|«      D ]  }||   ||   z  |z	  ||<   Œ t        |«      |z   }|dk(  r>t        ||z  ||z  z
  «      }|r||z
  }n||z   }t        |«      D ]
  }||z  |z	  }Œ ||z	  S |dz
  }t        |«      D ]  }||z  |z	  |z
  }Œ t        t        ||z  ||z  z
  «      «      }|r| }||z	  ||z	  fS )	zÇ
    Taylor series for cosh/sinh or cos/sin.

    type = 0 -- returns exp(x)  (slightly faster than cosh+sinh)
    type = 1 -- returns (cosh(x), sinh(x))
    type = 2 -- returns (cos(x), sin(x))
    r   r   ç      à?rF   rB   g333333Ó?rk   rD   )rI   r   Úmaxr   ÚEXP_SERIES_U_CUTOFFr   r   ÚappendÚsumr8   rë   )rè   rJ   ÚtyperÓ   rp   ÚxmagrÊ   rW   ró   Úaltrð   r_   Úx4rö   r÷   rø   r¶   rÑ   Úxpowersrì   Úsumsru   rX   Úpshifts                           rN   Úexponential_seriesrQ  ó  s  € ð 	ˆ1‚uØˆBˆØ‰àˆÜˆC��c‘	‰MÓ€AÜ�A‹;˜Ñ€DÜˆAˆt�a‰xÓ€AØ�”3�q˜$˜“<‘Ñ€EØ	�‰€BØˆ5�1‰9Ñ€AÜ
�R‰-€CØ�1‰9€CØÔ!Ò!Ø�A‘#˜"‘ÐˆˆQØ�‰e˜‰]ˆÜÐˆˆRØˆÙØ�1�Q‘3˜‘'‰MˆA˜2 ™7˜2 A¨¡F AØ�1�Q‘3˜‘'‰MˆA˜2 ™7˜2 A¨¡F AØ�2‘˜"‘ˆAò ð �‰e˜‰]ˆÙØ�R‘˜#‘‰Aà�R‘˜#‘‰Aä��D˜$‘J‘ÓˆØ�A‘#˜"‘ÐˆˆQØ˜�)ˆÜ˜˜1–ˆAØ�N‰N˜G B™K¨™N¨RÑ/Õ0ð äˆz˜A‰~ˆØˆÙÜ˜A–Y�Ø�q˜‘s˜A‘g‘�Ù˜1˜qš5 $ q£'¨Q¡,¤'Ø"& q£'¨Q¡,£'Ø�Q‘‘ð	 ð
 �7˜2‘;‘ 2Ñ%ˆAò ô ˜˜1–ˆAØ˜A‘w˜w q™zÑ)¨bÑ0ˆD�ŠGð ä�‹I˜‰OˆØˆq‚yÜ�q˜‘s˜c 2™g‘Ó'ˆÙØ�A‘‰Aà�A‘ˆAÜ˜–ˆAØ�1‘˜‘‰Að à�E‰zÐð
 �A‘ˆÜ˜–ˆAØ�A‘#˜&‘ CÑ'‰Að ô ”s˜C ™G q¨¡s™?Ó+Ó,ˆÙØ�ˆAØ�5‘˜A˜u™HÐ%Ð%rP   c                 ó$  — |t         kD  rt        | |d«      S t        |dz  «      }||z  }t        |z  x}}d}| | z  |z	  x}}|r)||z  }||z  }|dz  }||z  }||z  }|dz  }||z  |z	  }|rŒ)|| z  |z	  }||z   }|}	|r||z  |z	  }|dz  }|rŒ||	z	  S )zÄ
    Compute exp(x) as a fixed-point number. Works for any x,
    but for speed should have |x| < 1. For an arbitrary number,
    use exp(x) = exp(x-m*log(2)) * 2^m where m = floor(x/log(2)).
    r   rE  rB   r   )ÚEXP_COSH_CUTOFFrQ  rI   r   )
rè   rJ   rp   rö   r÷   rø   r_   rð   ru   rÑ   s
             rN   Úexp_basecaserT  >  sã   € ð ŒoÒÜ! ! T¨1Ó-Ð-ÜˆD�#‰I‹€AØˆA�I€DÜ˜$‰Ð€BˆØ	€AØ�‰c�d‰]Ð€AˆÙ
Ø	ˆa‰ˆ��q‘�˜!˜q™&˜!Ø	ˆa‰ˆ��q‘�˜!˜q™&˜!Øˆr‰T�d‰Nˆò ð ˆQ‰$�4‰€BØ
ˆR‰€AØ	€AÙ
Øˆq‰S�T‰MˆØ	ˆQ‰ˆò ð �‰6€MrP   c                 ó†   — |t         kD  rt        | |d«      \  }}||z   ||z
  fS t        | |«      }t        ||z   z  |z  }||fS )z(
    Computation of exp(x), exp(-x)
    r   )rS  rQ  rT  r   )rè   rJ   ÚcoshÚsinhr_   r`   s         rN   Úexp_expneg_basecaserX  W  sY   € ð ŒoÒÜ'¨¨4°Ó3‰
ˆˆdØ�D‰y˜$˜t™)Ð#Ð#Ü�Q˜Ó€AÜ	�T˜$‘YÑ	 AÑ%€AØˆaˆ4€KrP   c                 ó   — |t         kD  rt        | |d«      S |t        z
  }| |z	  }t        |«      }|t        vr;|dt         z   t        z
  z  }t        |dt         z   d«      \  }}|dz	  |dz	  ft        |<   t        |   \  }}t         |z
  }||z  }||z  }| ||z  z  } t
        |z  }	| }
d}| | z  |z	   }|r2||z  }|	|z  }	|dz  }|| z  |z	  }||z  }|
|z  }
|dz  }|| z  |z	   }|rŒ2|	|z  |
|z  z
  |z	  |
|z  |	|z  z   |z	  fS )zÈ
    Compute cos(x), sin(x) as fixed-point numbers, assuming x
    in [0, pi/2). For an arbitrary number, use x' = x - m*(pi/2)
    where m = floor(x/(pi/2)) along with quarter-period symmetries.
    rB   rF   r   )ÚCOS_SIN_CACHE_PRECrQ  ÚCOS_SIN_CACHE_STEPrI   Úcos_sin_cacher   )rè   rJ   Úprecsr­   rº   ÚwÚcos_tÚsin_tÚoffsetr  r  rø   r_   s                rN   Úcos_sin_basecaserb  b  sh  € ð Ô Ò Ü! ! T¨1Ó-Ð-ØÔ%Ñ%€EØ	ˆU‰
€AÜˆA‹€AØ”ÑØ�Ô%Ñ%Ô&8Ñ8Ñ9ˆÜ)¨!¨RÔ0BÑ-BÀAÓF‰ˆˆuØ! 2™I¨°©Ð3Œ�aÑÜ  Ñ#�L€Eˆ5Ü $Ñ&€FØ	ˆfÑ€EØ	ˆfÑ€EØˆˆe‰�O€AÜ
�T‰/€CØ
€CØ	€AØˆQ‰3�4‰-Ð€AÙ
Ø	ˆa‰ˆ�˜‘�˜1 ™6˜1¨¨!©°¡} 1Ø	ˆa‰ˆ�˜‘�˜1 ™6˜1¨!¨A©#°$©Ð'7 1ò ð �‰Y�s˜5‘yÑ  TÑ)¨c°%©i¸¸E¹	Ñ.AÀdÑ-JÐKÐKrP   c                 óþ  — | \  }}}}|rÜ||z   }|dz   }|r| }|dkD  r0|dk\  r+t        |t        d|z  «      z   «      }	t        |	||z  ||«      S || k  rt        t        |||«      S |dkD  rF||z   }
||
z   }|dk\  r||z  }n|| z	  }t        |
«      }t        ||«      \  }}t        |«      }||z  }n||z   }|dk\  r||z  }n|| z	  }d}t        ||«      }t        |||z
  ||«      S |st        S | t        k(  rt        S | S )Né   r;   r   g333333÷?r   )Úmpf_erI   r3   r7   r"   r}   ÚdivmodrT  r   r&   r!   )rè   rJ   rV   rÓ   rÔ   r¼   r»   r  rW   ÚeÚwpmodra  r­   Úlg2rº   s                  rN   r¬   r¬     sH  € ØÑ€Dˆ#ˆs�BÙ
Ø�3‰hˆØ�B‰YˆÙØ�$ˆCà�#Š:˜# š(ä�bœ˜T #™X›Ñ&Ó'ˆAÜ˜q # s¡(¨D°#Ó6Ð6Ø�"�Š9Üœt T¨4°Ó5Ð5à�Š7ð ˜‘HˆEØ˜5‘[ˆFØ˜Š{Ø˜6‘M‘à˜V˜GÑ$�Ü˜EÓ"ˆCÜ˜!˜S“>‰DˆAˆqÜ�A“ˆAØ�#‰I‰Aà˜2‘XˆFØ˜Š{Ø˜6‘M‘à˜V˜GÑ$�ØˆAÜ˜1˜bÓ!ˆÜ˜C  2¡ t¨SÓ1Ð1ÙÜˆØŒE‚zÜˆØ€HrP   c                 óä  — | \  }}}}|s^|r\|r$| t         k(  rt        S | t        k(  rt        S t        S | t         k(  rt         t         fS | t        k(  rt         t        fS t        t        fS ||z   }|dz   }	|dk  rC||	 k  r7|rt        | d|z
  ||«      S t        t        d||«      }
t        | |||«      }|
|fS |	| z  }	|dkD  radd|dz
  z  z  |	kD  rS|rt        t        t        g|   d|z
  ||«      S t        t        t        | «      ||«      d«      x}}|rt        |«      }||fS |dkD  rF|	|z   }||z   }|dk\  r||z  }n|| z	  }t        |«      }t        ||«      \  }}t        |«      }||z  }n||	z   }|dk\  r||z  }n|| z	  }d}t        ||	«      \  }}||d|z  z	  z   }
||d|z  z	  z
  }|r| }|r||	z  |
z  }t        ||	 ||«      S t        |
||	z
  dz
  ||«      }
t        |||	z
  dz
  ||«      }|
|fS )	z4Simultaneously compute (cosh(x), sinh(x)) for real xrd  éüÿÿÿr   r   rF   r\   rD   rB   )r%   r"   r&   r#   r'   r7   r1   r¬   r*   r,   r}   rf  rI   rX  r   )rè   rJ   rV   ÚtanhrÓ   rÔ   r¼   r»   r  rW   rV  rW  r¶   ru   rh  ra  r­   ri  rº   r_   r`   s                        rN   Úmpf_cosh_sinhrm  ¬  s_  € àÑ€Dˆ#ˆs�BÙ‘SÙØ”DŠy¤˜+Ø”EŠz¤%˜<ÜˆKØ”Š9œd¤D˜\Ð)Ø”Š:œt¤U˜mÐ+Ü”TˆzÐØ
ˆb‰&€CØ	ˆb‰€BØ
ˆR‚xà�"�Š9ÙÜ" 1 a¨¡f¨d°CÓ8Ð8Üœt Q¨¨cÓ2ˆDÜ˜q $¨¨cÓ2ˆDØ˜�:Ðà
�ˆt‰ˆà
ˆR‚xØˆa�#�a‘%‰j‰>˜BÒáÜ"¤D¬ <°Ñ#5°q¸±v¸tÀSÓIÐIÜœg¤g¨a£j°$¸Ó<¸bÓAÐAˆA�ÙÜ˜A“J�Ø�a�4ˆKà
ˆQ‚wØ�S‘ˆØ�u‘ˆØ�QŠ;Ø�v‘‰Aà˜˜Ñ ˆAÜ˜ÓˆÜ�a˜‹~‰ˆˆ1Ü�‹FˆØ	ˆc‰	‰à�r‘ˆØ�QŠ;Ø�v‘‰Aà˜˜Ñ ˆAØˆÜ˜q "Ó%�D€A€qà��A�a‘C‘‰>€DØ��A�a‘C‘‰>€DÙØˆuˆÙØ�r‰z˜dÑ"ˆÜ˜C "  d¨CÓ0Ð0ä˜D ! B¡$ q¡&¨$°Ó4ˆÜ˜D ! B¡$ q¡&¨$°Ó4ˆØ�TˆzÐrP   c                 óJ  — |dkD  r|d}	 d|z  }||z   |z   }t        |dz
  «      }|dz	  }||z   }	|	dk\  r| |	z  }
n| |	 z	  }
t        |
|«      \  }}||kD  r||z
  }n|}|||z   dz
  z	  rt        |«      }||z	  }
||z
  }n$|dz  }Œy|| z  }||z   }	|	dk\  r| |	z  }
n| |	 z	  }
d}|
||fS )Nr   r   r?   rF   )r™   rf  rI   )rÔ   r¼   r  rW   rì   Úcancellation_precrh  Úpi2Úpi4ra  r­   rº   r¹   Úsmalls                 rN   Úmod_pi2rs  ï  s  € à
ˆQ‚wØˆØØ " a¡ÐØ˜‘HÐ0Ñ0ˆEÜ˜5 ™7Ó#ˆCØ˜‘(ˆCØ˜S‘[ˆFØ˜Š{Ø˜6‘M‘à˜V˜GÑ$�Ü˜!˜S“>‰DˆAˆqØ�3ŠwØ˜a™‘à�Ø˜˜C™ ™Ò#Ü˜“F�Ø˜‘H�Ø˜S‘[�ØØ�‰FˆAð) ð, 	�ˆt‰ˆØ�r‘ˆØ�QŠ;Ø�v‘‰Aà˜˜Ñ ˆAØˆØˆa�ˆ8€OrP   c                 óz  — | \  }}}}|s9|rt         t         }
}	nt        t        }
}	|dk(  r|	|
fS |dk(  r|	S |dk(  r|
S |dk(  r|
S ||z   }|dz   }|dk  rj|| k  rd|rt        | t	        |«      «      } t        t        d||«      }	t        | d|z
  ||«      }
|dk(  r|	|
fS |dk(  r|	S |dk(  r|
S |dk(  rt        | |||«      S |rÐ|dk\  rr|dk(  r%t        }	t        t        ft        |dz  «      |z     }
n|dk(  rt        t        }
}	nt        t        }
}	|dk(  r|	|
fS |dk(  r|	S |dk(  r|
S |dk(  rt        |
|	||«      S || dz
  z	  dz   dz	  }||| dz
  z  z
  }t        |«      |z   }|dz   |z
  }||z   }|dk\  r||z  }n|| z	  }|t        |«      z  |z	  }nt        ||||«      \  }}}t        ||«      \  }	}
|dz  }|dk(  r|
 |	}
}	n|dk(  r|	 |
 }
}	n
|dk(  r|
|	 }
}	|r|
 }
|dk(  r"t        |	| ||«      }	t        |
| ||«      }
|	|
fS |dk(  rt        |	| ||«      S |dk(  rt        |
| ||«      S |dk(  rt        |
|	||«      S y)z–
    which:
    0 -- return cos(x), sin(x)
    1 -- return cos(x)
    2 -- return sin(x)
    3 -- return tan(x)

    if pi=True, compute for pi*x
    r   r   rB   r\   rF   rD   N)r'   r"   r!   r/   r¦   r7   r#   Úboolr0   r   r™   rs  rb  r   r   )rè   rJ   rV   ÚwhichÚpirÓ   rÔ   r¼   r»   r¶   ru   r  rW   rº   Úmag2ra  r­   rc   s                     rN   Úmpf_cos_sinry    sê  € ð Ñ€Dˆ#ˆs�BÙÙÜœˆq‰AäœˆqˆAØ�AŠ:˜a ˜d�{Ø�AŠ:˜a�xØ�AŠ:˜a�xØ�AŠ:˜a�xà
ˆs‰(€CØ	�‰€Bð ˆQ‚wØ�"�Š9ÙÜ˜Aœv b›zÓ*�ÜœD ! T¨3Ó/ˆAÜ˜A˜q ™v t¨SÓ1ˆAØ˜Šz ! Q $˜;Ø˜Šz !˜8Ø˜Šz !˜8Ø˜Šz¤+¨a°°t¸SÓ"AÐAÙ	Ø�"Š9Ø�bŠyÜ�Üœ5�M¤$ s¨Q¡w£-°$Ñ"6Ñ7‘Ø˜’Üœu�1‘äœe�1�Ø˜Šz ! Q $˜;Ø˜Šz !˜8Ø˜Šz !˜8Ø˜Šz¤'¨!¨Q°°cÓ":Ð:à�s�d˜1‘f‰o Ñ" qÑ(ˆØ�Q˜C˜4 ™6‘]Ñ#ˆÜ˜‹}˜sÑ"ˆØ�B‰Y˜ÑˆØ�r‘ˆØ�QŠ;Ø�v‘‰Aà˜˜Ñ ˆAØŒx˜‹|‰^ Ñ"‰ä˜3  S¨"Ó-‰ˆˆ1ˆbÜ˜A˜rÓ"�D€A€qØ	ˆA‰€AØ	
ˆaŠ˜˜˜A�A‘Ø	
ˆaŠ˜˜˜Q˜B�A‘Ø	
ˆaŠ˜˜A˜2�A�ÙØˆBˆØ�‚zÜ˜˜R˜C  sÓ+ˆÜ˜˜R˜C  sÓ+ˆØ�!ˆtˆØ�‚zÜ˜A ˜s D¨#Ó.Ð.Ø�‚zÜ˜A ˜s D¨#Ó.Ð.Ø�‚zÜ˜Q  4¨Ó-Ð-ð rP   c                 ó   — t        | ||d«      S ©Nr   ©ry  ©rè   rJ   rV   s      rN   Úmpf_cosr~  b  ó   € ¬[¸¸DÀ#ÀqÓ-IÐ&IrP   c                 ó   — t        | ||d«      S )NrB   r|  r}  s      rN   Úmpf_sinr�  c  r  rP   c                 ó   — t        | ||d«      S )Nr\   r|  r}  s      rN   Úmpf_tanrƒ  d  r  rP   c                 ó    — t        | ||dd«      S )Nr   r   r|  r}  s      rN   Úmpf_cos_sin_pir…  e  s   € ´KÀÀ4ÈÈaÐQRÓ4SÐ-SrP   c                 ó    — t        | ||dd«      S r{  r|  r}  s      rN   rA  rA  f  ó   € ´¸A¸tÀSÈ!ÈQÓ0OÐ)OrP   c                 ó    — t        | ||dd«      S )NrB   r   r|  r}  s      rN   Ú
mpf_sin_pir‰  g  r‡  rP   c                 ó"   — t        | ||«      d   S ©Nr   ©rm  r}  s      rN   Úmpf_coshr�  h  ó   € ¬m¸A¸tÀSÓ.IÈ!Ñ.LÐ'LrP   c                 ó"   — t        | ||«      d   S r{  rŒ  r}  s      rN   Úmpf_sinhr�  i  rŽ  rP   c                 ó    — t        | ||d¬«      S )Nr   )rl  rŒ  r}  s      rN   Úmpf_tanhr’  j  s   € ¬m¸A¸tÀSÈqÔ.QÐ'QrP   c                 óÐ   — |€t        |dz
  «      }t        | |«      \  }}t        |«      }t        ||«      \  }}|dz  }|dk(  r||fS |dk(  r| |fS |dk(  r| | fS |dk(  r|| fS y )Nr   r\   r   rB   )r™   rf  rI   rb  )rè   rJ   rp  rº   r­   r¶   ru   rc   s           rN   r  r  o  sŒ   € Ø
€{Ü�t˜A‘vÓˆÜ�!�S‹>�D€A€qÜˆA‹€AÜ˜A˜tÓ$�D€A€qØ	ˆA‰€AØˆA‚v�a˜�dˆ{ØˆA‚v�q�b˜!�eˆ|ØˆA‚v�q�b˜1˜"�fˆ}ØˆA‚v�a˜!˜�eˆ|€vrP   c                 óˆ   — |€t        |«      }t        | |«      \  }}t        |«      }t        ||«      }|dk\  r||z  S || z	  S r‹  )r}   rf  rI   rT  )rè   rJ   rå   rº   r­   rX   s         rN   Ú	exp_fixedr•  {  sP   € Ø
€{Ü˜‹oˆÜ�!�S‹>�D€A€qÜˆA‹€AÜ�Q˜Ó€AØˆA‚vØ�A‰vˆà�a�R‰yÐrP   Úsagez)Warning: Sage imports in libelefun failed)F)FNr©   )r   )šrR   rl   r   Úbackendr   r   r   r   r	   r
   r   Úlibmpfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   Ú
libintmathr9   rS  rG  rZ  r[  r\  rä   rá   r  râ   rü   r  r$  r  r  rû   rø   r  rS   rZ   r]   rq   rv   r}   r„   rŒ   r�   r‹   r–   r�   r™   rœ   rž   r    r£   r@  r¦   re  Ú
mpf_degreeÚmpf_ln2Úmpf_ln10r§   rª   Ú
mpf_sqrtpiÚmpf_ln_sqrt2pir·   rÂ   rÎ   rÝ   rß   ré   rî   rñ   rù   rã   r¥   r  r  r  r  r!  r&  r(  r5  r7  r:  r<  r>  rC  rQ  rT  rX  rb  r¬   rm  rs  ry  r~  r�  rƒ  r…  rA  r‰  r�  r�  r’  r  r•  Úsage.libs.mpmath.ext_libmpÚlibsÚmpmathÚ	ext_libmpÚ_lbmpÚImportErrorÚAttributeErrorrŽ   © rP   rN   Ú<module>r§     s.  ðñ	ó Ý å ß G× G÷÷ ÷ ÷ ÷ ÷ ÷ ÷ ÷ ÷ ÷ õ õ ð ˆhÒØ�Oà€OàÐ ð ˆhÒØÑàÐØÐ Ø€ð Ð Ø€à€ØÐ ØÐ àÐ àÐ ØÐ ØÐ ð �r�7Ð Ù	�‘8˜OÓ,¨QÑ.Ö	/€AØ™˜Q ™T /Ó2°2Ñ5Ð6¸¸Q¸q¹S¹ÑAÑAÑð 
0òò*ò"
'ò óð  ñAó ðAð ñ?ó ð?ðñ8 
ˆX‹€Ù	ˆY‹€Ù	ˆV‹€Ù	ˆR‹€òð, òó ðò ò
ð ñó ðð ñó ðñ ˜iÓ(€Ù˜hÓ'€Ù˜gÓ&€Ù˜lÓ+€
Ù˜iÓ(€Ù˜jÓ)€ð ñCó ðCð
 ñ,ó ð,ñ   Ó-€
Ù#Ð$4Ó5€ð 'ó -ò8"òlð, !+ó Qðf %ó (óò,ò-)ó^ òD ðD $ó F+òP%1òX!ò$+òò(Cð
 %ó  +ðF )ó !(ðF %ó 	0ð %ó 0ð &ó %ð" &ó 1ð &ó @ð*  *ó ó8I&òVò2	òLð: $ó *ðZ  *°ó @òF!ðH (¨q°Uó M.ð^ $Ó IØ#Ó IØ#Ó IØ *Ó SØ&Ó OØ&Ó OØ$Ó LØ$Ó LØ$Ó Qó

ó	ð ˆfÒð;ß2Ó2Ø—>‘>ˆØ—-’-ˆØ—-‘-ˆØ—-’-ˆØ—-’-ˆØ—-‘-ˆØ—O’Oˆ	Ø×+Ò+ˆØ×+Ñ+‰ð øð ˜Ð(ò ;ÙÐ9Ö:ð;ús   ÉA=K ËK-Ë,K-