
    Ed                         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	dS )    )BasicIntegerNc                   \    e Zd ZdZd Zed             Zed             Zd Zd Z	d Z
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                 (   t          |t                    rt          |          }t          |t                    r|dk    rt          d          t          |t                    st                              |          }t          j        | ||          S )Nr   z'multiplicity must be a positive integer)
isinstanceintr   	TypeErrorOrdinalconvertr   __new__)clsabs      3lib/python3.11/site-packages/sympy/sets/ordinals.pyr   zOmegaPower.__new__   s    a 	

A!W%% 	Ga 	GEFFF!W%% 	#""A}S!Q'''    c                     | j         d         S Nr   argsselfs    r   expzOmegaPower.exp       y|r   c                     | j         d         S N   r   r   s    r   multzOmegaPower.mult   r   r   c                 z    | j         |j         k    r || j        |j                  S  || j         |j                   S N)r   r   )r   otherops      r   _compare_termzOmegaPower._compare_term   s?    8uy  	+2di,,,2dh	***r   c                     t          |t                    s)	 t          d|          }n# t          $ r
 t          cY S w xY w| j        |j        k    S r   )r   r   r
   NotImplementedr   r   r!   s     r   __eq__zOmegaPower.__eq__$   s`    %,, 	&&"1e,, & & &%%%%&yEJ&&   ( <<c                 *    t          j        |           S r    )r   __hash__r   s    r   r*   zOmegaPower.__hash__,   s    ~d###r   c                     t          |t                    s)	 t          d|          }n# t          $ r
 t          cY S w xY w|                     |t
          j                  S r   )r   r   r
   r%   r#   operatorltr&   s     r   __lt__zOmegaPower.__lt__/   si    %,, 	&&"1e,, & & &%%%%&!!%555r(   N)__name__
__module____qualname____doc__r   propertyr   r   r#   r'   r*   r.    r   r   r   r      s         
	( 	( 	(   X   X+ + +' ' '$ $ $6 6 6 6 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                      j        | g|R  }d |j        D             t          fdt	          t                    dz
            D                       st          d          |S )Nc                     g | ]	}|j         
S r4   )r   ).0is     r   
<listcomp>z#Ordinal.__new__.<locals>.<listcomp>S   s    ***A!%***r   c              3   B   K   | ]}|         |d z            k    V  dS )r   Nr4   )r8   r9   powerss     r   	<genexpr>z"Ordinal.__new__.<locals>.<genexpr>T   s4      LL6!9qs+LLLLLLr   r   z"powers must be in decreasing order)superr   r   allrangelen
ValueError)r   termsobjr<   	__class__s      @r   r   zOrdinal.__new__Q   s    eggoc*E********LLLLU3v;;?5K5KLLLLL 	CABBB
r   c                     | j         S r    r   r   s    r   rC   zOrdinal.termsX   s
    yr   c                 P    | t           k    rt          d          | j        d         S )Nz ordinal zero has no leading termr   ord0rB   rC   r   s    r   leading_termzOrdinal.leading_term\   s*    4< 	A?@@@z!}r   c                 P    | t           k    rt          d          | j        d         S )Nz!ordinal zero has no trailing termrH   r   s    r   trailing_termzOrdinal.trailing_termb   s*    4< 	B@AAAz"~r   c                 P    	 | j         j        t          k    S # t          $ r Y dS w xY wNFrM   r   rI   rB   r   s    r   is_successor_ordinalzOrdinal.is_successor_ordinalh   s:    	%)T11 	 	 	55	s    
%%c                 R    	 | j         j        t          k     S # t          $ r Y dS w xY wrO   rP   r   s    r   is_limit_ordinalzOrdinal.is_limit_ordinalo   s=    	)-555 	 	 	55	s    
&&c                     | j         j        S r    )rJ   r   r   s    r   degreezOrdinal.degreev   s     $$r   c                 V    |dk    rt           S t          t          d|                    S r   )rI   r   r   )r   integer_values     r   r   zOrdinal.convertz   s,    A 	Kz!]33444r   c                     t          |t                    s3	 t                              |          }n# t          $ r
 t          cY S w xY w| j        |j        k    S r    )r   r   r   r
   r%   rC   r&   s     r   r'   zOrdinal.__eq__   sb    %)) 	&&.. & & &%%%%&zU[((   2 AAc                 *    t          | j                  S r    )hashr   r   s    r   r*   zOrdinal.__hash__   s    DIr   c                 B   t          |t                    s3	 t                              |          }n# t          $ r
 t          cY S w xY wt          | j        |j                  D ]\  }}||k    r||k     c S t          | j                  t          |j                  k     S r    )r   r   r   r
   r%   ziprC   rA   )r   r!   	term_self
term_others       r   r.   zOrdinal.__lt__   s    %)) 	&&.. & & &%%%%&%(U[%A%A 	. 	.!IzJ& . :----.4:U[!1!111rY   c                     | |k    p| |k     S r    r4   r&   s     r   __le__zOrdinal.__le__   s    -.r   c                     | |k     S r    r4   r&   s     r   __gt__zOrdinal.__gt__   s    5=  r   c                     | |k      S r    r4   r&   s     r   __ge__zOrdinal.__ge__   s    %<r   c                    d}d}| t           k    rdS | j        D ]}|r|dz  }|j        t           k    r|t          |j                  z  }nU|j        dk    r|dz  }nDt          |j        j                  dk    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   rI   z + r   wzw**(%s)zw**%sz*%s)rI   rC   r   strr   rA   rS   )r   net_str
plus_countr9   s       r   __str__zOrdinal.__str__   s    
4< 	6 	 	A !5 u} )3qv;;&! )3QU[!!A% ))? )9QU?*715=(6Q; (qu} (5<'!OJJr   c                 ~   t          |t                    s3	 t                              |          }n# t          $ r
 t          cY S w xY w|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     |dk     r|}nc||         j
        |k    rBt          |||         j        |j        j        z             }|d |         |gz   |dd          z   }n|d |dz            |z   }t          | S )Nr   r   )r   r   r   r
   r%   rI   listrC   rA   rU   r   r   r   rJ   )r   r!   a_termsb_termsrb_exprC   sum_terms           r   __add__zOrdinal.__add__   si   %)) 	&&.. & & &%%%%&D= 	Ktz""u{##LL11f 	%/ 	FA 1f 	%/ 	q5 	,EEQZ^u$ 	,!%5;M;R)RSSHBQBK8*,wqrr{:EEDQqSDMG+ErY   c                     t          |t                    s3	 t                              |          }n# t          $ r
 t          cY S w xY w|| z   S r    r   r   r   r
   r%   r&   s     r   __radd__zOrdinal.__radd__   ]    %)) 	&&.. & & &%%%%&t|rY   c                    t          |t                    s3	 t                              |          }n# t          $ r
 t          cY S w xY wt
          | |fv rt
          S | j        }| j        j        }g }|j	        r;|j
        D ]2}|                    t          ||j        z   |j                             3n|j
        d d         D ]2}|                    t          ||j        z   |j                             3|j        j        }|                    t          |||z                       |t          | j
        dd                    z  }t          | S )NrL   r   )r   r   r   r
   r%   rI   rU   rJ   r   rS   rC   appendr   r   rM   rn   )r   r!   a_expa_mult	summationargb_mults          r   __mul__zOrdinal.__mul__   sh   %)) 	&&.. & & &%%%%&D%=  	K"'	! 		.{ H H  ECGOSX!F!FGGGGH {3B3' H H  ECGOSX!F!FGGGG(-FZvf}==>>>djn---I	""rY   c                     t          |t                    s3	 t                              |          }n# t          $ r
 t          cY S w xY w|| z  S r    rv   r&   s     r   __rmul__zOrdinal.__rmul__   rx   rY   c                 `    | 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/   r0   r1   r2   r   r3   rC   rJ   rM   rQ   rS   rU   classmethodr   r'   r*   r.   ra   rc   re   rl   __repr__rt   rw   r   r   r   __classcell__)rE   s   @r   r   r   8   s        0       X   X
   X
   X   X % % X% 5 5 [5
) ) )  	2 	2 	2/ / /! ! !       0 H  .  # # #.  - - - - - - -r   r   c                       e Zd ZdZdS )OrdinalZerozDThe ordinal zero.

    OrdinalZero can be imported as ``ord0``.
    N)r/   r0   r1   r2   r4   r   r   r   r      s          	Dr   r   c                   .    e Zd ZdZd Ze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                 6    t                               |           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   rC   zOrdinalOmega.terms  s    1a  ""r   N)r/   r0   r1   r2   r   r3   rC   r4   r   r   r   r     sH        
 
$ $ $ # # X# # #r   r   )

sympy.corer   r   r,   r   r   r   r   rI   r   r4   r   r   <module>r      s    % % % % % % % % 06 06 06 06 06 06 06 06fB- B- B- B- B-e B- B- B-J	 	 	 	 	' 	 	 	# # # # #7 # # #( {}}r   