U
    ˜9%eÙ  ã                   @   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   úR/var/www/html/Darija-Ai-API/env/lib/python3.8/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ƒs2ztd|ƒ}W n tk
r0   t Y S X | 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ƒs2ztd|ƒ}W n tk
r0   t Y S X |  |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                    sP   t ƒ j| f|žŽ }dd„ |jD ƒ‰ t‡ fdd„ttˆ ƒd ƒD ƒƒsLtdƒ‚|S )Nc                 S   s   g | ]
}|j ‘qS r   )r   ©Ú.0Úir   r   r   Ú
<listcomp>S   s     z#Ordinal.__new__.<locals>.<listcomp>c                 3   s"   | ]}ˆ | ˆ |d   kV  qdS )r   Nr   r)   ©Zpowersr   r   Ú	<genexpr>T   s     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   r4   X   s    zOrdinal.termsc                 C   s   | t krtdƒ‚| jd S )Nz ordinal zero has no leading termr   ©Úord0r3   r4   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éÿÿÿÿr8   r   r   r   r   Útrailing_termb   s    zOrdinal.trailing_termc                 C   s*   z| j jtkW S  tk
r$   Y dS X d S ©NF©r<   r   r9   r3   r   r   r   r   Úis_successor_ordinalh   s    zOrdinal.is_successor_ordinalc                 C   s,   z| j jtk W S  tk
r&   Y dS X 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   )r9   r   r   )r   Zinteger_valuer   r   r   r	   z   s    zOrdinal.convertc                 C   s>   t |tƒs2zt |¡}W n tk
r0   t Y S X | j|jkS r   )r   r   r	   r   r   r4   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   sr   t |tƒs2zt |¡}W n tk
r0   t Y S X t| j|jƒD ]\}}||kr@||k   S q@t| jƒt|jƒk S r   )r   r   r	   r   r   Úzipr4   r2   )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   r9   z + r   Úwzw**(%s)zw**%sz*%s)r9   r4   r   Ústrr   r2   r@   )r   Znet_strZ
plus_countr+   r   r   r   Ú__str__Ÿ   s$    




zOrdinal.__str__c                 C   sô   t |tƒs2zt |¡}W n tk
r0   t Y S X |tkr>| S t| jƒ}t|jƒ}t|ƒd }|j	}|dkr„|| j
|k r„|d8 }qd|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   r9   Úlistr4   r2   rA   r   r   r   r:   )r   r   Za_termsZb_termsÚrZb_expr4   Zsum_termr   r   r   Ú__add__¹   s(    




 zOrdinal.__add__c                 C   s:   t |tƒs2zt |¡}W n tk
r0   t Y S X ||  S r   ©r   r   r	   r   r   r   r   r   r   Ú__radd__Ð   s    

zOrdinal.__radd__c                 C   sæ   t |tƒs2zt |¡}W n tk
r0   t Y S X t| |fkrBt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   r9   rA   r:   r   r@   r4   Úappendr   r   r<   rK   )r   r   Za_expZa_multZ	summationÚargZb_multr   r   r   Ú__mul__Ø   s&    


zOrdinal.__mul__c                 C   s:   t |tƒs2zt |¡}W n tk
r0   t Y S X ||  S r   rN   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(   r4   r:   r<   r?   r@   rA   Úclassmethodr	   r   r    r#   rD   rE   rF   rJ   Ú__repr__rM   rO   rR   rS   rU   Ú__classcell__r   r   r6   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   rY   ý   s   rY   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   r4     s    zOrdinalOmega.termsN)r$   r%   r&   r'   r
   r(   r4   r   r   r   r   rZ     s   rZ   )
Z
sympy.corer   r   r!   r   r   rY   rZ   r9   rT   r   r   r   r   Ú<module>   s   3 F