
    MZd-                     l   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
 Z! ejD                  e      d        Z# ejD                  e      d        Z# ejD                  e	      d        Z# ejD                  e
      d        Z# ejD                  e      d        Z# ejH                  eeee      d        Z# ejD                  e      d        Z# ejD                  e      d        Z# ejD                  e      d        Z# ejD                  e      d        Z# ejD                  e      d        Z#d Z% ejD                  e      d        Z# ejD                  e      d        Z# ejD                  e	      d        Z# ejD                  e      d        Z# ejD                  e
      d        Z# ejD                  e      d        Z# ejH                  eeee      d        Z# ejD                  e      d        Z# ejD                  e      d        Z# ejD                  e      d         Z# ejD                  e      d!        Z# ejD                  e      d"        Z# e jD                  e      d#        Z# e jD                  e      d$        Z#y%)&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                     | j                  t               }	 t        | j                               }| |z
  j	                  d      du rt
        	 |rt        |      S y # t
        $ r Y yw xY w)Nr   F)atomsr   introundequals	TypeErrorr   )exprassumptionsexactis       D/usr/lib/python3/dist-packages/sympy/assumptions/handlers/ntheory.py_PrimePredicate_numberr)      sq    

5!!E

1HQ5(O ) qz   s   5A 	A('A(c                 .    | j                   }|t        |S N)is_primer   r$   r%   rets      r(   _r/   "   s    
--C
{##J    c                 4    | j                   rt        | |      S y r+   )	is_numberr)   r$   r%   s     r(   r/   r/   )   s    ~~%dK88 r0   c                     | j                   rt        | |      S | j                  D ]#  }t        t	        j
                  |      |      r# y  | j                  D ]  }|j                   s|j                  s y y NF)r2   r)   argsr   r   integeris_composite)r$   r%   args      r(   r/   r/   .   se    ~~%dK88yy 199S>;/ yy ==S--r0   c                     | j                   rt        | |      S t        t        j                  | j
                        |      r+t        t        j                  | j                        |      ryyy)z(
    Integer**Integer     -> !Prime
    FN)r2   r)   r   r   r7   expbaser3   s     r(   r/   r/   9   sS    
 ~~%dK88
199TXX,		$))$k2 3 -r0   c                     t        |       S r+   r   r3   s     r(   r/   r/   D   s    4=r0   c                      yr5    r3   s     r(   r/   r/   H       r0   c                     t        | |      S r+   r)   r3   s     r(   r/   r/   L       !$44r0   c                     t        | |      S r+   rB   r3   s     r(   r/   r/   P   rC   r0   c                      y r+   r?   r3   s     r(   r/   r/   T       r0   c                 .    | j                   }|t        |S r+   )r8   r   r-   s      r(   r/   r/   [   s    


C
{##Jr0   c                     t        t        j                  |       |      }|rZt        t        j                  |       |      }|r7t        t        j                  |       |      }|y | j                  d      ry| S |S |S )N   F)r   r   positiver7   primer"   )r$   r%   	_positive_integer_primes        r(   r/   r/   b   sp    AJJt$k2Iqyy44F~ {{1~:Or0   c                     	 t        | j                               }| |z
  j                  d      st        	 t	        | t
        t        f      ry|dz  dk(  S # t        $ r Y yw xY w)Nr   Fr   )r    r!   r"   r#   
isinstancefloatr   )r$   r%   r'   s      r(   _EvenPredicate_numberrR   x   sh    

q  #O $ $'q5A:	  s   3A 	A! A!c                 .    | j                   }|t        |S r+   )is_evenr   r-   s      r(   r/   r/      s    
,,C
{##Jr0   c                 4    | j                   rt        | |      S y r+   )r2   rR   r3   s     r(   r/   r/      s    ~~$T;77 r0   c                    | j                   rt        | |      S d\  }}}}| j                  D ]  }t        t	        j
                  |      |      rst        t	        j                  |      |      rd}nyt        t	        j                  |      |      r|dz  }nT|sR|dk7  rMt        t	        j                  ||z         |      r+d}n(t        t	        j                  |      |      r|r yd}n y|} |ry|ry|t        | j                        k(  ryy)z
    Even * Integer    -> Even
    Even * Odd        -> Even
    Integer * Odd     -> ?
    Odd * Odd         -> Odd
    Even * Even       -> Even
    Integer * Integer -> Even if Integer + Integer = Odd
    otherwise         -> ?
    )Fr   FrI   TrI   FN)
r2   rR   r6   r   r   r7   evenodd
irrationallen)r$   r%   rW   rX   rY   accr9   s          r(   r/   r/      s     ~~$T;77!3D#z3yy qyy~{+166#;,QUU3Z-qcQhquuS3Y'5Dc"K0 J%( #dii.  !r0   c                     | j                   rt        | |      S d}| j                  D ]F  }t        t	        j
                  |      |      r#t        t	        j                  |      |      r| }F y |S )zM
    Even + Odd  -> Odd
    Even + Even -> Even
    Odd  + Odd  -> Even

    TN)r2   rR   r6   r   r   rW   rX   )r$   r%   _resultr9   s       r(   r/   r/      sh     ~~$T;77Gyy qvvc{K(s[)!kG r0   c                    | j                   rt        | |      S t        t        j                  | j
                        |      rt        t        j                  | j
                        |      r)t        t        j                  | j                        |      S t        t        j                  | j
                         t        j                  | j                        z  |      ry| j                  t        j                  u ryy y r5   )r2   rR   r   r   r7   r;   rJ   rW   r<   negativerX   r   NegativeOner3   s     r(   r/   r/      s    ~~$T;77
199TXX,qzz$((#[1qvvdii(+66!**TXX&&tyy)99;GYY!--' ( -r0   c                 4    t        | j                  dz         S )NrI   )boolpr3   s     r(   r/   r/      s    DFFQJr0   c                      yr5   r?   r3   s     r(   r/   r/      r@   r0   c                     t        | |      S r+   )rR   r3   s     r(   r/   r/      s     {33r0   c                     t        t        j                  | j                  d         |      r,t        t        j                  | j                  d         |      S y Nr   r   r   realr6   rW   r3   s     r(   r/   r/      @    
166$))A,-166$))A,'55 .r0   c                     t        t        j                  | j                  d         |      r,t        t        j                  | j                  d         |      S y rg   rh   r3   s     r(   r/   r/      rj   r0   c                 ^    t        t        j                  | j                  d         |      ryy )Nr   T)r   r   ri   r6   r3   s     r(   r/   r/      s%    
166$))A,- .r0   c                      y r+   r?   r3   s     r(   r/   r/      rF   r0   c                 .    | j                   }|t        |S r+   )is_oddr   r-   s      r(   r/   r/      s    
++C
{##Jr0   c                     t        t        j                  |       |      }|r%t        t        j                  |       |      }|y | S |S r+   )r   r   r7   rW   )r$   r%   rM   _evens       r(   r/   r/     sB    199T?K0HAFF4L+.=yOr0   N)&__doc__sympy.assumptionsr   r   
sympy.corer   r   r   r   r	   r
   r   sympy.core.numbersr   r   r   r   r   r   r   sympy.functionsr   r   r   sympy.ntheoryr   sympy.multipledispatchr   predicates.ntheoryr   r   r   r   r)   registerr/   register_manyrR   r?   r0   r(   <module>r|      s   % ; ; ;. . . ' ' ! 8! !
   9  9     ! " h2BMR S 5  5 &5 '5   T" # U# $*
   8 8 & &P  ( 	 	    !  Xx1A=Q R %4 &4 6 6 6 6     t  u r0   