o
    8Va-                     @   s  d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZmZmZm Z  d
d Z!e"edd Z#e"edd Z#e"e	dd Z#e"e
dd Z#e"edd Z#e$eeeedd Z#e"edd Z#e"edd Z#e"edd Z#e"edd Z#e"edd Z#dd Z%e"edd Z#e"edd Z#e"e	dd Z#e"edd Z#e"e
dd Z#e"edd Z#e$eeeed d Z#e"ed!d Z#e"ed"d Z#e"ed#d Z#e"ed$d Z#e"ed%d Z#e "ed&d Z#e "ed'd Z#d(S ))zD
Handlers for keys related to number theory: prime, even, odd, etc.
    )Qask)AddBasicExprFloatMulPowS)ImaginaryUnitInfinityIntegerNaNNegativeInfinityNumberSymbolRational)Absimreisprime)MDNotImplementedError   )PrimePredicateCompositePredicateEvenPredicateOddPredicatec                 C   sX   |  t }zt|  }| | ddu rtW n
 ty#   Y dS w |r*t|S d S )Nr   F)Zatomsr   introundequals	TypeErrorr   )exprassumptionsexacti r%   D/usr/lib/python3/dist-packages/sympy/assumptions/handlers/ntheory.py_PrimePredicate_number   s   r'   c                 C      | j }|d u r	t|S N)Zis_primer   r!   r"   retr%   r%   r&   _"      r,   c                 C      | j rt| |S d S r)   )	is_numberr'   r!   r"   r%   r%   r&   r,   )      
c                 C   sT   | j rt| |S | jD ]}tt||s d S q| jD ]}|j r'|jr' dS qd S NF)r/   r'   argsr   r   integeris_composite)r!   r"   argr%   r%   r&   r,   .   s   


c                 C   s@   | j rt| |S tt| j|rtt| j|rdS dS dS )z(
    Integer**Integer     -> !Prime
    FN)r/   r'   r   r   r4   expbaser0   r%   r%   r&   r,   9   s   
c                 C   s   t | S r)   r   r0   r%   r%   r&   r,   D   s   c                 C      dS r2   r%   r0   r%   r%   r&   r,   H      c                 C   
   t | |S r)   r'   r0   r%   r%   r&   r,   L      
c                 C   r;   r)   r<   r0   r%   r%   r&   r,   P   r=   c                 C      d S r)   r%   r0   r%   r%   r&   r,   T   r:   c                 C   r(   r)   )r5   r   r*   r%   r%   r&   r,   [   r-   c                 C   s`   t t| |}|r.t t| |}|r,t t| |}|d u r"d S | dr)dS | S |S |S )N   F)r   r   positiver4   Zprimer   )r!   r"   Z	_positive_integerZ_primer%   r%   r&   r,   b   s   
c                 C   sV   zt |  }| | dstW n
 ty   Y dS w t| ttfr%dS |d dkS )Nr   Fr   )r   r   r   r    
isinstancefloatr   )r!   r"   r$   r%   r%   r&   _EvenPredicate_numberx   s   rD   c                 C   r(   r)   )Zis_evenr   r*   r%   r%   r&   r,      r-   c                 C   r.   r)   )r/   rD   r0   r%   r%   r&   r,      r1   c                 C   s   | j rt| |S d\}}}}| jD ]J}tt||rFtt||r&d}n3tt||r3|d7 }n&|sE|dkrEtt|| |rEd}ntt||rV|rS dS d}n dS |}q|r`dS |rddS |t	| jkrmdS dS )z
    Even * Integer    -> Even
    Even * Odd        -> Even
    Integer * Odd     -> ?
    Odd * Odd         -> Odd
    Even * Even       -> Even
    Integer * Integer -> Even if Integer + Integer = Odd
    otherwise         -> ?
    )Fr   Fr?   Tr?   FN)
r/   rD   r3   r   r   r4   evenodd
irrationallen)r!   r"   rE   rF   rG   Zaccr6   r%   r%   r&   r,      s4   


c                 C   sR   | j rt| |S d}| jD ]}tt||rqtt||r$| }q dS |S )zM
    Even + Odd  -> Odd
    Even + Even -> Even
    Odd  + Odd  -> Even

    TN)r/   rD   r3   r   r   rE   rF   )r!   r"   Z_resultr6   r%   r%   r&   r,      s   

c                 C   s   | j rt| |S tt| j|r=tt| j|r#tt| j|S tt	| j t
| j@ |r5dS | jtju r?dS d S d S r2   )r/   rD   r   r   r4   r7   r@   rE   r8   negativerF   r
   ZNegativeOner0   r%   r%   r&   r,      s   
 c                 C   s   t | jd@  S )Nr?   )boolpr0   r%   r%   r&   r,      s   c                 C   r9   r2   r%   r0   r%   r%   r&   r,      r:   c                 C   r;   r)   )rD   r0   r%   r%   r&   r,      r=   c                 C   0   t t| jd |rt t| jd |S d S Nr   r   r   realr3   rE   r0   r%   r%   r&   r,         c                 C   rL   rM   rN   r0   r%   r%   r&   r,      rP   c                 C   s   t t| jd |rdS d S )Nr   T)r   r   rO   r3   r0   r%   r%   r&   r,      s   c                 C   r>   r)   r%   r0   r%   r%   r&   r,      r:   c                 C   r(   r)   )Zis_oddr   r*   r%   r%   r&   r,      r-   c                 C   s:   t t| |}|rt t| |}|d u rd S | S |S r)   )r   r   r4   rE   )r!   r"   rA   Z_evenr%   r%   r&   r,     s   N)&__doc__Zsympy.assumptionsr   r   Z
sympy.corer   r   r   r   r   r	   r
   Zsympy.core.numbersr   r   r   r   r   r   r   Zsympy.functionsr   r   r   Zsympy.ntheoryr   Zsympy.multipledispatchr   Zpredicates.ntheoryr   r   r   r   r'   registerr,   Zregister_manyrD   r%   r%   r%   r&   <module>   sx    $$















(









