o
     JAfRn                     @   sv   	 d dl mZ d dlZd dlZd dlZd dlZd dlZdgZejj	Z
ejjZedejejB ZG dd dejZdS )    DecimalNFractionaC  
    \A\s*                      # optional whitespace at the start, then
    (?P<sign>[-+]?)            # an optional sign, then
    (?=\d|\.\d)                # lookahead for digit or .digit
    (?P<num>\d*)               # numerator (possibly empty)
    (?:                        # followed by
       (?:/(?P<denom>\d+))?    # an optional denominator
    |                          # or
       (?:\.(?P<decimal>\d*))? # an optional fractional part
       (?:E(?P<exp>[-+]?\d+))? # and optional exponent
    )
    \s*\Z                      # and optional whitespace to finish
c                       s  e Zd Z	 dZdQdd fddZedd	 Zed
d Zdd ZdRddZ	e
dd Ze
dd Zdd Zdd Zdd Zdd Zeeej\ZZdd Zeeej\ZZdd  Zeeej\ZZd!d" Zeeej\ZZ d#d$ Z!ee!ej"\Z#Z$d%d& Z%ee%e&\Z'Z(d'd( Z)ee)ej*\Z+Z,d)d* Z-d+d, Z.d-d. Z/d/d0 Z0d1d2 Z1d3d4 Z2d5d6 Z3d7d8 Z4dSd9d:Z5d;d< Z6d=d> Z7d?d@ Z8dAdB Z9dCdD Z:dEdF Z;dGdH Z<dIdJ Z=dKdL Z>dMdN Z?dOdP Z@  ZAS )Tr   
_numerator_denominatorr   NT
_normalizec                   s  	 t t| | }|d u rt|tu r||_d|_|S t|tj	r+|j
|_|j|_|S t|ttfr<| \|_|_|S t|trt|}|d u rPtd| t|dpWd}|d}|ret|}n8d}|d}|rdt| }|| t| }||9 }|d}	|	rt|	}	|	d	kr|d|	 9 }n|d|	  9 }|d
dkr| }n3tdt|t  u rt|u rn nnt|tj	rt|tj	r|j
|j |j
|j }}ntd|d	krtd| |rt||}
|d	k r|
 }
||
 }||
 }||_||_|S )N   z Invalid literal for Fraction: %rnum0denomdecimal
   expr   sign-z2argument should be a string or a Rational instancez+both arguments should be Rational instanceszFraction(%s, 0))superr   __new__typeintr   r   
isinstancenumbersRational	numeratordenominatorfloatr   as_integer_ratiostr_RATIONAL_FORMATmatch
ValueErrorgrouplen	TypeErrorZeroDivisionErrormathgcd)clsr   r   r	   selfmr   r   Zscaler   g	__class__  /usr/lib/python3.10/fractions.pyr   >   sx   





 


zFraction.__new__c                 C   sF   	 t |tjr| |S t |tstd| j|t|jf | |  S )Nz.%s.from_float() only takes floats, not %r (%s))r   r   Integralr   r$   __name__r   r   )r(   fr.   r.   r/   
from_float   s   
zFraction.from_floatc                 C   sX   	 ddl m} t|tjr|t|}nt||s&td| j|t|jf | |	  S )Nr   r   z2%s.from_decimal() only takes Decimals, not %r (%s))
r   r   r   r   r0   r   r$   r1   r   r   )r(   Zdecr   r.   r.   r/   from_decimal   s   
zFraction.from_decimalc                 C   s   	 | j | jfS Nr   r)   r.   r.   r/   r      s   zFraction.as_integer_ratio@B c                 C   s   	 |dk r	t d| j|krt| S d\}}}}| j| j}}	 || }|||  }	|	|kr/n|||||  |	f\}}}}||||  }}q || | }
t||
|  ||
|  }t||}t||  t||  krm|S |S )Nr
   z$max_denominator should be at least 1)r   r
   r
   r   )r!   r   r   r   abs)r)   Zmax_denominatorZp0Zq0Zp1Zq1ndaZq2kZbound1Zbound2r.   r.   r/   limit_denominator   s*   

zFraction.limit_denominatorc                 C      | j S r5   )r   r;   r.   r.   r/   r         zFraction.numeratorc                 C   r>   r5   )r   r?   r.   r.   r/   r     r@   zFraction.denominatorc                 C   s   	 d| j j| j| jf S )Nz
%s(%s, %s))r-   r1   r   r   r6   r.   r.   r/   __repr__  s   zFraction.__repr__c                 C   s&   	 | j dkrt| jS d| j| j f S )Nr
   z%s/%s)r   r   r   r6   r.   r.   r/   __str__  s   

zFraction.__str__c                    sV   	  fdd}d j  d |_ j|_ fdd}d j  d |_ j|_||fS )Nc                    sL   t |ttfr| |S t |tr t| |S t |tr$ t| |S tS r5   )r   r   r   r   complexNotImplementedr;   bfallback_operatormonomorphic_operatorr.   r/   forwardd  s   


z-Fraction._operator_fallbacks.<locals>.forward__c                    sV   t |tjr|| S t |tjr t|t| S t |tjr) t|t| S tS r5   )r   r   r   ZRealr   ComplexrC   rD   rF   r;   rG   r.   r/   reversep  s   
z-Fraction._operator_fallbacks.<locals>.reverseZ__r)r1   __doc__)rI   rH   rJ   rN   r.   rG   r/   _operator_fallbacks  s   O	
zFraction._operator_fallbacksc           
      C   s   	 | j | j}}|j |j}}t||}|dkr(t|| ||  || ddS || }|||  ||  }t||}	|	dkrIt||| ddS t||	 |||	  ddS Nr
   Fr   r   r   r&   r'   r   
r;   rF   nadanbdbr+   stg2r.   r.   r/   _add     zFraction._addc           
      C   s   	 | j | j}}|j |j}}t||}|dkr(t|| ||  || ddS || }|||  ||  }t||}	|	dkrIt||| ddS t||	 |||	  ddS rQ   rR   rS   r.   r.   r/   _sub  r\   zFraction._subc                 C   s|   	 | j | j}}|j |j}}t||}|dkr!|| }|| }t||}|dkr3|| }|| }t|| || ddS rQ   rR   )r;   rF   rT   rU   rV   rW   g1rZ   r.   r.   r/   _mul  s   zFraction._mulc           
      C   s   	 | j | j}}|j |j}}t||}|dkr!|| }|| }t||}|dkr3|| }|| }|| || }}	|	dk rG| |	 }}	t||	ddS Nr
   r   Fr   rR   )
r;   rF   rT   rU   rV   rW   r^   rZ   r9   r:   r.   r.   r/   _div  s   zFraction._divc                 C   s   	 | j |j | j|j   S r5   r   r   rE   r.   r.   r/   	_floordiv  s   zFraction._floordivc                 C   s<   	 | j |j }}t| j| ||j \}}|t||| fS r5   )r   divmodr   r   )r;   rF   rU   rW   ZdivZn_modr.   r.   r/   _divmod  s   zFraction._divmodc                 C   s.   	 | j |j }}t| j| |j|  || S r5   )r   r   r   )r;   rF   rU   rW   r.   r.   r/   _mod  s   zFraction._modc                 C   s   	 t |tjrM|jdkrE|j}|dkr t| j| | j| ddS | jdkr4t| j|  | j|  ddS t| j |  | j |  ddS t| t| S t| | S r`   )	r   r   r   r   r   r   r   r   r   )r;   rF   Zpowerr.   r.   r/   __pow__  s(   



zFraction.__pow__c                 C   s^   	 | j dkr| jdkr|| j S t|tjrt|j|j|  S | j dkr)|| j S |t|  S )Nr
   r   )	r   r   r   r   r   r   r   r   r   rM   r.   r.   r/   __rpow__:  s   


zFraction.__rpow__c                 C   s   	 t | j| jddS NFr   r   r   r   r?   r.   r.   r/   __pos__H  s   zFraction.__pos__c                 C   s   	 t | j | jddS ri   rj   r?   r.   r.   r/   __neg__L  s   zFraction.__neg__c                 C   s   	 t t| j| jddS ri   )r   r8   r   r   r?   r.   r.   r/   __abs__P  s   zFraction.__abs__c                 C   s(   	 | j dk r| j  | j  S | j | j S )Nr   r   r?   r.   r.   r/   	__trunc__T  s   
zFraction.__trunc__c                 C   s   	 | j | j S r5   rb   r?   r.   r.   r/   	__floor__[  s   zFraction.__floor__c                 C   s   	 | j  | j  S r5   rb   r?   r.   r.   r/   __ceil___  s   zFraction.__ceil__c                 C   s   	 |d u r.t | j| j\}}|d | jk r|S |d | jkr"|d S |d dkr*|S |d S dt| }|dkrAtt| | |S tt| | | S )N   r
   r   r   )rd   r   r   r8   r   round)r)   Zndigitsfloor	remaindershiftr.   r.   r/   	__round__d  s   zFraction.__round__c                 C   sf   	 z	t | jdt}W n ty   t}Y nw ttt| j| }| jdkr(|n| }|dkr1dS |S )Nr   )powr   _PyHASH_MODULUSr!   _PyHASH_INFhashr8   r   )r)   ZdinvZhash_resultr.   r.   r/   __hash__}  s   zFraction.__hash__c                 C   s   	 t |tu r| j|ko| jdkS t|tjr#| j|jko"| j|jkS t|tj	r1|j
dkr1|j}t|trKt|s@t|rDd|kS | | |kS tS )Nr
   r           )r   r   r   r   r   r   r   r   r   rL   imagrealr   r&   isnanisinfr3   rD   rE   r.   r.   r/   __eq__  s   

zFraction.__eq__c                 C   sd   	 t |tjr|| j|j | j|j S t |tr0t	|s#t
|r(|d|S || | |S tS )Nr   )r   r   r   r   r   r   r   r   r&   r   r   r3   rD   )r)   otheropr.   r.   r/   _richcmp  s   



zFraction._richcmpc                 C      	 |  |tjS r5   )r   operatorltrE   r.   r.   r/   __lt__     zFraction.__lt__c                 C   r   r5   )r   r   gtrE   r.   r.   r/   __gt__  r   zFraction.__gt__c                 C   r   r5   )r   r   lerE   r.   r.   r/   __le__  r   zFraction.__le__c                 C   r   r5   )r   r   gerE   r.   r.   r/   __ge__  r   zFraction.__ge__c                 C   s   	 t | jS r5   )boolr   r?   r.   r.   r/   __bool__  s   
zFraction.__bool__c                 C   s   | j t| ffS r5   )r-   r   r6   r.   r.   r/   
__reduce__  s   zFraction.__reduce__c                 C       t | tkr| S | | j| jS r5   r   r   r-   r   r   r6   r.   r.   r/   __copy__     zFraction.__copy__c                 C   r   r5   r   )r)   memor.   r.   r/   __deepcopy__  r   zFraction.__deepcopy__)r   N)r7   r5   )Br1   
__module____qualname__	__slots__r   classmethodr3   r4   r   r=   propertyr   r   rA   rB   rP   r[   r   add__add____radd__r]   sub__sub____rsub__r_   mul__mul____rmul__ra   truediv__truediv____rtruediv__rc   floordiv__floordiv____rfloordiv__re   rd   
__divmod____rdivmod__rf   mod__mod____rmod__rg   rh   rk   rl   rm   rn   ro   rp   rv   r~   r   r   r   r   r   r   r   r   r   r   __classcell__r.   r.   r,   r/   r   &   sh    i


7

 0
!)r   r   r&   r   r   resys__all__	hash_infomodulusrz   infr{   compileVERBOSE
IGNORECASEr   r   r   r.   r.   r.   r/   <module>   s   
