Ë
    7^(h¬$  ã                   ó‚   — d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ  G d„ dee«      ZeZ G d	„ d
e«      ZeZy)z"Finite extensions of ring domains.é    )ÚDomain)ÚDomainElement)ÚCoercionFailedÚNotInvertibleÚGeneratorsError)ÚPoly)ÚDefaultPrintingc                   óÂ   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ ZeZd„ Zd„ Zd„ ZeZd„ Zd„ Zd„ ZeZd„ ZeZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZeZe d„ «       Z!d„ Z"y)ÚExtensionElementa#  
    Element of a finite extension.

    A class of univariate polynomials modulo the ``modulus``
    of the extension ``ext``. It is represented by the
    unique polynomial ``rep`` of lowest degree. Both
    ``rep`` and the representation ``mod`` of ``modulus``
    are of class DMP.

    ©ÚrepÚextc                 ó    — || _         || _        y ©Nr   )Úselfr   r   s      úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/polys/agca/extensions.pyÚ__init__zExtensionElement.__init__   s   € ØˆŒØˆ�ó    c                 ó   — | j                   S r   )r   ©Úfs    r   ÚparentzExtensionElement.parent   s   € Ø�u‰uˆr   c                 ó8   — | j                   j                  | «      S r   )r   Úto_sympyr   s    r   Úas_exprzExtensionElement.as_expr   s   € Ø�u‰u�~‰~˜aÓ Ð r   c                 ó,   — t        | j                  «      S r   )Úboolr   r   s    r   Ú__bool__zExtensionElement.__bool__"   s   € Ü�A—E‘E‹{Ðr   c                 ó   — | S r   © r   s    r   Ú__pos__zExtensionElement.__pos__%   s   € Øˆr   c                 óD   — t        | j                   | j                  «      S r   )ÚExtElemr   r   r   s    r   Ú__neg__zExtensionElement.__neg__(   s   € Ü˜Ÿ™�v˜qŸu™uÓ%Ð%r   c                 óÜ   — t        |t        «      r&|j                  | j                  k(  r|j                  S y 	 | j                  j	                  |«      }|j                  S # t
        $ r Y y w xY wr   )Ú
isinstancer#   r   r   Úconvertr   ©r   Úgs     r   Ú_get_repzExtensionElement._get_rep+   sY   € Ü�aœÔ!Ø�u‰u˜Ÿ™Š~Ø—u‘u�àðØ—E‘E—M‘M !Ó$�Ø—u‘u�øÜ!ò Ùðús   ¸&A Á	A+Á*A+c                 óz   — | j                  |«      }|�#t        | j                  |z   | j                  «      S t        S r   ©r*   r#   r   r   ÚNotImplemented©r   r)   r   s      r   Ú__add__zExtensionElement.__add__8   ó3   € Ø�j‰j˜‹mˆØˆ?Ü˜1Ÿ5™5 3™;¨¯©Ó.Ð.ä!Ð!r   c                 óz   — | j                  |«      }|�#t        | j                  |z
  | j                  «      S t        S r   r,   r.   s      r   Ú__sub__zExtensionElement.__sub__A   r0   r   c                 óz   — | j                  |«      }|�#t        || j                  z
  | j                  «      S t        S r   r,   r.   s      r   Ú__rsub__zExtensionElement.__rsub__H   s3   € Ø�j‰j˜‹mˆØˆ?Ü˜3 §¡™;¨¯©Ó.Ð.ä!Ð!r   c                 ó¨   — | j                  |«      }|�:t        | j                  |z  | j                  j                  z  | j                  «      S t
        S r   )r*   r#   r   r   Úmodr-   r.   s      r   Ú__mul__zExtensionElement.__mul__O   s@   € Ø�j‰j˜‹mˆØˆ?Ü˜AŸE™E C™K¨1¯5©5¯9©9Ñ4°a·e±eÓ<Ð<ä!Ð!r   c                 ó.  — | st        d«      ‚| j                  j                  ry| j                  j                  r>| j                  j
                  j                  | j                  j                  «       «      ryd| › d| j                  › d�}t        |«      ‚)z5Raise if division is not implemented for this divisorzZero divisorTzCan not invert z in z7. Only division by invertible constants is implemented.)	r   r   Úis_Fieldr   Ú	is_groundÚdomainÚis_unitÚLCÚNotImplementedError)r   Úmsgs     r   Ú	_divcheckzExtensionElement._divcheckX   sw   € áÜ Ó/Ð/Ø�U‰U�^Š^ØØ�U‰U�_Š_ §¡§¡×!5Ñ!5°a·e±e·h±h³jÔ!AØð % Q C t¨A¯E©E¨7ð 3Lð LˆCä% cÓ*Ð*r   c                 óR  — | j                  «        | j                  j                  r0| j                  j	                  | j                  j
                  «      }n<| j                  j                  }|j                  |j                  | j                  «      }t        || j                  «      S )z…Multiplicative inverse.

        Raises
        ======

        NotInvertible
            If the element is a zero divisor.

        )
r@   r   r9   r   Úinvertr6   ÚringÚexquoÚoner#   )r   ÚinvrepÚRs      r   ÚinversezExtensionElement.inversei   sh   € ð 	
�‰Œà�5‰5�>Š>Ø—U‘U—\‘\ !§%¡%§)¡)Ó,‰Fà—‘—
‘
ˆAØ—W‘W˜QŸU™U A§E¡EÓ*ˆFä�v˜qŸu™uÓ%Ð%r   c                 óÆ   — | j                  |«      }|€t        S t        || j                  «      }	 |j	                  «       }| |z  S # t
        $ r t        | › d|› �«      ‚w xY w)Nz / )r*   r-   r#   r   rH   r   ÚZeroDivisionError)r   r)   r   Úginvs       r   Ú__truediv__zExtensionElement.__truediv__}   sk   € Ø�j‰j˜‹mˆØˆ;Ü!Ð!Ü�C˜Ÿ™Óˆð	2Ø—9‘9“;ˆDð �4‰xˆøô ò 	2Ü# q c¨¨Q¨C LÓ1Ð1ð	2ús   ±A ÁA c                 ón   — 	 | j                   j                  |«      }|| z  S # t        $ r	 t        cY S w xY wr   ©r   r'   r   r-   r(   s     r   Ú__rtruediv__zExtensionElement.__rtruediv__Œ   ó;   € ð	"Ø—‘—‘˜aÓ ˆAð �1‰uˆøô ò 	"Ü!Ò!ð	"úó   ‚" ¢4³4c                 óè   — | j                  |«      }|€t        S t        || j                  «      }	 |j	                  «        | j                  j                  S # t
        $ r t        | › d|› �«      ‚w xY w)Nz % )r*   r-   r#   r   r@   r   rJ   Úzeror.   s      r   Ú__mod__zExtensionElement.__mod__•   sn   € Ø�j‰j˜‹mˆØˆ;Ü!Ð!Ü�C˜Ÿ™Óˆð	2Ø�K‰KŒMð
 �u‰u�z‰zÐøô	 ò 	2Ü# q c¨¨Q¨C LÓ1Ð1ð	2ús   ±A ÁA1c                 ón   — 	 | j                   j                  |«      }|| z  S # t        $ r	 t        cY S w xY wr   rN   r(   s     r   Ú__rmod__zExtensionElement.__rmod__£   rP   rQ   c                 ó”  — t        |t        «      st        d«      ‚|dk  r	 | j                  «       | }} | j                  }| j                  j                  }| j                  j                  j                  }|dkD  r |dz  r||z  |z  }||z  |z  }|dz  }|dkD  rŒ t        || j                  «      S # t        $ r t        d«      ‚w xY w)Nzexponent of type 'int' expectedr   znegative powers are not definedé   )r&   ÚintÚ	TypeErrorrH   r>   Ú
ValueErrorr   r   r6   rE   r#   )r   ÚnÚbÚmÚrs        r   Ú__pow__zExtensionElement.__pow__ª   sË   € Ü˜!œSÔ!ÜÐ=Ó>Ð>ØˆqŠ5ðDØ—y‘y“{ Q B�1�ð �E‰EˆØ�E‰E�I‰IˆØ�E‰E�I‰I�M‰MˆØ�!ŠeØ�1ŠuØ�q‘S˜A‘I�Ø�1‘˜‘	ˆAØ�!‰GˆAð	 �!‹eô �q˜!Ÿ%™%Ó Ð øô 'ò DÜ Ð!BÓCÐCðDús   ¢B2 Â2Cc                 ó–   — t        |t        «      r4| j                  |j                  k(  xr | j                  |j                  k(  S t        S r   )r&   r#   r   r   r-   r(   s     r   Ú__eq__zExtensionElement.__eq__¾   s5   € Ü�aœÔ!Ø—5‘5˜AŸE™E‘>Ò4 a§e¡e¨q¯u©u¡nÐ4ä!Ð!r   c                 ó   — | |k(   S r   r    r(   s     r   Ú__ne__zExtensionElement.__ne__Ä   s   € Ø˜‘6ˆzÐr   c                 óD   — t        | j                  | j                  f«      S r   )Úhashr   r   r   s    r   Ú__hash__zExtensionElement.__hash__Ç   s   € Ü�Q—U‘U˜AŸE™E�NÓ#Ð#r   c                 ó:   — ddl m}  || j                  «       «      S )Nr   )Ússtr)Úsympy.printing.strri   r   )r   ri   s     r   Ú__str__zExtensionElement.__str__Ê   s   € Ý+Ù�A—I‘I“KÓ Ð r   c                 ó.   — | j                   j                  S r   )r   r:   r   s    r   r:   zExtensionElement.is_groundÐ   s   € à�u‰u�‰Ðr   c                 ó>   — | j                   j                  «       \  }|S r   )r   Úto_list)r   Úcs     r   Ú	to_groundzExtensionElement.to_groundÔ   s   € Ø�e‰e�m‰m‹o‰ˆØˆr   N)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r   r!   r$   r*   r/   Ú__radd__r2   r4   r7   Ú__rmul__r@   rH   rL   Ú__floordiv__rO   Ú__rfloordiv__rT   rV   r`   rb   rd   rg   rk   Ú__repr__Úpropertyr:   rp   r    r   r   r   r      s¶   „ ñ	ð €Iòòò!òòò&òò"ð €Hò"ò"ò"ð €Hò+ò"&ò(ð €Lòð !€Mòòò!ò("òò$ò!ð €Hàñó ðór   r   c                   óŽ   — e Zd ZdZdZeZd„ Zd„ Zd„ Z	d„ Z
d„ ZeZed„ «       Zd	„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy
)ÚMonogenicFiniteExtensionaà  
    Finite extension generated by an integral element.

    The generator is defined by a monic univariate
    polynomial derived from the argument ``mod``.

    A shorter alias is ``FiniteExtension``.

    Examples
    ========

    Quadratic integer ring $\mathbb{Z}[\sqrt2]$:

    >>> from sympy import Symbol, Poly
    >>> from sympy.polys.agca.extensions import FiniteExtension
    >>> x = Symbol('x')
    >>> R = FiniteExtension(Poly(x**2 - 2)); R
    ZZ[x]/(x**2 - 2)
    >>> R.rank
    2
    >>> R(1 + x)*(3 - 2*x)
    x - 1

    Finite field $GF(5^3)$ defined by the primitive
    polynomial $x^3 + x^2 + 2$ (over $\mathbb{Z}_5$).

    >>> F = FiniteExtension(Poly(x**3 + x**2 + 2, modulus=5)); F
    GF(5)[x]/(x**3 + x**2 + 2)
    >>> F.basis
    (1, x, x**2)
    >>> F(x + 3)/(x**2 + 2)
    -2*x**2 + x + 2

    Function field of an elliptic curve:

    >>> t = Symbol('t')
    >>> FiniteExtension(Poly(t**2 - x**3 - x + 1, t, field=True))
    ZZ(x)[t]/(t**2 - x**3 - x + 1)

    Tc                 ó  ‡ ‡— t        |t        «      r|j                  st        d«      ‚|j	                  d¬«      }|j                  «       ‰ _        |‰ _        |j                  ‰ _	        |j                  x‰ _
        } |j                  |j                  Ž ‰ _        ‰ j                  ‰ j                  j                  «      ‰ _        ‰ j                  ‰ j                  j                   «      ‰ _        ‰ j                  j                  d   Š‰ j                  j"                  d   ‰ _        ‰ j                  ‰«      ‰ _        t)        ˆˆ fd„t+        ‰ j                  «      D «       «      ‰ _        ‰ j                  j.                  ‰ _        y )Nz!modulus must be a univariate PolyF)Úautor   c              3   óF   •K  — | ]  }‰j                  ‰|z  «      –— Œ y ­wr   ©r'   )Ú.0ÚiÚgenr   s     €€r   ú	<genexpr>z4MonogenicFiniteExtension.__init__.<locals>.<genexpr>  s   øè ø€ ÒJ°A˜4Ÿ<™<¨¨Q©×/ÑJùs   ƒ!)r&   r   Úis_univariaterZ   ÚmonicÚdegreeÚrankÚmodulusr   r6   r;   Úold_poly_ringÚgensrC   r'   rS   rE   ÚsymbolsÚsymbolÚ	generatorÚtupleÚrangeÚbasisr9   )r   r6   Údomr„   s   `  @r   r   z!MonogenicFiniteExtension.__init__  s  ù€ Ü˜3¤Ô%¨#×*;Ò*;ÜÐ?Ó@Ð@ð �i‰i˜UˆiÓ#ˆà—J‘J“LˆŒ	ØˆŒØ—7‘7ˆŒàŸJ™JÐ&ˆŒ�cØ%�C×%Ñ% s§x¡xÐ0ˆŒ	à—L‘L §¡§¡Ó0ˆŒ	Ø—<‘< §	¡	§¡Ó.ˆŒà�i‰i�n‰n˜QÑˆØ—i‘i×'Ñ'¨Ñ*ˆŒØŸ™ cÓ*ˆŒÜÔJ¼¸t¿y¹yÓ9IÔJÓJˆŒ
ð Ÿ™×,Ñ,ˆ�r   c                 ój   — | j                   j                  |«      }t        || j                  z  | «      S r   ©rC   r'   r#   r6   )r   Úargr   s      r   ÚnewzMonogenicFiniteExtension.new$  s+   € Ø�i‰i×Ñ Ó$ˆÜ�s˜TŸX™X‘~ tÓ,Ð,r   c                 óV   — t        |t        «      sy| j                  |j                  k(  S ©NF)r&   ÚFiniteExtensionrŠ   )r   Úothers     r   rb   zMonogenicFiniteExtension.__eq__(  s"   € Ü˜%¤Ô1ØØ�|‰|˜uŸ}™}Ñ,Ð,r   c                 óX   — t        | j                  j                  | j                  f«      S r   )rf   Ú	__class__rq   rŠ   ©r   s    r   rg   z!MonogenicFiniteExtension.__hash__-  s    € Ü�T—^‘^×,Ñ,¨d¯l©lÐ;Ó<Ð<r   c                 óV   — | j                   ›d| j                  j                  «       ›d�S )Nz/(ú))rC   rŠ   r   rž   s    r   rk   z MonogenicFiniteExtension.__str__0  s   € Ø ŸI›I t§|¡|×';Ñ';Õ'=Ð>Ð>r   c                 ó.   — | j                   j                  S r   )r;   Úhas_CharacteristicZerorž   s    r   r¢   z/MonogenicFiniteExtension.has_CharacteristicZero5  s   € à�{‰{×1Ñ1Ð1r   c                 ó6   — | j                   j                  «       S r   )r;   Úcharacteristicrž   s    r   r¤   z'MonogenicFiniteExtension.characteristic9  s   € Ø�{‰{×)Ñ)Ó+Ð+r   Nc                 ól   — | j                   j                  ||«      }t        || j                  z  | «      S r   r•   ©r   r   Úbaser   s       r   r'   z MonogenicFiniteExtension.convert<  ó-   € Ø�i‰i×Ñ  4Ó(ˆÜ�s˜TŸX™X‘~ tÓ,Ð,r   c                 ól   — | j                   j                  ||«      }t        || j                  z  | «      S r   r•   r¦   s       r   Úconvert_fromz%MonogenicFiniteExtension.convert_from@  r¨   r   c                 óL   — | j                   j                  |j                  «      S r   )rC   r   r   ©r   r   s     r   r   z!MonogenicFiniteExtension.to_sympyD  s   € Ø�y‰y×!Ñ! !§%¡%Ó(Ð(r   c                 ó$   — | j                  |«      S r   r�   r¬   s     r   Ú
from_sympyz#MonogenicFiniteExtension.from_sympyG  s   € Ø�|‰|˜A‹Ðr   c                 óZ   — | j                   j                  |«      }| j                  |«      S r   )rŠ   Ú
set_domainr�   )r   ÚKr6   s      r   r°   z#MonogenicFiniteExtension.set_domainJ  s%   € Ø�l‰l×%Ñ% aÓ(ˆØ�~‰~˜cÓ"Ð"r   c                 óˆ   — | j                   |v rt        d«      ‚ | j                  j                  |Ž }| j	                  |«      S )Nz+Can not drop generator from FiniteExtension)rŽ   r   r;   Údropr°   )r   r�   r±   s      r   r³   zMonogenicFiniteExtension.dropN  s?   € Ø�;‰;˜'Ñ!Ü!Ð"OÓPÐPØˆD�K‰K×Ñ˜gÐ&ˆØ�‰˜qÓ!Ð!r   c                 ó&   — | j                  ||«      S r   )rD   )r   r   r)   s      r   ÚquozMonogenicFiniteExtension.quoT  s   € Ø�z‰z˜!˜QÓÐr   c                 ó”   — | j                   j                  |j                  |j                  «      }t        || j                  z  | «      S r   )rC   rD   r   r#   r6   )r   r   r)   r   s       r   rD   zMonogenicFiniteExtension.exquoW  s3   € Ø�i‰i�o‰o˜aŸe™e Q§U¡UÓ+ˆÜ�s˜TŸX™X‘~ tÓ,Ð,r   c                  ó   — yr™   r    ©r   Úas     r   Úis_negativez$MonogenicFiniteExtension.is_negative[  s   € Ør   c                 óœ   — | j                   rt        |«      S |j                  r)| j                  j	                  |j                  «       «      S y r   )r9   r   r:   r;   r<   rp   r¸   s     r   r<   z MonogenicFiniteExtension.is_unit^  s9   € Ø�=Š=Ü˜“7ˆNØ�[Š[Ø—;‘;×&Ñ& q§{¡{£}Ó5Ð5ð r   r   )rq   rr   rs   rt   Úis_FiniteExtensionr   Údtyper   r—   rb   rg   rk   rz   r{   r¢   r¤   r'   rª   r   r®   r°   r³   rµ   rD   rº   r<   r    r   r   r}   r}   Û   s~   „ ñ'ðP Ðà€Eò-ò8-ò-ò
=ò?ð €Hàñ2ó ð2ò,ó-ò-ò)òò#ò"ò ò-òó6r   r}   N)rt   Úsympy.polys.domains.domainr   Ú!sympy.polys.domains.domainelementr   Úsympy.polys.polyerrorsr   r   r   Úsympy.polys.polytoolsr   Úsympy.printing.defaultsr	   r   r#   r}   rš   r    r   r   ú<module>rÃ      sL   ðÙ (å -Ý ;÷ñ å &Ý 3ôK�} oô KðZ €ôG6˜vô G6ðR +�r   