o
    oh                     @   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   g/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/sets/ordinals.pyr
      s   


zOmegaPower.__new__c                 C   
   | j d S Nr   argsselfr   r   r   exp      
zOmegaPower.expc                 C   r   N   r   r   r   r   r   mult   r   zOmegaPower.multc                 C   s(   | j |j kr|| j|jS || j |j S N)r   r   )r   otheropr   r   r   _compare_term   s   zOmegaPower._compare_termc                 C   s<   t |tsztd|}W n ty   t Y S w | j|jkS r   )r   r   r   NotImplementedr   r   r   r   r   r   __eq__$      
zOmegaPower.__eq__c                 C   
   t | S r   )r   __hash__r   r   r   r   r$   ,      
zOmegaPower.__hash__c                 C   s>   t |tsztd|}W n ty   t Y S w | |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 s't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.   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__r2   r   r
   Q   s
   "zOrdinal.__new__c                 C   s   | j S r   r   r   r   r   r   r:   X   s   zOrdinal.termsc                 C      | t krtd| jd S )Nz ordinal zero has no leading termr   ord0r9   r:   r   r   r   r   leading_term\      
zOrdinal.leading_termc                 C   r>   )Nz!ordinal zero has no trailing termr?   r   r   r   r   trailing_termb   rB   zOrdinal.trailing_termc                 C   s$   z| j jtkW S  ty   Y dS w NFrD   r   r@   r9   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 w rE   rF   r   r   r   r   is_limit_ordinalo   s
   zOrdinal.is_limit_ordinalc                 C   s   | j jS r   )rA   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   integer_valuer   r   r   r	   z   s   zOrdinal.convertc                 C   s<   t |tszt|}W n ty   t Y S w | j|jkS r   )r   r   r	   r   r   r:   r    r   r   r   r!      r"   zOrdinal.__eq__c                 C   s
   t | jS r   )hashr   r   r   r   r   r$      r%   zOrdinal.__hash__c                 C   sp   t |tszt|}W n ty   t Y S w t| j|jD ]\}}||kr-||k   S qt| jt|jk S r   )r   r   r	   r   r   zipr:   r8   )r   r   	term_self
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__   r%   zOrdinal.__gt__c                 C   s
   | |k  S r   r   r    r   r   r   __ge__   r%   zOrdinal.__ge__c                 C   s   d}d}| t kr
dS | jD ]O}|r|d7 }|jt kr"|t|j7 }n%|jdkr,|d7 }nt|jjdks8|jjr@|d|j 7 }n|d|j 7 }|jdksX|jt ksX|d	|j 7 }|d7 }q|S )
N r   r@   z + r   wzw**(%s)zw**%sz*%s)r@   r:   r   strr   r8   rH   )r   net_str
plus_countr0   r   r   r   __str__   s$   




zOrdinal.__str__c                 C   s  t |tszt|}W n ty   t Y S w |tkr| S t| j}t|j}t|d }|j	}|dkrK|| j
|k rK|d8 }|dkrK|| j
|k s<|dk rU|}t| S || j
|kr{t||| j|jj }|d | |g |dd   }t| S |d |d  | }t| S )Nr   r   )r   r   r	   r   r   r@   listr:   r8   rI   r   r   r   rA   )r   r   a_termsb_termsrb_expr:   sum_termr   r   r   __add__   s0   


zOrdinal.__add__c                 C   s>   t |tsz
t|}W ||  S  ty   t Y S w ||  S r   r   r   r	   r   r   r    r   r   r   __radd__      
zOrdinal.__radd__c                 C   s   t |tszt|}W n ty   t Y S w t| |fv r tS | j}| jj}g }|j	rB|j
D ]}|t||j |j q/t| S |j
d d D ]}|t||j |j qI|jj}|t|||  |t| j
dd  7 }t| S )NrC   r   )r   r   r	   r   r   r@   rI   rA   r   rH   r:   appendr   r   rD   rX   )r   r   a_expa_mult	summationargb_multr   r   r   __mul__   s*   

zOrdinal.__mul__c                 C   s>   t |tsz
t|}W ||  S  ty   t Y S w ||  S r   r_   r    r   r   r   __rmul__   ra   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-   r:   rA   rD   rG   rH   rI   classmethodr	   r!   r$   r(   rO   rP   rQ   rW   __repr__r^   r`   rh   ri   rk   __classcell__r   r   r<   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   ro      s    ro   c                   @   s$   e Zd ZdZdd Zedd ZdS )OrdinalOmegazThe 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   r#   r   )r   r
   )r   r   r   r   r
     r%   zOrdinalOmega.__new__c                 C   s   t ddfS r   )r   r   r   r   r   r:     s   zOrdinalOmega.termsN)r)   r*   r+   r,   r
   r-   r:   r   r   r   r   rp     s
    rp   )

sympy.corer   r   r&   r   r   ro   rp   r@   rj   r   r   r   r   <module>   s    3 F
