o
    "`                     @   sh   d dl mZ ddlZddlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ G dd	 d	eZdS )
   )StandardBaseContext    N)math2)function_docs)mpf_bernoullito_float	int_types)libmpc                   @   s  e Zd ZdZdd Zdd ZejZdd Zdd	 Z	d
d Z
dd ZdZeee	Zee
eZdZdZejZejZejZejZdZedd Zdd ZejZej Z ej!Z!dZ"dZ#dZ$dZ%dZ&dZ!dZ'dZ(dZ)dZ*e+ Z,Z-d d! Z.d"d# Z/d$d% Z0d&d' Z1d(d) Z2e3Z4e5Z6d*d+ Z7e8ej9Z:e8ej;Z;e8ej<Z<e8ej= Z>Z=e8ej?Z?e8ej@Z@e8ejAZAe8ejBZBe8ejCZCe8ejDZDe8ejEZEe8ejFZFe8ejGZGe8ejHZHe8ejIZIe8ejJZJe8ejK ZLZKe8ejMZMe8ejNZNe8ejOZOe8ejPZPe8ejQZQe8ejRZSe8ejTZUe8ejVZWe8ejX ZYZZd,d- Z[d.d/ Z\d0d1 Z]e^j_Z_e^j`Z`d2d3 Zad4d5 Zbd6d7 Zcd8d9 Zdd:d; Zed<d= ZfdOd?d@ZgdAdB ZhdCdD Zie8ejjZjdEdF ZkelZmdGdH ZndIdJ Zoe8ejpZqe8ejrZsdPdLdMZtdNS )Q	FPContextz
    Context for fast low-precision arithmetic (53-bit precision, giving at most
    about 15-digit accuracy), using Python's builtin float and complex.
    c                 C   s*   t |  tj| _i | _d| _|   d S )NF)r   __init__r   Zloggamma_bernoulli_cacheZprettyZ_init_aliasesctx r   //usr/lib/python3/dist-packages/mpmath/ctx_fp.pyr      s
   
zFPContext.__init__c                 C   s   t |d |d  S Nr   r   )float)clsxr   r   r   <lambda>       zFPContext.<lambda>c                 C      dS )N5   r   r   r   r   r   	_get_prec        zFPContext._get_precc                 C      d S Nr   r   pr   r   r   	_set_prec!   r   zFPContext._set_precc                 C   r   )N   r   r   r   r   r   _get_dps"   r   zFPContext._get_dpsc                 C   r   r   r   r   r   r   r   _set_dps#   r   zFPContext._set_dpsT              ?y              ?c                    s8   |r	 fdd}n }t j| j|_t| || d S )Nc                    s.   | j   fdd|D }| g|R i |S )Nc                    s   g | ]} |qS r   r   ).0aconvertr   r   
<listcomp>8   r   z>FPContext._wrap_specfun.<locals>.f_wrapped.<locals>.<listcomp>r'   )r   argskwargsfr'   r   	f_wrapped6   s   z*FPContext._wrap_specfun.<locals>.f_wrapped)r   __dict__get__doc__setattr)r   namer-   wrapr.   r   r,   r   _wrap_specfun3   s
   zFPContext._wrap_specfunc                 C   s6   | j }||v r|| S tt|dddd||< || S )Nr   nT)strict)r   r   r   )r   r6   cacher   r   r   	bernoulli?   s
   zFPContext.bernoullig;f?gw@gw?g9B.?gUk@gox?g]O?gm<B{@g!;?gs/O҄?c                 C   s   || dkS )Nr#   r   r   r   r   r   r   
is_specialV      zFPContext.is_specialc                 C   s   ||kS r   r   r:   r   r   r   isnanY   s   zFPContext.isnanc                 C   s   t |tjkS r   )absr   INFr:   r   r   r   isinf\   s   zFPContext.isinfc                 C   s   |r|| dkS dS )Nr#   Fr   r:   r   r   r   isnormal_   s   zFPContext.isnormalc                 C   s0   t |tu r|jrdS |j}|dkot||kS )NFr#   )typecompleximagrealroundr:   r   r   r   isnpintd   s
   zFPContext.isnpintc                 C   s   zt |W S    t| Y S r   )r   rC   r:   r   r   r   r(   n   s   
zFPContext.convertc                 C   s   t |}t|j|jS r   )rC   mathatan2rD   rE   r   zr   r   r   arg   s   zFPContext.argc                 C   s   |  | j| S r   )expjr:   r   r   r   expj      zFPContext.expjc                 C   s   |  | j| j | S r   )rM   rN   pir:   r   r   r   expjpi   s   zFPContext.expjpic                 C   s   |r|  t|d S | jS )Nr   )frexpr>   ninfrJ   r   r   r   mag   s   zFPContext.magc                 C   s6   t |dr|jr
dS |j}z|t|kW S    Y dS )NrD   F)hasattrrD   rE   intrJ   r   r   r   isint   s   
zFPContext.isintc                 C   sF   t |drt|j}nt|}||kr|| jfS || t|| fS )NrD   )rV   rF   rE   rT   rU   r>   )r   rK   r6   r   r   r   nint_distance   s   

zFPContext.nint_distancec                 C   s\   t |tu r|\}}| || dfS t|drt|j}nt|}||kr*|dfS |dfS )NRrD   Z)rB   tuplempfrV   rW   rE   )r   rK   r   qZintzr   r   r   _convert_param   s   
zFPContext._convert_paramc                 C   s   t |tp	t |tS r   )
isinstancer   r   rJ   r   r   r   _is_real_type   s   zFPContext._is_real_typec                 C   s
   t |tS r   )r`   rC   rJ   r   r   r   _is_complex_type   s   
zFPContext._is_complex_typep  c                 K   s   t |}t|}t||| }	| j}
d }}d}	 |D ]
}||| | 9 }q|	D ]
}||| |  }q(|d7 }|| }||9 }||7 }t||
k rK|S ||krR| jq)Nr$   r   r   )listrangeepsr>   NoConvergence)r   r   r^   typesZcoeffsrK   Zmaxtermsr+   ZnumZdenZtolstkir   r   r   hypsum   s    zFPContext.hypsumc                 C   s   t ||S r   )rH   rI   )r   r   yr   r   r   rI      r<   zFPContext.atan2c                 C   s@   t |}|dkr| |S d|d  | | | |d | S )Nr   r   )rW   digammafaczeta)r   mrK   r   r   r   psi   s   
&zFPContext.psic                 C   s2   |  |}|dks|dkr|S | |d | j S r   )r(   rp   eulerr:   r   r   r   harmonic   s   
zFPContext.harmonicc                 C   s   t t||S r   )rW   rH   ldexp)r   r   precr   r   r   to_fixed   rP   zFPContext.to_fixedc                 C   s   dd l }|  S )Nr   )random)r   rz   r   r   r   rand   s   zFPContext.randr   c                 C   sP   | j }d}| D ]}||7 }|| s!|r!t|dt| kr! |S |d7 }q|S )Nr   gC]r2<r   )zeror>   )r   ZtermsZ
check_stepri   rk   Ztermr   r   r   sum_accurately   s   

zFPContext.sum_accuratelyN)rc   )r   )u__name__
__module____qualname__r1   r   Z_mpqr	   rg   r   r   r!   r"   Z_fixed_precisionpropertyrx   Zdpsr|   Zoner   ZEPSrf   r?   infZNINFrT   ZNANnanrN   classmethodr5   r9   rQ   eru   Zsqrt2Zsqrt5ZphiZln2Zln10catalanZkhinchinZaperyZglaisherr>   ZabsminZabsmaxr;   r=   r@   rA   rG   r   r]   rC   Zmpcr(   staticmethodpowZpowerZsqrtrM   logZlnZcosZsinZtanZcos_sinZacosZasinZatanZcoshZsinhZtanhZgammaZrgammaZ	factorialrq   ZfloorZceilZcospiZsinpiZcbrtZnthrootZ_nthrootZeiZ_eiZe1Z_e1rr   Z_zetaZ	_zeta_intrL   rO   rR   rH   rw   rS   rU   rX   rY   r_   ra   rb   rm   rI   rt   rp   rv   strZnstrry   r{   ZerfZ_erfZerfcZ_erfcr}   r   r   r   r   r
      s    



























	



r
   )Zctx_baser   rH   Zcmath r   r   r	   r   r   r   r
   r   r   r   r   <module>   s    