ó
¡¼™\c           @   s   d  d l  m Z m Z d  d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ e ƒ  Z e ƒ  Z	 d S(   iÿÿÿÿ(   t   Basict   IntegerNt
   OmegaPowerc           B   sY   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z e	 j
 Z
 d „  Z RS(   sÃ   
    Represents ordinal exponential and multiplication terms one of the
    building blocks of the Ordinal class.
    In OmegaPower(a, b) a represents exponent and b represents multiplicity.
    c         C   s}   t  | t ƒ r t | ƒ } n  t  | t ƒ s: | d k rI t d ƒ ‚ n  t  | t ƒ sj t j | ƒ } n  t j |  | | ƒ S(   Ni    s'   multiplicity must be a positive integer(   t
   isinstancet   intR   t	   TypeErrort   Ordinalt   convertR    t   __new__(   t   clst   at   b(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   
   s    c         C   s   |  j  d S(   Ni    (   t   args(   t   self(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   exp   s    c         C   s   |  j  d S(   Ni   (   R   (   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   mult   s    c         C   s<   |  j  | j  k r% | |  j | j ƒ S| |  j  | j  ƒ Sd  S(   N(   R   R   (   R   t   othert   op(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   _compare_term   s    c         C   sJ   t  | t ƒ s: y t d | ƒ } Wq: t k
 r6 t SXn  |  j | j k S(   Ni    (   R   R   R   t   NotImplementedR   (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __eq__#   s    c         C   sM   t  | t ƒ s: y t d | ƒ } Wq: t k
 r6 t SXn  |  j | t j ƒ S(   Ni    (   R   R   R   R   R   t   operatort   lt(   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __lt__-   s    (   t   __name__t
   __module__t   __doc__R   t   propertyR   R   R   R   R    t   __hash__R   (    (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR      s   				R   c           B   sã   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e
 d „  ƒ Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s  
    Represents ordinals in Cantor normal form.

    Internally, this class is just a list of instances of OmegaPower
    Examples
    ========
    >>> from sympy.sets import Ordinal, ord0, OmegaPower
    >>> from sympy.sets.ordinals import omega
    >>> w = omega
    >>> w.is_limit_ordinal
    True
    >>> Ordinal(OmegaPower(w + 1 ,1), OmegaPower(3, 2))
    w**(w + 1) + w**3*2
    >>> 3 + w
    w
    >>> (w + 1) * w
    w**2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Ordinal_arithmetic
    c            sy   t  t |  ƒ j |  | Œ } g  | j D] } | j ^ q% ‰  t ‡  f d †  t t ˆ  ƒ d ƒ Dƒ ƒ su t d ƒ ‚ n  | S(   Nc         3   s'   |  ] } ˆ  | ˆ  | d  k Vq d S(   i   N(    (   t   .0t   i(   t   powers(    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pys	   <genexpr>P   s    i   s"   powers must be in decreasing order(	   t   superR   R   R   R   t   allt   ranget   lent
   ValueError(   R	   t   termst   objR   (    (   R   s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   M   s
    ,c         C   s&   |  t  k r t d ƒ ‚ n  |  j d S(   Ns    ordinal zero has no leading termi    (   t   ord0R$   R   (   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   leading_termT   s    c         C   s&   |  t  k r t d ƒ ‚ n  |  j d S(   Ns!   ordinal zero has no trailing termiÿÿÿÿ(   R'   R$   R   (   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   trailing_termZ   s    c         C   s-   y |  j  j t k SWn t k
 r( t SXd  S(   N(   R)   R   R'   R$   t   False(   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   is_successor_ordinal`   s    c         C   s.   y |  j  j t k SWn t k
 r) t SXd  S(   N(   R)   R   R'   R$   R*   (   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   is_limit_ordinalg   s    c         C   s
   |  j  j S(   N(   R(   R   (   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   degreen   s    c         C   s#   | d k r t  St t d | ƒ ƒ S(   Ni    (   R'   R   R   (   R	   t   integer_value(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   r   s    c         C   sJ   t  | t ƒ s: y t j | ƒ } Wq: t k
 r6 t SXn  |  j | j k S(   N(   R   R   R   R   R   R   (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   x   s    c         C   s   t  |  j ƒ S(   N(   t   hashR   (   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   €   s    c         C   s’   t  | t ƒ s: y t j | ƒ } Wq: t k
 r6 t SXn  x9 t |  j | j ƒ D]" \ } } | | k rP | | k  SqP Wt |  j ƒ t | j ƒ k  S(   N(   R   R   R   R   R   t   zipR   R#   (   R   R   t	   term_selft
   term_other(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   ƒ   s    "c         C   s   |  | k p |  | k  S(   N(    (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __le__Ž   s    c         C   s   |  | k S(   N(    (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __gt__‘   s    c         C   s   |  | k  S(   N(    (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __ge__”   s    c         C   s  d } d } |  t  k r d Sxì |  j D]á } | r? | d 7} n  | j t  k rd | t | j ƒ 7} ne | j d k r€ | d 7} nI t | j j ƒ d k s¤ | j j r¸ | d | j 7} n | d | j 7} | j d k rý | j t  k rý | d	 | j 7} n  | d 7} q& W| S(
   Nt    i    R'   s    + i   t   ws   w**(%s)s   w**%ss   *%s(   R'   R   R   t   strR   R#   R,   (   R   t   net_strt
   plus_countR   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __str__—   s$    $ c         C   s1  t  | t ƒ s: y t j | ƒ } Wq: t k
 r6 t SXn  | t k rJ |  St |  j ƒ } t | j ƒ } t | ƒ d } | j	 } x- | d k r° | | j
 | k  r° | d 8} q„ W| d k  rÆ | } na | | j
 | k rt | | | j | j j ƒ } | |  | g | d } n | | d  | } t | Œ  S(   Ni   i    (   R   R   R   R   R   R'   t   listR   R#   R-   R   R   R   R(   (   R   R   t   a_termst   b_termst   rt   b_expR%   t   sum_term(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __add__±   s(    	"	 c         C   sB   t  | t ƒ s: y t j | ƒ } Wq: t k
 r6 t SXn  | |  S(   N(   R   R   R   R   R   (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __radd__È   s    c         C   s*  t  | t ƒ s: y t j | ƒ } Wq: t k
 r6 t SXn  t |  | f k rP t S|  j } |  j j } g  } | j	 r« x© | j
 D]& } | j t | | j | j ƒ ƒ q~ Wnu x5 | j
 d  D]& } | j t | | j | j ƒ ƒ q¹ W| j j } | j t | | | ƒ ƒ | t |  j
 d ƒ 7} t | Œ  S(   Niÿÿÿÿi   (   R   R   R   R   R   R'   R-   R(   R   R,   R   t   appendR   R   R)   R<   (   R   R   t   a_expt   a_multt   sumt   argt   b_mult(    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __mul__Ð   s&    		'$c         C   sB   t  | t ƒ s: y t j | ƒ } Wq: t k
 r6 t SXn  | |  S(   N(   R   R   R   R   R   (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __rmul__ç   s    c         C   s#   |  t  k s t St t | d ƒ ƒ S(   Ni   (   t   omegaR   R   R   (   R   R   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   __pow__ï   s    (   R   R   R   R   R   R(   R)   R+   R,   R-   t   classmethodR   R   R   R   R3   R4   R5   R;   t   __repr__RB   RC   RJ   RK   RM   (    (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR   5   s*   												t   OrdinalZeroc           B   s   e  Z d  Z RS(   sD   The ordinal zero.

    OrdinalZero can be imported as ``ord0``.
    (   R   R   R   (    (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyRP   ô   s   t   OrdinalOmegac           B   s   e  Z d  Z d „  Z RS(   sê   The ordinal omega which forms the base of all ordinals in cantor normal form.

    OrdinalOmega can be imported as ``omega``.

    Examples
    ========

    >>> from sympy.sets.ordinals import omega
    >>> omega + omega
    w*2
    c         C   s   t  j |  t d d ƒ ƒ S(   Ni   (   R   R   R   (   R	   (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyR     s    (   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyRQ   û   s   (
   t
   sympy.coreR    R   R   R   R   RP   RQ   R'   RL   (    (    (    s2   lib/python2.7/site-packages/sympy/sets/ordinals.pyt   <module>   s   1¿	