
    \h-                         S SK Jr  S SKJr  S SKJrJrJrJr  S SK	J
r
  S SKJr  S SKJr  S SKJr  SS	KJr  SS
KJr   " S S5      r " S S5      rg)    )oo)symbols)FiniteFieldQQRationalFieldFF)Poly)solve)is_sequence)as_int   )divisors)polynomial_congruencec                       \ rS rSrSrSS jrSS jrS rS rS r	S r
S	 rS
 r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSrg)EllipticCurve   a+  
Create the following Elliptic Curve over domain.

`y^{2} + a_{1} x y + a_{3} y = x^{3} + a_{2} x^{2} + a_{4} x + a_{6}`

The default domain is ``QQ``. If no coefficient ``a1``, ``a2``, ``a3``,
is given then it creates a curve with the following form:

`y^{2} = x^{3} + a_{4} x + a_{6}`

Examples
========

References
==========

.. [1] J. Silverman "A Friendly Introduction to Number Theory" Third Edition
.. [2] https://mathworld.wolfram.com/EllipticDiscriminant.html
.. [3] G. Hardy, E. Wright "An Introduction to the Theory of Numbers" Sixth Edition

c                 b   US:X  a  [         nO[        U5      n[        UR                  X4XQU45      u  p4pQnXpl        X`l        US-  SU-  -   nSU-  X5-  -   n	US-  SU-  -   n
US-  U-  SU-  U-  -   X5-  U-  -
  XES-  -  -   US-  -
  nXX4u  U l        U l        U l        U l	        US-  * U-  SU	S-  -  -
  SU
S-  -  -
  SU-  U	-  U
-  -   U l
        X0l        X@l        XPl        Xl        X l        [!        S5      u  pnXUsU l        U l        U l        [)        US-  U-  X<-  U-  U-  -   X]-  US-  -  -   US-  -
  XLS-  -  U-  -
  X-  US-  -  -
  X.S-  -  -
  US	9U l        [-        U R                  [.        5      (       a  SU l        g [-        U R                  [2        5      (       a  S U l        g g )
Nr                  	   zx y z)domain)r   r   mapconvert_domainmodulus_b2_b4_b6_b8_discrim_a1_a2_a3_a4_a6r   xyzr	   _poly
isinstancer   _rankr   )selfa4a6a1a2a3r   r   b2b4b6b8r)   r*   r+   s                  T/var/www/auris/envauris/lib/python3.13/site-packages/sympy/ntheory/elliptic_curve.py__init__EllipticCurve.__init__#   s   a<F[F """1EFUQV^VbgUQV^URZ!b&2+%"4rEzABEI13.$(DHdhQa"a%i/"r1u*<q2v{R?OO'"a!"q!Q$q&246!8+bd1a4i7!Q$>qDJRTRSUVRVYVY[_`\`Y``iop
dllK00DJm44DJ 5    c                     [        XX05      $ NEllipticCurvePoint)r/   r)   r*   r+   s       r9   __call__EllipticCurve.__call__?   s    !!00r<   c                    [        U5      (       a  [        U5      S:X  a  SnOUS   nUS S u  p4OD[        U[        5      (       a$  UR                  UR
                  UR                  p$nO[        S5      eU R                  S:X  a  US:X  a  gU R                  R                  U R                  X0R
                  X@R                  U05      S:H  $ )Nr   r   zInvalid point.r   T)r   lenr-   r@   r)   r*   r+   
ValueErrorcharacteristicr,   subs)r/   pointz1x1y1s        r9   __contains__EllipticCurve.__contains__B   s    u5zQ1X2AYFB122%''577BBB-..!#azzFFBCDIIr<   c                 6    U R                   R                  5       $ r>   )r,   __repr__r/   s    r9   rO   EllipticCurve.__repr__Q   s    zz""$$r<   c                    U R                   nUS:X  a  U $ US:X  a=  [        U R                  S-  U R                  S-  U R                  S-  U R
                  S9$ U R                  S-  SU R                  -  -
  nU R                  S-  * SU R                  -  U R                  -  -   SU R                  -  -
  n[        SU-  S	U-  U R
                  S
9$ )z
Return minimal Weierstrass equation.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve

>>> e1 = EllipticCurve(-10, -20, 0, -1, 1)
>>> e1.minimal()
Poly(-x**3 + 13392*x*z**2 + y**2*z + 1080432*z**3, x, y, z, domain='QQ')

r   r   r   )r3   r      $      ii)r   )rF   r   r    r!   r   r   )r/   charc4c6s       r9   minimalEllipticCurve.minimalT   s     ""19K19 !TXXaZDHHQJPTP\P\]]XXq[2dhh;&hhk\BtxxK003txx<?SVSVT\\BBr<   c                 @  ^ U R                   n[        5       nUS:  aw  [        U5       Hf  mU R                  R	                  U R
                  TU R                  S05      R                  n[        X15      nUR                  U4S jU 5       5        Mh     U$ [        S5      e)z
Return points of curve over Finite Field.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e2 = EllipticCurve(1, 1, 1, 1, 1, modulus=5)
>>> e2.points()
{(0, 2), (1, 4), (2, 0), (2, 2), (3, 0), (3, 1), (4, 0)}

r   c              3   ,   >#    U  H	  nTU4v   M     g 7fr>    ).0numis     r9   	<genexpr>'EllipticCurve.points.<locals>.<genexpr>   s     6#3q#h#s   zInfinitely many points)rF   setranger,   rG   r)   r+   exprr   updaterE   )r/   rV   all_ptcongruence_eqsolr`   s        @r9   pointsEllipticCurve.pointsk   s     ""194[ $

DFFA0F G L L+M@6#66 ! M566r<   c                    / nU R                   [        :X  aJ  [        U R                  R	                  U R
                  U5      5       H  nUR                  X45        M     U$ U R                  R	                  U R
                  XR                  S05      R                  n[        X@R                  5       H  nUR                  X45        M     U$ )z7Returns points on the curve for the given x-coordinate.r   )r   r   r
   r,   rG   r)   appendr+   re   r   rF   )r/   r)   ptr*   rh   s        r9   points_xEllipticCurve.points_x   s    <<24::??466156		1&! 7 	 !JJOOTVVQ,BCHHM*=:M:MN		1&! O	r<   c           	         U R                   S:  a  [        S5      e[        R                  U 5      /n[	        U R
                  R                  U R                  SU R                  S05      5       H.  nUR                  (       d  M  UR                  U " US5      5        M0     [        U R                  SS9 H  n[        US-  5      nUS-  U:X  d  M  [	        U R
                  R                  U R                  X@R                  S05      5       HK  nUR                  (       d  M  U " X$5      nUR                  5       [        :w  d  M8  UR!                  XU* /5        MM     M     U$ )a  
Return torsion points of curve over Rational number.

Return point objects those are finite order.
According to Nagell-Lutz theorem, torsion point p(x, y)
x and y are integers, either y = 0 or y**2 is divisor
of discriminent. According to Mazur's theorem, there are
at most 15 points in torsion collection.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e2 = EllipticCurve(-43, 166)
>>> sorted(e2.torsion_points())
[(-5, -16), (-5, 16), O, (3, -8), (3, 8), (11, -32), (11, 32)]

r   z"No torsion point for Finite Field.r   T)	generatorg      ?r   )rF   rE   r@   point_at_infinityr
   r,   rG   r*   r+   is_rationalrm   r   discriminantintorderr   extend)r/   lxxr`   jps         r9   torsion_pointsEllipticCurve.torsion_points   s   & "ABB11$78

DFFA(>?@B~~~b!% A $++t<AArE
A!tqy

FFA0F GHB>> RAwwyB!R) I = r<   c                 6    U R                   R                  5       $ )z
Return domain characteristic.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e2 = EllipticCurve(-43, 166)
>>> e2.characteristic
0

)r   rF   rP   s    r9   rF   EllipticCurve.characteristic   s     ||**,,r<   c                 ,    [        U R                  5      $ )z
Return curve discriminant.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e2 = EllipticCurve(0, 17)
>>> e2.discriminant
-124848

)rv   r#   rP   s    r9   ru   EllipticCurve.discriminant   s     4==!!r<   c                      U R                   S:H  $ )z5
Return True if curve discriminant is equal to zero.
r   )ru   rP   s    r9   is_singularEllipticCurve.is_singular   s    
   A%%r<   c                     U R                   S-  SU R                  -  -
  nU R                  R                  US-  U R                  -  5      $ )z
Return curve j-invariant.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e1 = EllipticCurve(-2, 0, 0, 1, 1)
>>> e1.j_invariant
1404928/389

r   rS   r   )r   r    r   to_sympyr#   )r/   rW   s     r9   j_invariantEllipticCurve.j_invariant   s@     XXq[2dhh;&||$$RUT]]%:;;r<   c                 j    U R                   S:X  a  [        S5      e[        U R                  5       5      $ )z
Number of points in Finite field.

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e2 = EllipticCurve(1, 0, modulus=19)
>>> e2.order
19

r   Still not implemented)rF   NotImplementedErrorrD   rj   rP   s    r9   rw   EllipticCurve.order   s/     !#%&=>>4;;=!!r<   c                 J    U R                   b  U R                   $ [        S5      e)zR
Number of independent points of infinite order.

For Finite field, it must be 0.
r   )r.   r   rP   s    r9   rankEllipticCurve.rank   s$     ::!::!"9::r<   )r$   r%   r&   r'   r(   r   r    r!   r"   r#   r   r,   r.   r   r)   r*   r+   N)r   r   r   r   )r   )__name__
__module____qualname____firstlineno____doc__r:   rA   rL   rO   rY   rj   ro   r}   propertyrF   ru   r   r   rw   r   __static_attributes__r]   r<   r9   r   r      s    ,81J%C.72
"H - - " " & & < <  " "" ; ;r<   r   c                   ^    \ rS rSrSr\S 5       rS rS rS r	S r
S rS	 rS
 rS rS rSrg)r@   i
  a  
Point of Elliptic Curve

Examples
========

>>> from sympy.ntheory.elliptic_curve import EllipticCurve
>>> e1 = EllipticCurve(-17, 16)
>>> p1 = e1(0, -4, 1)
>>> p2 = e1(1, 0)
>>> p1 + p2
(15, -56)
>>> e3 = EllipticCurve(-1, 9)
>>> e3(1, -3) * 3
(664/169, 17811/2197)
>>> (e3(1, -3) * 3).order()
oo
>>> e2 = EllipticCurve(-2, 0, 0, 1, 1)
>>> p = e2(-1,1)
>>> q = e2(0, -1)
>>> p+q
(4, 8)
>>> p-q
(1, 0)
>>> 3*p-5*q
(328/361, -2800/6859)
c                     [        SSSU 5      $ Nr   r   r?   )curves    r9   rs   $EllipticCurvePoint.point_at_infinity'  s    !!Q511r<   c                    UR                   R                  nU" U5      U l        U" U5      U l        U" U5      U l        X@l        U R
                  R                   U l         U R
                  R                  U 5      (       d  [        S5      eg )Nz%The curve does not contain this point)r   r   r)   r*   r+   _curverL   rE   )r/   r)   r*   r+   r   doms         r9   r:   EllipticCurvePoint.__init__+  sn    mm##QQQ{{**{{''--DEE .r<   c                 f   U R                   S:X  a  U$ UR                   S:X  a  U $ U R                  U R                   -  U R                  U R                   -  p2UR                  UR                   -  UR                  UR                   -  pTU R                  R                  nU R                  R
                  nU R                  R                  nU R                  R                  n	U R                  R                  n
X$:w  a  X5-
  X$-
  -  nX4-  XR-  -
  XB-
  -  nOnX5-   S:X  a  U R                  U R                  5      $ SUS-  -  SU-  U-  -   U	-   Xc-  -
  Xb-  U-   SU-  -   -  nUS-  * X-  -   SU
-  -   X-  -
  Xb-  U-   SU-  -   -  nUS-  Xk-  -   U-
  U-
  U-
  nX-   * U-  U-
  U-
  nU R                  XS5      $ )Nr   r   r   r   )
r+   r)   r*   r   r$   r%   r&   r'   r(   rs   )r/   r|   rJ   rK   x2y2r2   r3   r4   r0   r1   slopeyintx3y3s                  r9   __add__EllipticCurvePoint.__add__5  s   66Q;H33!8KtvvBQSS!##acc'B[[__[[__[[__[[__[[__8W)EGbg%"'2DA~--dkk::QY2b(2-5"'B,R:OPEUFRUNQrT)BE1bebj1R46GHDAX 2%*R/z]R$&+{{21%%r<   c                     U R                   U R                  U R                  4UR                   UR                  UR                  4:  $ r>   )r)   r*   r+   r/   others     r9   __lt__EllipticCurvePoint.__lt__M  s3    '577EGGUWW*EEEr<   c                     [        U5      nU R                  U R                  5      nUS:X  a  U$ US:  a  U * U* -  $ U nU(       a   US-  (       a  X#-   nUS-  nX3-   nU(       a  M   U$ r   )r   rs   r   )r/   nrr|   s       r9   __mul__EllipticCurvePoint.__mul__P  st    1I""4;;/6Hq55A2:1uE!GAA	 a
 r<   c                 
    X-  $ r>   r]   )r/   r   s     r9   __rmul__EllipticCurvePoint.__rmul___  s	    xr<   c                     [        U R                  U R                  * U R                  R                  U R                  -  -
  U R                  R
                  -
  U R                  U R                  5      $ r>   )r@   r)   r*   r   r$   r&   r+   rP   s    r9   __neg__EllipticCurvePoint.__neg__b  sN    !$&&466'DKKOODFF4J*JT[[__*\^b^d^dfjfqfqrrr<   c                 F   U R                   S:X  a  gU R                  R                  n SR                  UR	                  U R
                  5      UR	                  U R                  5      5      $ ! [         a     Of = fSR                  U R
                  U R                  5      $ )Nr   Oz({}, {}))r+   r   r   formatr   r)   r*   	TypeError)r/   r   s     r9   rO   EllipticCurvePoint.__repr__e  s~    66Q;kk!!	$$S\\$&&%93<<;OPP 		  00s   AA- -
A:9A:c                 &    U R                  U* 5      $ r>   )r   r   s     r9   __sub__EllipticCurvePoint.__sub__o  s    ||UF##r<   c                    U R                   S:X  a  gU R                  S:X  a  gU S-  nUR                  U R                  * :X  a  gSnU R                  [        :w  a  [	        UR
                  5      UR
                  :X  a  [	        UR                  5      UR                  :X  ac  X-   nUS-  nUR                   S:X  a  U$ [	        UR
                  5      UR
                  :X  a%  [	        UR                  5      UR                  :X  a  Mc  [        $ UR
                  R                  UR
                  :X  a  UR                  R                  UR                  :X  aq  X-   nUS-  nUS:  a  [        $ UR                   S:X  a  U$ UR
                  R                  UR
                  :X  a&  UR                  R                  UR                  :X  a  Mq  [        $ )z%
Return point order n where nP = 0.

r   r   r   r   r   )r+   r*   r   r   rv   r)   r   	numerator)r/   r|   r`   s      r9   rw   EllipticCurvePoint.orderr  sD   
 66Q;66Q;1H33466'><<2acc(acc/c!##h!##oHQ33!8H	 acc(acc/c!##h!##o
 Iccmmqss"qss}}';AFA2v	ssax ccmmqss"qss}}'; 	r<   )r   r   r)   r*   r+   N)r   r   r   r   r   staticmethodrs   r:   r   r   r   r   r   rO   r   rw   r   r]   r<   r9   r@   r@   
  sK    8 2 2F&0Fs1$r<   r@   N)sympy.core.numbersr   sympy.core.symbolr   sympy.polys.domainsr   r   r   r   sympy.polys.polytoolsr	   sympy.solvers.solversr
   sympy.utilities.iterablesr   sympy.utilities.miscr   factor_r   residue_ntheoryr   r   r@   r]   r<   r9   <module>r      s<    ! % B B & ' 1 '  2{; {;|C Cr<   