3 \W\�@s�ddlmZddlZddlZddlZddlZddlZddgZdd�Zdd�Z ej j Z ej j ZejdejejB�ZGd d�dej�ZdS) �)�DecimalN�Fraction�gcdcCsfddl}|jdtd�t|�tko0t|�knr\|p<|dkrPtj||� Stj||�St||�S)Nrz6fractions.gcd() is deprecated. Use math.gcd() instead.�)�warnings�warn�DeprecationWarning�type�int�mathr�_gcd)�a�br�r�!/usr/lib64/python3.6/fractions.pyrs   cCsx|r|||}}qW|S)Nr)r rrrrr 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�eZdZdRZdSdd��fdd� Zed d ��Zed d ��ZdTdd�Ze dd��Z e dd��Z dd�Z dd�Z dd�Zdd�Zeeej�\ZZdd�Zeeej�\ZZdd�Zeeej�\ZZd d!�Zeeej�\ZZd"d#�Z d$d%�Z!d&d'�Z"d(d)�Z#d*d+�Z$d,d-�Z%d.d/�Z&d0d1�Z'd2d3�Z(d4d5�Z)d6d7�Z*d8d9�Z+dUd:d;�Z,dd?�Z.d@dA�Z/dBdC�Z0dDdE�Z1dFdG�Z2dHdI�Z3dJdK�Z4dLdM�Z5dNdO�Z6dPdQ�Z7�Z8S)Vr� _numerator� _denominatorrNT)� _normalizec sRtt|�j|�}|dk�rdt|�tkr6||_d|_|St|tj �rV|j |_|j |_|St|t t f�rx|j�\|_|_|St|t��rZtj|�}|dkr�td|��t|jd�p�d�}|jd�}|r�t|�}nvd}|jd�}|�rdt|�}||t|�}||9}|jd�} | �rBt| �} | d k�r4|d| 9}n|d| 9}|jd �d k�rb| }ntd ��nft|�tk�o�t|�kn�r�n@t|tj ��r�t|tj ��r�|j |j |j |j }}ntd ��|d k�r�td|��|�rBt|�tk�ot|�kn�r(tj||�} |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__rrrTsr            $   $   zFraction.__new__cCsDt|tj�r||�St|t�s8td|j|t|�jf��||j��S)Nz.%s.from_float() only takes floats, not %r (%s))rr�Integralr"r*�__name__r r#)r,�frrr� from_float�s   zFraction.from_floatcCsVddlm}t|tj�r&|t|��}n$t||�sJtd|j|t|�jf��||j ��S)Nr)rz2%s.from_decimal() only takes Decimals, not %r (%s)) rrrrr1r r*r2r r#)r,Zdecrrrr� from_decimal�s   zFraction.from_decimal�@Bc Cs�|dkrtd��|j|kr"t|�Sd\}}}}|j|j}}xP||}|||} | |kr\P|||||| f\}}}}||||}}q>W|||} t|| ||| |�} t||�} t| |�t| |�kr�| S| SdS)Nrz$max_denominator should be at least 1r)rrrr)r'rrr�abs) r-Zmax_denominatorZp0Zq0Zp1Zq1�n�dr Zq2�kZbound1Zbound2rrr�limit_denominator�s&      zFraction.limit_denominatorcCs|jS)N)r)r rrrr szFraction.numeratorcCs|jS)N)r)r rrrr!szFraction.denominatorcCsd|jj|j|jfS)Nz %s(%s, %s))r0r2rr)r-rrr�__repr__szFraction.__repr__cCs(|jdkrt|j�Sd|j|jfSdS)Nrz%s/%s)rr$r)r-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|�|�StSdS)N)rr rr"�complex�NotImplemented)r r)�fallback_operator�monomorphic_operatorrr�forwardvs   z-Fraction._operator_fallbacks..forward�__csZt|tj�r�||�St|tj�r4�t|�t|��St|tj�rR�t|�t|��StSdS)N)rrrZRealr"�Complexr>r?)rr )r@rArr�reverse�s    z-Fraction._operator_fallbacks..reverseZ__r)r2�__doc__)rAr@rBrEr)r@rAr�_operator_fallbacks&sP  zFraction._operator_fallbackscCs,|j|j}}t|j||j|||�S)N)r!rr )r r�da�dbrrr�_add�sz Fraction._addcCs,|j|j}}t|j||j|||�S)N)r!rr )r rrHrIrrr�_sub�sz Fraction._subcCst|j|j|j|j�S)N)rr r!)r rrrr�_mul�sz Fraction._mulcCst|j|j|j|j�S)N)rr r!)r rrrr�_div�s z Fraction._divcCstj||�S)N)r �floor)r rrrr� __floordiv__�szFraction.__floordiv__cCstj||�S)N)r rN)rr rrr� __rfloordiv__�szFraction.__rfloordiv__cCs||}|||S)Nr)r r�divrrr�__mod__�szFraction.__mod__cCs||}|||S)Nr)rr rQrrr�__rmod__�szFraction.__rmod__cCs�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)NrrF)r) rrrr!r rrrr")r rZpowerrrr�__pow__�s         zFraction.__pow__cCs\|jdkr|jdkr||jSt|tj�rs