
    wgU                        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 ZdE ZdF ZefdGZedfdHZdI ZeddfdJZefdKZefdLZefdMZefdNZefdOZefdPZefdQZefdRZefdSZdZdTZdZdUZe
dVk(  r	 ddlmc mc mZ ejh                  Z4ej                  Zej                  Zqej                  Zej                  Zej                  Zgej"                  Zej                   Zej                  Zlyy# eef$ r  edW       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pythonX  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       [/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/mpmath/libmp/libelefun.pygzconstant_memo.<locals>.g^   sd    KK	9::)D.11d4il#w)&)
zzgdl++    )rG   rH   __name____doc__)rM   rO   s   ` rN   constant_memorS   U   s5     AKAJ, AJ		AI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    BY"I8]++FAAsHQKs;;rP   )r   rR   )rY   rM   s   ` rN   def_mpf_constantrZ   j   s      < AI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    1uz1q\1BAIr))8R!Q$Y**	
1qA!Q:.JBB!Q:.JBBb52b5="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    
 	D4K#b()Aq!Az*GAq!qS4K1Q3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      sQ     IA E1	SVjQiDDDE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     3T4@@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    
 14>>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     	sax1Q1Q1Q'(qD619"!GaK6&(?+uqy&1-sQh"1c57G<
B"357G<
BrErErEBrEMa7NrP   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).
    gv	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-Aq!W-GAq!v$'(E	&!F1H*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^    
 	saxA	
1qA!QZFB!QZFBb58R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HTXXd^#b()A!9DAqqS4K!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    
 	BJD8af%&'T/:A7NrP   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GIfRj!4b946BBrP   c                 ,    t        t        |       |       S N)r   r   r|   s    rN   sqrtpi_fixedr   0  s    htnd++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   
 E4sE4sJKKqy1rEkT4Z8$DDrz19tXab"3'&)*.5 5AtS))"8AtBw"3'$)+/%s< <x47C8$cJJ 	47C A71a=$,,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  })zn-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?    	Av!ax	!B
CD1Xa[=(1,-HNAr2s
q5ABCB26MCB#I//CX~CL)cHn$FA r6M aC#g"Wq['#a2g,''=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)N2   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     s1   EAtag~&BQK ! EFEU
+ q!A#u-BB1ea",v561ac$hvo&*!A#1U7+++a/ H  b% a[!R'BE"1I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     gL<@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#sB;<<9K:1uAvKKq5LL1u6K61dC((74D#..S!B2v1:C$D.,@(A!Ar	a[1b%(AsE3'adAaD!A$!dC84D$6<<H1Q3J$q&!E 	2vaJEE	UB	AvSAA
e
CEY!U{"Q&%/DI#:I#:I
Iq%
6CS$c*AtQ] 2C88rP   c                     t        | d||      S )zcubic root of a positive numberr\   )r   )ru   rJ   rV   s      rN   mpf_cbrtr     s    q!T3''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=UT\**	B	;B-CQK"Q$Ka$qu,WXa["Q$/4r7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
!axq5S4[1_HqsO	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NANA
rTdNqSTM	Q  '4-A	
1QA	
:ag	%AMAMA
rTdNqSTM	Q  
$1a4 A	
1tA!QATNd"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    AY  q$w 
T/C
C%$!C% Aq5DB
A#$B
R%DB	
B	
AB	
2$A	A

a1f	Q
a1frTdN	Q  R%DB	BAaC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1k1-,-u:K(%KA	eOE
a%DQA	
dDA-.A
A#$B
R%DB	
B	
AB	
2$A	A

ad
	Q
ad
rTdN	Q  R%DB	B1A19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#sB :e|9Tk9Tk<==	B axLC	"-sD#>>
b&C#hG !|'	RK3&D'BqD/*DtnCx"%wrz3SAAq%s33,B Gr!IbM 1B3cBB 
_fS"R%0"5Yr]""Ac11#aO
|Xa_b))	Qy}_B3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   
 Q4!1Q4tA 1v~K:71:tS119K	1B	1BE	Re	$BE2&IaL1-M E]eVQY6RT%ZBqE"Q%(889WR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 )Nd   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{IIc1tBw<)'12IIc!fS$Y&'ECGE*+AG%& 
g"U(O B'SbyS &DG$$+'2+36B,1OPE !U4Z  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DLE	5z&&%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$/IAv	AA4iaddlqsd{;w$OPPB
Q$$,B
r'd	B	
AB	
RDA	A

a1f	Q
a1f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//9VD,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#sB:e|9Xas33:hq$44
(C
T"W}dC((td2g~1afdC00	SX	B
axAr"

BAB	22rlAoq A%BB3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`   E4sE4s:!t){a$$$uT5M!Dy c!2B779VD,s2C%DbIJJyQl36GHII9K9L:$$$:Lc*B//GAq$q&)462Dvd1f~tT377tT3''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#sB	#vzae},CDD	B1AhwtQ3R8"=A1bAXa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#sB	Cx!|T5M! GHH:$$$	B1Aq"%r*A74B',AXa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#sB
b&C
Rx"9q!D&$44
t 	Ab126A
Ar"Awq$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ub126A71a$dC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#sBSHDEE
s(C
Qw!8q%=&&DEE	B
Rx"9q$c22
t4AaAWWQ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#sB:Ks2v;D
ax"9.DOT377	r	BA	!Q+A1bA1bA1bA1bA1dC 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   }nt        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     	1uBCc	MAA;DAtaxA3q$<E	B519A
R-C19C!!A#"Qe]R1Q3'MA272AFA1Q3'MA272AFA2"A  e]R#AR#AD$JA#"Q)1 	1ANNGBKNR/0	1zA~AY qsAg1q5$q'Q,'"&q'Q,'Q	
 72;2%A  1 	1AAwwqz)b0DG	1IOqyqsc2g'AAAA 	A1A	Ez
 A 	(AA#&C'A	( sCGqs?+,A5AuH%%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!!T1--D#IAAID$B	Acd]A
	aq!q&!	aq!q&!rTdN  Q$4B
RA	A
qSTM	Q  6MrP   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Dy$t)##QA	T$Y	A%Aa4KrP   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      !!T1--%%E	U
AAA%%&889)!R0B-BAFu!2I3a #LE5$&F	fE	fEeOA
T/C
C	AQ34-A
	a161!}1	a161!A#$'71  Ys5y T)c%iE	.Ad-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#sB
3hBY$C#:#(bT#X&'Aq#s(D#66"9tT4557 HE5[F{6MVG$E"C!S>DAqAA#IA2XF{6MVG$A1b!C2tS11Ez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#sBSDy+Ez%<K9dD\):tUm+Tz
b&C	bB
Rx"9"1afdC88tQc2Dq$c2D:
t
Rxa#a%j>B"D<#5qvtSIIggaj$<bAAAAJa4K
QwSuQ;vA Aa~1F	c	rQ;vA Aq"%DAqAaC>DAaC>Durzd"C"dC00D!B$q&$4D!B$q&$4Tz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   
Qw "aH00E57#C(CS[F{6MVG$!S>DAq3waC#FHS[FA) , 	trQ;vA Aa8OrP   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#sBqAqAA:ad{A:axA:axA:ax
s(C	B Qw"9Avbz*D!T3/AAqvtS1Az!Q$;z!8z!8z+atS"AA	"9by5M$sQw-$"67u1e1z!Q$;z!8z!8z'!Qc"::sd1fo"q(QC46]#}s"BYrQ;vA Ax|^"3S"-1bAr"DAq	AA	
aAA	
aQBA	
aA2ABzRCs+RCs+!tzAsD#..zAsD#..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aQR4S-SrP   c                      t        | ||dd      S r{  r|  r}  s      rN   rA  rA  f      AtS!Q0O)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      mAtS.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    mAtSq.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    
{tAv!S>DAqAAAt$DAq	AAAvad{Avqb!e|Avqb1"f}Ava!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>DAqAAQAAvAvaRy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     s5  	    G G             hOO  h          r7 	8O,Q.	/ BAQT/2256QqSAAB*"
'   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%1X!$+(C
 %  +F ) !(F % 	0 % 0 & %" & 1 & @*  * 8I&V2	L: $ *Z  * @F!H (qU M.^ $ I# I# I * S& O& O$ L$ L$ Q

	 f;22>>----------OO	++++  ( ;9:;s   A=K K-,K-