Ë
    täiÝ¯  ã            
       ó¢  — d Z dZddlZddlmZ ddlZda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 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! edk(  rd	„ Z"nd
„ Z"d„ Z# G d„ de$«      Z%	 e&  e&d«      Z( e&d«      Z) e&d«      Z* e&d«      Z+ e&d«      Z,e,Z-d„ Z.d„ Z/d„ Z0de	ddfZ1de	ddfZ2de
ddfZ3de
ddfZ4de
ddfZ5deddfZ6de
ddfZ7de	ddfZ8de	ddfZ9de	ddfZ:dZ;d„ Z< G d „ d!«      Z=dg e>dd"«      D � cg c]  } e
| dz
  z  dz
  ‘Œ c} z   Z? e=«       e?gZ@e)d#e*d$e,d%e+d&iZAd'„ ZBd(„ ZC	 eDeEfZFd)„ ZGd*„ ZHed+k(  r"d, eIe«      v rej”                  ZBej”                  ZCedk(  rej–                  xZBZCereGZKeHZLneBZKeCZLde-fd-„ZM eNd.„  e>d/d0«      D «       «      ZOed+k(  rd1 eIe«      v rej                   ZMedk(  rejš                  ZMde-fd2„ZQd3„ ZRdhd4„ZSd5„ ZTde-fd6„ZUde-fd7„ZVde-fd8„ZWde-fd9„ZXd:e-fd;„ZYd<e-fd=„ZZde-fd>„Z[d?e-fd@„Z\e-fdA„Z]dB„ Z^dC„ Z_dD„ Z`dE„ ZadF„ ZbdG„ ZcdH„ ZddI„ ZedJ„ ZfdK„ ZgdL„ Zhde-fdM„Zide-fdN„Zjde-fdO„ZkdP„ Zlde-dfdQ„Zmde-fdR„Znde-d?fdS„Zode-fdT„Zpe-fdU„Zqde-fdV„Zre-fdW„Zsed+k(  repZteqZunerZtesZudX„ ZvdY„ Zwe-fdZ„Zxe-fd[„Zye-fd\„Zze,e+e+e,e)e*e*e)e(e(iZ{e,e,e+e+e)e*e*e)e(e(iZ|e-fd]„Z}d^„ Z~d_„ Z	 	 did`„Z€djda„Z�e9e9e:e8dbœZ‚e-fdc„Zƒdd„ Z„de„ Z…e-fdf„Z†e-fdg„Z‡edk(  rK	 ddlˆm‰c mŠc m‹ZŒ eŒjÚ                  ZmeŒjÜ                  ZneŒjè                  ZteŒjð                  ZxeŒ�j                  Z†yy# e'$ r d„ Z&Y �ŒÀw xY wc c} w # e'$ r eDfZFY �Œw xY w# e�$ r Y yw xY w)kzH
Low-level functions for arbitrary-precision floating-point arithmetic.
Ú	plaintexté    N)Úbisecté   )ÚMPZÚMPZ_TYPEÚMPZ_ZEROÚMPZ_ONEÚMPZ_TWOÚMPZ_FIVEÚBACKENDÚSTRICTÚHASH_MODULUSÚ	HASH_BITSÚgmpyÚsageÚ
sage_utils)Úgiant_stepsÚ
trailtableÚbctableÚlshiftÚrshiftÚbitcountÚtrailingÚ
sqrt_fixedÚnumeralÚisqrtÚ
isqrt_fastÚsqrtremÚbin_to_radixr   c                 ó.   — | \  }}}}|t        |«      ||fS ©N©Úhex©ÚxÚsignÚmanÚexpÚbcs        úb/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/mpmath/libmp/libmpf.pyÚto_pickabler+      s#   € ØÑˆˆc�3˜Ø”S˜“X˜s BÐ&Ð&ó    c                 ó4   — | \  }}}}|t        |«      dd  ||fS )Né   r"   r$   s        r*   r+   r+   #   s)   € ØÑˆˆc�3˜Ø”S˜“X˜a˜b�\ 3¨Ð*Ð*r,   c                 ó0   — | \  }}}}|t        |d«      ||fS )Né   )r   r$   s        r*   Úfrom_pickabler1   '   s%   € ØÑ€Dˆ#ˆs�BØ”#�c˜2“,  RÐ(Ð(r,   c                   ó   — e Zd Zy)ÚComplexResultN)Ú__name__Ú
__module__Ú__qualname__© r,   r*   r3   r3   +   s   „ Ør,   r3   c                 ó   — | S r!   r7   )r%   s    r*   Ú<lambda>r9   1   s   € ‘qr,   ÚnÚfÚcÚuÚdc           
      ó\   — t        dt        t        t        | «      dz  «      dz
  «      «      S )zZReturn number of accurate decimals that can be represented
    with a precision of n bits.r   çr£y	O“
@©ÚmaxÚintÚround©r:   s    r*   Úprec_to_dpsrF   ;   s*   € ô ˆq”#”eœC ›FÐ#5Ñ5Ó6°qÑ8Ó9Ó:Ð:r,   c           
      ó\   — t        dt        t        t        | «      dz   dz  «      «      «      S )zJReturn the number of bits required to represent n decimals
    accurately.r   r@   rA   rE   s    r*   Údps_to_precrH   @   s)   € ô ˆq”#”eœS ›V A™XÐ'9Ñ9Ó:Ó;Ó<Ð<r,   c                 ó.   — t        | «      }|dk(  ry|dz   S )z¡Return the number of decimal digits required to represent
    a number with n-bit precision so that it can be uniquely
    reconstructed from the representation.é   é   é   )rF   )r:   Údpss     r*   Úrepr_dpsrN   E   s    € ô �a‹.€CØ
ˆb‚yØØ�‰7€Nr,   rL   éÿÿÿÿi…ÿÿÿi8þÿÿéþÿÿÿiëüÿÿéýÿÿÿg      ðc                 óD  — |t         k(  rE| dk\  r1| |dz
  z	  }|dz  r|dz  s| t        |dk     |   z  r|dz	  dz   S |dz	  S t        |  ||«       S |t        k(  r| |z	  S |t        k(  r|  |z	   S |t
        k(  r| dk\  r| |z	  S |  |z	   S |t        k(  r| dk\  r|  |z	   S | |z	  S y )Nr   r   r.   é,  )Úround_nearestÚh_maskÚ	round_intÚround_floorÚround_ceilingÚ
round_downÚround_up)r%   r:   ÚrndÚts       r*   rV   rV   k   sà   € Ø
ŒmÒØ�Š6Ø�a˜‘c‘
ˆAØ�1Šu˜1˜qš5 a¬&°°3±©-¸Ñ*:Ò&:Ø˜1™˜a‘x�à˜!‘t�ä˜q˜b ! SÓ)Ð)Ð)Ø
ŒkÒØ�A‰vˆØ
ŒmÒØ�"˜‘ˆ|ÐØ
ŒjÒØ�Š6Ø˜‘6ˆMØ�"˜‘ˆ|ÐØ
Œh‚Ø�Š6Ø�b˜Q‘Y�<ÐØ�A‰vˆð r,   c                   ó   — e Zd Zd„ Zy)Ú
h_mask_bigc                 ó    — t         |dz
  z  dz
  S )Nr   )r	   )Úselfr:   s     r*   Ú__getitem__zh_mask_big.__getitem__…   s   € Ü˜!˜A™#‘ Ñ!Ð!r,   N)r4   r5   r6   ra   r7   r,   r*   r^   r^   „   s   „ ó"r,   r^   rS   )r   r   )r   r   )r   r   )r   r   c                 ó¬  — |st         S ||z
  }|dkD  r\|t        k(  r3||dz
  z	  }|dz  r |dz  s|t        |dk     |   z  r	|dz	  dz   }n|dz	  }nt        |   |    r||z  }n| |z	   }||z  }|}|dz  sUt        t        |dz  «         }|s/|dz  s|dz  }|dz  }|dz  }|dz  sŒt        t        |dz  «         }||z  }||z  }||z  }|dk(  rd}| |||fS )aœ  
    Create a raw mpf tuple with value (-1)**sign * man * 2**exp and
    normalized mantissa. The mantissa is rounded in the specified
    direction if its size exceeds the precision. Trailing zero bits
    are also stripped from the mantissa to ensure that the
    representation is canonical.

    Conditions on the input:
    * The input must represent a regular (finite) number
    * The sign bit must be 0 or 1
    * The mantissa must be positive
    * The exponent must be an integer
    * The bitcount must be exact

    If these conditions are not met, use from_man_exp, mpf_pos, or any
    of the conversion functions to create normalized raw mpf tuples.
    r   r   r.   rS   éÿ   é   ©ÚfzerorT   rU   Úshifts_downr   rC   ©r&   r'   r(   r)   Úprecr[   r:   r\   s           r*   Ú
_normalizerj   ™   s,  € ñ$ Üˆà
ˆT‰	€AØˆ1‚uØ”-ÒØ˜˜!™‘ˆAØ�1Šu˜1˜qš5 c¬F°1°S±5©M¸!Ñ,<Ò&<Ø˜!‘t˜Q‘h‘à˜‘d‘Ü˜Ñ˜dÒ#Ø�A‰I‰Cà�T˜A‘I�,ˆCØˆq‰ˆØˆà�Š7Ü”s˜3 ™9“~Ñ&ˆÙØ˜C’iØ˜‘	�Ø�q‘�Ø�a‘�ð ˜C“iô œ3˜s S™y›>Ñ*ˆAØ�‰	ˆØˆq‰ˆØ
ˆa‰ˆð
 ˆa‚xØˆØ��c˜2ÐÐr,   c                 ó¸  — |st         S ||k  r| |||fS ||z
  }|t        k(  r3||dz
  z	  }|dz  r |dz  s|t        |dk     |   z  r	|dz	  dz   }n|dz	  }nt        |   |    r||z  }n| |z	   }||z  }|}|dz  sUt        t        |dz  «         }|s/|dz  s|dz  }|dz  }|dz  }|dz  sŒt        t        |dz  «         }||z  }||z  }||z  }|dk(  rd}| |||fS )zSsame as normalize, but with the added condition that
       man is odd or zero
    r   r.   rS   rc   rd   re   rh   s           r*   Ú_normalize1rl   Ð   s;  € ñ ÜˆØ	ˆT‚zØ�S˜#˜rÐ!Ð!Ø
ˆT‰	€AØ
ŒmÒØ�A�a‘C‰LˆØˆqŠ5�q˜1’u #¬¨q°©u©°aÑ(8Ò"8Ø�a‘4˜‘(‰Cà�Q‘$‰CÜ	�SÑ	˜$Ò	Ø�‰	‰à�˜‘	ˆlˆØˆ1�H€CØ	€Bà�Š7Ü”s˜3 ™9“~Ñ&ˆÙØ˜C’iØ˜‘	�Ø�q‘�Ø�a‘�ð ˜C“iô œ3˜s S™y›>Ñ*ˆAØ�‰	ˆØˆq‰ˆØ
ˆa‰ˆð
 ˆa‚xØˆØ��c˜2ÐÐr,   c                 ó¶   — t        |«      t        k(  sJ ‚t        |«      t        v sJ ‚t        |«      t        v sJ ‚|t        |«      k(  sJ ‚t	        | |||||«      S )úzAdditional checks on the components of an mpf. Enable tests by setting
       the environment variable MPMATH_STRICT to Y.)Útyper   Ú
_exp_typesr   rj   ©r&   r'   r(   r)   ri   r[   s         r*   Ústrict_normalizerr   þ   sa   € ô �‹9œÒ Ð Ð Ü�‹8”zÑ!Ð!Ð!Ü�‹9œ
Ñ"Ð"Ð"Ø”˜#“ÒÐÐÜ�d˜C  b¨$°Ó4Ð4r,   c                 óÈ   — t        |«      t        k(  sJ ‚t        |«      t        v sJ ‚t        |«      t        v sJ ‚|t        |«      k(  sJ ‚|r|dz  sJ ‚t	        | |||||«      S )rn   r   )ro   r   rp   r   rl   rq   s         r*   Ústrict_normalize1rt     sp   € ô �‹9œÒ Ð Ð Ü�‹8”zÑ!Ð!Ð!Ü�‹9œ
Ñ"Ð"Ð"Ø”˜#“ÒÐÐÙ˜˜qšÐ!Ð!Ü�t˜S # r¨4°Ó5Ð5r,   r   Ú_mpmath_normalizec                 ó’  — t        | «      } d}| dk  rd}|  } | dk  rt        t        | «         }nt        | «      }|s|| st        S | dz  si| dz  r|| dz	  |dz   |dz
  fS t
        t        | dz  «         }|s/| dz  s| dz  } |dz  }|dz  }| dz  sŒt
        t        | dz  «         }| |z  } ||z  }||z  }|| ||fS t        || ||||«      S )z‚Create raw mpf from (man, exp) pair. The mantissa may be signed.
    If no precision is specified, the mantissa is stored exactly.r   r   é   r.   rc   rd   )r   r   rC   r   rf   r   Ú	normalize)r'   r(   ri   r[   r&   r)   r\   s          r*   Úfrom_man_expry   #  s
  € ô ˆc‹(€CØ€DØ
ˆQ‚wØˆØˆdˆØ
ˆT‚zÜ”S˜“XÑ‰ä�c‹]ˆÙÙÜˆLØ�QŠwØ�QŠwØ˜c Q™h¨¨a©°°a±Ð8Ð8Üœ3˜s S™y›>Ñ*ˆAÙØ š)Ø˜A‘I�CØ˜1‘H�CØ˜!‘G�Bð  ›)ô œs 3¨¡9›~Ñ.�Ø�A‰IˆCØ�1‰HˆCØ�!‰GˆBØ�c˜3 Ð#Ð#Ü�T˜3  R¨¨sÓ3Ð3r,   c              #   ó8   K  — | ]  }|t        |d «      f–— Œ y­w)r   N)ry   )Ú.0r:   s     r*   Ú	<genexpr>r|   B  s   è ø€ ÐB±/¨Q�!”\ ! QÓ'Ô(±/ùs   ‚iöÿÿÿi  Ú_mpmath_createc                 óD   — |s| t         v r	t         |    S t        | d||«      S )zcCreate a raw mpf from an integer. If no precision is specified,
    the mantissa is stored exactly.r   )Ú	int_cachery   )r:   ri   r[   s      r*   Úfrom_intr€   J  s)   € ñ Ø”	‰>Ü˜Q‘<ÐÜ˜˜1˜d CÓ(Ð(r,   c                 ó<   — | \  }}}}|s|rt        d|z  «      ‚||fS )z:Return (man, exp) of a raw mpf. Raise an error if inf/nan.z*mantissa and exponent are undefined for %s©Ú
ValueError©Úsr&   r'   r(   r)   s        r*   Ú
to_man_expr†   R  s/   € àÑ€Dˆ#ˆs�BÙ‘SÜÐEÈÑKÓLÐLØ�ˆ8€Or,   c                 ó²   — | \  }}}}|s|rt        d«      ‚|dk\  r|r| |z  S ||z  S |s|r|| z	   S || z	  S |rt        | | |«      S t        || |«      S )z³Convert a raw mpf to the nearest int. Rounding is done down by
    default (same as int(float) in Python), but can be changed. If the
    input is inf/nan, an exception is raised.z cannot convert inf or nan to intr   )rƒ   rV   )r…   r[   r&   r'   r(   r)   s         r*   Úto_intrˆ   Y  s‹   € ð Ñ€Dˆ#ˆs�BÙ‘SÜÐ;Ó<Ð<Ø
ˆa‚xÙØ�D˜S‘=Ð Ø�c‰zÐáÙØ˜c˜T‘]Ð#Ð#à˜C˜4‘=Ð ÙÜ˜#˜ ˜t SÓ)Ð)ä˜˜s˜d CÓ(Ð(r,   c                 ó*  — | \  }}}}|s|r| S |dk\  r| S ||z   }|dk  r_|t         k(  r|rt        S t        S |t        k(  r|rt        S t        S |t
        k(  r"|dk  s	|t        k(  rt        S |rt        S t        S t        ‚t        | t        ||«      |«      S ©Nr   r   )
rX   rf   ÚfonerW   ÚfnonerT   r	   ÚNotImplementedErrorÚmpf_posÚmin)r…   r[   r&   r'   r(   r)   Úmags          r*   Úmpf_round_intr‘   o  sž   € ØÑ€Dˆ#ˆs�BÙ‘SØˆØ
ˆa‚xØˆØ
ˆb‰&€CØ
ˆQ‚wØ”-ÒÙœE�\Ü �[Ø”KÒÙœE�\Ü!�\Ø”MÒ!Ø�QŠw˜#¤š.´¨,Ùœe�|Ü"�{ä%Ð%Ü�1”c˜"˜c“l CÓ(Ð(r,   c                 óD   — t        | t        «      }|rt        |||«      }|S r!   )r‘   rW   rŽ   ©r…   ri   r[   Úvs       r*   Ú	mpf_floorr•   …  s$   € Ü�aœÓ%€AÙÜ�A�t˜SÓ!ˆØ€Hr,   c                 óD   — t        | t        «      }|rt        |||«      }|S r!   )r‘   rX   rŽ   r“   s       r*   Úmpf_ceilr—   ‹  ó$   € Ü�aœÓ'€AÙÜ�A�t˜SÓ!ˆØ€Hr,   c                 óD   — t        | t        «      }|rt        |||«      }|S r!   )r‘   rT   rŽ   r“   s       r*   Úmpf_nintrš   ‘  r˜   r,   c                 ó0   — t        | t        | «      ||«      S r!   )Úmpf_subr•   )r…   ri   r[   s      r*   Úmpf_fracr�   —  s   € Ü�1”i “l D¨#Ó.Ð.r,   é5   c                 ó"  — | | k7  rt         S 	 t        j                  | «      \  }}| t        k(  rt        S | t         k(  rt
        S t        t        |dz  «      |dz
  ||«      S #  | t        k(  rt        cY S | t         k(  rt
        cY S t         cY S xY w)zÆCreate a raw mpf from a Python float, rounding if necessary.
    If prec >= 53, the result is guaranteed to represent exactly the
    same number as the input. If prec is not specified, use prec=53.l          rž   )ÚfnanÚmathÚfrexpÚmath_float_infÚfinfÚfninfry   rC   )r%   ri   r[   ÚmÚes        r*   Ú
from_floatr¨   š  s…   € ð
 	ˆA‚vÜˆðÜ�z‰z˜!‹}‰ˆˆ1ð
 	ŒNÒ¤4˜KØŒ^ˆOÒ¤E˜\Üœ˜A˜u™I›¨¨"©¨d°CÓ8Ð8øðØ”Ò¤t¢Ø”�Ò¬¢ÜŠús   �A! Á!BÁ4BÂBéq   c                 ó\  — t        | «      }| |k(  rt        |||«      S ddl}|j                  | «      rG|j	                  | «      \  }}t        t        |j                  |d«      «      t        |dz
  «      ||«      S |j                  | «      rt        S |j                  | «      rt        S t        S )zÇCreate a raw mpf from a numpy float, rounding if necessary.
    If prec >= 113, the result is guaranteed to represent exactly the
    same number as the input. If prec is not specified, use prec=113.r   Nr©   )Úfloatr¨   ÚnumpyÚisfiniter¢   ry   rC   ÚldexpÚisposinfr¤   Úisneginfr¥   r    )r%   ri   r[   ÚyÚnpr¦   r§   s          r*   Úfrom_npfloatr³   ­  sŽ   € ô 	ˆa‹€AØˆA‚vÜ˜!˜T 3Ó'Ð'ÛØ	‡{�{�1„~Ø�x‰x˜‹{‰ˆˆ1ÜœC §¡¨¨CÓ 0Ó1´3°q¸±u³:¸tÀSÓIÐIØ	‡{�{�1„~œd�{Ø	‡{�{�1„~œe�|Ü€Kr,   c                 ó  — | j                  «       rt        S | j                  «       r| j                  «       rt        S t
        S |€(t        t        | j                  «       d   «      dz  «      }t        t        | «      ||«      S )z¤Create a raw mpf from a Decimal, rounding if necessary.
    If prec is not specified, use the equivalent bit precision
    of the number of significant digits in x.r   r@   )Úis_nanr    Úis_infiniteÚ	is_signedr¥   r¤   rC   ÚlenÚas_tupleÚfrom_strÚstr)r%   ri   r[   s      r*   Úfrom_Decimalr¼   ¼  sc   € ð 	‡x�x„zœ$�;Ø‡}�}„¨¯©¬œuÐ?¼4Ð?Ø€|Ü”3�q—z‘z“| A‘Ó'Ð(:Ñ:Ó;ˆÜ”C˜“F˜D #Ó&Ð&r,   Fc                 óF  — | \  }}}}|s6| t         k(  ry| t        k(  rt        S | t        k(  rt         S t        t        z  S |dkD  rt	        ||||d|«      \  }}}}|r| }	 t        j                  ||«      S # t        $ r! |r‚ ||z   dkD  r|r	t         cY S t        cY S Y yw xY w)a  
    Convert a raw mpf to a Python float. The result is exact if the
    bitcount of s is <= 53 and no underflow/overflow occurs.

    If the number is too large or too small to represent as a regular
    float, it will be converted to inf or 0.0. Setting strict=True
    forces an OverflowError to be raised instead.

    Warning: with a directed rounding mode, the correct nearest representable
    floating-point number in the specified direction might not be computed
    in case of overflow or (gradual) underflow.
    g        rž   r   )rf   r¤   r£   r¥   Ú
normalize1r¡   r®   ÚOverflowError)r…   Ústrictr[   r&   r'   r(   r)   s          r*   Úto_floatrÁ   Æ  s»   € ð Ñ€Dˆ#ˆs�BÙØ”Š:˜cØ”Š9œ^Ð+Ø”Š:œ~˜oÐ-ÜœnÑ,Ð,Ø	ˆB‚wÜ'¨¨c°3¸¸BÀÓDÑˆˆc�3˜ÙØˆdˆðÜ�z‰z˜#˜sÓ#Ð#øÜò 
ÙØà�‰8�aŠ<ÙÜ&�Ò&ä%Ò%áð
ús   Á A6 Á6B ÂB ÂB c                 óB   — t        t        | «      t        |«      ||«      S )zDCreate a raw mpf from a rational number p/q, round if
    necessary.)Úmpf_divr€   )ÚpÚqri   r[   s       r*   Úfrom_rationalrÆ   ë  s   € ô ”8˜A“;¤¨£¨T°3Ó7Ð7r,   c                 ón   — | \  }}}}|r| }|dk(  rt        d|z  «      ‚|dk\  r
|d|z  z  dfS |d| z  fS )z]Convert a raw mpf to a rational number. Return integers (p, q)
    such that s = p/q exactly.rO   z&cannot convert %s to a rational numberr   r   r‚   r„   s        r*   Úto_rationalrÈ   ð  s^   € ð Ñ€Dˆ#ˆs�BÙØˆdˆØ	ˆR‚xÜÐAÀCÑGÓHÐHØ
ˆa‚xØ�a˜‘f‰~˜qÐ Ð à�A˜˜‘Iˆ~Ðr,   c                 ób   — | \  }}}}||z   }|r|dk\  r| |z  S | | z	  S |dk\  r||z  S || z	  S )z.Convert a raw mpf to a fixed-point big integerr   r7   )r…   ri   r&   r'   r(   r)   Úoffsets          r*   Úto_fixedrË   ý  s[   € àÑ€Dˆ#ˆs�BØ�4‰Z€FÙØ�QŠ;  ¨Ñ/Ð/Ø!$ ¨6¨'Ñ2Ð2à�QŠ;˜s f™}Ð,Ø"¨ wÑ/Ð/r,   c                 óf   — t         sddl}|j                   a t        t        | «      |  | t        «      S )zQReturn a raw mpf chosen randomly from [0, 1), with prec bits
    in the mantissa.r   N)ÚgetrandbitsÚrandomry   rW   )ri   rÎ   s     r*   Úmpf_randrÏ     s-   € õ ÛØ×(Ñ(ˆÜœ DÓ)¨D¨5°$¼ÓDÐDr,   c                 óF   — | d   r|d   s| t         k(  s	|t         k(  ry| |k(  S )z‚Test equality of two raw mpfs. This is simply tuple comparison
    unless either number is nan, in which case the result is False.r   F)r    ©r…   r\   s     r*   Úmpf_eqrÒ     s*   € ð ˆQŠ4�q˜’tØ”Š9˜œTš	ØØ�‰6€Mr,   c                 ó  — t         j                  dk\  rÄ| \  }}}}|sj| t        k(  rt         j                  j                  S | t
        k(  rt         j                  j                  S | t        k(  rt         j                  j                   S |t        z  }|dk\  r
|t        z  }nt        dz
  d|z
  t        z  z
  }||z  t        z  }|r| }|dk(  rd}t        |«      S 	 t        t        | d¬«      «      S # t        $ r t        | «      cY S w xY w)N)rL   r.   r   r   rO   rP   )rÀ   )ÚsysÚversion_infor    Ú	hash_infoÚnanr¤   Úinfr¥   r   r   rC   ÚhashrÁ   r¿   )r…   ÚssignÚsmanÚsexpÚsbcÚhs         r*   Úmpf_hashrß   !  sö   € ä
×Ñ˜6Ò!Ø!"Ñˆˆt�T˜3ñ Ø”DŠy¤§¡×!2Ñ!2Ð2Ø”DŠy¤§¡×!2Ñ!2Ð2Ø”EŠz¤3§=¡=×#4Ñ#4Ð"4Ð4Ø”<ÑˆØ�1Š9Øœ)Ñ#‰Dä˜q‘= R¨$¡Y´)Ñ$;Ñ<ˆDØ�$‰Yœ,Ñ&ˆÙ�q�b�!Ø�Š7˜�AÜ�1‹vˆð	äœ ¨1Ô-Ó.Ð.øÜò 	ô ˜“7ŠNð		ús   ÃC/ Ã/DÄDc                 ó~  — | \  }}}}|\  }}}}	|r|sN| t         k(  rt        |«       S |t         k(  rt        | «      S | |k(  ry|t        k(  ry| t        k(  ry|t        k(  ryy||k7  r|syy||k(  r||k(  ry||kD  r|ryy|ryy||z   }
|	|z   }|r|
|k  ry|
|kD  ry|
|k  ry|
|kD  ryt        | |dt        «      }|d   ryy)z€Compare the raw mpfs s and t. Return -1 if s < t, 0 if s == t,
    and 1 if s > t. (Same convention as Python's cmp() function.)r   r   rO   é   )rf   Úmpf_signr    r¤   r¥   rœ   rW   )r…   r\   rÚ   rÛ   rÜ   rÝ   ÚtsignÚtmanÚtexpÚtbcÚaÚbÚdeltas                r*   Úmpf_cmprê   >  s  € ð Ñ€Eˆ4��sØÑ€Eˆ4��sñ ‘tØ”Š:œx¨›{˜lÐ*Ø”Š:œh q›kÐ)Ø�Š6˜!à”Š9˜QØ”Š9˜QØ”Š:˜aØà�‚~Ù˜QØàˆt‚|Ø�4Š<ØØ�$Š;Ù˜RØá˜QØð 	ˆd‰
€AØˆd‰
€AÙØˆqŠ5˜ØˆqŠ5˜àˆqŠ5˜ØˆqŠ5˜ô �A�q˜!œ[Ó)€EØˆQ‚xØØr,   c                 óF   — | t         k(  s	|t         k(  ryt        | |«      dk  S ©NFr   ©r    rê   rÑ   s     r*   Úmpf_ltrî   r  ó#   € ØŒD‚y�Aœ’IØÜ�1�a‹=˜1ÑÐr,   c                 óF   — | t         k(  s	|t         k(  ryt        | |«      dk  S rì   rí   rÑ   s     r*   Úmpf_lerñ   w  ó#   € ØŒD‚y�Aœ’IØÜ�1�a‹=˜AÑÐr,   c                 óF   — | t         k(  s	|t         k(  ryt        | |«      dkD  S rì   rí   rÑ   s     r*   Úmpf_gtrô   |  rï   r,   c                 óF   — | t         k(  s	|t         k(  ryt        | |«      dk\  S rì   rí   rÑ   s     r*   Úmpf_gerö   �  rò   r,   c                 óf   — | d   x}}| dd  D ]  }t        ||«      r|}t        ||«      sŒ|}Œ! ||fS rŠ   )rî   rô   )Úseqr�   rB   r%   s       r*   Úmpf_min_maxrù   †  sE   € Ø�A‘Ð€Cˆ#Ø��‹WˆÜ�!�SŒ> ˜3Ü�!�S�> ™3ð ð �ˆ8€Or,   c                 óD   — |r| \  }}}}|s|r| S t        ||||||«      S | S )zPCalculate 0+s for a raw mpf (i.e., just round s to the specified
    precision).)r¾   ©r…   ri   r[   r&   r'   r(   r)   s          r*   rŽ   rŽ   �  s9   € ñ ØÑˆˆc�3˜Ù™ØˆHÜ˜$  S¨"¨d°CÓ8Ð8Ø€Hr,   c                 ó”   — | \  }}}}|s"|r| t         k(  rt        S | t        k(  rt         S | S |s	d|z
  |||fS t        d|z
  |||||«      S )z“Negate a raw mpf (return -s), rounding the result to the
    specified precision. The prec argument can be omitted to do the
    operation exactly.r   )r¤   r¥   r¾   rû   s          r*   Úmpf_negrý   —  sb   € ð Ñ€Dˆ#ˆs�BÙÙØ”DŠy¤˜,Ø”EŠz¤$˜;ØˆÙØ�$‘˜˜S "Ð%Ð%Ü�a˜‘f˜c 3¨¨D°#Ó6Ð6r,   c                 ór   — | \  }}}}|s|r| t         k(  rt        S | S |s
|rd|||fS | S t        d|||||«      S )z‰Return abs(s) of the raw mpf s, rounded to the specified
    precision. The prec argument can be omitted to generate an
    exact result.r   )r¥   r¤   r¾   rû   s          r*   Úmpf_absrÿ   ¥  sW   € ð Ñ€Dˆ#ˆs�BÙ‘SØ”Š:ÜˆKØˆÙÙØ�s˜C Ð$Ð$ØˆÜ�a˜˜c 2 t¨SÓ1Ð1r,   c                 óH   — | \  }}}}|s| t         k(  ry| t        k(  ryyd|z  S )zˆReturn -1, 0, or 1 (as a Python int, not a raw mpf) depending on
    whether s is negative, zero, or positive. (Nan is taken to give 0.)r   rO   r   )r¤   r¥   r„   s        r*   râ   râ   ´  s4   € ð Ñ€Dˆ#ˆs�BÙØ”Š9˜QØ”Š:˜bØØ�4‰<Ðr,   c                 ó  — | \  }}}}|\  }	}
}}|	|z  }	|�r–|
�r“||z
  }|�rG|dkD  r�|dkD  rK|rI||z   |z
  |z
  }||dz   kD  r6|dz   }||z  }|	|k(  r|dz  }n|dz  }t        ||||z
  t        |«      ||«      S ||	k(  r	|
||z  z   }n |r	|
||z  z
  }n||z  |
z
  }|dk\  rd}n| }d}t        |«      }t        |||||xs ||«      S |dk  r |dk  rK|rI||z   |z
  |z
  }||dz   kD  r6|dz   }|
|z  }
||	k(  r|
dz  }
n|
dz  }
t        |	|
||z
  t        |
«      ||«      S ||	k(  r
||
| z  z   }n"|	r
||
| z  z
  }n	|
| z  |z
  }|dk\  rd}n| }d}t        |«      }t        |||||xs ||«      S ||	k(  r|
|z   }n|r|
|z
  }n||
z
  }|dk\  rd}n| }d}t        |«      }t        |||||xs ||«      S |rt        |«      }|s+|r| |k(  s|
s|s| S t        S |
rt        |	|
|||xs ||«      S |S |r|S |rt        |||||xs ||«      S | S )z×
    Add the two raw mpf values s and t.

    With prec=0, no rounding is performed. Note that this can
    produce a very large mantissa (potentially too large to fit
    in memory) if exponents are far apart.
    r   éd   é   r   iœÿÿÿ)r¾   r   rx   rý   r    )r…   r\   ri   r[   Ú_subrÚ   rÛ   rÜ   rÝ   rã   rä   rå   ræ   rÊ   ré   r'   r)   s                    r*   Úmpf_addr  ¾  sç  € ð Ñ€Eˆ4��sØÑ€Eˆ4��sØ	ˆT�M€Eâ’Ø˜‘ˆÚØ˜Šzà˜C’<¡DØ $™J¨Ñ,¨tÑ3�EØ˜t a™xÒ'Ø!%¨¡˜Ø ™˜Ø  Eš>¨4°1©9©4Ø+/°1©9¨4Ü)¨%°°t¸F±{Ü$ T›N¨D°#ó 7ð 7ð ˜E’>Ø $¨&¡.Ñ1‘Cñ  D¨D°F©NÑ$;™cØ%)¨V¡^°tÑ$;˜cØ˜a’xØ !™à"˜d˜Ø !˜Ü˜c“]�Ü! %¨¨d°B¸º
ÀÀCÓHÐHØ˜!’à˜D’=¡TØ $™J¨Ñ,¨tÑ3�EØ˜t a™xÒ'Ø!%¨¡˜Ø ™˜Ø  Eš>¨4°1©9©4Ø+/°1©9¨4Ü)¨%°°t¸F±{Ü$ T›N¨D°#ó 7ð 7ð ˜E’>Ø $¨6¨'¡/Ñ2‘Cñ  D¨D°V°G©OÑ$<™cØ%)¨f¨W¡_¸Ñ$<˜cØ˜a’xØ !™à"˜d˜Ø !˜Ü˜c“]�Ü! %¨¨d°B¸º
ÀÀCÓHÐHà�EŠ>Ø˜‘+‰Cá˜D 4™K‘cØ  4™K�cØ�aŠxØ‘à�d�Ø�Ü�c‹]ˆÜ˜  T¨2¨tªz°r¸3Ó?Ð?áÜ�A‹JˆÙÙØ�AŠv™¡TØ�ÜˆKÙÜ˜e T¨4°°d²k¸cÀ3ÓGÐGØˆÙØˆÙÜ˜%  t¨S°$²+¸#¸sÓCÐCØ€Hr,   c                 ó    — t        | |||d«      S )zxReturn the difference of two raw mpfs, s-t. This function is
    simply a wrapper of mpf_add that changes the sign of t.r   )r  )r…   r\   ri   r[   s       r*   rœ   rœ     s   € ô �1�a˜˜s AÓ&Ð&r,   c                 ój  — d}d}|dz  xs d}d}| D ]Ž  }|\  }	}
}}|
r^|	r|s|
 }
||z
  }||k\  r/||kD  r!|r|t        t        |«      «      z
  |kD  r|
}|}ŒC||
|z  z  }ŒL| }||z
  |kD  r|rŒZ|
|}}Œ_||z  |
z   }|}Œj|sŒm|rt        |«      }t        |xs t        |d«      }Œ� |r|S t        ||||«      S )a>  
    Sum a list of mpf values efficiently and accurately
    (typically no temporary roundoff occurs). If prec=0,
    the final result will not be rounded either.

    There may be roundoff error or cancellation if extremely
    large exponent differences occur.

    With absolute=True, sums the absolute values.
    r   r.   i@B Nr   )r   Úabsrÿ   r  rf   ry   )Úxsri   r[   Úabsoluter'   r(   Úmax_extra_precÚspecialr%   ÚxsignÚxmanÚxexpÚxbcré   s                 r*   Úmpf_sumr  "  s  € ð €CØ
€CØ˜!‘VÒ&˜w€NØ€GÛˆØ!"Ñˆˆt�T˜3ÙÙ™XØ�u�Ø˜3‘JˆEØ�sŠ{ð ˜NÒ*Ù %¬´°S³Ó(:Ñ":¸^Ò"KØ�CØ‘Cà˜D E™MÑ*‘Cà˜�à˜‘9˜~Ò-ÚØ#'¨˜S™à %™<¨4Ñ/�CØ‘CÚÙÜ˜A“J�Ü˜gÒ.¬°°1Ó5‰Gð7 ñ: ØˆÜ˜˜S $¨Ó,Ð,r,   c                 óP  — | \  }}}}|\  }}	}
}||z  }||	z  }|r)t        |«      }|rt        ||||
z   |||«      S ||||
z   |fS | xr |}|	 xr |
}|s|st        S t        | |fv rt        S |	s|
r|| }} |t        k(  rt        S t        t
        dœt        | «      t        |«      z     S )úMultiply two raw mpfs©r   rO   )r   r¾   rf   r    r¤   r¥   râ   ©r…   r\   ri   r[   rÚ   rÛ   rÜ   rÝ   rã   rä   rå   ræ   r&   r'   r)   Ú	s_specialÚ	t_specials                    r*   Úgmpy_mpf_mulr  R  sÑ   € àÑ€Eˆ4��sØÑ€Eˆ4��sØ�5‰=€DØ
ˆt‰)€CÙ
Ü�c‹]ˆÙÜ˜d C¨¨d©°B¸¸cÓBÐBà˜#˜t D™y¨"Ð-Ð-Ø�Ò#˜t€IØ�Ò#˜t€IÙ™YÜˆÜ��1ˆv�~œd�{Ù‘d 1 a˜q˜AØŒE‚zœ$�;Ü”uÑœh q›k¬H°Q«KÑ7Ñ8Ð8r,   c                 ó¨   — | \  }}}}|st        | t        |«      ||«      S |st        S |dk  r|dz  }| }||z  }t        |||t	        |«      ||«      S )úMultiply by a Python integer.r   r   )Úmpf_mulr€   rf   rx   r   ©r…   r:   ri   r[   r&   r'   r(   r)   s           r*   Úgmpy_mpf_mul_intr  g  si   € àÑ€Dˆ#ˆs�BÙÜ�qœ( 1›+ t¨SÓ1Ð1ÙÜˆØˆ1‚uØ�‰	ˆØˆBˆØˆ1�H€CÜ�T˜3 ¤X¨c£]°D¸#Ó>Ð>r,   c                 ól  — | \  }}}}|\  }}	}
}||z  }||	z  }|r7||z   dz
  }|t        ||z	  «      z  }|rt        ||||
z   |||«      S ||||
z   |fS | xr |}|	 xr |
}|s|st        S t        | |fv rt        S |	s|
r|| }} |t        k(  rt        S t        t
        dœt        | «      t        |«      z     S )r  r   r  )rC   r¾   rf   r    r¤   r¥   râ   r  s                    r*   Úpython_mpf_mulr  t  sç   € àÑ€Eˆ4��sØÑ€Eˆ4��sØ�5‰=€DØ
ˆt‰)€CÙ
Ø�3‰Y˜‰]ˆØ
Œc�#�r‘'‹lÑˆÙÜ˜d C¨¨d©°B¸¸cÓBÐBà˜#˜t D™y¨"Ð-Ð-Ø�Ò#˜t€IØ�Ò#˜t€IÙ™YÜˆÜ��1ˆv�~œd�{Ù‘d 1 a˜q˜AØŒE‚zœ$�;Ü”uÑœh q›k¬H°Q«KÑ7Ñ8Ð8r,   c                 ó  — | \  }}}}|st        | t        |«      ||«      S |st        S |dk  r|dz  }| }||z  }|dk  r|t        t	        |«         dz
  z  }n|t        |«      dz
  z  }|t	        ||z	  «      z  }t        ||||||«      S )r  r   r   rw   )r  r€   rf   r   rC   r   rx   r  s           r*   Úpython_mpf_mul_intr!  Š  s§   € àÑ€Dˆ#ˆs�BÙÜ�qœ( 1›+ t¨SÓ1Ð1ÙÜˆØˆ1‚uØ�‰	ˆØˆBˆØˆ1�H€Càˆ4‚xØ
Œg”c˜!“f‰o Ñ!Ñ!‰à
Œh�q‹k˜A‰oÑˆØŒ#ˆc�2‰g‹,Ñ€BÜ�T˜3  R¨¨sÓ3Ð3r,   c                 ó*   — | \  }}}}|s| S ||||z   |fS )z8Quickly multiply the raw mpf s by 2**n without rounding.r7   )r…   r:   r&   r'   r(   r)   s         r*   Ú	mpf_shiftr#  ¥  s+   € àÑ€Dˆ#ˆs�BÙØˆØ��c˜!‘e˜RÐÐr,   c                 ól   — | \  }}}}|s| t         k(  rt         dfS t        ‚t        | | |z
  «      ||z   fS )z?Convert x = y*2**n to (y, n) with abs(y) in [0.5, 1) if nonzeror   )rf   rƒ   r#  r$   s        r*   Ú	mpf_frexpr%  ¬  sF   € àÑ€Dˆ#ˆs�BÙØ”Š:Ü˜1�:ÐäÐÜ�Q˜˜˜C™Ó  " S¡&Ð(Ð(r,   c                 ó’  — | \  }}}}|\  }}	}
}|r|	s¨| t         k(  r$|t         k(  rt        ‚|t        k(  rt        S t         S |t         k(  rt        ‚| xr |}|	 xr |
}|r|rt        S | t        k(  s	|t        k(  rt        S |s4|t         k(  rt        S t        t        dœt        | «      t        |«      z     S t         S ||z  }|	dk(  rt        ||||
z
  |||«      S ||z
  |z   dz   }|dk  rd}t        ||z  |	«      \  }}|r,|dz  dz   }|dz  }t        ||||
z
  |z
  t        |«      ||«      S t        ||||
z
  |z
  t        |«      ||«      S )zFloating-point divisionr  r   rá   )
rf   ÚZeroDivisionErrorr    r¤   r¥   râ   r¾   Údivmodr   rx   )r…   r\   ri   r[   rÚ   rÛ   rÜ   rÝ   rã   rä   rå   ræ   r  r  r&   ÚextraÚquotÚrems                     r*   rÃ   rÃ   ¶  sr  € àÑ€Eˆ4��sØÑ€Eˆ4��sÙ‘tØ”Š:Ø”EŠzÔ!2Ð2Ø”DŠy¤˜+ÜˆLØ”Š:Ü#Ð#Ø�XÒ' 4ˆ	Ø�XÒ' 4ˆ	Ù™ÜˆKØ”Š9˜œTš	ÜˆKÙØ”EŠzÜ�ÜœuÑ%¤h¨q£k´H¸Q³KÑ&?Ñ@Ð@ÜˆØ�5‰=€DØˆq‚yÜ˜$  d¨4¡i°°d¸CÓ@Ð@ð �3‰J˜Ñ˜qÑ €EØˆq‚yØˆÜ�t˜U‘{ DÓ)�I€Dˆ#Ù
Ø�a‘˜1‰}ˆØ�‰
ˆÜ˜$  d¨4¡i°¡o´xÀ³~ÀtÈSÓQÐQÜ�T˜4  d¡¨5¡´(¸4³.À$ÈÓLÐLr,   c                 ó&  — |\  }}}}| r|st        t        | «      |||«      S | dk  r|dz  }|  } ||z   dz   }t        | |z  |«      \  }	}
|
r*|	dz  dz   }	|dz  }t        ||	| |z
  t	        |	«      ||«      S t        ||	| |z
  t	        |	«      ||«      S )z>Floating-point division n/t with a Python integer as numeratorr   r   rá   )rÃ   r€   r(  r¾   r   rx   )r:   r\   ri   r[   r&   r'   r(   r)   r)  r*  r+  s              r*   Úmpf_rdiv_intr-  Û  s¹   € àÑ€Dˆ#ˆs�BÙ‘CÜ”x “{ A t¨SÓ1Ð1Øˆ1‚uØ�‰	ˆØˆBˆØ�2‰I˜‰M€EÜ�q˜%‘x Ó%�I€Dˆ#Ù
Ø�a‘˜1‰}ˆØ�‰
ˆÜ˜$  s d¨5¡j´(¸4³.À$ÈÓLÐLÜ�T˜4 #  e¡¬X°d«^¸TÀ3ÓGÐGr,   c                 ó$  — | \  }}}}|\  }}	}
}|s|s|	s|
rt         S ||k(  r
|
||z   kD  r| S |	dk(  r||
|z   kD  rt        S t        ||
«      }d|z  |z  }d|z  |	z  }	|||z
  z  |	|
|z
  z  z  }|dk\  rd}n| }d}t        |||t	        |«      ||«      S )Nr   rO   r   )r    rf   r�   rx   r   )r…   r\   ri   r[   rÚ   rÛ   rÜ   rÝ   rã   rä   rå   ræ   Úbaser'   r&   s                  r*   Úmpf_modr0  ë  sÎ   € ØÑ€Eˆ4��sØÑ€Eˆ4��sÙ‘t¡d±Üˆà�‚~˜$  c¡š/Øˆð ˆq‚y�T˜D ™H’_ÜˆÜˆt�T‹?€DØ�‰;˜Ñ€DØ�‰;˜Ñ€DØ�D˜‘IÑ 4¨D°©IÑ#6Ñ
7€CØ
ˆa‚xØ‰àˆdˆØˆÜ�T˜3 ¤h¨s£m°T¸3Ó?Ð?r,   c                 óÎ  — | \  }}}}|sZ|rX| t         k(  r|dkD  r| S |dk(  rt        S t        S | t        k(  r(|dkD  rt         t        g|dz     S |dk(  rt        S t        S t        S t	        |«      }|dk(  rt
        S |dk(  rt        | ||«      S |dk(  rY| \  }}}}|st        S ||z  }|dk(  rdt        ||z   dfS ||z   dz
  }|t        t	        ||z	  «         z  }t        d|||z   |||«      S |dk(  rt        t
        | ||«      S |dk  r+t        | | |dz   t        |   «      }	t        t
        |	||«      S ||z  }
|dk(  r|
t        ||z  dfS ||z  dk  r!||z  }t        |
|||z  t        |«      ||«      S |t        k(  xs t        |   |
   }|dt        |«      z  z   dz   }t
        \  }}}}	 |dz  rV||z  }||z   }||dz
  z  }|t        t	        ||z	  «         z   }||kD  r|r	|||z
  z	  }n
| ||z
  z	   }|||z
  z  }|}|dz  }|snT||z  }||z   }||z   dz
  }|t        t	        ||z	  «         z   }||kD  r|r	|||z
  z	  }n
| ||z
  z	   }|||z
  z  }|}|dz  }Œ¯t!        |
|||||«      S )z=Compute s**n, where s is a raw mpf and n is a Python integer.r   r   r.   rO   rá   iè  r  )r¤   r    rf   r¥   rC   r‹   rŽ   r	   r   r¾   rÃ   Úmpf_pow_intÚreciprocal_rndr   rT   rg   rx   )r…   r:   ri   r[   r&   r'   r(   r)   Ú_ÚinverseÚresult_signÚrounds_downÚworkprecÚpmÚpeÚpbcs                   r*   r2  r2    s  € àÑ€Dˆ#ˆs�Bá‘SØ”Š9Ø�1Šu˜Q�hØ�AŠvœd�{ÜˆLØ”Š:Ø�1Šuœd¤E˜]¨1¨q©5Ñ1Ð1Ø�AŠvœd�{ÜˆLÜˆäˆA‹€AØˆA‚v”dˆ{ØˆA‚v”g˜a  sÓ+Ð+ØˆA‚vØ‰ˆˆ3��RÙÜˆLØ�#‰gˆØ�!Š8Ø”w  C¡¨Ð+Ð+Ø�"‰W�q‰[ˆØ
Œg”c˜#˜r™'“lÑ#Ñ#ˆÜ˜!˜S # c¡'¨2¨t°SÓ9Ð9ØˆB‚w”wœt Q¨¨cÓ2Ð2Øˆ1‚uÜ˜a !  T¨!¡V¬^¸CÑ-@ÓAˆÜ”t˜W d¨CÓ0Ð0à˜‘(€Kð ˆa‚xØœW c¨!¡e¨QÐ/Ð/Ø	ˆ!�tˆd‚{Ø�‰	ˆÜ˜+ s¨C°©E´8¸C³=À$ÈÓLÐLð œ-Ñ'ò &Ü�CÑ˜Ñ%ð ð �aœ ›‘mÑ# aÑ'€HÜ�N€A€rˆ2ˆsØ
ØˆqŠ5Ø�C‘ˆBØ�C‘ˆBØ�2˜‘6‰MˆCØœ¤ B¨#¡I£Ñ/Ñ/ˆCØ�XŠ~ÙØ  H¡Ñ-‘Bà˜C S¨¡\Ñ2Ð3�BØ�c˜H‘nÑ$�Ø�Ø�‰FˆAÙØØ�#‰gˆØ�#‰gˆØ�"‰W�q‰[ˆØ”'œ#˜c R™i›.Ñ)Ñ)ˆØ�Š=ÙØ˜b ™kÑ*‘à˜ 2 h¡;Ñ/Ð0�Ø�2˜‘=Ñ ˆCØˆBØ�‰Fˆð7 ô: �[ " b¨#¨t°SÓ9Ð9r,   c                 óæ   — |t         k(  rt        | ||«      S | \  }}}}|t        ||z   |z
  dz
  df}|r|t        t        fv |z  }	n|t
        t        fv |z  }	|	rt        | |||«      S t        | ||«      S )a  
    For nonzero x, calculate x + eps with directed rounding, where
    eps < prec relatively and eps has the given sign (0 for
    positive, 1 for negative).

    With rounding to nearest, this is taken to simply normalize
    x to the given precision.
    r   )rT   rŽ   r	   rY   rX   rZ   r  )
r%   Úeps_signri   r[   r&   r'   r(   r)   ÚepsÚaways
             r*   Úmpf_perturbr@  f  s‘   € ð ŒmÒÜ�q˜$ Ó$Ð$ØÑ€Dˆ#ˆs�BØ”W˜c "™f T™k¨!™m¨QÐ
/€CÙØœ
¤MÐ2Ð2°hÑ>‰àœ¤-Ð0Ð0°HÑ<ˆÙÜ�q˜#˜t SÓ)Ð)ä�q˜$ Ó$Ð$r,   c                 ó¤  — | d   rd}t        | «      } nd}| \  }}}}|syt        |t        j                  dd«      z  «      dz   }||z   }t	        |«      dkD  r€dd	lm}	m}
 t        t	        |«      «      d
z   }t        |«      }t        | |	|«      «      }t        | |
|«      |«      }t        |«      }t        | t        t        ||«      |«      } | \  }}}}|}nd}t        ||z
  |z
  d«      }t        |t        j                  dd«      z  dz   «      }t!        | |«      }t#        ||d|«      }t%        |d|¬«      }|t'        |«      |z
  dz
  z  }|||fS )a0  Helper function for representing the floating-point number s as
    a decimal with dps digits. Returns (sign, string, exponent) where
    sign is '' or '-', string is the digit string, and exponent is
    the decimal exponent as an int.

    If inexact, the decimal representation is rounded toward zero.r   Ú-Ú )rC  Ú0r   é
   r.   i¬  r   )Úmpf_ln2Úmpf_ln10rá   g      à?)r/  Úsize)rý   rC   r¡   Úlogr  Ú	libelefunrF  rG  r   r€   r  rÃ   rˆ   r2  ÚftenrB   rË   r   r   r¸   )r…   rM   r&   Ú_signr'   r(   r)   ÚbitprecÚ
exp_from_1rF  rG  ÚexpprecÚtmprè   ÚexponentÚfixprecÚfixdpsÚsfÚsdÚdigitss                       r*   Úto_digits_exprW  �  sh  € ð 	ˆ‚tØˆÜ�A‹J‰àˆØÑ€Eˆ3��RáØä�#œŸ™  A›Ñ&Ó'¨"Ñ,€Gð �r‘€JÜ
ˆ:ƒ˜Òß0ô œ3˜s›8Ó$ qÑ(ˆÜ�s‹mˆÜ�c™7 7Ó+Ó,ˆÜ�c™8 GÓ,¨gÓ6ˆÜ�3‹KˆÜ�A”{¤4¨¨GÓ4°gÓ>ˆØÑˆˆs�C˜Ø‰àˆô
 �'˜C‘- "Ñ$ aÓ(€GÜ�œ4Ÿ8™8 B q›>Ñ)¨CÑ/Ó0€FÜ	�!�WÓ	€BÜ	�b˜' 2 vÓ	.€BÜ�R˜b sÔ+€Fà”�F“˜fÑ$ qÑ(Ñ(€HØ�˜Ð!Ð!r,   c                 ój  — | d   s=| t         k(  r|rd}nd}|r|dz  }|S | t        k(  ry| t        k(  ry| t        k(  ryt        ‚|€t        |d	z   d
«      }|€|}t        | |d	z   «      \  }}}	|s|d   dv r|	dz  }	d}n÷t        |«      |kD  rt||   dv rm|d| }|dz
  }
|
dk\  r||
   dk(  r|
dz  }
|
dk\  r	||
   dk(  rŒ|
dk\  r-|d|
 t        t        ||
   «      dz   «      z   d||
z
  dz
  z  z   }ndd|dz
  z  z   }|	dz  }	n|d| }||	cxk  r|k  r5n n2|	dk  rdt        |	 «      z  |z   }d}n|	dz   }||kD  r|d||z
  z  z  }d}	nd}|d| dz   ||d z   }|r|j                  d«      }|d   dk(  r|dz  }|	dk(  r	|r|s||z   S |	dk\  r||z   dz   t        |	«      z   S |	dk  r||z   dz   t        |	«      z   S y)a{  
    Convert a raw mpf to a decimal floating-point literal with at
    most `dps` decimal digits in the mantissa (not counting extra zeros
    that may be inserted for visual purposes).

    The number will be printed in fixed-point format if the position
    of the leading digit is strictly between min_fixed
    (default = min(-dps/3,-5)) and max_fixed (default = dps).

    To force fixed-point format always, set min_fixed = -inf,
    max_fixed = +inf. To force floating-point format, set
    min_fixed >= max_fixed.

    The literal is formatted so that it can be parsed back to a number
    by to_str, float() or Decimal().
    r   z0.0z.0ze+0ú+infú-infr×   NrL   éûÿÿÿr   Ú56789Ú9rD  Ú1Ú.rO   ze+r§   )rf   r¤   r¥   r    rƒ   r�   rW  r¸   r»   rC   Úrstrip)r…   rM   Ústrip_zerosÚ	min_fixedÚ	max_fixedÚshow_zero_exponentr\   r&   rV  rQ  ÚiÚsplits               r*   Úto_strrg  µ  sW  € ð( ˆQŠ4Ø”Š:Ù˜‘AØ�AÙ!Ø�U‘
�ØˆHØ”Š9˜VØ”Š:˜fØ”Š9˜UÜÐàÐ¤c¨C°©F¨)°RÓ&8˜)ØÐ c˜)ô +¨1¨c°!©eÓ4Ñ€Dˆ&�(ñ Ø�!‰9˜ÑØ˜‰MˆHØ‰ô ˆv‹;˜Ò ¨¡°Ñ!7Ø˜D˜S�\ˆFØ�a‘ˆAØ�q’&˜V A™Y¨#Ò-Ø�Q‘�ð �q’&˜V A™Y¨#Ó-à�AŠvØ  ˜¤c¬#¨f°Q©i«.¸1Ñ*<Ó&=Ñ=ÀÀsÈQÁwÐQRÁ{Ñ@SÑS‘à˜s c¨A¡g™Ñ.�Ø˜A‘‘à˜D˜S�\ˆFð �xÔ+ )Õ+Ø˜!Š|Øœc 8 )›nÑ,°Ñ6�Ø‘à  1™�Ø˜3’;Ø˜c 5¨¡9™oÑ-�FØ‰HàˆEà˜˜%�. 3Ñ&¨°°¨Ñ7ˆáà—]‘] 3Ó'ˆFØ�b‰z˜SÒ Ø˜#‘�à�1‚}™Ñ%7ÀÀvÁÐ9MØ�1‚}˜T F™]¨TÑ1´C¸³MÑAÐAØ�!‚|˜D 6™M¨CÑ/´#°h³-Ñ?Ð?€|r,   c                 óˆ  — | j                  «       j                  d«      } t        | «       | j                  d«      }t	        |«      dk(  rd}n|d   } t        |d   «      }| j                  d«      }t	        |«      dk(  r,|d   |d   j                  d«      }}|t	        |«      z  }||z   } t        t        | |«      «      } | |fS )zHelper function for from_str.Úlr§   r   r   r_  r.   rD  )Úlowerr`  r«   rf  r¸   rC   r   )r%   r/  Úpartsr(   rç   rè   s         r*   Ústr_to_man_exprl  
  s³   € à	�‰‹	×Ñ˜Ó€Aä	ˆ!„Hà�G‰G�C‹L€EÜ
ˆ5ƒz�Q‚Ø‰à�!‰HˆÜ�%˜‘(‹mˆà�G‰G�C‹L€EÜ
ˆ5ƒz�Q‚Ø�Q‰x˜˜q™Ÿ™¨Ó-ˆ1ˆØŒs�1‹v‰ˆØ�‰EˆÜŒC��4‹LÓ€AØˆcˆ6€Mr,   )rØ   rY  rZ  r×   c           	      ó  — | j                  «       j                  «       } | t        v r	t        |    S d| v rV| j                  d«      \  }}|j	                  d«      |j	                  d«      }}t        t        |«      t        |«      ||«      S t        | d¬«      \  }}t        |«      dkD  r1t        ||dz   «      }t        |t        t        ||dz   «      ||«      }|S |dk\  rt        |d|z  z  ||«      }|S t        |d| z  ||«      }|S )aV  Create a raw mpf from a decimal literal, rounding in the
    specified direction if the input number cannot be represented
    exactly as a binary floating-point number with the given number of
    bits. The literal syntax accepted is the same as for Python
    floats.

    TODO: the rounding does not work properly for large exponents.
    Ú/ri  rE  ©r/  i�  r   )rj  ÚstripÚspecial_strrf  r`  rÆ   rC   rl  r  r€   r  r2  rK  )r%   ri   r[   rÄ   rÅ   r'   r(   r…   s           r*   rº   rº   !  s  € ð 	
�‰‹	�‰Ó€AØŒKÑÜ˜1‰~Ðà
ˆa�xØ�w‰w�s‹|‰ˆˆ1Ø�x‰x˜‹}˜aŸh™h s›mˆ1ˆÜœS ›V¤S¨£V¨T°3Ó7Ð7ä˜a bÔ)�H€Cˆô ˆ3ƒx�#‚~Ü�S˜$˜r™'Ó"ˆÜ�A”{¤4¨¨d°2©gÓ6¸¸cÓBˆð €Hð	 �!Š8Ü˜˜r 3™w™¨¨cÓ2ˆAð €Hô ˜c 2¨ t¡8¨T°3Ó7ˆAØ€Hr,   c                 óŽ   — t        | d¬«      \  }}t        |«      }d}|dk  r| }d}t        |«      }t        |||||t        «      S )Nr.   ro  r   r   )rl  r   r   rx   rW   )r%   r'   r(   r&   r)   s        r*   Ú	from_bstrrs  D  sQ   € Ü˜a aÔ(�H€CˆÜ
ˆc‹(€CØ€DØ
ˆQ‚wØˆdˆØˆÜ	�#‹€BÜ�T˜3  R¨¬[Ó9Ð9r,   c                 óZ   — | \  }}}}ddg|   t        |t        |«      d¬«      z   d|z  z   S )NrC  rB  r.   )rH  r/  ze%i)r   r   r$   s        r*   Úto_bstrru  N  s:   € ØÑ€Dˆ#ˆs�BØˆsˆ8�D‰>œG C¬h°s«mÀ!ÔDÑDÈÐPSÉÑTÐTr,   c                 óT  — | \  }}}}|rt        d«      ‚|s| S |dz  r|dz  }|dz  }|dz  }n|dk(  rt        |||dz  |||«      S t        dd|z  |z
  dz   «      }||dz  z  }|dv rt        ||z  «      }n t	        ||z  «      \  }}|r|dz  dz   }|dz  }t        |||z
  dz  ||«      S )zb
    Compute the square root of a nonnegative mpf value. The
    result is correctly rounded.
    z square root of a negative numberr   r.   r  Úfd)r3   r¾   rB   r   r   ry   )	r…   ri   r[   r&   r'   r(   r)   Úshiftr+  s	            r*   Úmpf_sqrtry  X  sê   € ð
 Ñ€Dˆ#ˆs�BÙÜÐ>Ó?Ð?ÙØˆØ
ˆQ‚wØˆq‰ˆØ�‰	ˆØ
ˆa‰‰Ø	�ŠÜ˜$  S¨!¡V¨R°°sÓ;Ð;Ü��1�T‘6˜"‘9˜Q‘;Ó€EØ	ˆU�Q‰YÑ€EØ
ˆd�{Ü�C˜‘JÓ‰ä˜3 ™:Ó&‰ˆˆSáØ˜‘6˜1‘*ˆCØ�Q‰JˆEÜ˜˜c %™i¨!™^¨T°3Ó7Ð7r,   c                 ó¼   — |t         k(  rt        | ||«      S | t         k(  rt        |||«      S t        t        | | «      t        ||«      |dz   «      }t	        |||«      S )zICompute the Euclidean norm sqrt(x**2 + y**2) of two raw mpfs
    x and y.r  )rf   rÿ   r  r  ry  )r%   r±   ri   r[   Úhypot2s        r*   Ú	mpf_hypotr|  t  s[   € ð 	ŒE‚zœ' ! T¨3Ó/Ð/ØŒE‚zœ' ! T¨3Ó/Ð/Ü”W˜Q˜q“\¤7¨1¨Q£<°°a±Ó8€FÜ�F˜D #Ó&Ð&r,   r!   )TNNF)rE  )ŽÚ__doc__Ú__docformat__r¡   r   rÔ   rÍ   Úbackendr   r   r   r	   r
   r   r   r   r   r   r   r   r   Ú
libintmathr   r   r   r   r   r   r   r   r   r   r   r   r   r+   r1   rƒ   r3   ÚinternÚ	NameErrorrT   rW   rX   rZ   rY   Ú
round_fastrF   rH   rN   rf   Úfnzeror‹   rŒ   ÚftworK  Úfhalfr    r¤   r¥   r£   rV   r^   ÚrangeÚh_mask_smallrU   rg   rj   rl   rC   Úlongrp   rr   rt   Údirru   rx   r¾   ry   Údictr   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  r!  r  Úmpf_mul_intr#  r%  rÃ   r-  r0  r3  Únegative_rndr2  r@  rW  rg  rl  rq  rº   rs  ru  ry  r|  Úsage.libs.mpmath.ext_libmpÚlibsÚmpmathÚ	ext_libmpÚext_libÚImportError)r4  s   0r*   Ú<module>r”     sS  ðñð €ã å ã 
ð €÷F÷ F÷ Fõ F÷÷ ÷ õ ð ˆfÒó'ò+ò)ô	�Jô 	ðÙ
ñ
 �s“€Ù�S‹k€Ù�s“€Ù�#‹;€Ù�C‹[€
Ø€
ò;ò
=ò
ð 
ˆH�a˜Ð€Ø
ˆX�q˜!Ð	€Ø	ˆ7�A�qÐ€Ø	
ˆG�Q˜Ð€Ø	ˆ7�A�qÐ€Ø	ˆ8�Q˜Ð€Ø	
ˆG�R˜Ð€ð 	
ˆ8�T˜2Ð€Ø	ˆ8�T˜2Ð€Ø	
ˆH�d˜BÐ€ð €ò÷2"ñ "ð ˆs±%¸¸3´-Ó@±-¨Q�g  !¡‘n aÓ'°-Ñ@Ñ@€Ù
‹,˜Ð	%€ð
 ˜5 -°Øˆu�h˜uð&€ò5òn'ðRØ�t�€Jò5ò6ð ˆfÒÐ,±°D³	Ñ9Ø×'Ñ'€JØ×(Ñ(€Kà
ˆfÒØ)×3Ñ3Ð3€J�á	Ø €IØ"�Jà€IØ€Jð !%¨*ó 4ñ> ÑB±%¸¸S´/ÓBÓB€	à
ˆfÒÐ)©S°«YÑ6Ø×&Ñ&€Là
ˆfÒØ×*Ñ*€Là˜Jó )òó)ò,)ð, ˜Zó ð ˜Jó ð ˜Jó ð ˜Jó /ð ˜zó 9ð&  *ó ð  :ó 'ð  *ó #ðJ #-ó 8ò
ò	0ò&Eòòò:2òhò
ò
ò
ò
ð ˜:ó ð ˜jó 7ð ˜jó 2òð ˜j¨qó ]ð~ ˜jó 'ð
 ˜J°ó .-ð`  :ó 9ð* &0ó ?ð   Zó 9ð, (2ó 4ð( ˆfÒØ€GØ"�Kà€GØ$€Kò ò)ð 'ó #MðJ ",ó Hð  'ó @ð0 ˆxØ
ˆZØ�Ø�+Ø�-ð€ð ˆzØ
ˆXØ�Ø�+Ø�-ð€ð !+ó Q:òh%ò62"ðh @DØóS@ójð*  $¨u¸DÑA€à$ó òF:òUð %ó 8ð8 )ó 'ð ˆfÒðß4Ó4Ø—/‘/ˆØ—/‘/ˆØ—/‘/ˆØ—/‘/ˆØ×#Ò#‰ð øð[* ò ÙƒFðüòp Aøðf ò Ø�ƒJðûðT$ ò Ùðús=   Á,L# Ã9L2Ä*L7 ËA	M Ì#L/Ì.L/Ì7MÍMÍMÍM