+
    i-                         ^ RI Ht ^ RIHt ^ RIHtHtHtHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ^RIHt ^R	IHt  ! R
 R4      t ! R R4      tR# )    )oo)symbols)FiniteFieldQQRationalFieldFF)Poly)solve)is_sequence)as_int)divisors)polynomial_congruencec                      a  ] tR t^t o RtRR ltRR ltR tR tR t	R t
R tR	 t]R
 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       tRtV tR# )EllipticCurvea+  
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                <   V^ 8X  d   \         pM\        V4      p\        VP                  W4WQV34      w  r4rQpWpn        W`n        V^,          ^V,          ,           p^V,          W5,          ,           p	V^,          ^V,          ,           p
V^,          V,          ^V,          V,          ,           W5,          V,          ,
          WE^,          ,          ,           V^,          ,
          pWW3w  V n        V n        V n        V n	        V^,          ) V,          ^V	^,          ,          ,
          ^V
^,          ,          ,
          ^	V,          V	,          V
,          ,           V n
        W0n        W@n        WPn        Wn        W n        \!        R4      w  rpWVuV n        V n        V n        \)        V^,          V,          W<,          V,          V,          ,           W],          V^,          ,          ,           V^,          ,
          WL^,          ,          V,          ,
          W,          V^,          ,          ,
          W.^,          ,          ,
          VR7      V n        \-        V P                  \.        4      '       d
   ^ V n        R# \-        V P                  \2        4      '       d
   RV n        R# R# )r   zx y z)domainN)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   &&&&&&&        Z/var/www/html/photoedit/myenv/lib/python3.14/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                    \        WW04      # NEllipticCurvePoint)r'   r!   r"   r#   s   &&&&r1   __call__EllipticCurve.__call__?   s    !!00r4   c                   \        V4      '       d)   \        V4      ^8X  d   ^pM	V^,          pVR,          w  r4ME\        V\        4      '       d%   VP                  VP
                  VP                  r$pM\        R4      hV P                  ^ 8X  d
   V^ 8X  d   R# V P                  P                  V P                  W0P
                  W@P                  V/4      ^ 8H  # )   :Nr<   NzInvalid point.T)r   lenr%   r8   r!   r"   r#   
ValueErrorcharacteristicr$   subs)r'   pointz1x1y1s   &&   r1   __contains__EllipticCurve.__contains__B   s    u5zQ1X2YFB122%''577BBB-..!#azzFFBCDIIr4   c                6    V P                   P                  4       # r6   )r$   __repr__r'   s   &r1   rH   EllipticCurve.__repr__Q   s    zz""$$r4   c                   V P                   pV^8X  d   V # V^8X  dM   \        V P                  ^,          V P                  ^,          V P                  ^,          V P
                  R7      # V P                  ^,          ^V P                  ,          ,
          pV P                  ^,          ) ^$V P                  ,          V P                  ,          ,           ^V P                  ,          ,
          p\        RV,          RV,          V P
                  R7      # )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   ii)r?   r   r   r   r   r   )r'   charc4c6s   &   r1   minimalEllipticCurve.minimalT   s     ""19K19 !TXXaZDHHQJPTP\P\]]XXq[2dhh;&hhk\BtxxK003txx<?SVSVT\\BBr4   c                B  a V P                   p\        4       pV^8  dx   \        V4       Ff  oV P                  P	                  V P
                  SV P                  ^/4      P                  p\        W14      pVP                  V3R lV 4       4       Kh  	  V# \        R4      h)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)}

c              3   ,   <"   T F	  pSV3x  K  	  R # 5ir6    ).0numis   & r1   	<genexpr>'EllipticCurve.points.<locals>.<genexpr>   s     6#3q#h#s   zInfinitely many points)r?   setranger$   r@   r!   r#   exprr   updater>   )r'   rL   all_ptcongruence_eqsolrV   s   &    @r1   pointsEllipticCurve.pointsk   s     ""194[ $

DFFA0F G L L+M@6#66 ! M566r4   c                   . pV P                   \        8X  dK   \        V P                  P	                  V P
                  V4      4       F  pVP                  W34       K  	  V# V P                  P	                  V P
                  WP                  ^/4      P                  p\        W@P                  4       F  pVP                  W34       K  	  V# )z7Returns points on the curve for the given x-coordinate.)r   r   r
   r$   r@   r!   appendr#   r[   r   r?   )r'   r!   ptr"   r^   s   &&   r1   points_xEllipticCurve.points_x   s    <<24::??466156		1&! 7 	 !JJOOTVVQ,BCHHM*=:M:MN		1&! O	r4   c           	        V P                   ^ 8  d   \        R4      h\        P                  V 4      .p\	        V P
                  P                  V P                  ^ V P                  ^/4      4       F/  pVP                  '       g   K  VP                  V ! V^ 4      4       K1  	  \        V P                  RR7       F  p\        VR,          4      pV^,          V8X  g   K%  \	        V P
                  P                  V P                  W@P                  ^/4      4       FM  pVP                  '       g   K  V ! W$4      pVP                  4       \        8w  g   K:  VP!                  WU) .4       KO  	  K  	  V# )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)]

z"No torsion point for Finite Field.T)	generatorg      ?)r?   r>   r8   point_at_infinityr
   r$   r@   r"   r#   is_rationalrc   r   discriminantintorderr   extend)r'   lxxrV   jps   &     r1   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 = r4   c                6    V P                   P                  4       # )z
Return domain characteristic.

Examples
========

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

)r   r?   rI   s   &r1   r?   EllipticCurve.characteristic   s     ||**,,r4   c                ,    \        V P                  4      # )z
Return curve discriminant.

Examples
========

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

)rl   r   rI   s   &r1   rk   EllipticCurve.discriminant   s     4==!!r4   c                     V P                   ^ 8H  # )z5
Return True if curve discriminant is equal to zero.
)rk   rI   s   &r1   is_singularEllipticCurve.is_singular   s    
   A%%r4   c                    V P                   ^,          ^V P                  ,          ,
          pV P                  P                  V^,          V P                  ,          4      # )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   r   r   to_sympyr   )r'   rM   s   & r1   j_invariantEllipticCurve.j_invariant   s@     XXq[2dhh;&||$$RUT]]%:;;r4   c                l    V P                   ^ 8X  d   \        R4      h\        V P                  4       4      # )z
Number of points in Finite field.

Examples
========

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

Still not implemented)r?   NotImplementedErrorr=   r`   rI   s   &r1   rm   EllipticCurve.order   s/     !#%&=>>4;;=!!r4   c                L    V P                   e   V P                   # \        R4      h)zR
Number of independent points of infinite order.

For Finite field, it must be 0.
r   )r&   r   rI   s   &r1   rankEllipticCurve.rank   s$     ::!::!"9::r4   )r   r   r   r   r    r   r   r   r   r   r   r$   r&   r   r!   r"   r#   N)r   r   r   r   )   )__name__
__module____qualname____firstlineno____doc__r2   r9   rE   rH   rO   r`   re   rs   propertyr?   rk   rz   r~   rm   r   __static_attributes____classdictcell____classdict__s   @r1   r   r      s     ,81J%C.72
"H - - " " & & < <  " "" ; ;r4   r   c                   j   a  ] tR tRt o Rt]R 4       tR tR tR t	R t
R tR	 tR
 tR tR tRtV tR# )r8   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                    \        ^ ^^ V 4      # r   r7   )curves   &r1   ri   $EllipticCurvePoint.point_at_infinity'  s    !!Q511r4   c                   VP                   P                  pV! V4      V n        V! V4      V n        V! V4      V n        W@n        V P
                  P                   V n         V P
                  P                  V 4      '       g   \        R 4      hR# )z%The curve does not contain this pointN)r   r   r!   r"   r#   _curverE   r>   )r'   r!   r"   r#   r   doms   &&&&& r1   r2   EllipticCurvePoint.__init__+  sn    mm##QQQ{{**{{''--DEE .r4   c                   V P                   ^ 8X  d   V# VP                   ^ 8X  d   V # V P                  V P                   ,          V P                  V P                   ,          r2VP                  VP                   ,          VP                  VP                   ,          rTV P                  P                  pV P                  P
                  pV P                  P                  pV P                  P                  p	V P                  P                  p
W$8w  d9   W5,
          W$,
          ,          pW4,          WR,          ,
          WB,
          ,          pMW5,           ^ 8X  d   V P                  V P                  4      # ^V^,          ,          ^V,          V,          ,           V	,           Wc,          ,
          Wb,          V,           ^V,          ,           ,          pV^,          ) W,          ,           ^V
,          ,           W,          ,
          Wb,          V,           ^V,          ,           ,          pV^,          Wk,          ,           V,
          V,
          V,
          pW,           ) V,          V,
          V,
          pV P                  W^4      # r   )
r#   r!   r"   r   r   r   r   r   r    ri   )r'   rr   rC   rD   x2y2r*   r+   r,   r(   r)   slopeyintx3y3s   &&             r1   __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%%r4   c                    V P                   V P                  V P                  3VP                   VP                  VP                  38  # r6   )r!   r"   r#   r'   others   &&r1   __lt__EllipticCurvePoint.__lt__M  s3    '577EGGUWW*EEEr4   c                    \        V4      pV P                  V P                  4      pV^ 8X  d   V# V^ 8  d   V ) V) ,          # T pV'       d+   V^,          '       d	   W#,           pV^,          pW3,           pK2  V# r   )r   ri   r   )r'   nrrr   s   &&  r1   __mul__EllipticCurvePoint.__mul__P  sm    1I""4;;/6Hq55A2:1uuE!GAAr4   c                    W,          # r6   rS   )r'   r   s   &&r1   __rmul__EllipticCurvePoint.__rmul___  s	    xr4   c                    \        V P                  V P                  ) V P                  P                  V P                  ,          ,
          V P                  P
                  ,
          V P                  V P                  4      # r6   )r8   r!   r"   r   r   r   r#   rI   s   &r1   __neg__EllipticCurvePoint.__neg__b  sN    !$&&466'DKKOODFF4J*JT[[__*\^b^d^dfjfqfqrrr4   c                L   V P                   ^ 8X  d   R# V P                  P                  p RP                  VP	                  V P
                  4      VP	                  V P                  4      4      #   \         d     Mi ; iRP                  T P
                  T P                  4      # )r   Oz({}, {}))r#   r   r   formatr}   r!   r"   	TypeError)r'   r   s   & r1   rH   EllipticCurvePoint.__repr__e  s~    66Q;kk!!	$$S\\$&&%93<<;OPP 		  00s   AA/ /A=<A=c                &    V P                  V) 4      # r6   )r   r   s   &&r1   __sub__EllipticCurvePoint.__sub__o  s    ||UF##r4   c                   V P                   ^ 8X  d   ^# V P                  ^ 8X  d   ^# V ^,          pVP                  V P                  ) 8X  d   ^# ^pV P                  \        8w  du   \	        VP
                  4      VP
                  8X  dK   \	        VP                  4      VP                  8X  d'   W,           pV^,          pVP                   ^ 8X  g   Kl  V# \        # VP
                  P                  VP
                  8X  dY   VP                  P                  VP                  8X  d4   W,           pV^,          pV^8  d   \        # VP                   ^ 8X  g   K{  V# \        # )z%
Return point order n where nP = 0.

)r#   r"   r   r   rl   r!   r   	numerator)r'   rr   rV   s   &  r1   rm   EllipticCurvePoint.orderr  s    
 66Q;66Q;1H33466'><<2acc(acc/c!##h!##oHQ33!8HIccmmqss"qss}}';AFA2v	ssax	r4   )r   r   r!   r"   r#   N)r   r   r   r   r   staticmethodri   r2   r   r   r   r   r   rH   r   rm   r   r   r   s   @r1   r8   r8   
  sS     8 2 2F&0Fs1$ r4   r8   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   r8   rS   r4   r1   <module>r      s<    ! % B B & ' 1 '  2{; {;|C Cr4   