
    sg                         d dl mZmZ d dlZ G d de      Z G d de      Z G d de      Z G d	 d
e      Z e       Z e       Z	y)    )BasicIntegerNc                   N    e Zd ZdZd Zed        Zed        Zd Zd Z	d Z
d Zy	)

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                     t        |t              rt        |      }t        |t              r|dk  rt        d      t        |t              st        j                  |      }t        j                  | ||      S )Nr   z'multiplicity must be a positive integer)
isinstanceintr   	TypeErrorOrdinalconvertr   __new__)clsabs      F/var/www/html/venv/lib/python3.12/site-packages/sympy/sets/ordinals.pyr   zOmegaPower.__new__   s\    a
A!W%aEFF!W%"A}}S!Q''    c                      | j                   d   S Nr   argsselfs    r   expzOmegaPower.exp       yy|r   c                      | j                   d   S N   r   r   s    r   multzOmegaPower.mult   r   r   c                     | j                   |j                   k(  r || j                  |j                        S  || j                   |j                         S N)r   r   )r   otherops      r   _compare_termzOmegaPower._compare_term   s<    88uyy dii,,dhh		**r   c                     t        |t              s	 t        d|      }| j                  |j                  k(  S # t        $ r	 t        cY S w xY wr   )r   r   r
   NotImplementedr   r   r!   s     r   __eq__zOmegaPower.__eq__$   sI    %,&"1e, yyEJJ&&  &%%&s   7 A	A	c                 ,    t        j                  |       S r    )r   __hash__r   s    r   r)   zOmegaPower.__hash__,   s    ~~d##r   c                     t        |t              s	 t        d|      }| j	                  |t
        j                        S # t        $ r	 t        cY S w xY wr   )r   r   r
   r%   r#   operatorltr&   s     r   __lt__zOmegaPower.__lt__/   sM    %,&"1e, !!%55  &%%&s   > AAN)__name__
__module____qualname____doc__r   propertyr   r   r#   r'   r)   r-    r   r   r   r      sH    
	(    +'$6r   r   c                        e Zd ZdZ fdZe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 x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                     t        |   | g| }|j                  D cg c]  }|j                   c}t	        fdt        t              dz
        D              st        d      |S c c}w )Nc              3   :   K   | ]  }|   |d z      k\    yw)r   Nr3   ).0ipowerss     r   	<genexpr>z"Ordinal.__new__.<locals>.<genexpr>T   s"     L6!9qs+Ls   r   z"powers must be in decreasing order)superr   r   r   allrangelen
ValueError)r   termsobjr8   r9   	__class__s       @r   r   zOrdinal.__new__Q   s_    goc*E*!$*A!%%*LU3v;?5KLLABB
 +s   A-c                     | j                   S r    r   r   s    r   r@   zOrdinal.termsX   s    yyr   c                 H    | t         k(  rt        d      | j                  d   S )Nz ordinal zero has no leading termr   ord0r?   r@   r   s    r   leading_termzOrdinal.leading_term\   s#    4<?@@zz!}r   c                 H    | t         k(  rt        d      | j                  d   S )Nz!ordinal zero has no trailing termrE   r   s    r   trailing_termzOrdinal.trailing_termb   s#    4<@AAzz"~r   c                 \    	 | j                   j                  t        k(  S # t        $ r Y yw xY wNFrJ   r   rF   r?   r   s    r   is_successor_ordinalzOrdinal.is_successor_ordinalh   s0    	%%))T11 		s    	++c                 ^    	 | j                   j                  t        k(   S # t        $ r Y yw xY wrL   rM   r   s    r   is_limit_ordinalzOrdinal.is_limit_ordinalo   s3    	))--555 		s     	,,c                 .    | j                   j                  S r    )rG   r   r   s    r   degreezOrdinal.degreev   s      $$$r   c                 B    |dk(  rt         S t        t        d|            S r   )rF   r   r   )r   integer_values     r   r   zOrdinal.convertz   s!    AKz!]344r   c                     t        |t              s	 t        j                  |      }| j
                  |j
                  k(  S # t        $ r	 t        cY S w xY wr    )r   r   r   r
   r%   r@   r&   s     r   r'   zOrdinal.__eq__   sK    %)&. zzU[[((  &%%&s   A   AAc                 ,    t        | j                        S r    )hashr   r   s    r   r)   zOrdinal.__hash__   s    DIIr   c                 6   t        |t              s	 t        j                  |      }t        | j                  |j                        D ]  \  }}||k7  s||k  c S  t        | j                        t        |j                        k  S # t        $ r	 t        cY S w xY wr    )r   r   r   r
   r%   zipr@   r>   )r   r!   	term_self
term_others       r   r-   zOrdinal.__lt__   s    %)&. &)U[[%A 	.!IzJ& :--	. 4::U[[!111  &%%&s   B BBc                     | |k(  xs | |k  S r    r3   r&   s     r   __le__zOrdinal.__le__   s    -.r   c                     | |k   S r    r3   r&   s     r   __gt__zOrdinal.__gt__   s    5=  r   c                     | |k   S r    r3   r&   s     r   __ge__zOrdinal.__ge__   s    %<r   c                     d}d}| t         k(  ry| j                  D ]  }|r|dz  }|j                  t         k(  r|t        |j                        z  }nr|j                  dk(  r|dz  }n]t        |j                  j                        dkD  s|j                  j                  r|d|j                  z  z  }n|d|j                  z  z  }|j                  dk(  s%|j                  t         k(  s|d	|j                  z  z  }|dz  } |S )
N r   rF   z + r   wzw**(%s)zw**%sz*%s)rF   r@   r   strr   r>   rP   )r   net_str
plus_countr8   s       r   __str__zOrdinal.__str__   s    
4< 	A5 uu}3qvv;&!3QUU[[!A%)?)?9QUU?*7155=(66Q;quu}5<'!OJ!	" r   c                 t   t        |t              s	 t        j                  |      }|t
        k(  r| S t        | j                        }t        |j                        }t        |      dz
  }|j                  }|dk\  r/||   j                  |k  r|dz  }|dk\  r||   j                  |k  r|dk  r
|}t        | S ||   j                  |k(  rGt        |||   j                  |j                  j                  z         }|d | |gz   |dd  z   }t        | S |d |dz    |z   }t        | S # t        $ r	 t        cY S w xY w)Nr   r   )r   r   r   r
   r%   rF   listr@   r>   rR   r   r   r   rG   )r   r!   a_termsb_termsrb_expr@   sum_terms           r   __add__zOrdinal.__add__   sF   %)&. D=Ktzz"u{{#L11f%/FA 1f%/q5E  QZ^^u$!%5;M;M;R;R)RSHBQK8*,wqr{:E  DQqSMG+E#  &%%&s   D% %D76D7c                     t        |t              s	 t        j                  |      }|| z   S || z   S # t        $ r	 t        cY S w xY wr    r   r   r   r
   r%   r&   s     r   __radd__zOrdinal.__radd__   K    %)&. t|ut|  &%%&   1 AAc                    t        |t              s	 t        j                  |      }t
        | |fv rt
        S | j                  }| j                  j                  }g }|j                  rK|j                  D ]4  }|j                  t        ||j                  z   |j                               6 t        | S |j                  d d D ]4  }|j                  t        ||j                  z   |j                               6 |j                  j                  }|j                  t        |||z               |t        | j                  dd        z  }t        | S # t        $ r	 t        cY S w xY w)NrI   r   )r   r   r   r
   r%   rF   rR   rG   r   rP   r@   appendr   r   rJ   rj   )r   r!   a_expa_mult	summationargb_mults          r   __mul__zOrdinal.__mul__   sA   %)&. D%= K""''	!!{{ H  ECGGOSXX!FGH 	"" {{3B' H  ECGGOSXX!FGH((--FZvf}=>djjn--I	""#  &%%&s   E E! E!c                     t        |t              s	 t        j                  |      }|| z  S || z  S # t        $ r	 t        cY S w xY wr    rr   r&   s     r   __rmul__zOrdinal.__rmul__   rt   ru   c                 J    | t         k(  st        S t        t        |d            S r   )omegar%   r   r   r&   s     r   __pow__zOrdinal.__pow__   s!    u}!!z%+,,r   )r.   r/   r0   r1   r   r2   r@   rG   rJ   rN   rP   rR   classmethodr   r'   r)   r-   r]   r_   ra   rh   __repr__rp   rs   r}   r   r   __classcell__)rB   s   @r   r   r   8   s    0    
  
     % % 5 5
)	2/! 0 H.#.-r   r   c                       e Zd ZdZy)OrdinalZerozDThe ordinal zero.

    OrdinalZero can be imported as ``ord0``.
    N)r.   r/   r0   r1   r3   r   r   r   r      s     	r   r   c                   &    e Zd ZdZd Zed        Zy)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                 ,    t         j                  |       S r    )r   r   )r   s    r   r   zOrdinalOmega.__new__  s    s##r   c                     t        dd      fS r   )r   r   s    r   r@   zOrdinalOmega.terms  s    1a ""r   N)r.   r/   r0   r1   r   r2   r@   r3   r   r   r   r     s     
$ # #r   r   )

sympy.corer   r   r+   r   r   r   r   rF   r   r3   r   r   <module>r      sO    % 06 06fB-e B-J	' 	#7 #( }r   