ó
    ˆ*£hU«  ã                   ó*  • S r SSKrSSKJr  SSKJr  SSKJrJrJrJrJ	r	J
r
  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8  SSK9J:r:  \
S	:X  a  S
r;OSr;Sr<\
S	:X  a  Sr=OSr=Sr>0 r?Sr@0 rASrBSrC0 rDSrESrFSrG0 rHSS/rI\" S\" \B5      S-   5       H  rJ\I\K" S\J-  \B5      S-   /S\JS-
  -  -  -  rIM!     S rLS rMS rNS rOSXS jrP\LS 5       rQ\LS 5       rR \" S5      rS\" S 5      rT\" S!5      rU\" S"5      rVS# rW\LSYS$ j5       rXS% rYS& rZ\LS' 5       r[\LS( 5       r\\M" \\5      r]\M" \X5      r^\M" \[5      r_\M" \Y5      r`\M" \Q5      ra\M" \R5      rb\LS) 5       rc\LS* 5       rd\M" \d5      re\M" \c5      rf\4S+ jrgS, rhS- ri\4S. jrj\4S/ jrkSZS0 jrlS1 rmS2 rnS[S3 jroS4 rp\4S5 jrqS6 rrS7 rsS8 rtS9 ruS: rv\4S; jrw\4S< jrx\4S= jry\4S> jrz\4S? jr{\4S@ jr|\4SA jr}\4SB jr~S[SC jrSD r€SE r�SF r‚\4SG jrƒ\S4SH jr„SI r…\SS4SJ jr†\4SK jr‡\4SL jrˆ\4SM jr‰\4SN jrŠ\4SO jr‹\4SP jrŒ\4SQ jr�\4SR jrŽ\4SS jr�SZST jr�SZSU jr‘\
SV:X  a   SSK’J“s  J”s  J•r–  \–Rh                  r4\–GR                  rƒ\–Râ                  rq\–GR                  r‡\–GR                  rˆ\–RÎ                  rg\–GR"                  r‘\–GR                   r�\–RØ                  rlgg! \—\˜4 a    \™" SW5         gf = f)\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                 ót   ^ • ST l         ST l        U 4S jnT R                  Ul        T R                  Ul        U$ )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                 ó¶   >• TR                   nX::  a  TR                  X -
  -	  $ [        U S-  S-   5      nT" U40 UD6Tl        UTl         TR                  X0-
  -	  $ )NgÍÌÌÌÌÌð?é
   )Ú	memo_precÚmemo_valÚint)ÚprecÚkwargsrG   ÚnewprecÚfs       €ÚS/home/mande/repo/quber/.venv/lib/python3.13/site-packages/mpmath/libmp/libelefun.pyÚgÚconstant_memo.<locals>.g^   s^   ø€ Ø—K‘Kˆ	ØÓØ—:‘: )¡.Ñ1Ð1Ü�d˜4‘i ‘lÓ#ˆÙ�wÑ) &Ñ)ˆŒ
ØˆŒØ�z‰z˜g™lÑ+Ð+ó    )rG   rH   Ú__name__Ú__doc__)rM   rO   s   ` rN   Úconstant_memorT   U   s5   ø€ ð €A„KØ€A„Jõ,ð —‘€A„JØ—	‘	€A„IØ€HrQ   c                 óD   ^ • [         4U 4S jjnT R                  Ul        U$ )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   >• U S-   nT" U5      nU[         [        4;   a  US-  n[        SX2* [        U5      X5      $ )Nr?   r   r   )r   r   r    r   )rJ   ÚrndÚwpÚvÚfixeds       €rN   rM   Údef_mpf_constant.<locals>.fr   sB   ø€ Ø�B‰YˆÙ�"‹IˆØ”8œ]Ð+Ó+Ø�‰FˆAÜ˜˜A˜s¤H¨Q£K°Ó;Ð;rQ   )r   rS   )rZ   rM   s   ` rN   Údef_mpf_constantr\   j   s   ø€ ô ÷ <ð —‘€A„IØ€HrQ   c                 óú   • X!-
  S:X  a?  [        SU-  S-   5      nU(       d
  US-  (       a  [        X@S-  -  U4$ [        * X@S-  -  U4$ X-   S-  n[        XXS5      u  pgn[        XX#5      u  pšnX¦-  X‰-  -   Xz-  X‹-  4$ )Nr   rB   é   )r   r   Úbsp_acot)ÚqÚaÚbÚ
hyperbolicÚa1ÚmÚp1Úq1Úr1Úp2Úq2Úr2s               rN   r_   r_   {   s‘   € Ø�u�ƒzÜ��1‘�q‘‹\ˆÞ˜˜1ŸÜ˜B A¡™I rÐ)Ð)ä�8˜R Q¡$™Y¨Ð*Ð*Ø	
‰ˆq‰€AÜ˜! Ó.�J€BˆBÜ˜! Ó.�J€BˆBØ‰5�2‘5‰=˜"™% ¡Ð&Ð&rQ   c                 óŠ   • [        SU-  [        R                  " U 5      -  S-   5      n[        U SX25      u  pEnXE-   U-  XP-  -  $ )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_   )ra   rJ   rc   ÚNÚpr`   Úrs          rN   Ú
acot_fixedrs   ‰   sI   € ô
 	ˆD�4‰KœŸš ›Ñ# bÑ(Ó)€AÜ�q˜!˜AÓ*�G€Aˆ!Ø‰S�4‰K˜1™3ÑÐrQ   Fc                 ó~   • Sn[         nU  H,  u  pVU[        U5      [        [        U5      X-   U5      -  -  nM.     XC-	  $ )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   rs   )ÚcoefsrJ   rc   Ú	extraprecÚsra   rb   s          rN   Úmachinrx   ’   sD   € ð €IÜ€AÛ‰ˆØ	ŒS�‹V”j¤ Q£¨©¸ÓDÑDÑDŠñ à‰NÐrQ   c                 ó    • [        / SQU S5      $ )zn
Computes ln(2). This is done with a hyperbolic Machin-type formula,
with binary splitting at high precision.
))é   é   )éþÿÿÿiÁ  )r=   i-"  T©rx   ©rJ   s    rN   Ú	ln2_fixedr   ¢   s   € ô Ò3°T¸4Ó@Ð@rQ   c                 ó    • [        / SQU S5      $ )zF
Computes ln(10). This is done with a hyperbolic Machin-type formula.
))é.   é   )é"   é1   )r?   é¡   Tr}   r~   s    rN   Ú
ln10_fixedr†   ª   s   € ô
 Ò1°4¸Ó>Ð>rQ   iqcÏ i¦-~ i@Å	 é   c                 óf  • X-
  S:X  aO  [        SU-  S-
  SU-  S-
  -  SU-  S-
  -  5      nUS-  [        S-  -  S-  nSU-  U-  [        [        U-  -   -  nOWU(       a  US:  a  [	        S	X5        X-   S-  n[        XUS-   U5      u  p‰n
[        XqUS-   U5      u  p¼nXœ-  nX‹-  nX¬-  XØ-  -   nXEU4$ )
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)ra   rb   ÚlevelÚverboserO   rq   r`   ÚmidÚg1rf   rg   Úg2ri   rj   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ÜÐ&¨Ô-Ø‰s�Q‰hˆÜ" 1¨5°©7°GÓ<‰
ˆ�Ü" 3¨5°©7°GÓ<‰
ˆ�Ø‰EˆØ‰EˆØ‰E�B‘E‰MˆØ�ˆ7€NrQ   c                 óà   • [        U S-  S-  S-   5      nU(       a  [        SU5        [        SUSU5      u  pEn[        [        SU -  -  5      nU[        -  U-  U[
        U-  -   [        -  -  nU$ )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_baserp   rO   rq   r`   ÚsqrtCrY   s	            rN   Úpi_fixedr›   é   sv   € ô 	ˆD�Ñ˜lÑ*¨QÑ.Ó/€AÞÜÐ)¨1Ô-Ü˜A˜q ! WÓ-�G€Aˆ!Ü”v  $¡Ñ'Ó(€EØ	Œ&‰�‰˜!œF 1™H™*¤fÑ,Ñ-€AØ€HrQ   c                 ó   • [        U 5      S-  $ )Né´   )r›   r~   s    rN   Údegree_fixedrž   ú   s   € Ü�D‹>˜3ÑÐrQ   c                 óŒ   • X-
  S:X  a  [         [        U5      4$ X-   S-  n[        X5      u  p4[        X!5      u  pVX6-  U-   XF-  4$ )zY
Sum series for exp(1)-1 between a, b, returning the result
as an exact fraction (p, q).
r   rB   )r   r   Úbspe)ra   rb   re   rf   rg   ri   rj   s          rN   r    r    ý   sN   € ð
 	�sˆaƒxÜœ˜A›ˆÐØ	
‰ˆq‰€AÜ�!‹Z�F€BÜ�!‹Z�F€BØ‰5�‰8�R‘Uˆ?ÐrQ   c                 ó‚   • [        SU -  [        R                  " U 5      -  S-   5      n[        SU5      u  p#X#-   U -  U-  $ )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   rn   ro   r    )rJ   rp   rq   r`   s       rN   Úe_fixedr¢   	  sB   € ô 	ˆC�‰H”T—X’X˜d“^Ñ# bÑ(Ó)€AÜ��!‹9�D€AØ‰S�4‰K˜!ÑÐrQ   c                 óT   • U S-  n [        [        SU -  -  5      [        U -  -   nUS-	  $ )z*
Computes the golden ratio, (1+sqrt(5))/2
rF   rB   é   )r8   r
   r   )rJ   ra   s     rN   Ú	phi_fixedr¥     s2   € ð
 	ˆB�J€DÜ”8˜a ™fÑ%Ó&¬'°T©/Ñ:€AØ�‰7€NrQ   c           	      ód   • U S-   n[        [        [        [        U5      S5      U5      U S-
  5      $ )NrF   r   )r   Úmpf_logr1   Úmpf_pi)rJ   rX   s     rN   Úln_sqrt2pi_fixedr©   *  s.   € à	�‰€Bä”GœI¤f¨R£j°!Ó4°bÓ9¸4À¹6ÓBÐBrQ   c                 ó,   • [        [        U 5      U 5      $ ©N)r   r›   r~   s    rN   Úsqrtpi_fixedr¬   0  s   € ä”h˜t“n dÓ+Ð+rQ   c           	      óÒ  • U u  pEpgUu  p‰p«U(       a  U
S:  a  [        S5      eU
S:¼  a  [        U SU-  Xš-  -  X#5      $ U
S:X  a�  U	S:X  a8  U(       a%  [        [        [	        XS-   [
        U   5      X#5      $ [	        XU5      $ U(       a"  [        [	        XS-   [
        U   5      U	* X#5      $ [        [	        XS-   U5      X’U5      $ [        XS-   U5      n[        [        X5      X#5      $ )zJ
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/   )rw   ÚtrJ   rW   ÚssignÚsmanÚsexpÚsbcÚtsignÚtmanÚtexpÚtbcÚcs                rN   Úmpf_powr¹   >  sü   € ð
 Ñ€E�ØÑ€E�Þ�˜“ÜÐJÓKÐKØˆqƒyÜ˜1˜r E™k¨T©ZÑ8¸$ÓDÐDàˆrƒzØ�1‹9ÞÜœt¤X¨a°b±Ü" 3Ñ'ó&)Ø*.ó5ð 5ä˜A SÓ)Ð)æÜ"¤8¨A°B©wÜ" 3Ñ'ó$)Ø+/¨%°ó<ð <äœx¨°©7°CÓ8¸$ÀcÓJÐJô 	�˜‘7˜CÓ €AÜ”7˜1“= $Ó,Ð,rQ   c                 ó¤  • US:X  a  X -  S4$ [        U 5      nSnSUS[        U5      -  -   S-   -  n[        u  pgp‰ US-  (       aK  Xp-  nX„-   nX“S-
  -  n	U	[        [        Xy-	  5         -   n	X•:”  a  XyU-
  -	  nX‰U-
  -  nUn	US-  nU(       d   Xx4$ X -  n XD-   nX3-   S-
  nU[        [        X-	  5         -   nX5:”  a  XU-
  -	  n XCU-
  -  nUnUS-  nM—  )zun-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ˆ2Ø
Øˆq�5Ø‘ˆBØ‘ˆBØ˜‘6‰MˆCØœ¤ B¡I£Ñ/Ñ/ˆCØ‹~Ø ™LÑ)�Ø˜H‘nÑ$�Ø�Ø�‰FˆAÞØð ˆ6€Mð ‰CˆØ‰gˆØ‰W�q‰[ˆØ”'œ#˜a™g›,Ñ'Ñ'ˆØ‹=Ø˜‘kÑ"ˆAØ˜‘=Ñ ˆCØˆBØ�‰Fˆñ+ rQ   c                 óæ  • Sn [        XX-  -
  5      n[        [        USU-  -  5      5      nSnUn	Un
[        XBU-   5       Ha  n[        XaS-
  U
5      u  pÍ[        XÁS-
  U
-  U-
  U-
  U	-
  5      n[        U SU-  U-
  U	-   5      U-  nXñS-
  [        XkU
-
  5      -  -   U-  nUn
Mc     U$ ! [         a=    [	        WU5      n[	        U5      n[        SXt5      n[        XWU5      n[        U5      n NÁf = f)Né2   g      ð?r   rF   rB   )r   r   rI   ÚOverflowErrorr   r2   r¹   r   r   rÄ   r   )r»   r¼   rJ   Úexp1ÚstartÚy1rr   ÚfnÚextraÚextra1Úprevprq   rÁ   rÂ   rk   ÚBs                   rN   Únthroot_fixedrÐ   �  s  € Ø€EðÜ�A˜a™g‘~Ó&ˆÜ”�B˜˜Q™‘KÓ Ó!ˆð €EØ€FØ€EÜ˜ U¡
Ö+ˆÜ˜q A¡# uÓ-‰ˆÜ�B˜1™˜e™ a™¨"Ñ,¨vÑ5Ó6ˆÜ�1�a˜‘c˜$‘h˜v‘oÓ&¨Ñ*ˆØ�A‘#œ  U¡7Ó+Ñ+Ñ+¨aÑ/ˆØŠñ ,ð €Høô ó Ü�b˜%Ó ˆÜ�a‹[ˆÜ˜!˜RÓ'ˆÜ�B˜EÓ"ˆÜ�1‹IŠðús   „*B) Â)AC0Ã/C0c                 ó2  • U u  pEpgU(       a  [        S5      eU(       dW  U [        :X  a  [        $ U [        :X  a  US:”  a  [        $ US:X  a  [        $ [        $ U(       d  [        $ US:  a  [        $ [        $ SnUS:  aI  US:X  a  [        $ US:X  a  [        XU5      $ US:X  a  [        [        XU5      $ [        U   nSnSn	X)-  nU* nUS	:”  a~  US
:¼  d  U[        SSUS-  -  -   5      :  a`  US-   n
[        U5      n[        SXº5      n[        XX£5      n[        US   US   US   US   X#5      n U(       a  [        [        XW	-
  U5      $ U $ USU-  -   X!-  -
  n
US:”  a  XªS-  -  n
XªU-  -
  n
Xz-
  nSnXn-   nUS:  a  SnU* nU(       a	  UUU-  -  nOUUU-  -  n[        X^5      nSnXn-   US-
  U
-  -
  U-  U-
  nSnU(       a  US:X  d  US:X  a  SnOUS:X  d  US:X  a  Sn[        UU-   XU5      n[        UUX#5      n U(       a  [        [        XW	-
  U5      $ U $ )zYnth-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   )rw   r¼   rJ   rW   ÚsignÚmanr¾   r½   Úflag_inverseÚextra_inverseÚprec2rË   Únthrr   ÚshiftÚsign1ÚesrÌ   rÈ   Ú	rnd_shifts                       rN   Úmpf_nthrootrß   ¦  si  € ð
 Ñ€DˆsÞÜÐ;Ó<Ð<ÞØ”‹9ÜˆKØ”‹:Ø�1‹uÜ�Ø�A‹vÜ�ÜˆKæÜˆKØˆq‹5ÜˆLÜˆØ€LØˆ1ƒuØ�‹6ÜˆKØ�‹6Ü˜1 CÓ(Ð(Ø�‹7Üœ4 ¨#Ó.Ð.ä˜SÑ!ˆØˆØˆØÑˆØˆBˆØˆ2ƒv�1˜“: ¬¨C°$¸¸D¹±.Ñ,@Ó(AÓ!AØ�r‘	ˆÜ�a‹[ˆÜ˜1˜bÓ(ˆÜ�A˜EÓ'ˆÜ�a˜‘d˜A˜a™D ! A¡$¨¨!©¨dÓ8ˆÞÜœ4 ¨Ñ$6¸Ó<Ð<àˆHà�1�Q‘3‰J˜$™&Ñ!€Eð 	ˆ2ƒvØ˜‘ÑˆØ˜a™‘ˆà‰J€Eà€EØ	‰€BØ	ˆAƒvØˆØˆSˆÞØ��A‘‰‰à��A‘‰ˆÜ
�Ó
€CØ€EØ‰Y˜˜!™˜U‘{Ñ" QÑ&¨%Ñ/€DØ€IÞØ�#‹:˜ ›ØˆIøà�#‹:˜ ›ØˆIÜ
˜˜I™ q°Ó
6€CÜ�S˜$ Ó*€AÞÜ”t˜Q ]Ñ 2°CÓ8Ð8àˆrQ   c                 ó   • [        U SX5      $ )zcubic root of a positive numberr^   )rß   )rw   rJ   rW   s      rN   Úmpf_cbrtrá   ù  s   € ä�q˜!˜TÓ'Ð'rQ   c                 ó>  • U [         ;   a  [         U    u  p4XA:¼  a  X4U-
  -	  $ US-   nU[        ::  a1  Uc  [        U5      n[        U 5      nXU-
  -  n[	        Xu5      Xb-  -   nO"[        [        [        U 5      US-   5      U5      nU [        :  a
  X…4[         U '   X…U-
  -	  $ )zT
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ÚvprecrX   rr   ÚxrY   s	            rN   Úlog_int_fixedrë     s«   € ð
 	ŒMÓÜ$ QÑ'‰ˆØ‹=Ø T™\Ñ*Ð*Ø	�‰€BØ	ÔÓØ‰;Ü˜B“-ˆCÜ�Q‹KˆØ�Q‘$‰KˆÜ˜aÓ$ q¡uÑ,‰ä”WœX a›[¨"¨Q©$Ó/°Ó4ˆØÔÓØ˜7Œ�aÑØ�D‘‰>ÐrQ   c                 ót   • Sn X-   S-	  nUS:”  a  [        X-
  5      S:  a  U $ [        X-  5      nUn US-  nM6  )zR
Fixed-point computation of agm(a,b), assuming
a, b both close to unit magnitude.
r   r   rŒ   r=   )Úabsr8   )ra   rb   rJ   ÚiÚanews        rN   Ú	agm_fixedrð     sM   € ð
 	
€AØ
Ø‘�a‰xˆØˆq‹5”S˜™“[ 1“_ØˆHÜ�q‘s‹OˆØˆØ	ˆQ‰ˆñ rQ   c                 ód  • X -  U-	  nU=n=pEU(       a  XR-  U-	  nXE-  U-	  nX4-  nU(       a  M  U[         U-  -  nX3-  US-
  -	  nU[        X-  5      -  U-	  nU =n=pEU(       a  XR-  U-	  nXE-  U-	  nXd-  nU(       a  M  [         U-  US-  -   nXf-  U-	  n[        X6U5      n[        U5      U-  U-  $ )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   Úx2rw   ra   rb   r¯   rq   s           rN   Úlog_agmró   )  sç   € ð2 ‰#�$‰€Bà€N€A€NˆÞ
Ø‰T�d‰NˆØ‰S�T‰MˆØ	‰ˆ÷ ˆ!ð Œ'�4‰-Ñ€AØ	
‰��Q‘‰€AØ	
Œ:�a‘gÓÑ	 Ñ%€Aà€M€A€MˆÞ
Ø‰T�d‰NˆØ‰S�T‰MˆØ	‰ˆ÷ ˆ!ô 
�$‰˜1˜a™4Ñ €AØ	
‰ˆt‰€Aä�!˜Ó€AÜ�T‹N˜dÑ" qÑ(Ð(rQ   c                 ó\  • [        U5       H  n[        X-  5      n M     [        U-  nX-
  U-  X-   -  nUS:  nU(       a  U* nXU-  U-	  nXw-  U-	  nUn	US-  n
XX-  U-	  nSnU(       a(  X•U-  -  n	US-  nX¥U-  -  n
XX-  U-	  nUS-  nU(       a  M(  X§-  U-	  n
Xš-   SU-   -  nU(       a  U* $ U$ )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   rr   rî   ÚonerY   rÕ   Úv2Úv4Ús0Ús1Úkrw   s                rN   Ú
log_taylorrû   X  sé   € ô �AŽYˆÜ�q‘wÓŠñ ä
�T‰/€CØ
‰%�$‰˜!™%Ñ €AØˆq‰5€DÞØˆBˆØ
‰#�$‰€BØ
‰%�D‰€BØ	
€BØ	
ˆA‰€BØ	
‰�$‰€AØ	€AÞ
Ø
�1‰f‰ˆØ	ˆQ‰ˆØ
�1‰f‰ˆØ‰T�d‰NˆØ	ˆQ‰ˆ÷ ˆ!ð ‰%�D‰€BØ	‰�A�a‘CÑ€AÞØˆrˆ	Ø€HrQ   c                 óª  • X[         -
  -	  n[        U   nX1-
  nX#4[        ;   a  [        X#4   u  pVO"X#[         -
  -  n[        XSS5      nXV4[        X#4'   XT-  nXd-  nX-
  U-  U-  nXq-  [        U-  U-   -  nXˆ-  U-	  n	X™-  U-	  n
UnUS-  nXŠ-  U-	  nSnU(       a(  X¸U-  -  nUS-  nXÈU-  -  nXŠ-  U-	  nUS-  nU(       a  M(  XÉ-  U-	  nX¼-   S-  nXn-   $ )zX
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Údprecra   Úlog_arÓ   rY   rö   r÷   rø   rù   rú   rw   s                  rN   rå   rå   z  s-  € ð
 	
Ô#Ñ#Ñ$€AÜ" 4Ñ(€KØÑ€EØ	ÐÔ+Ó+Ü# A NÑ3‰ˆˆ5àÔ 0Ñ0Ñ1ˆÜ˜1¨1Ó-ˆØ,-¨:Ô˜˜Ñ(Ø�K€AØ	�O€EØ
‰%�D‰˜QÑ€AØ	
‰œ D™¨AÑ-Ñ.€AØ
‰#�$‰€BØ
‰%�D‰€BØ	
€BØ	
ˆA‰€BØ	
‰�$‰€AØ	€AÞ
Ø
�‰d‰
ˆØ	ˆQ‰ˆØ
�‰d‰
ˆØ‰T�d‰NˆØ	ˆQ‰ˆ÷ ˆ!ð ‰%�D‰€BØ	‰�1‰€AØ‰9ÐrQ   c                 ó`  • U u  p4pVU(       d0  U [         :X  a  [        $ U [        :X  a  [        $ U [        :X  a  [        $ U(       a  [	        S5      eUS-   nUS:X  a'  U(       d  [         $ [        U[        U5      -  U* X5      $ XV-   n[        U5      n	U	S::  a\  SU	-
  n
U
(       a  [        U-  U-
  nOU[        US-
  -  -
  n[        U5      nXl-
  nX×:”  a  [        X«X–-
  XÌS5      n[        XêX5      $ X}-  nU	S:”  a)  [        U	5      U:”  a  [        U[        U5      -  U* X5      $ U[        ::  a0  [        [        XGU-
  5      U5      nU(       a  Xø[        U5      -  -  nOHU* [        -  nUU-
  n[!        U U5      n UU* -  n[#        [%        X5      U5      * nUU[        U5      -  -  n[        X÷* X5      $ )z^
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   rW   rÕ   rÖ   r¾   r½   rX   ÚmagÚabs_magr´   rµ   r·   Úcancellationr¯   re   Úoptimal_magr¼   s                     rN   r§   r§   œ  s¿  € ð
 Ñ€Dˆsö Ø”‹:œe�|Ø”‹9œT�kØ”‹9œT�kÞÜÐ<Ó=Ð=Ø	�‰€Bð ˆaƒxÞÜˆLÜ˜C¤	¨"£Ñ-°¨s°DÓ>Ð>Ø
‰&€CÜ�#‹h€Gð �!ƒ|à�'‘	ˆÞÜ˜R‘K 3Ñ&‰Dàœ' B q¡D™/Ñ*ˆDÜ�t‹nˆØ‘xˆØÓÜ˜% w¡z°3¸SÓAˆAÜ˜q¨Ó3Ð3àÑˆBð �ƒÜ�GÓ˜rÓ!Ü ¤I¨b£MÑ 1°B°3¸ÓBÐBð 
Œ_ÓÜœf S¨R©%Ó0°"Ó5ˆÞØ”Y˜r“]Ñ"Ñ"ˆAøà�cÔ1Ñ1ˆØ˜#ÑˆÜ�a˜‹OˆØ
�ˆ|ÑˆÜ”X˜a“_ bÓ)Ð)ˆØ	ˆQŒy˜‹}‰_ÑˆÜ˜˜3 Ó*Ð*rQ   c           
      ó"  • US   (       d  XpU S   (       dn  US   (       d/  Xs=:X  a  [         :X  a   [        $   [        X4;   a  [        $ [        $ U [         :X  a  [	        [        U5      X#5      $ U [        :X  a  [        $ [        $ [        X 5      n[        X5      nSn[        XEX&-   5      n[        U[        S5      nUS   US   -   n	U[         :X  d	  X–* S-  :  a!  [        XEX&-   [        US   US   5      -
  5      n[        [	        XrU5      S5      $ )z)
Computes log(sqrt(a^2+b^2)) accurately.
r   r?   rF   rB   r^   rD   )r!   r&   r'   r%   r§   r*   r/   r-   r#   Úminr1   )
ra   rb   rJ   rW   Úa2Úb2rÌ   Úh2Ú	cancelledÚmag_cancelleds
             rN   Úmpf_log_hypotr  ä  sý   € ð
 ˆQ�4Øˆ1àˆQ�4à��tØ�œŒÜ�ð ä˜�v‹~Ü�äˆKà”‹:äœ7 1›: tÓ1Ð1Ø”‹9ÜˆKÜˆä	�‹€BÜ	�‹€BØ€Eä	�˜™Ó	$€BÜ˜œE 2Ó&€IØ˜a‘L ¨1¡Ñ-€Mð ”EÓ˜]¨V°Q©YÓ6Ü�R˜T™Z¬¨B¨q©E°"°Q±%Ó(8Ñ8Ó9ˆÜ”W˜R sÓ+¨RÓ0Ð0rQ   c                 óÂ  • US:¼  a(  [         R                  " [        XS-
  -	  5      S-  5      nO%[         R                  " [        U 5      SU-  -  5      nSn[        [        US-  5      SU-
  -	  5      nSn[	        X15       HO  nXT-  nX%U-
  -  n[        X%5      u  pgXu-  U-  nU[        XU-
  5      -
  U-  [        U-  US-  U-	  -   -  n	X)-
  nUnMQ     [        X#U-
  5      $ )Néd   é5   g      @Cg       @rÆ   rB   )rn   ÚatanrI   r   r   Úcos_sin_fixedr   r   )
rê   rJ   rr   rÎ   Úextra_prX   ÚcosÚsinÚtanra   s
             rN   Úatan_newtonr    sì   € Øˆsƒ{Ü�IŠI”c˜1 B™w™<Ó)¨'Ñ1Ó2‰ä�IŠI”c˜!“f˜S $™YÑ&Ó'ˆØ€EÜŒC��G‘Ó  E¡Ñ*Ó+€AØ€GÜ˜%Ö&ˆØ
‰ˆØ�U‘(‰OˆÜ  Ó'‰ˆØ‰y˜SÑ ˆØ”&˜ ™GÓ$Ñ$¨Ñ+´'¸2±+À3ÈÁ6ÈBÁ,Ñ1OÑPˆØ‰EˆØŠñ 'ô �!˜4‘ZÓ Ð rQ   c                 ó´   • S[        US-
  5      -  S-   nX!-
  nX4[        ;   a  [        X4   u  pEO!X[        -
  -  n[        XB5      nXE4[        X4'   XC-	  XS-	  4$ )Nr   r?   )r   Úatan_taylor_cacheÚATAN_TAYLOR_SHIFTr  )r¼   rJ   rÙ   r   ra   Úatan_as         rN   Úatan_taylor_get_cachedr  "  st   € ð
 ”˜$˜q™&Ó!Ñ" bÑ(€EØ‰L€EØ	€zÔ&Ó&Ü% a hÑ/‰	ˆˆ6àÔ+Ñ+Ñ,ˆÜ˜QÓ&ˆØ'( kÔ˜!˜(Ñ#Ø‰J˜&™/Ð*Ð*rQ   c                 ó0  • X[         -
  -	  n[        X!5      u  p4X-
  nXQ-  US-  U-	  X5-  U-	  -   [        U-  -   -  =pgUS-  U-	  nXˆ-  U-	  n	US-  n
Xy-  U-	  nSnU(       a(  XgU-  -  nUS-  nX§U-  -  n
Xy-  U-	  nUS-  nU(       a  M(  X¨-  U-	  n
Xj-
  nXL-   $ )NrB   r^   rŠ   )r  r  r   )rê   rJ   r¼   ra   r  rÔ   rø   rY   rö   r÷   rù   rú   rw   s                rN   Úatan_taylorr!  1  sÜ   € Ø	
Ô%Ñ%Ñ	&€AÜ& qÓ/�I€AØ	‰€AØ‰i˜a ™d d™l¨q©s°d©{Ñ;¼wÈ$¹ÑOÑPÐP€BØ
ˆQ‰$�$‰,€BØ
‰'�dÑ	€BØ	
ˆA‰€BØ	
‰�DÑ€AØ	€AÞ
Ø
�1‰f‰ˆØ	ˆQ‰ˆØ
�1‰f‰ˆØ‰V˜ÑˆØ	ˆQ‰ˆ÷ ˆ!ð ‰'�dÑ	€BØ
‰€AØ‰:ÐrQ   c           	      ó†   • U (       d  [        [        X5      S5      $ [        [        [        U[        U   5      S5      5      $ )NrD   )r1   r¨   r,   r6   )rÕ   rJ   rW   s      rN   Úatan_infr#  E  s5   € ÞÜœ Ó*¨BÓ/Ð/Ü”9œV D¬,°sÑ*;Ó<¸bÓAÓBÐBrQ   c                 ó"  • U u  p4pVU(       dB  U [         :X  a  [         $ U [        :X  a  [        SX5      $ U [        :X  a  [        SX5      $ [        $ XV-   nXqS-   :”  a  [        X1U5      $ U* US-   :”  a  [        U SU-
  X5      $ US-   [        U5      -   nUS:¼  a  [        SX5      n Sn	OSn	[        X5      n
U(       a  U
* n
U[        :  a  [        X¨5      nO[        X¨5      nU	(       a  [        U5      S-	  S-   U-
  nU(       a  U* n[        X¸* X5      $ )Nr   r   r?   é   rB   TF)r!   r%   r#  r&   r'   r7   rí   r2   r   ÚATAN_TAYLOR_PRECr!  r  r›   r   )rê   rJ   rW   rÕ   rÖ   r¾   r½   r  rX   Ú
reciprocalr¯   ra   s               rN   Úmpf_atanr(  J  s  € ØÑ€DˆsÞØ”‹:œe�|Ø”‹9œX a¨Ó3Ð3Ø”‹:œh q¨$Ó4Ð4ÜˆØ
‰(€Cà
�"‰Wƒ}Ü˜ CÓ(Ð(à€tˆd�2‰gƒ~Ü˜1˜a ™f dÓ0Ð0Ø	�‰”S˜“XÑ	€Bà
ˆaƒxÜ˜˜AÓ"ˆØ‰
àˆ
Ü�‹€AÞØˆBˆØ	ÔÓÜ˜Ó‰ä˜ÓˆÞÜ�r‹l˜A‰o˜qÑ  AÑ%ˆÞØˆBˆÜ˜˜3 Ó*Ð*rQ   c           	      ó  • Uu  pEpgU u  p‰p«U	(       d¥  U [         :X  a*  U[        :w  a   [        U5      S:¼  a  [         $ [        X#5      $ U [        [
        4;   a[  U[        [
        4;   a  [        $ U [        :X  a  [        [        X#5      S5      $ [        [        [        U[        U   5      S5      5      $ [        $ U(       a&  [        [        [        U 5      X[        U   5      5      $ U(       dZ  U[        :X  a  [        $ U[        :X  a  [         $ U[
        :X  a  [        X#5      $ U [         :X  a  [         $ [        [        X#5      S5      $ [        [        XUS-   5      US-   5      nU(       a  [        [        US-   5      XÂU5      $ [        XÂU5      $ )Nr   rD   rŒ   )r!   r'   r)   r¨   r%   r&   r1   r,   r6   Ú	mpf_atan2r(  r0   r-   r+   )r»   rê   rJ   rW   ÚxsignÚxmanÚxexpÚxbcÚysignÚymanÚyexpÚybcÚtquos                rN   r*  r*  m  sH  € ØÑ€E�ØÑ€E�ÞØ”‹:˜!œt›)Ü˜‹{˜aÓÜ�Ü˜$Ó$Ð$Ø””u�ÓØ”Tœ5�MÓ!Ü�à”D‹yÜ ¤¨Ó!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Üœ Ó*¨BÓ/Ð/Ü”G˜A $ q¡&Ó)¨4°©6Ó2€DÞÜ”v˜d 1™f“~ t°3Ó7Ð7ä�t 3Ó'Ð'rQ   c           
      ó  • U u  p4pVXe-   S:”  a  U [         [        4;  a  [        S5      eUS-   n[        X 5      n[	        [         [        [        [         X‡5      U5      U5      n	[        X	U5      n
[        [        X¡U5      S5      $ )Nr   z%asin(x) is real only for -1 <= x <= 1é   r   )
r"   r#   r   r/   r-   r4   r.   r0   r1   r(  ©rê   rJ   rW   rÕ   rÖ   r¾   r½   rX   ra   rb   r¸   s              rN   Úmpf_asinr7  �  sz   € ØÑ€DˆsØ	�v�ƒz�a¤¤e˜}Ó,ÜÐCÓDÐDà	�‰€BÜ�‹€AÜ””hœw¤t¨QÓ3°RÓ8¸"Ó=€AÜ��bÓ€AÜ”X˜a sÓ+¨QÓ/Ð/rQ   c                 ó2  • U u  p4pVXe-   S:”  a0  U [         [        4;  a  [        S5      eU [        :X  a  [        X5      $ US-   n[	        X 5      n[        [        [         X‡5      U5      n	[        U	[        [         X5      U5      n
[        [        X¡U5      S5      $ )Nr   z%acos(x) is real only for -1 <= x <= 1r5  r   )r"   r#   r   r¨   r/   r4   r.   r0   r-   r1   r(  r6  s              rN   Úmpf_acosr9  ›  s�   € àÑ€DˆsØ	�x�!ƒ|Ø”Tœ5�MÓ!ÜÐ GÓHÐHØ”‹:Ü˜$Ó$Ð$Ø	�‰€BÜ�‹€AÜ”œ˜qÓ% rÓ*€AÜ�”7œ4 Ó'¨Ó,€AÜ”X˜a sÓ+¨QÓ/Ð/rQ   c                 ó0  • US-   nU u  pEpgXg-   nUS:  a  Xƒ* :  a  [        U SU-
  X5      $ X8* -  n[        [        [        X 5      [        U5      U5      n	[        [        U 5      X“5      n	U(       a  [        [        X‘[        U   5      5      $ [        X‘U5      $ )Nr?   éøÿÿÿr   )	r7   r4   r-   r/   r"   r*   r,   r§   r6   )
rê   rJ   rW   rX   rÕ   rÖ   r¾   r½   r  r`   s
             rN   Ú	mpf_asinhr<  ©  s˜   € Ø	�‰€BØÑ€DˆsØ
‰&€CØ
ˆRƒxØ�‹9Ü˜q ! D¡&¨$Ó4Ð4Ø
ˆt‰ˆô 	”œ ›¬¨bÓ1°2Ó6€AÜ”˜“
˜AÓ"€AÞÜ”w˜q¬°SÑ(9Ó:Ó;Ð;ä�q Ó$Ð$rQ   c                 ó¾   • US-   n[        U [        5      S:X  a  [        S5      e[        [	        [        X 5      [        U5      U5      n[        [	        XU5      X5      $ )Nr5  rD   z acosh(x) is real only for x >= 1)r(   r"   r   r4   r-   r/   r#   r§   )rê   rJ   rW   rX   r`   s        rN   Ú	mpf_acoshr>  º  sS   € à	�‰€BÜˆq”$Ó˜2ÓÜÐ>Ó?Ð?Ü”œ ›¤u¨bÓ1°2Ó6€AÜ”7˜1 Ó$ dÓ0Ð0rQ   c           	      óˆ  • U u  p4pVU(       d$  U(       a  U [         [        4;   a  U $ [        S5      eXe-   nUS:”  a&  US:X  a  US:X  a  [        [        /U   $ [        S5      eUS-   nUS:  a  Xx* :  a  [        XX5      $ X‡* -  n[        U [        U5      n	[        [        X5      n
[        [        [        XšU5      X5      S5      $ )Nz&atanh(x) is real only for -1 <= x <= 1r   r   r5  r;  rD   )r!   r'   r   r%   r&   r7   r-   r"   r.   r1   r§   r0   )rê   rJ   rW   rÕ   rÖ   r¾   r½   r  rX   ra   rb   s              rN   Ú	mpf_atanhr@  Â  sÆ   € àÑ€DˆsÞ–SØ”œ�ÓØˆHÜÐDÓEÐEØ
‰(€CØ
ˆQƒwØ�!‹8˜˜q›Üœ%�= Ñ&Ð&ÜÐDÓEÐEØ	�‰€BØ
ˆRƒxØ�‹9Ü˜q¨Ó2Ð2Ø
ˆt‰ˆÜ�”4˜Ó€AÜ”�aÓ€AÜ”WœW Q¨2Ó.°Ó:¸BÓ?Ð?rQ   c                 óž  • U u  p4pVU(       d  U [         :X  a  [        $ U $ [        XV-   5      nUS:¼  a3  US:  d  U[        U5      ::  a  [	        [        [        U 5      5      X5      $ X-   S-   n[        U5      n	[        [        U	S5      [        U5      n
[        X�U5      n[        X5      n[        XËU5      n[        X¼U5      n[        XºX5      nU$ )Nr   rF   r?   r   )r&   r'   rí   r   r   r9   r   Úmpf_phir-   r1   r#   r¹   Ú
mpf_cos_pir0   r.   )rê   rJ   rW   rÕ   rÖ   r¾   r½   ÚsizerX   ra   rb   rÓ   rY   s                rN   Úmpf_fibonaccirE  ×  sÁ   € ØÑ€DˆsÞØ”‹:ÜˆKØˆäˆs‰v‹;€DØ
ˆaƒxà�"‹9˜¤¨£Ó.ÜœD¤¨£›O¨TÓ7Ð7à	‰�rÑ	€BÜ�‹€AÜ”	˜!˜Q“¤¨Ó+€AÜ��bÓ€AÜ�1Ó€AÜ��bÓ€AÜ��bÓ€AÜ��dÓ €AØ€HrQ   c                 óÚ  • U S:  a  U * n SnOSn[        SUS-  -  5      n[        U 5      U-
  n[        SXT-   5      nSS[        XE* 5      -  -   nX-   nXU-
  -  n [        U-  nUS:H  n	U[        :  aq  X -  U-	  =p«Xª-  U-	  n[
        =pÞSnU(       a4  X¿S-
  U-  -  o½U-  oßS-  nX¿S-
  U-  -  o¾U-  oïS-  nX¼-  U-	  nU(       a  M4  X®-  U-	  nU	(       a  Xí-
  U-   nO÷Xí-   U-   nOï[        SUS-  -  5      nX -  U-	  =p«XŠ/n[        SU5       H  nUR                  US   U
-  U-	  5        M     [
        /U-  nSnU(       aa  [        U5       H>  nX¿S-
  U-  -  nU	(       a  US-  (       a  UU==   U-  ss'   OUU==   U-  ss'   US-  nM@     UUS   -  U-	  nU(       a  Ma  [        SU5       H  nUU   UU   -  U-	  UU'   M     [        U5      U-   nUS:X  aD  [        UU-  X‡-  -
  5      nU(       a  UU-
  nOUU-   n[        U5       H  nUU-  U-	  nM     UU-	  $ US-
  n[        U5       H  nUU-  U-	  U-
  nM     [        [        X‡-  UU-  -
  5      5      nU(       a  U* nUU-	  UU-	  4$ )	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Ó?rm   rD   )rI   r   Úmaxr   ÚEXP_SERIES_U_CUTOFFr   r   ÚappendÚsumr8   rí   )rê   rJ   ÚtyperÕ   rr   ÚxmagrÌ   rX   rõ   Úaltrò   ra   Úx4rø   rù   rú   r¸   rÓ   Úxpowersrî   Úsumsrw   rY   Úpshifts                           rN   Úexponential_seriesrS  ó  sÛ  € ð 	ˆ1ƒuØˆBˆØ‰àˆÜˆC��c‘	‰MÓ€AÜ�A‹;˜Ñ€DÜˆAˆt‰xÓ€AØ�”3�q˜“<‘Ñ€EØ	‰€BØ�1‰9Ñ€AÜ
�R‰-€CØ�1‰9€CØÔ!Ó!Ø‘#˜"‘ÐˆØ‰e˜‰]ˆÜÐˆØˆÞØ�Q‘3˜‘'‰MˆA ™7˜2¨¡F AØ�Q‘3˜‘'‰MˆA ™7˜2¨¡F AØ‘˜"‘ˆA÷ ˆað ‰e˜‰]ˆÞØ‘˜#‘‰Aà‘˜#‘‰Aä��D˜$‘J‘ÓˆØ‘#˜"‘ÐˆØ�)ˆÜ˜˜1–ˆAØ�N‰N˜G B™K¨™N¨RÑ/Ö0ñ äˆz˜A‰~ˆØˆÞÜ˜A–Y�Ø˜‘s˜A‘g‘�Þ˜1˜qŸ5 $ q£'¨Q¡,¤'Ø"& q£'¨Q¡,£'Ø�Q‘’ñ	 ð
 �7˜2‘;‘ 2Ñ%ˆA÷ ˆaô ˜˜1–ˆAØ˜A‘w˜w q™zÑ)¨bÑ0ˆD�‹Gñ ä�‹I˜‰OˆØˆqƒyÜ�q˜‘s˜c™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Ð%Ð%rQ   c                 ó2  • U[         :”  a  [        XS5      $ [        US-  5      nX-  n[        U-  =p4SnX -  U-	  =pgU(       a(  Xe-  ocU-  o5S-  nXe-  odU-  oES-  nXg-  U-	  nU(       a  M(  X@-  U-	  nX4-   nUn	U(       a  Xˆ-  U-	  nUS-  nU(       a  M  X‰-	  $ )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   rG  rB   r   )ÚEXP_COSH_CUTOFFrS  rI   r   )
rê   rJ   rr   rø   rù   rú   ra   rò   rw   rÓ   s
             rN   Úexp_basecaserV  >  sÇ   € ð ŒoÓÜ! !¨1Ó-Ð-ÜˆD�#‰I‹€AØ�I€DÜ˜$‰Ð€BØ	€AØ‰c�d‰]Ð€AÞ
Ø	‰ˆ�q‘�˜q™&˜!Ø	‰ˆ�q‘�˜q™&˜!Ø‰T�d‰Nˆ÷ ˆ!ð ‰$�4‰€BØ
‰€AØ	€AÞ
Ø‰S�T‰MˆØ	ˆQ‰ˆ÷ ˆ!ð ‰6€MrQ   c                 óz   • U[         :”  a  [        XS5      u  p#X#-   X#-
  4$ [        X5      n[        X-   -  U-  nXE4$ )z 
Computation of exp(x), exp(-x)
r   )rU  rS  rV  r   )rê   rJ   ÚcoshÚsinhra   rb   s         rN   Úexp_expneg_basecaserZ  W  sK   € ð ŒoÓÜ'¨°Ó3‰
ˆØ‰y˜$™)Ð#Ð#Ü�QÓ€AÜ	�T‘YÑ	 AÑ%€AØˆ4€KrQ   c                 óô  • U[         :”  a  [        XS5      $ U[        -
  nX-	  n[        U5      nU[        ;  a:  US[         -   [        -
  -  n[        US[         -   S5      u  pgUS-	  US-	  4[        U'   [        U   u  pg[         U-
  nXh-  nXx-  nXU-  -  n [
        U-  n	U n
SnX -  U-	  * nU(       a0  XË-  oÉU-  o›S-  o¼U -  U-	  nXË-  oÊU-  o«S-  o¼U -  U-	  * nU(       a  M0  X–-  X§-  -
  U-	  X¦-  X—-  -   U-	  4$ )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_PRECrS  ÚCOS_SIN_CACHE_STEPrI   Úcos_sin_cacher   )rê   rJ   Úprecsr¯   r¼   ÚwÚcos_tÚsin_tÚoffsetr  r  rú   ra   s                rN   Úcos_sin_basecaserd  b  sB  € ð Ô Ó Ü! !¨1Ó-Ð-ØÔ%Ñ%€EØ	‰
€AÜˆA‹€AØ”ÓØ�Ô%Ñ%Ô&8Ñ8Ñ9ˆÜ)¨!¨RÔ0BÑ-BÀAÓF‰ˆØ! 2™I¨°©Ð3Œ�aÑÜ  Ñ#�L€EÜ $Ñ&€FØ	Ñ€EØ	Ñ€EØˆe‰�O€AÜ
�T‰/€CØ
€CØ	€AØ‰3�4‰-Ð€AÞ
Ø	‰ˆ˜‘� ™6˜1¨!©°¡} 1Ø	‰ˆ˜‘� ™6˜1¨A©#°$©Ð'7 1÷ ˆ!ð ‰Y�s‘yÑ  TÑ)¨c©i¸¹	Ñ.AÀdÑ-JÐKÐKrQ   c                 ó  • U u  p4pVU(       aÕ  Xe-   nUS-   nU(       a  U* nUS:”  a/  US:¼  a)  [        U[        SU-  5      -   5      n	[        X”U-  X5      $ Xx* :  a  [        [        X1U5      $ US:”  a@  X‡-   n
XZ-   nUS:¼  a  XK-  nOXK* -	  n[        U
5      n[        XÍ5      u  pì[        U5      nXÇ-  nOXX-   nUS:¼  a  XK-  nOXK* -	  nSn[        XÈ5      n[        XNU-
  X5      $ U(       d  [        $ U [        :X  a  [        $ U $ )Né   r;   r   g333333÷?r   )Úmpf_erI   r3   r7   r"   r   ÚdivmodrV  r   r&   r!   )rê   rJ   rW   rÕ   rÖ   r¾   r½   r  rX   ÚeÚwpmodrc  r¯   Úlg2r¼   s                  rN   r®   r®     s   € ØÑ€DˆsÞ
Ø‰hˆØ�B‰YˆÞØ�$ˆCà�#‹:˜# ›(ä�bœ˜T #™X›Ñ&Ó'ˆAÜ˜q s¡(¨DÓ6Ð6Ø�‹9Üœt T°Ó5Ð5à�‹7ð ‘HˆEØ‘[ˆFØ˜‹{Ø‘M‘à˜GÑ$�Ü˜EÓ"ˆCÜ˜!“>‰DˆAÜ�A“ˆAØ‰I‰Aà‘XˆFØ˜‹{Ø‘M‘à˜GÑ$�ØˆAÜ˜1Ó!ˆÜ˜C 2¡ tÓ1Ð1ÞÜˆØŒEƒzÜˆØ€HrQ   c                 ó  • U u  pEpgU(       dl  U(       ae  U(       a&  U [         :X  a  [        $ U [        :X  a  [        $ [        $ U [         :X  a  [         [         4$ U [        :X  a  [         [        4$ [        [        4$ Xg-   nUS-   n	US:  aB  X‰* :  a7  U(       a  [        U SU-
  X5      $ [        [        SX5      n
[        XX5      nX«4$ X˜* -  n	US:”  ah  SSUS-
  -  -  U	:”  aY  U(       a  [        [        [        /U   SU-
  X5      $ [        [        [        U 5      X5      S5      =pÍU(       a  [        U5      nXÍ4$ US:”  aC  X˜-   nXn-   nUS:¼  a  X_-  nOX_* -	  n[        U5      n[        UU5      u  nn[        U5      nUU-  nOXi-   nUS:¼  a  X_-  nOX_* -	  nSn[        UU	5      u  nnUUSU-  -	  -   n
UUSU-  -	  -
  nU(       a  U* nU(       a  X¹-  U
-  n[        XY* X5      $ [        U
UU	-
  S-
  X5      n
[        UUU	-
  S-
  X5      nX«4$ )	z4Simultaneously compute (cosh(x), sinh(x)) for real xrf  éüÿÿÿr   r   rF   r^   rD   rB   )r%   r"   r&   r#   r'   r7   r1   r®   r*   r,   r   rh  rI   rZ  r   )rê   rJ   rW   ÚtanhrÕ   rÖ   r¾   r½   r  rX   rX  rY  r¸   rw   rj  rc  r¯   rk  r¼   ra   rb   s                        rN   Úmpf_cosh_sinhro  ¬  s)  € àÑ€DˆsÞ–SÞØ”D‹y¤˜+Ø”E‹z¤%˜<ÜˆKØ”‹9œd¤D˜\Ð)Ø”‹:œt¤U˜mÐ+Ü”TˆzÐØ
‰&€CØ	ˆb‰€BØ
ˆRƒxà�‹9ÞÜ" 1 a¨¡f¨dÓ8Ð8Üœt Q¨Ó2ˆDÜ˜q¨Ó2ˆDØ�:Ðà
ˆt‰ˆà
ˆRƒxØˆa�#�a‘%‰j‰>˜BÓæÜ"¤D¬ <°Ñ#5°q¸±v¸tÓIÐIÜœg¤g¨a£j°$Ó<¸bÓAÐAˆAÞÜ˜A“J�Ø�4ˆKà
ˆQƒwØ‘ˆØ‘ˆØ�Q‹;Ø‘‰Aà˜Ñ ˆAÜ˜ÓˆÜ�a˜‹~‰ˆˆ1Ü�‹FˆØ	ˆc‰	‰à‘ˆØ�Q‹;Ø‘‰Aà˜Ñ ˆAØˆÜ˜q "Ó%�D€A€qà��A�a‘C‘‰>€DØ��A�a‘C‘‰>€DÞØˆuˆÞØ‰z˜dÑ"ˆÜ˜C  dÓ0Ð0ä˜D ! B¡$ q¡&¨$Ó4ˆÜ˜D ! B¡$ q¡&¨$Ó4ˆØˆzÐrQ   c                 ó>  • US:”  ay  Sn SU-  nX2-   U-   n[        US-
  5      nUS-	  nXa-   n	U	S:¼  a  X	-  n
OX	* -	  n
[        X§5      u  p¼XÈ:”  a  X|-
  nOUnXÓU-   S-
  -	  (       a  [        U5      nXÂ-	  n
Xb-
  nO"US-  nMv  X2* -  nX-   n	U	S:¼  a  X	-  n
OX	* -	  n
SnX«U4$ )Nr   r   r?   rF   )r›   rh  rI   )rÖ   r¾   r  rX   rî   Úcancellation_precrj  Úpi2Úpi4rc  r¯   r¼   r»   Úsmalls                 rN   Úmod_pi2ru  ï  sè   € à
ˆQƒwØˆØØ " a¡ÐØ‘HÐ0Ñ0ˆEÜ˜5 ™7Ó#ˆCØ˜‘(ˆCØ‘[ˆFØ˜‹{Ø‘M‘à˜GÑ$�Ü˜!“>‰DˆAØ‹wØ™‘à�Ø˜C™ ™×#Ü˜“F�Ø‘H�Ø‘[�ØØ�‰FˆAñ) ð, 	ˆt‰ˆØ‘ˆØ�Q‹;Ø‘‰Aà˜Ñ ˆAØˆØ�ˆ8€OrQ   c                 óŒ  • U u  pVpxU(       d?  U(       a  [         [         p©O[        [        p©US:X  a  Xš4$ US:X  a  U	$ US:X  a  U
$ US:X  a  U
$ X‡-   nUS-   nUS:  an  X¼* :  ah  U(       a  [        U [	        U5      5      n [        [        SX5      n	[        U SU-
  X5      n
US:X  a  Xš4$ US:X  a  U	$ US:X  a  U
$ US:X  a  [        XX5      $ U(       aÎ  US:¼  as  US:X  a%  [        n	[        [        4[        US-  5      U-     n
OUS:X  a  [        [        p©O[        [        p©US:X  a  Xš4$ US:X  a  U	$ US:X  a  U
$ US:X  a  [        X©X5      $ Xg* S-
  -	  S-   S-	  nXmU* S-
  -  -
  n[        U5      U-   nUS-   U-
  nX|-   nUS:¼  a  Xo-  nOXo* -	  nU[        U5      -  U-	  nO[        XgX¼5      u  npÜ[        UU5      u  pšUS-  nUS:X  a  U
* U	p©OUS:X  a  U	* U
* p©O	US:X  a  X©* p©U(       a  U
* n
US:X  a  [        Xœ* X5      n	[        X¬* X5      n
Xš4$ US:X  a  [        Xœ* X5      $ US:X  a  [        X¬* X5      $ US:X  a  [        X©X5      $ g)zz
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›   ru  rd  r   r   )rê   rJ   rW   ÚwhichÚpirÕ   rÖ   r¾   r½   r¸   rw   r  rX   r¼   Úmag2rc  r¯   re   s                     rN   Úmpf_cos_sinr{    s˜  € ð Ñ€DˆsÞÞÜœ‰qäœˆqØ�A‹:˜a˜d�{Ø�A‹:˜a�xØ�A‹:˜a�xØ�A‹:˜a�xà
‰(€CØ	�‰€Bð ˆQƒwØ�‹9ÞÜ˜Aœv b›zÓ*�ÜœD ! TÓ/ˆAÜ˜A˜q ™v tÓ1ˆAØ˜‹z ! $˜;Ø˜‹z !˜8Ø˜‹z !˜8Ø˜‹z¤+¨a°tÓ"AÐAÞ	Ø�"‹9Ø�b‹yÜ�Üœ5�M¤$ s¨Q¡w£-°$Ñ"6Ñ7‘Ø˜“Üœu‘1äœe�1Ø˜‹z ! $˜;Ø˜‹z !˜8Ø˜‹z !˜8Ø˜‹z¤'¨!°Ó":Ð:à�d˜1‘f‰o Ñ" qÑ(ˆØ˜C˜4 ™6‘]Ñ#ˆÜ˜‹}˜sÑ"ˆØ�B‰Y˜ÑˆØ‘ˆØ�Q‹;Ø‘‰Aà˜Ñ ˆAØŒx˜‹|‰^ Ñ"‰ä˜3 SÓ-‰ˆˆ1Ü˜A˜rÓ"�D€AØ	ˆA‰€AØ	
ˆa‹˜˜˜A‘AØ	
ˆa‹˜˜˜Q˜B‘AØ	
ˆa‹˜˜2�AÞØˆBˆØ�ƒzÜ˜˜C Ó+ˆÜ˜˜C Ó+ˆØˆtˆØ�ƒzÜ˜A˜s DÓ.Ð.Ø�ƒzÜ˜A˜s DÓ.Ð.Ø�ƒzÜ˜Q 4Ó-Ð-ð rQ   c                 ó   • [        XUS5      $ ©Nr   ©r{  ©rê   rJ   rW   s      rN   Úmpf_cosr€  b  ó   € ¬[¸À#ÀqÓ-IÐ&IrQ   c                 ó   • [        XUS5      $ )NrB   r~  r  s      rN   Úmpf_sinrƒ  c  r�  rQ   c                 ó   • [        XUS5      $ )Nr^   r~  r  s      rN   Úmpf_tanr…  d  r�  rQ   c                 ó   • [        XUSS5      $ )Nr   r   r~  r  s      rN   Úmpf_cos_sin_pir‡  e  s   € ´KÀÈÈaÐQRÓ4SÐ-SrQ   c                 ó   • [        XUSS5      $ r}  r~  r  s      rN   rC  rC  f  ó   € ´¸AÀSÈ!ÈQÓ0OÐ)OrQ   c                 ó   • [        XUSS5      $ )NrB   r   r~  r  s      rN   Ú
mpf_sin_pir‹  g  r‰  rQ   c                 ó    • [        XU5      S   $ ©Nr   ©ro  r  s      rN   Úmpf_coshr�  h  ó   € ¬m¸AÀSÓ.IÈ!Ñ.LÐ'LrQ   c                 ó    • [        XU5      S   $ r}  rŽ  r  s      rN   Úmpf_sinhr’  i  r�  rQ   c                 ó   • [        XUSS9$ )Nr   )rn  rŽ  r  s      rN   Úmpf_tanhr”  j  s   € ¬m¸AÀSÈqÑ.QÐ'QrQ   c                 óÎ   • Uc  [        US-
  5      n[        X5      u  p4[        U5      n[        XA5      u  pVUS-  nUS:X  a  XV4$ US:X  a  U* U4$ US:X  a  U* U* 4$ US:X  a  Xe* 4$ g )Nr   r^   r   rB   )r›   rh  rI   rd  )rê   rJ   rr  r¼   r¯   r¸   rw   re   s           rN   r  r  o  s€   € Ø
�{Ü�t˜A‘vÓˆÜ�!‹>�D€AÜˆA‹€AÜ˜AÓ$�D€AØ	ˆA‰€AØˆAƒv�a�dˆ{ØˆAƒv�q�b˜!�eˆ|ØˆAƒv�q�b˜1˜"�fˆ}ØˆAƒv�a˜�eˆ|€vrQ   c                 ó‚   • Uc  [        U5      n[        X5      u  p4[        U5      n[        XA5      nUS:¼  a  XS-  $ XS* -	  $ r�  )r   rh  rI   rV  )rê   rJ   rç   r¼   r¯   rY   s         rN   Ú	exp_fixedr—  {  sF   € Ø
�{Ü˜‹oˆÜ�!‹>�D€AÜˆA‹€AÜ�QÓ€AØˆAƒvØ‰vˆà�R‰yÐrQ   Úsagez)Warning: Sage imports in libelefun failed)F)FNr«   )r   )šrS   rn   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   rU  rI  r\  r]  r^  ræ   rã   r  rä   rþ   r  r&  r  r  rý   rú   r
  rT   r\   r_   rs   rx   r   r†   rŽ   r�   r�   r˜   r‘   r›   rž   r    r¢   r¥   rB  r¨   rg  Ú
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*  r7  r9  r<  r>  r@  rE  rS  rV  rZ  rd  r®   ro  ru  r{  r€  rƒ  r…  r‡  rC  r‹  r�  r’  r”  r  r—  Úsage.libs.mpmath.ext_libmpÚlibsÚmpmathÚ	ext_libmpÚ_lbmpÚImportErrorÚAttributeErrorr�   © rQ   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? Ë?LÌL