a
    SG5dÙ  ã                   @   sh   d dl mZmZ d dlZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZeƒ Zeƒ Z	dS )é    )ÚBasicÚIntegerNc                   @   sP   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú
OmegaPowerzÙ
    Represents ordinal exponential and multiplication terms one of the
    building blocks of the :class:`Ordinal` class.
    In ``OmegaPower(a, b)``, ``a`` represents exponent and ``b`` represents multiplicity.
    c                 C   sN   t |tƒrt|ƒ}t |tƒr$|dkr,tdƒ‚t |tƒs@t |¡}t | ||¡S )Nr   z'multiplicity must be a positive integer)Ú
isinstanceÚintr   Ú	TypeErrorÚOrdinalÚconvertr   Ú__new__)ÚclsÚaÚb© r   úO/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/sets/ordinals.pyr
      s    


zOmegaPower.__new__c                 C   s
   | j d S ©Nr   ©Úargs©Úselfr   r   r   Úexp   s    zOmegaPower.expc                 C   s
   | j d S ©Né   r   r   r   r   r   Úmult   s    zOmegaPower.multc                 C   s,   | j |j kr|| j|jƒS || j |j ƒS d S ©N)r   r   )r   ÚotherÚopr   r   r   Ú_compare_term   s    zOmegaPower._compare_termc                 C   s<   t |tƒs0ztd|ƒ}W n ty.   t Y S 0 | j|jkS r   )r   r   r   ÚNotImplementedr   ©r   r   r   r   r   Ú__eq__$   s    

zOmegaPower.__eq__c                 C   s
   t  | ¡S r   )r   Ú__hash__r   r   r   r   r    ,   s    zOmegaPower.__hash__c                 C   s>   t |tƒs0ztd|ƒ}W n ty.   t Y S 0 |  |tj¡S r   )r   r   r   r   r   ÚoperatorÚltr   r   r   r   Ú__lt__/   s    

zOmegaPower.__lt__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Úpropertyr   r   r   r   r    r#   r   r   r   r   r      s   

r   c                       sØ   e Zd ZdZ‡ fdd„Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
ed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eZd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Z‡  ZS )*r   a  
    Represents ordinals in Cantor normal form.

    Internally, this class is just a list of instances of OmegaPower.

    Examples
    ========
    >>> from sympy import Ordinal, 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                    sR   t ƒ j| g|¢R Ž }dd„ |jD ƒ‰ t‡ fdd„ttˆ ƒd ƒD ƒƒsNtdƒ‚|S )Nc                 S   s   g | ]
}|j ‘qS r   )r   ©Ú.0Úir   r   r   Ú
<listcomp>S   ó    z#Ordinal.__new__.<locals>.<listcomp>c                 3   s"   | ]}ˆ | ˆ |d   kV  qdS )r   Nr   r)   ©Úpowersr   r   Ú	<genexpr>T   r-   z"Ordinal.__new__.<locals>.<genexpr>r   z"powers must be in decreasing order)Úsuperr
   r   ÚallÚrangeÚlenÚ
ValueError)r   ÚtermsÚobj©Ú	__class__r.   r   r
   Q   s
    "zOrdinal.__new__c                 C   s   | j S r   r   r   r   r   r   r6   X   s    zOrdinal.termsc                 C   s   | t krtdƒ‚| jd S )Nz ordinal zero has no leading termr   ©Úord0r5   r6   r   r   r   r   Úleading_term\   s    zOrdinal.leading_termc                 C   s   | t krtdƒ‚| jd S )Nz!ordinal zero has no trailing terméÿÿÿÿr:   r   r   r   r   Útrailing_termb   s    zOrdinal.trailing_termc                 C   s(   z| j jtkW S  ty"   Y dS 0 d S ©NF©r>   r   r;   r5   r   r   r   r   Úis_successor_ordinalh   s    zOrdinal.is_successor_ordinalc                 C   s*   z| j jtk W S  ty$   Y dS 0 d S r?   r@   r   r   r   r   Úis_limit_ordinalo   s    zOrdinal.is_limit_ordinalc                 C   s   | j jS r   )r<   r   r   r   r   r   Údegreev   s    zOrdinal.degreec                 C   s   |dkrt S ttd|ƒƒS r   )r;   r   r   )r   Zinteger_valuer   r   r   r	   z   s    zOrdinal.convertc                 C   s<   t |tƒs0zt |¡}W n ty.   t Y S 0 | j|jkS r   )r   r   r	   r   r   r6   r   r   r   r   r   €   s    

zOrdinal.__eq__c                 C   s
   t | jƒS r   )Úhashr   r   r   r   r   r    ˆ   s    zOrdinal.__hash__c                 C   sp   t |tƒs0zt |¡}W n ty.   t Y S 0 t| j|jƒD ]\}}||kr>||k   S q>t| jƒt|jƒk S r   )r   r   r	   r   r   Úzipr6   r4   )r   r   Z	term_selfZ
term_otherr   r   r   r#   ‹   s    

zOrdinal.__lt__c                 C   s   | |kp| |k S r   r   r   r   r   r   Ú__le__–   s    zOrdinal.__le__c                 C   s
   | |k S r   r   r   r   r   r   Ú__gt__™   s    zOrdinal.__gt__c                 C   s
   | |k  S r   r   r   r   r   r   Ú__ge__œ   s    zOrdinal.__ge__c                 C   s¾   d}d}| t krdS | jD ]ž}|r*|d7 }|jt krD|t|jƒ7 }nJ|jdkrX|d7 }n6t|jjƒdksp|jjr€|d|j 7 }n|d|j 7 }|jdks°|jt ks°|d	|j 7 }|d7 }q|S )
NÚ r   r;   z + r   Úwzw**(%s)zw**%sz*%s)r;   r6   r   Ústrr   r4   rB   )r   Znet_strZ
plus_countr+   r   r   r   Ú__str__Ÿ   s$    




zOrdinal.__str__c                 C   sò   t |tƒs0zt |¡}W n ty.   t Y S 0 |tkr<| S t| jƒ}t|jƒ}t|ƒd }|j	}|dkr‚|| j
|k r‚|d8 }qb|dk r|}nZ|| j
|krÖt||| j|jj ƒ}|d |… |g |dd …  }n|d |d … | }t|Ž S )Nr   r   )r   r   r	   r   r   r;   Úlistr6   r4   rC   r   r   r   r<   )r   r   Za_termsZb_termsÚrZb_expr6   Zsum_termr   r   r   Ú__add__¹   s(    




 zOrdinal.__add__c                 C   s8   t |tƒs0zt |¡}W n ty.   t Y S 0 ||  S r   ©r   r   r	   r   r   r   r   r   r   Ú__radd__Ð   s    

zOrdinal.__radd__c                 C   sä   t |tƒs0zt |¡}W n ty.   t Y S 0 t| |fv r@tS | j}| jj}g }|j	r~|j
D ]}| t||j |jƒ¡ q^n^|j
d d… D ]}| t||j |jƒ¡ qŒ|jj}| t||| ƒ¡ |t| j
dd … ƒ7 }t|Ž S )Nr=   r   )r   r   r	   r   r   r;   rC   r<   r   rB   r6   Úappendr   r   r>   rM   )r   r   Za_expZa_multÚ	summationÚargZb_multr   r   r   Ú__mul__Ø   s&    


zOrdinal.__mul__c                 C   s8   t |tƒs0zt |¡}W n ty.   t Y S 0 ||  S r   rP   r   r   r   r   Ú__rmul__ï   s    

zOrdinal.__rmul__c                 C   s   | t kstS tt|dƒƒS r   )Úomegar   r   r   r   r   r   r   Ú__pow__÷   s    zOrdinal.__pow__)r$   r%   r&   r'   r
   r(   r6   r<   r>   rA   rB   rC   Úclassmethodr	   r   r    r#   rF   rG   rH   rL   Ú__repr__rO   rQ   rU   rV   rX   Ú__classcell__r   r   r8   r   r   8   s:   






r   c                   @   s   e Zd ZdZdS )ÚOrdinalZerozDThe ordinal zero.

    OrdinalZero can be imported as ``ord0``.
    N)r$   r%   r&   r'   r   r   r   r   r\   ý   s   r\   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚOrdinalOmegazê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  | ¡S r   )r   r
   )r   r   r   r   r
     s    zOrdinalOmega.__new__c                 C   s   t ddƒfS r   )r   r   r   r   r   r6     s    zOrdinalOmega.termsN)r$   r%   r&   r'   r
   r(   r6   r   r   r   r   r]     s   r]   )
Ú
sympy.corer   r   r!   r   r   r\   r]   r;   rW   r   r   r   r   Ú<module>   s   3 F