B
    2*\^                 @   s   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dgZdd Zdd 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Fractiongcdc             C   sf   dd l }|dtd t| t  kr2t|kr\n n&|p<| dk rPt| | S t| |S t| |S )Nr   z6fractions.gcd() is deprecated. Use math.gcd() instead.   )warningswarnDeprecationWarningtypeintmathr   _gcd)abr    r   4C:\ALexclude\prg\programme\Python37\Lib\fractions.pyr      s     c             C   s   x|r|| |  } }qW | S )Nr   )r   r   r   r   r   r       s    r   aC  
    \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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 d#d$ Z!d%d& Z"d'd( Z#d)d* Z$d+d, Z%d-d. Z&d/d0 Z'd1d2 Z(d3d4 Z)d5d6 Z*d7d8 Z+dSd9d:Z,d;d< Z-d=d> Z.d?d@ Z/dAdB Z0dCdD Z1dEdF Z2dGdH Z3dIdJ Z4dKdL Z5dMdN Z6dOdP Z7  Z8S )Tr   )
_numerator_denominatorr   NT)
_normalizec               sR  t t| | }|d krdt|tkr6||_d|_|S t|tj	rV|j
|_|j|_|S t|ttfrx| \|_|_|S t|trZt|}|d krtd| t|dpd}|d}|rt|}nvd}|d}|rdt| }|| t| }||9 }|d}	|	rBt|	}	|	d	kr4|d|	 9 }n|d|	  9 }|d
dkrb| }ntdnft|t  krt|krn nn@t|tj	rt|tj	r|j
|j |j
|j  }}ntd|d	krtd| |rBt|t  krt|kr(n nt||}
|d	k r2|
 }
n
t||}
||
 }||
 }||_||_|S )N   z Invalid literal for Fraction: %rZ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__r	   r
   r   r   
isinstancenumbersRational	numeratordenominatorfloatr   as_integer_ratiostr_RATIONAL_FORMATmatch
ValueErrorgrouplen	TypeErrorZeroDivisionErrorr   r   r   )clsr!   r"   r   selfmr   r   Zscaler   g)	__class__r   r   r   T   sr    







$

$

zFraction.__new__c             C   sD   t |tjr| |S t |ts8t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   sV   ddl m} t|tjr&|t|}n$t||sJtd| j|t|jf | |	  S )Nr   )r   z2%s.from_decimal() only takes Decimals, not %r (%s))
r   r   r   r   r2   r
   r+   r3   r	   r$   )r-   Zdecr   r   r   r   from_decimal   s    
zFraction.from_decimal@B c             C   s   |dk rt d| j|kr"t| S d\}}}}| j| j }}xP|| }|||  }	|	|kr\P |||||  |	f\}}}}||||   }}q>W || | }
t||
|  ||
|  }t||}t||  t||  kr|S |S d 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dr   Zq2kZbound1Zbound2r   r   r   limit_denominator   s&     

zFraction.limit_denominatorc             C   s   | j S )N)r   )r   r   r   r   r!     s    zFraction.numeratorc             C   s   | j S )N)r   )r   r   r   r   r"     s    zFraction.denominatorc             C   s   d| j j| j| jf S )Nz
%s(%s, %s))r1   r3   r   r   )r.   r   r   r   __repr__  s    zFraction.__repr__c             C   s(   | j dkrt| jS d| j| j f S d S )Nr   z%s/%s)r   r%   r   )r.   r   r   r   __str__  s    

zFraction.__str__c                sT    fdd}d j  d |_ j|_ fdd}d j  d |_ j|_||fS )Nc                sP   t |ttfr| |S t |tr0 t| |S t |trH t| |S tS d S )N)r   r
   r   r#   complexNotImplemented)r   r   )fallback_operatormonomorphic_operatorr   r   forwardv  s    


z-Fraction._operator_fallbacks.<locals>.forward__c                sZ   t |tjr|| S t |tjr4 t|t| S t |tjrR t|t| S tS d S )N)r   r   r    ZRealr#   Complexr?   r@   )r   r   )rA   rB   r   r   reverse  s    
z-Fraction._operator_fallbacks.<locals>.reverseZ__r)r3   __doc__)rB   rA   rC   rF   r   )rA   rB   r   _operator_fallbacks&  s    P	
zFraction._operator_fallbacksc             C   s,   | j |j  }}t| j| |j|  || S )N)r"   r   r!   )r   r   dadbr   r   r   _add  s    zFraction._addc             C   s,   | j |j  }}t| j| |j|  || S )N)r"   r   r!   )r   r   rI   rJ   r   r   r   _sub  s    zFraction._subc             C   s   t | j|j | j|j S )N)r   r!   r"   )r   r   r   r   r   _mul  s    zFraction._mulc             C   s   t | j|j | j|j S )N)r   r!   r"   )r   r   r   r   r   _div  s    zFraction._divc             C   s   t | | S )N)r   floor)r   r   r   r   r   __floordiv__  s    zFraction.__floordiv__c             C   s   t ||  S )N)r   rO   )r   r   r   r   r   __rfloordiv__  s    zFraction.__rfloordiv__c             C   s   | | }| ||  S )Nr   )r   r   divr   r   r   __mod__  s    zFraction.__mod__c             C   s   ||  }|| |  S )Nr   )r   r   rR   r   r   r   __rmod__  s    zFraction.__rmod__c             C   s   t |tjr|jdkr|j}|dkr>t| j| | j| ddS | jdkrft| j|  | j|  ddS t| j |  | j |  ddS qt| t| S nt| | S d S )Nr   r   F)r   )	r   r   r    r"   r!   r   r   r   r#   )r   r   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rP|| j S |t|  S )Nr   r   )	r   r   r   r   r    r   r!   r"   r#   )r   r   r   r   r   __rpow__  s    


zFraction.__rpow__c             C   s   t | j| jddS )NF)r   )r   r   r   )r   r   r   r   __pos__  s    zFraction.__pos__c             C   s   t | j | jddS )NF)r   )r   r   r   )r   r   r   r   __neg__  s    zFraction.__neg__c             C   s   t t| j| jddS )NF)r   )r   r8   r   r   )r   r   r   r   __abs__  s    zFraction.__abs__c             C   s*   | j dk r| j  | j  S | j | j S d S )Nr   )r   r   )r   r   r   r   	__trunc__  s    
zFraction.__trunc__c             C   s   | j | j S )N)r!   r"   )r   r   r   r   	__floor__  s    zFraction.__floor__c             C   s   | j  | j  S )N)r!   r"   )r   r   r   r   __ceil__  s    zFraction.__ceil__c             C   s   |d krZt | j| j\}}|d | jk r,|S |d | jkrB|d S |d dkrR|S |d S dt| }|dkrtt| | |S tt| | | S d S )Nr   r   r   r   )divmodr!   r"   r8   r   round)r.   ZndigitsrO   Z	remaindershiftr   r   r   	__round__  s    zFraction.__round__c             C   sP   t | jtd t}|st}nt| j| t }| dkr:|n| }|dkrLdS |S )Nr   r   )powr   _PyHASH_MODULUS_PyHASH_INFr8   r   )r.   ZdinvZhash_resultr   r   r   __hash__!  s    zFraction.__hash__c             C   s   t |tkr | j|ko| jdkS t|tjrD| j|jkoB| j|jkS t|tj	r`|j
dkr`|j}t|trt|s~t|rd|kS | | |kS ntS d S )Nr   r   g        )r	   r
   r   r   r   r   r    r!   r"   rE   imagrealr#   r   isnanisinfr5   r@   )r   r   r   r   r   __eq__7  s    
zFraction.__eq__c             C   sh   t |tjr&|| j|j | j|j S t |tr`t	|sDt
|rN|d|S || | |S ntS d S )Ng        )r   r   r    r   r"   r   r!   r#   r   rj   rk   r5   r@   )r.   otheropr   r   r   _richcmpL  s    

zFraction._richcmpc             C   s   |  |tjS )N)ro   operatorlt)r   r   r   r   r   __lt__b  s    zFraction.__lt__c             C   s   |  |tjS )N)ro   rp   gt)r   r   r   r   r   __gt__f  s    zFraction.__gt__c             C   s   |  |tjS )N)ro   rp   le)r   r   r   r   r   __le__j  s    zFraction.__le__c             C   s   |  |tjS )N)ro   rp   ge)r   r   r   r   r   __ge__n  s    zFraction.__ge__c             C   s
   | j dkS )Nr   )r   )r   r   r   r   __bool__r  s    zFraction.__bool__c             C   s   | j t| ffS )N)r1   r%   )r.   r   r   r   
__reduce__x  s    zFraction.__reduce__c             C   s    t | tkr| S | | j| jS )N)r	   r   r1   r   r   )r.   r   r   r   __copy__{  s    zFraction.__copy__c             C   s    t | tkr| S | | j| jS )N)r	   r   r1   r   r   )r.   Zmemor   r   r   __deepcopy__  s    zFraction.__deepcopy__)r   N)r7   )N)9r3   
__module____qualname__	__slots__r   classmethodr5   r6   r<   propertyr!   r"   r=   r>   rH   rK   rp   add__add____radd__rL   sub__sub____rsub__rM   mul__mul____rmul__rN   truediv__truediv____rtruediv__rP   rQ   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r`   rg   rl   ro   rr   rt   rv   rx   ry   rz   r{   r|   __classcell__r   r   )r1   r   r   <   sT   m
7k
)r   r   r   r   rp   resys__all__r   r   	hash_infomodulusrd   infre   compileVERBOSE
IGNORECASEr&   r    r   r   r   r   r   <module>   s   