U e5d _�@s�ddlmZddlZddlZddlZddlZddlZddgZdd�Zdd�Z ej j Z ej j Ze�dejejB�ZGd d�dej�ZdS) ���DecimalN�Fraction�gcdcCsfddl}|�dtd�t|�tkr2t|�kr\nn&|p<|dkrPt�||� St�||�St||�S)Nrz6fractions.gcd() is deprecated. Use math.gcd() instead.�)�warnings�warn�DeprecationWarning�type�int�mathr�_gcd)�a�br�r�!/usr/lib64/python3.8/fractions.pyrs�   cCs|r|||}}q|S�Nr�rrrrrr sr aC \A\s* # optional whitespace at the start, then (?P[-+]?) # an optional sign, then (?=\d|\.\d) # lookahead for digit or .digit (?P\d*) # numerator (possibly empty) (?: # followed by (?:/(?P\d+))? # an optional denominator | # or (?:\.(?P\d*))? # an optional fractional part (?:E(?P[-+]?\d+))? # and optional exponent ) \s*\Z # and optional whitespace to finish cs�eZdZdZdQdd��fdd� Zedd ��Zed d ��Zd d �ZdRdd�Z e dd��Z e dd��Z dd�Z dd�Zdd�Zdd�Zeeej�\ZZdd�Zeeej�\ZZdd �Zeeej�\ZZd!d"�Zeeej�\ZZ d#d$�Z!ee!ej"�\Z#Z$d%d&�Z%ee%e&�\Z'Z(d'd(�Z)ee)ej*�\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�ZdMdN�Z?dOdP�Z@�ZAS)Tr�� _numerator� _denominatorrNT�� _normalizec sRtt|��|�}|dk�rdt|�tkr6||_d|_|St|tj �rV|j |_|j |_|St|t t f�rx|��\|_|_|St|t��rZt�|�}|dkr�td|��t|�d�p�d�}|�d�}|r�t|�}nvd}|�d�}|�rdt|�}||t|�}||9}|�d�} | �rBt| �} | d k�r4|d| 9}n|d| 9}|�d �d k�rb| }ntd ��nft|�tk�r�t|�k�r�nnn@t|tj ��r�t|tj ��r�|j |j |j |j }}ntd ��|d k�r�td|��|�rBt|�tk�rt|�k�r(nnt�||�} |d k�r2| } n t||�} || }|| }||_||_|S)N�z Invalid literal for Fraction: %rZnum�0�denom�decimal� �exprZsign�-z2argument should be a string or a Rational instancez+both arguments should be Rational instanceszFraction(%s, 0))�superr�__new__r r rr� isinstance�numbers�Rational� numerator� denominator�floatr�as_integer_ratio�str�_RATIONAL_FORMAT�match� ValueError�group�len� TypeError�ZeroDivisionErrorr rr ) �clsr%r&r�self�mrrZscaler�g�� __class__rrr!Tsx     �       $ �  �  $   zFraction.__new__cCsDt|tj�r||�St|t�s8td|j|t|�jf��||���S)Nz.%s.from_float() only takes floats, not %r (%s))r"r#�Integralr'r/�__name__r r()r1�frrr� from_float�s  �zFraction.from_floatcCsVddlm}t|tj�r&|t|��}n$t||�sJtd|j|t|�jf��||� ��S)Nrrz2%s.from_decimal() only takes Decimals, not %r (%s)) rrr"r#r7r r/r8r r()r1Zdecrrrr� from_decimal�s   ��zFraction.from_decimalcCs |j|jfSrr�r2rrrr(�szFraction.as_integer_ratio�@Bc Cs�|dkrtd��|j|kr"t|�Sd\}}}}|j|j}}||}|||} | |krZq�|||||| f\}}}}||||}}q<|||} t|| ||| |�} t||�} t| |�t| |�kr�| S| SdS)Nrz$max_denominator should be at least 1)rrrr)r,rrr�abs) r2Zmax_denominatorZp0Zq0Zp1Zq1�n�drZq2�kZbound1Zbound2rrr�limit_denominator�s$      zFraction.limit_denominatorcCs|jSr)r�rrrrr%szFraction.numeratorcCs|jSr)rrCrrrr&szFraction.denominatorcCsd|jj|j|jfS)Nz %s(%s, %s))r6r8rrr<rrr�__repr__"s�zFraction.__repr__cCs(|jdkrt|j�Sd|j|jfSdS)Nrz%s/%s)rr)rr<rrr�__str__'s  zFraction.__str__csT��fdd�}d�jd|_�j|_��fdd�}d�jd|_�j|_||fS)NcsPt|ttf�r�||�St|t�r0�t|�|�St|t�rH�t|�|�StSdSr)r"r rr'�complex�NotImplementedr��fallback_operator�monomorphic_operatorrr�forward~s   z-Fraction._operator_fallbacks..forward�__csZt|tj�r�||�St|tj�r4�t|�t|��St|tj�rR�t|�t|��StSdSr)r"r#r$ZRealr'�ComplexrFrG�rrrHrr�reverse�s    z-Fraction._operator_fallbacks..reverseZ__r)r8�__doc__)rJrIrKrOrrHr�_operator_fallbacks.sP  zFraction._operator_fallbackscCs,|j|j}}t|j||j|||�Sr�r&rr%�rr�da�dbrrr�_add�s�z Fraction._addcCs,|j|j}}t|j||j|||�SrrRrSrrr�_sub�s�z Fraction._subcCst|j|j|j|j�Sr�rr%r&rrrr�_mul�sz Fraction._mulcCst|j|j|j|j�SrrXrrrr�_div�s  �z Fraction._divcCs|j|j|j|jSr�r%r&rrrr� _floordiv�szFraction._floordivcCs:|j|j}}t|j|||j�\}}|t|||�fSr)r&�divmodr%r)rrrTrUZdivZn_modrrr�_divmod�szFraction._divmodcCs,|j|j}}t|j||j|||�SrrRrSrrr�_mod�sz Fraction._modcCs�t|tj�r�|jdkr�|j}|dkr>t|j||j|dd�S|jdkrft|j| |j| dd�St|j | |j | dd�Sq�t|�t|�Sn t|�|SdS)NrrFr) r"r#r$r&r%rrrr')rrZpowerrrr�__pow__�s&   �   � �zFraction.__pow__cCs\|jdkr|jdkr||jSt|tj�rrrrCrrr�__abs__�szFraction.__abs__cCs*|jdkr|j |j S|j|jSdS)NrrrCrrr� __trunc__s zFraction.__trunc__cCs |j|jSrr[rCrrr� __floor__ szFraction.__floor__cCs|j |j Srr[rCrrr�__ceil__szFraction.__ceil__cCs�|dkrZt|j|j�\}}|d|jkr,|S|d|jkrB|dS|ddkrR|S|dSdt|�}|dkr�tt||�|�Stt||�|�SdS)Nrrrr)r]r%r&r>r�round)r2ZndigitsZfloorZ remainder�shiftrrr� __round__s  zFraction.__round__cCsPt|jtdt�}|st}nt|j�|t}|dkr:|n| }|dkrLdS|S)Nrr����������)�powr�_PyHASH_MODULUS� _PyHASH_INFr>r)r2ZdinvZhash_�resultrrr�__hash__,s zFraction.__hash__cCs�t|�tkr |j|ko|jdkSt|tj�rD|j|jkoB|j|jkSt|tj �r`|j dkr`|j }t|t �r�t �|�s~t �|�r�d|kS||�|�kSntSdS)Nrr�)r r rrr"r#r$r%r&rM�imag�realr'r �isnan�isinfr:rGrrrr�__eq__Bs    � zFraction.__eq__cCsht|tj�r&||j|j|j|j�St|t�r`t� |�sDt� |�rN|d|�S|||� |��Snt SdS)Nrt) r"r#r$rr&rr%r'r rwrxr:rG)r2�other�oprrr�_richcmpWs   �  zFraction._richcmpcCs|�|tj�Sr)r|�operator�ltrrrr�__lt__mszFraction.__lt__cCs|�|tj�Sr)r|r}�gtrrrr�__gt__qszFraction.__gt__cCs|�|tj�Sr)r|r}�lerrrr�__le__uszFraction.__le__cCs|�|tj�Sr)r|r}�gerrrr�__ge__yszFraction.__ge__cCs t|j�Sr)�boolrrCrrr�__bool__}szFraction.__bool__cCs|jt|�ffSr)r6r)r<rrr� __reduce__�szFraction.__reduce__cCs t|�tkr|S|�|j|j�Sr�r rr6rrr<rrr�__copy__�s zFraction.__copy__cCs t|�tkr|S|�|j|j�Srr�)r2Zmemorrr� __deepcopy__�s zFraction.__deepcopy__)rN)r=)N)Br8� __module__� __qualname__� __slots__r!� classmethodr:r;r(rB�propertyr%r&rDrErQrVr}�add�__add__�__radd__rW�sub�__sub__�__rsub__rY�mul�__mul__�__rmul__rZ�truediv� __truediv__� __rtruediv__r\�floordiv� __floordiv__� __rfloordiv__r^r]� __divmod__� __rdivmod__r_�mod�__mod__�__rmod__r`rardrerfrgrhrirlrsryr|rr�r�r�r�r�r�r�� __classcell__rrr5rr<sbm   7  k )rrr r#r}�re�sys�__all__rr � hash_info�modulusrp�infrq�compile�VERBOSE� IGNORECASEr*r$rrrrr�s  �