o
    8Va                     @   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 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   5/usr/lib/python3/dist-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.sets 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>Q   s    z#Ordinal.__new__.<locals>.<listcomp>c                 3   s$    | ]} |  |d   kV  qdS )r   Nr   r.   Zpowersr   r   	<genexpr>R   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
   O   s
   "zOrdinal.__new__c                 C   s   | j S r   r   r   r   r   r   r9   V   s   zOrdinal.termsc                 C      | t krtd| jd S )Nz ordinal zero has no leading termr   ord0r8   r9   r   r   r   r   leading_termZ      
zOrdinal.leading_termc                 C   r=   )Nz!ordinal zero has no trailing termr>   r   r   r   r   trailing_term`   rA   zOrdinal.trailing_termc                 C   s$   z| j jtkW S  ty   Y dS w NFrC   r   r?   r8   r   r   r   r   is_successor_ordinalf   s
   zOrdinal.is_successor_ordinalc                 C   s&   z| j jtk W S  ty   Y dS w rD   rE   r   r   r   r   is_limit_ordinalm   s
   zOrdinal.is_limit_ordinalc                 C   s   | j jS r   )r@   r   r   r   r   r   degreet   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	   x   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   r9   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   zipr9   r7   )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__   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?   r9   r   strr   r7   rG   )r   Znet_strZ
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?   listr9   r7   rH   r   r   r   r@   )r   r   Za_termsZb_termsrZb_expr9   Z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 )NrB   r   )r   r   r	   r   r   r?   rH   r@   r   rG   r9   appendr   r   rC   rR   )r   r   Za_expZa_multsumargZ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   rU   r    r   r   r   __rmul__   rW   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-   r9   r@   rC   rF   rG   rH   classmethodr	   r!   r$   r(   rK   rL   rM   rQ   __repr__rT   rV   r[   r\   r^   __classcell__r   r   r;   r   r   6   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   rb      s    rb   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   r9     s   zOrdinalOmega.termsN)r)   r*   r+   r,   r
   r-   r9   r   r   r   r   rc     s
    rc   )
Z
sympy.corer   r   r&   r   r   rb   rc   r?   r]   r   r   r   r   <module>   s    2 E
