a �DOg_�@stddlmZddlZddlZddlZddlZddlZdgZejj Z ejj Z e� dejejB�ZGdd�dej�ZdS)���DecimalN�FractionaC \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 s"tt|��|�}|du�rdt|�tur6||_d|_|St|tj �rV|j |_|j |_|St|t t f�rx|��\|_|_|St|t��rZt�|�}|dur�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|�tu�r�t|�u�r�nnn@t|tj ��r�t|tj ��r�|j |j |j |j }}ntd ��|d k�r�td|��|�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 instanceszFraction(%s, 0))�superr�__new__�type�intrr� isinstance�numbers�Rational� numerator� denominator�floatr�as_integer_ratio�str�_RATIONAL_FORMAT�match� ValueError�group�len� TypeError�ZeroDivisionError�math�gcd) �clsrrr �self�mr rZscaler�g�� __class__��!/usr/lib64/python3.9/fractions.pyr>st     �       $ �  �    zFraction.__new__cCsDt|tj�r||�St|t�s8td|j|t|�jf��||���S)Nz.%s.from_float() only takes floats, not %r (%s))rr�Integralrr$�__name__rr)r(�fr.r.r/� 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)) rrrrr0rr$r1rr)r(Zdecrr.r.r/� from_decimal�s   ��zFraction.from_decimalcCs |j|jfS�Nr�r)r.r.r/r�szFraction.as_integer_ratio�@Bc Cs�|dkrtd��|j|kr"t|�Sd\}}}}|j|j}}||}|||} | |krZq�|||||| f\}}}}||||}}q<|||} t|| ||| |�} t||�} t| |�t| |�kr�| S| SdS)Nr z$max_denominator should be at least 1)rr r r)r!rrr�abs) r)Zmax_denominatorZp0Zq0Zp1Zq1�n�d�aZq2�kZbound1Zbound2r.r.r/�limit_denominator�s$      zFraction.limit_denominatorcCs|jSr5)r�r;r.r.r/rszFraction.numeratorcCs|jSr5)rr>r.r.r/rszFraction.denominatorcCsd|jj|j|jfS)Nz %s(%s, %s))r-r1rrr6r.r.r/�__repr__s�zFraction.__repr__cCs(|jdkrt|j�Sd|j|jfSdS)Nr z%s/%s)rrrr6r.r.r/�__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|�|�StSdSr5)rrrr�complex�NotImplemented�r;�b��fallback_operator�monomorphic_operatorr.r/�forwardds   z-Fraction._operator_fallbacks..forward�__csZt|tj�r�||�St|tj�r4�t|�t|��St|tj�rR�t|�t|��StSdSr5)rrrZRealr�ComplexrArB�rDr;rEr.r/�reverseps    z-Fraction._operator_fallbacks..reverseZ__r)r1�__doc__)rGrFrHrLr.rEr/�_operator_fallbackssP  zFraction._operator_fallbackscCs,|j|j}}t|j||j|||�Sr5�rrr�r;rD�da�dbr.r.r/�_adds�z Fraction._addcCs,|j|j}}t|j||j|||�Sr5rOrPr.r.r/�_sub�s�z Fraction._subcCst|j|j|j|j�Sr5�rrrrCr.r.r/�_mul�sz Fraction._mulcCst|j|j|j|j�Sr5rUrCr.r.r/�_div�s  �z Fraction._divcCs|j|j|j|jSr5�rrrCr.r.r/� _floordiv�szFraction._floordivcCs:|j|j}}t|j|||j�\}}|t|||�fSr5)r�divmodrr)r;rDrQrRZdivZn_modr.r.r/�_divmod�szFraction._divmodcCs,|j|j}}t|j||j|||�Sr5rOrPr.r.r/�_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)Nr rFr) rrrrrrrrr)r;rDZpowerr.r.r/�__pow__�s&   �   � �zFraction.__pow__cCs\|jdkr|jdkr||jSt|tj�rr.r.r/�__pos__�szFraction.__pos__cCst|j |jdd�Sr_r`r>r.r.r/�__neg__�szFraction.__neg__cCstt|j�|jdd�Sr_)rr8rrr>r.r.r/�__abs__�szFraction.__abs__cCs*|jdkr|j |j S|j|jSdS)Nrrr>r.r.r/� __trunc__�s zFraction.__trunc__cCs |j|jSr5rXr>r.r.r/� __floor__�szFraction.__floor__cCs|j |j Sr5rXr>r.r.r/�__ceil__�szFraction.__ceil__cCs�|durZt|j|j�\}}|d|jkr,|S|d|jkrB|dS|ddkrR|S|dSdt|�}|dkr�tt||�|�Stt||�|�SdS)N�r rr)rZrrr8r�round)r)�ndigits�floor� remainder�shiftr.r.r/� __round__�s  zFraction.__round__cCsdzt|jdt�}Wnty(t}Yn0ttt|j��|�}|jdkrN|n| }|dkr`dS|S)N�����r�����)�powr�_PyHASH_MODULUSr!� _PyHASH_INF�hashr8r)r)ZdinvZhash_�resultr.r.r/�__hash__s  zFraction.__hash__cCs�t|�tur |j|ko|jdkSt|tj�rD|j|jkoB|j|jkSt|tj �r`|j dkr`|j }t|t �r�t �|�s~t �|�r�d|kS||�|�kSntSdS)Nr r�)rrrrrrrrrrJ�imag�realrr&�isnan�isinfr3rBrCr.r.r/�__eq__3s    � zFraction.__eq__cCsht|tj�r&||j|j|j|j�St|t�r`t� |�sDt� |�rN|d|�S|||� |��Snt SdS)Nrv) rrrrrrrrr&ryrzr3rB)r)�other�opr.r.r/�_richcmpHs   �  zFraction._richcmpcCs|�|tj�Sr5)r~�operator�ltrCr.r.r/�__lt__^szFraction.__lt__cCs|�|tj�Sr5)r~r�gtrCr.r.r/�__gt__bszFraction.__gt__cCs|�|tj�Sr5)r~r�lerCr.r.r/�__le__fszFraction.__le__cCs|�|tj�Sr5)r~r�gerCr.r.r/�__ge__jszFraction.__ge__cCs t|j�Sr5)�boolrr>r.r.r/�__bool__nszFraction.__bool__cCs|jt|�ffSr5)r-rr6r.r.r/� __reduce__vszFraction.__reduce__cCs t|�tkr|S|�|j|j�Sr5�rrr-rrr6r.r.r/�__copy__ys zFraction.__copy__cCs t|�tkr|S|�|j|j�Sr5r�)r)�memor.r.r/� __deepcopy__~s zFraction.__deepcopy__)rN)r7)N)Br1� __module__� __qualname__� __slots__r� classmethodr3r4rr=�propertyrrr?r@rNrSr�add�__add__�__radd__rT�sub�__sub__�__rsub__rV�mul�__mul__�__rmul__rW�truediv� __truediv__� __rtruediv__rY�floordiv� __floordiv__� __rfloordiv__r[rZ� __divmod__� __rdivmod__r\�mod�__mod__�__rmod__r]r^rarbrcrdrerfrmrur{r~r�r�r�r�r�r�r�r�� __classcell__r.r.r,r/r&sbi   7  k !)rrr&rr�re�sys�__all__� hash_info�modulusrq�infrr�compile�VERBOSE� IGNORECASErrrr.r.r.r/�s  �