B
    [                 @   s   d Z ddlmZmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZ eG dd deeeZdd Zeee< dS )z/Rational number type based on Python integers.     )print_functiondivisionN)PicklableWithSlots)DomainElement)integer_types)	converter)RationalInteger)DefaultPrinting)publicc               @   s*  e Zd ZdZddgZdd ZdCdd	Zed
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZeZd&d' ZeZd(d) Zd*d+ Zd,d- Zd.d/ ZeZd0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#d<d= Z$e%d>d? Z&e%d@dA Z'e&Z(e'Z)dBS )DPythonRationala  
    Rational number type based on Python integers.

    This was supposed to be needed for compatibility with older Python
    versions which don't support Fraction. However, Fraction is very
    slow so we don't use it anyway.

    Examples
    ========

    >>> from sympy.polys.domains import PythonRational

    >>> PythonRational(1)
    1
    >>> PythonRational(2, 3)
    2/3
    >>> PythonRational(14, 10)
    7/5

    pqc             C   s   ddl m} | S )Nr   )PythonRationalField)Zsympy.polys.domainsr   )selfr    r   Alib/python3.7/site-packages/sympy/polys/domains/pythonrational.pyparent)   s    zPythonRational.parent   Tc             C   s   ddl m} t|tr|j}nt|tr6|j|j }}|sDtdn|dk rZ| |  }}|sld| _d| _nP|dks||dkr|| _|| _n2|r|||}|dkr|| }|| }|| _|| _d S )Nr   )
python_gcdzrational numberr   )sympy.polys.domains.groundtypesr   
isinstancer	   r   r   r   ZeroDivisionError)r   r   r   _gcdgcdxr   r   r   __init__-   s,    



zPythonRational.__init__c             C   s   t | }||_||_|S )N)object__new__r   r   )clsr   r   objr   r   r   newJ   s    
zPythonRational.newc             C   s(   | j dkrt| jS t| j| j fS d S )Nr   )r   hashr   )r   r   r   r   __hash__Q   s    

zPythonRational.__hash__c             C   s*   | j | j }}|dk r"| |  S || S )Nr   )r   r   )r   r   r   r   r   r   __int__W   s    zPythonRational.__int__c             C   s   t | j| j S )N)floatr   r   )r   r   r   r   	__float__]   s    zPythonRational.__float__c             C   s   |  t| j| jS )N)r!   absr   r   )r   r   r   r   __abs__`   s    zPythonRational.__abs__c             C   s   |  | j
 | jS )N)r!   r   r   )r   r   r   r   __pos__c   s    zPythonRational.__pos__c             C   s   |  | j | jS )N)r!   r   r   )r   r   r   r   __neg__f   s    zPythonRational.__neg__c             C   s   ddl m} t|tr| j| j|j|jf\}}}}|||}|dkr^|| ||  }|| }	q|| ||  }
}|| ||
  |
|  }}	|||}|| |	||   }}	n&t|tr| j| j|  }| j}	ntS | j||	ddS )Nr   )r   r   F)r   )	r   r   r   r   r   r   r   NotImplemented	__class__)r   otherr   apaqbpbqgr   r   q1q2g2r   r   r   __add__i   s     




zPythonRational.__add__c             C   s4   t |tstS | j| j|  }| j}| j||ddS )NF)r   )r   r   r+   r   r   r,   )r   r-   r   r   r   r   r   __radd__~   s
    
zPythonRational.__radd__c             C   s   ddl m} t|tr| j| j|j|jf\}}}}|||}|dkr^|| ||  }|| }	q|| ||  }
}|| ||
  |
|  }}	|||}|| |	||   }}	n&t|tr| j| j|  }| j}	ntS | j||	ddS )Nr   )r   r   F)r   )	r   r   r   r   r   r   r   r+   r,   )r   r-   r   r.   r/   r0   r1   r2   r   r   r3   r4   r5   r   r   r   __sub__   s     




zPythonRational.__sub__c             C   s4   t |tstS | j| | j }| j}| j||ddS )NF)r   )r   r   r+   r   r   r,   )r   r-   r   r   r   r   r   __rsub__   s
    
zPythonRational.__rsub__c             C   s   ddl m} t|trj| j| j|j|jf\}}}}|||}|||}|| ||  || ||   }	}
n4t|tr||| j}| j||  }	| j| }
ntS | j|	|
ddS )Nr   )r   F)r   )	r   r   r   r   r   r   r   r+   r,   )r   r-   r   r.   r/   r0   r1   x1x2r   r   r   r   r   r   __mul__   s    


$
zPythonRational.__mul__c             C   sN   ddl m} t|tstS || j|}| j||  }| j| }| j||ddS )Nr   )r   F)r   )r   r   r   r   r+   r   r   r,   )r   r-   r   r   r   r   r   r   r   __rmul__   s    

zPythonRational.__rmul__c             C   s   ddl m} t|trj| j| j|j|jf\}}}}|||}|||}|| ||  || ||   }	}
n4t|tr||| j}| j| }	| j||  }
ntS | j|	|
ddS )Nr   )r   F)r   )	r   r   r   r   r   r   r   r+   r,   )r   r-   r   r.   r/   r0   r1   r:   r;   r   r   r   r   r   r   __div__   s    


$

zPythonRational.__div__c             C   sJ   ddl m} t|tstS || j|}| j||  }| j| }| ||S )Nr   )r   )r   r   r   r   r+   r   r   r,   )r   r-   r   r   r   r   r   r   r   __rdiv__   s    

zPythonRational.__rdiv__c             C   s
   |  dS )Nr   )r,   )r   r-   r   r   r   __mod__   s    zPythonRational.__mod__c             C   s   | | | | fS )Nr   )r   r-   r   r   r   
__divmod__   s    zPythonRational.__divmod__c             C   s@   | j | j }}|dk r(|||   }}}| j|| || ddS )Nr   F)r   )r   r   r,   )r   Zexpr   r   r   r   r   __pow__   s    zPythonRational.__pow__c             C   s
   | j dkS )Nr   )r   )r   r   r   r   __nonzero__   s    zPythonRational.__nonzero__c             C   sH   t |tr"| j|jko | j|jkS t |tr@| jdko>| j|kS dS d S )Nr   F)r   r   r   r   r   )r   r-   r   r   r   __eq__   s
    

zPythonRational.__eq__c             C   s
   | |k S )Nr   )r   r-   r   r   r   __ne__   s    zPythonRational.__ne__c             C   s2   y| | }W n t k
r    tS X ||jdS d S )Nr   )	TypeErrorr+   r   )r   r-   opZdiffr   r   r   _cmp   s
    zPythonRational._cmpc             C   s   |  |tjS )N)rH   operatorlt)r   r-   r   r   r   __lt__  s    zPythonRational.__lt__c             C   s   |  |tjS )N)rH   rI   le)r   r-   r   r   r   __le__  s    zPythonRational.__le__c             C   s   |  |tjS )N)rH   rI   gt)r   r-   r   r   r   __gt__  s    zPythonRational.__gt__c             C   s   |  |tjS )N)rH   rI   ge)r   r-   r   r   r   __ge__  s    zPythonRational.__ge__c             C   s   | j S )N)r   )r   r   r   r   numer  s    zPythonRational.numerc             C   s   | j S )N)r   )r   r   r   r   denom  s    zPythonRational.denomN)r   T)*__name__
__module____qualname____doc__	__slots__r   r   classmethodr!   r#   r$   r&   r(   r)   r*   r6   r7   r8   r9   r<   r=   r>   __truediv__r?   __rtruediv__r@   rA   rB   rC   __bool__rD   rE   rH   rK   rM   rO   rQ   propertyrR   rS   	numeratordenominatorr   r   r   r   r      sJ   
		r   c             C   s   t | j| jS )N)r   r   r   )argr   r   r   sympify_pythonrational  s    ra   )rW   Z
__future__r   r   rI   Zsympy.polys.polyutilsr   Z!sympy.polys.domains.domainelementr   Zsympy.core.compatibilityr   Zsympy.core.sympifyr   Zsympy.core.numbersr   r	   Zsympy.printing.defaultsr
   Zsympy.utilitiesr   r   ra   r   r   r   r   <module>   s     