Ë
    O/æj¨G  ã                   ó´   — d dl mZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZ  G d„ d«      Z G d„ d	«      Zd
„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zy)é    )Ú_randint)ÚgcdÚinvertÚsqrt)Ú_sqrt_mod_prime_power)Úisprime)Úlogr   c                   ó   — e Zd Zdd„Zd„ Zy)ÚSievePolynomialNc                 ó.   — || _         || _        || _        y)aÄ  This class denotes the seive polynomial.
        If ``g(x) = (a*x + b)**2 - N``. `g(x)` can be expanded
        to ``a*x**2 + 2*a*b*x + b**2 - N``, so the coefficient
        is stored in the form `[a**2, 2*a*b, b**2 - N]`. This
        ensures faster `eval` method because we dont have to
        perform `a**2, 2*a*b, b**2` every time we call the
        `eval` method. As multiplication is more expensive
        than addition, by using modified_coefficient we get
        a faster seiving process.

        Parameters
        ==========

        modified_coeff : modified_coefficient of sieve polynomial
        a : parameter of the sieve polynomial
        b : parameter of the sieve polynomial
        N)Úmodified_coeffÚaÚb)Úselfr   r   r   s       úS/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/sympy/ntheory/qs.pyÚ__init__zSievePolynomial.__init__	   s   € ð$ -ˆÔØˆŒØˆ�ó    c                 ó@   — d}| j                   D ]  }||z  }||z  }Œ |S )z¢
        Compute the value of the sieve polynomial at point x.

        Parameters
        ==========

        x : Integer parameter for sieve polynomial
        r   )r   )r   ÚxÚansÚcoeffs       r   ÚevalzSievePolynomial.eval   s7   € ð ˆØ×(Ñ(ò 	ˆEØ�1‰HˆCØ�5‰L‰Cð	ð ˆ
r   )© NN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   „ óó,r   r   c                   ó   — e Zd ZdZd„ Zy)ÚFactorBaseElemz7This class stores an element of the `factor_base`.
    c                 óf   — || _         || _        || _        d| _        d| _        d| _        d| _        y)zÿ
        Initialization of factor_base_elem.

        Parameters
        ==========

        prime : prime number of the factor_base
        tmem_p : Integer square root of x**2 = n mod prime
        log_p : Compute Natural Logarithm of the prime
        N)ÚprimeÚtmem_pÚlog_pÚsoln1Úsoln2Úa_invÚb_ainv)r   r    r!   r"   s       r   r   zFactorBaseElem.__init__2   s5   € ð ˆŒ
ØˆŒØˆŒ
ØˆŒ
ØˆŒ
ØˆŒ
Øˆ�r   N)r   r   r   Ú__doc__r   r   r   r   r   r   /   s   „ ñór   r   c                 ó\  — ddl m} g }d\  }}|j                  d| «      D ]†  }t        ||dz
  dz  |«      dk(  sŒ|dkD  r|€t	        |«      dz
  }|dkD  r|€t	        |«      dz
  }t        ||d«      d   }t        t        |«      dz  «      }|j                  t        |||«      «       Œˆ |||fS )	aç  Generate `factor_base` for Quadratic Sieve. The `factor_base`
    consists of all the points whose ``legendre_symbol(n, p) == 1``
    and ``p < num_primes``. Along with the prime `factor_base` also stores
    natural logarithm of prime and the residue n modulo p.
    It also returns the of primes numbers in the `factor_base` which are
    close to 1000 and 5000.

    Parameters
    ==========

    prime_bound : upper prime bound of the factor_base
    n : integer to be factored
    r   )Úsieve©NNé   é   iè  iˆ  é   )
Úsympy.ntheory.generater)   Ú
primerangeÚpowÚlenr   Úroundr	   Úappendr   )	Úprime_boundÚnr)   Úfactor_baseÚidx_1000Úidx_5000r    Úresiduer"   s	            r   Ú_generate_factor_baser:   F   sÐ   € õ -Ø€KØ#Ñ€HˆhØ×!Ñ! ! [Ó1ò FˆÜˆq�5˜1‘9 Ñ" EÓ*¨aÓ/Ø�tŠ| Ð 0Ü˜{Ó+¨aÑ/�Ø�tŠ| Ð 0Ü˜{Ó+¨aÑ/�Ü+¨A¨u°aÓ8¸Ñ;ˆGÜœ#˜e›* UÑ*Ó+ˆEØ×Ñœ~¨e°W¸eÓDÕEðFð �X˜{Ð*Ð*r   Nc                 óD  — t        |«      }t        d| z  «      |z  }d\  }}	}
|€dn|}|€t        |«      dz
  n|}t        d«      D ]€  }d}g }||k  rJd}|dk(  s||v r |||«      }|dk(  rŒ||v rŒ||   j                  }||z  }|j                  |«       ||k  rŒJ||z  }|
�t        |dz
  «      t        |
dz
  «      k  sŒ{|}	|}|}
Œ‚ |}|	}g }|D ]W  }||   j                  }||   j                  t        ||z  |«      z  |z  }||dz  kD  r||z
  }|j                  ||z  |z  «       ŒY t        |«      }t        ||z  d|z  |z  ||z  | z
  g||«      }|D ]¿  }||j                  z  dk(  rŒt        ||j                  «      |_        |D �cg c]!  }d|z  |j                  z  |j                  z  ‘Œ# c}|_        |j                  |j                  |z
  z  |j                  z  |_        |j                  |j                   |z
  z  |j                  z  |_        ŒÁ ||fS c c}w )ag  This step is the initialization of the 1st sieve polynomial.
    Here `a` is selected as a product of several primes of the factor_base
    such that `a` is about to ``sqrt(2*N) / M``. Other initial values of
    factor_base elem are also initialized which includes a_inv, b_ainv, soln1,
    soln2 which are used when the sieve polynomial is changed. The b_ainv
    is required for fast polynomial change as we do not have to calculate
    `2*b*invert(a, prime)` every time.
    We also ensure that the `factor_base` primes which make `a` are between
    1000 and 5000.

    Parameters
    ==========

    N : Number to be factored
    M : sieve interval
    factor_base : factor_base primes
    idx_1000 : index of prime number in the factor_base near 1000
    idx_5000 : index of prime number in the factor_base near to 5000
    seed : Generate pseudoprime numbers
    r,   )NNNr   r+   é2   )r   r   r1   Úranger    r3   Úabsr!   r   Úsumr   r%   r&   r#   r$   )ÚNÚMr6   r7   r8   ÚseedÚrandintÚ
approx_valÚbest_aÚbest_qÚ
best_ratioÚstartÚendÚ_r   ÚqÚrand_pÚpÚratioÚBÚvalÚq_lÚgammar   ÚgÚfbÚb_elems                              r   Ú_initialize_first_polynomialrV   c   sg  € ô* �t‹n€GÜ�a˜‘c“˜Q‘€Jð
 "2Ñ€FˆF�JØÐ!‰A x€EØ"*Ð"2Œ#ˆkÓ
˜QÒ
¸€CÜ�2‹Yò ˆØˆØˆØ�*ŠnØˆFØ˜A’+ ¨1¡Ù  ¨Ó,�ð ˜A“+ ¨1¢à˜FÑ#×)Ñ)ˆAØ�‰FˆAØ�H‰H�VÔð �*‹nð �J‘ˆØÐ¤ U¨Q¡Y£´#°jÀ1±nÓ2EÓ!EØˆFØˆFØ‰Jðð  	€AØ€Aà
€AØò ˆØ˜#Ñ×$Ñ$ˆØ˜CÑ ×'Ñ'¬&°°c±¸3Ó*?Ñ?À#ÑEˆØ�3˜‘7Š?Ø˜%‘KˆEØ	�‰��C‘˜‘Õðô 	ˆA‹€AÜ˜˜1™˜a ™c !™e Q q¡S¨1¡WÐ-¨q°!Ó4€Aàò :ˆØˆr�x‰x‰<˜1ÒØÜ˜!˜RŸX™XÓ&ˆŒØ@AÖB°f�Q�v‘X˜bŸh™hÑ&¨¯©Ó1ÒBˆŒ	Ø—H‘H˜bŸi™i¨!™mÑ,°·±Ñ8ˆŒØ—H‘H˜rŸy™y˜j¨1™nÑ-°·±Ñ9ˆ�ð:ð ˆaˆ4€Kùò Cs   Æ&Hc                 ó  — ddl m} d}|}|dz  dk(  r|dz  }|dz  }|dz  dk(  rŒ ||d|z  z  «      dz  dk(  rd}nd}|j                  d|z  ||dz
     z  z   }	|j                  }
t	        |
|
z  d|
z  |	z  |	|	z  | z
  g|
|	«      }|D ]}  }|
|j
                  z  dk(  rŒ|j                  ||j                  |dz
     z  z
  |j
                  z  |_        |j                  ||j                  |dz
     z  z
  |j
                  z  |_        Œ |S )aÐ  Initialization stage of ith poly. After we finish sieving 1`st polynomial
    here we quickly change to the next polynomial from which we will again
    start sieving. Suppose we generated ith sieve polynomial and now we
    want to generate (i + 1)th polynomial, where ``1 <= i <= 2**(j - 1) - 1``
    where `j` is the number of prime factors of the coefficient `a`
    then this function can be used to go to the next polynomial. If
    ``i = 2**(j - 1) - 1`` then go to _initialize_first_polynomial stage.

    Parameters
    ==========

    N : number to be factored
    factor_base : factor_base primes
    i : integer denoting ith polynomial
    g : (i - 1)th polynomial
    B : array that stores a//q_l*gamma
    r   )Úceilingr+   r,   éÿÿÿÿ)	Ú#sympy.functions.elementary.integersrX   r   r   r   r    r#   r&   r$   )r@   r6   ÚirS   rO   rX   ÚvÚjÚneg_powr   r   rT   s               r   Ú_initialize_ith_polyr_   ©   s3  € õ$ <Ø	€AØ	€AØ
ˆa‰%�1Š*Ø	ˆQ‰ˆØ	ˆa‰ˆð ˆa‰%�1‹*ñ ˆq�A�q‘D‰zÓ˜QÑ !Ò#Ø‰àˆØ	�‰ˆa�‰i˜˜!˜a™%™Ñ Ñ €AØ	�‰€AÜ˜˜1™˜a ™c !™e Q q¡S¨1¡WÐ-¨q°!Ó4€AØò DˆØˆr�x‰x‰<˜1ÒØØ—H‘H˜w r§y¡y°°Q±Ñ'7Ñ7Ñ7¸2¿8¹8ÑCˆŒØ—H‘H˜w r§y¡y°°Q±Ñ'7Ñ7Ñ7¸2¿8¹8ÑCˆ�ð	Dð €Hr   c                 ó¦  — dgd| z  dz   z  }|D ]¿  }|j                   €Œt        | |j                   z   |j                  z  d| z  |j                  «      D ]  }||xx   |j                  z  cc<   Œ |j                  dk(  rŒpt        | |j                  z   |j                  z  d| z  |j                  «      D ]  }||xx   |j                  z  cc<   Œ ŒÁ |S )a¨  Sieve Stage of the Quadratic Sieve. For every prime in the factor_base
    that does not divide the coefficient `a` we add log_p over the sieve_array
    such that ``-M <= soln1 + i*p <=  M`` and ``-M <= soln2 + i*p <=  M`` where `i`
    is an integer. When p = 2 then log_p is only added using
    ``-M <= soln1 + i*p <=  M``.

    Parameters
    ==========

    M : sieve interval
    factor_base : factor_base primes
    r   r,   r+   )r#   r=   r    r"   r$   )rA   r6   Úsieve_arrayÚfactorÚidxs        r   Ú_gen_sieve_arrayrd   Ñ   sÖ   € ð �#�q˜‘s˜Q‘w‘-€KØò 	-ˆØ�<‰<ÐØÜ˜!˜fŸl™lÑ*¨f¯l©lÑ:¸A¸a¹CÀÇÁÓNò 	-ˆCØ˜Ó §¡Ñ,Ôð	-à�<‰<˜1ÒØä˜!˜fŸl™lÑ*¨f¯l©lÑ:¸A¸a¹CÀÇÁÓNò 	-ˆCØ˜Ó §¡Ñ,Ôñ	-ð	-ð Ðr   c                 ó†  — g }| dk  r|j                  d«       | dz  } n|j                  d«       |D ]u  }| |j                  z  dk7  r|j                  d«       Œ'd}| |j                  z  dk(  r'|dz  }| |j                  z  } | |j                  z  dk(  rŒ'|j                  |dz  «       Œw | dk(  r|dfS t        | «      r| dfS y)ab  Here we check that if `num` is a smooth number or not. If `a` is a smooth
    number then it returns a vector of prime exponents modulo 2. For example
    if a = 2 * 5**2 * 7**3 and the factor base contains {2, 3, 5, 7} then
    `a` is a smooth number and this function returns ([1, 0, 0, 1], True). If
    `a` is a partial relation which means that `a` a has one prime factor
    greater than the `factor_base` then it returns `(a, False)` which denotes `a`
    is a partial relation.

    Parameters
    ==========

    a : integer whose smootheness is to be checked
    factor_base : factor_base primes
    r   r+   rY   r,   TFr*   )r3   r    r   )Únumr6   Úvecrb   Ú
factor_exps        r   Ú_check_smoothnessri   ì   sÖ   € ð €CØ
ˆQ‚wØ�
‰
�1ŒØˆr‰	‰à�
‰
�1Œàò #ˆØ�—‘Ñ Ò"Ø�J‰J�qŒMØØˆ
Ø�F—L‘LÑ  AÒ%Ø˜!‰OˆJØ�F—L‘LÑ ˆCð �F—L‘LÑ  AÓ%ð 	�
‰
�: ‘>Õ"ð#ð ˆa‚xØ�DˆyÐÜˆs„|Ø�EˆzÐØr   c                 óf  — t        | «      }t        ||z  «      dz  |z
  }g }	t        «       }
d|d   j                  z  }t	        |«      D ]Ã  \  }}||k  rŒ||z
  }|j                  |«      }t        ||«      \  }}|€Œ4|j                  |z  |j                  z   }|du r\|}||kD  rŒ\||vr||f||<   Œh||   \  }}|j                  |«       	 t        || «      }||z  |z  }||z  ||z  z  }t        ||«      \  }}|	j                  |||f«       ŒÅ |	|
fS # t        $ r |
j                  |«       Y Œæw xY w)a)  Trial division stage. Here we trial divide the values generetated
    by sieve_poly in the sieve interval and if it is a smooth number then
    it is stored in `smooth_relations`. Moreover, if we find two partial relations
    with same large prime then they are combined to form a smooth relation.
    First we iterate over sieve array and look for values which are greater
    than accumulated_val, as these values have a high chance of being smooth
    number. Then using these values we find smooth relations.
    In general, let ``t**2 = u*p modN`` and ``r**2 = v*p modN`` be two partial relations
    with the same large prime p. Then they can be combined ``(t*r/p)**2 = u*v modN``
    to form a smooth relation.

    Parameters
    ==========

    N : Number to be factored
    M : sieve interval
    factor_base : factor_base primes
    sieve_array : stores log_p values
    sieve_poly : polynomial from which we find smooth relations
    partial_relations : stores partial relations with one large prime
    ERROR_TERM : error term for accumulated_val
    r-   é€   rY   F)Úisqrtr	   Úsetr    Ú	enumerater   ri   r   r   Úpopr   ÚZeroDivisionErrorÚaddr3   )r@   rA   r6   ra   Ú
sieve_polyÚpartial_relationsÚ
ERROR_TERMÚsqrt_nÚaccumulated_valÚsmooth_relationsÚproper_factorÚpartial_relation_upper_boundrc   rP   r   r\   rg   Ú	is_smoothÚuÚlarge_primeÚu_prevÚv_prevÚlarge_prime_invs                          r   Ú_trial_division_stager€     s‰  € ô. �1‹X€FÜ˜!˜f™*“o eÑ+¨jÑ8€OØÐÜ“E€MØ#& {°2¡×'<Ñ'<Ñ#<Ð Ü˜kÓ*ò -‰ˆˆSØ�Ò ØØ�!‰GˆØ�O‰O˜AÓˆÜ*¨1¨kÓ:‰ˆˆYØÐØØ�L‰L˜‰N˜ZŸ\™\Ñ)ˆð ˜ÑØˆKàÐ9Ò9ØØÐ"3Ñ3Ø23°Q°Ð! +Ñ.Øà!2°;Ñ!?‘�˜Ø!×%Ñ% kÔ2ðÜ&,¨[¸!Ó&<�Oð �f‘H˜_Ñ,�Ø�f‘H ¨[Ñ!8Ñ9�Ü!2°1°kÓ!B‘��Yà×Ñ  A s Õ,ð?-ð@ ˜]Ð*Ð*øô )ò Ø!×%Ñ% kÔ2Ùðús   ÃDÄD0Ä/D0c                 ó@   — g }| D ]  }|j                  |d   «       Œ |S )z|Build a 2D matrix from smooth relations.

    Parameters
    ==========

    smooth_relations : Stores smooth relations
    r,   )r3   )rw   ÚmatrixÚ
s_relations      r   Ú_build_matrixr„   R  s-   € ð €FØ&ò %ˆ
Ø�‰�j ‘mÕ$ð%à€Mr   c                 óÒ  — ddl }|j                  | «      }t        |«      }t        |d   «      }dg|z  }t        |«      D ]p  }t        |«      D ]  }||   |   dk(  sŒ n d|<   t        |«      D ]>  }||k(  rŒ	||   |   dk(  sŒt        |«      D ]  }	||	   |   ||	   |   z   dz  ||	   |<   Œ Œ@ Œr g }
t	        |«      D ]!  \  }}|dk(  sŒ|
j                  ||   |g«       Œ# |
||fS )aþ  Fast gaussian reduction for modulo 2 matrix.

    Parameters
    ==========

    A : Matrix

    Examples
    ========

    >>> from sympy.ntheory.qs import _gauss_mod_2
    >>> _gauss_mod_2([[0, 1, 1], [1, 0, 1], [0, 1, 0], [1, 1, 1]])
    ([[[1, 0, 1], 3]],
     [True, True, True, False],
     [[0, 1, 0], [1, 0, 0], [0, 0, 1], [1, 0, 1]])

    Reference
    ==========

    .. [1] A fast algorithm for gaussian elimination over GF(2) and
    its implementation on the GAPP. Cetin K.Koc, Sarath N.Arachchiger   NFr+   Tr,   )ÚcopyÚdeepcopyr1   r=   rn   r3   )ÚAr†   r‚   ÚrowÚcolÚmarkÚcÚrÚc1Úr2Údependent_rowrc   rP   s                r   Ú_gauss_mod_2r‘   `  s2  € ó, Ø�]‰]˜1Ó€FÜ
ˆf‹+€CÜ
ˆf�Q‰i‹.€CØˆ7�3‰;€DÜ�3‹Zò 
JˆÜ�s“ò 	ˆAØ�a‰y˜‰|˜qÓ Ùð	ð ˆˆQ‰Ü˜“*ò 	JˆBØ�QŠwØØ�a‰y˜‰} Ó!Ü ›*ò J�BØ&,¨R¡j°¡n°v¸b±zÀ!±}Ñ&DÈÑ%I�F˜2‘J˜r’NñJñ		Jð
Jð €MÜ˜d“Oò 5‰ˆˆSØ�%‹<Ø× Ñ  &¨¡+¨sÐ!3Õ4ð5ð ˜$ Ð&Ð&r   c                 óž  — | |   d   }||   d   g}||   d   g}| |   d   }	t        |	«      D ]h  \  }
}|dk(  sŒt        t        |«      «      D ]F  }||   |
   dk(  sŒ||   dk(  sŒ|j                  ||   d   «       |j                  ||   d   «        Œh Œj d}d}|D ]  }||z  }Œ	 |D ]  }||z  }Œ	 t	        |«      }t        ||z
  |«      S )a�  Finds proper factor of N. Here, transform the dependent rows as a
    combination of independent rows of the gauss_matrix to form the desired
    relation of the form ``X**2 = Y**2 modN``. After obtaining the desired relation
    we obtain a proper factor of N by `gcd(X - Y, N)`.

    Parameters
    ==========

    dependent_rows : denoted dependent rows in the reduced matrix form
    mark : boolean array to denoted dependent and independent rows
    gauss_matrix : Reduced form of the smooth relations matrix
    index : denoted the index of the dependent_rows
    smooth_relations : Smooth relations vectors matrix
    N : Number to be factored
    r+   r   T)rn   r=   r1   r3   rl   r   )Údependent_rowsr‹   Úgauss_matrixÚindexrw   r@   Úidx_in_smoothÚindependent_uÚindependent_vÚdept_rowrc   rP   r‰   r{   r\   r[   s                   r   Ú_find_factorrš   �  s'  € ð  # 5Ñ)¨!Ñ,€MØ% mÑ4°QÑ7Ð8€MØ% mÑ4°QÑ7Ð8€MØ˜eÑ$ QÑ'€Hä˜hÓ'ò ‰ˆˆSØ�!‹8ÜœS Ó.Ó/ò �Ø Ñ$ SÑ)¨QÓ.°4¸±9ÀÓ3DØ!×(Ñ(Ð)9¸#Ñ)>¸qÑ)AÔBØ!×(Ñ(Ð)9¸#Ñ)>¸qÑ)AÔBÙñ	ðð 	
€AØ	€AØò ˆØ	ˆQ‰‰ðàò ˆØ	ˆQ‰‰ðô 	ˆa‹€AÜˆq�1‰u�a‹=Ðr   c           	      óÂ  — |dz  }t        || «      \  }}}g }d}	i }
t        «       }dt        |«      z  dz  }	 |	dk(  rt        | ||||«      \  }}nt	        | ||	«      }|	dz  }	|	dt        |«      dz
  z  k\  rd}	t        ||«      }t        | |||||
|«      \  }}||z  }||z  }t        |«      t        |«      |z   k\  rnŒˆt        |«      }t        |«      \  }}}| }t        t        |«      «      D ]l  }t        |||||| «      }|dkD  sŒ|| k  sŒ|j                  |«       ||z  dk(  r||z  }||z  dk(  rŒt        |«      r|j                  |«        |S |dk(  sŒk |S  |S )a  Performs factorization using Self-Initializing Quadratic Sieve.
    In SIQS, let N be a number to be factored, and this N should not be a
    perfect power. If we find two integers such that ``X**2 = Y**2 modN`` and
    ``X != +-Y modN``, then `gcd(X + Y, N)` will reveal a proper factor of N.
    In order to find these integers X and Y we try to find relations of form
    t**2 = u modN where u is a product of small primes. If we have enough of
    these relations then we can form ``(t1*t2...ti)**2 = u1*u2...ui modN`` such that
    the right hand side is a square, thus we found a relation of ``X**2 = Y**2 modN``.

    Here, several optimizations are done like using multiple polynomials for
    sieving, fast changing between polynomials and using partial relations.
    The use of partial relations can speeds up the factoring by 2 times.

    Parameters
    ==========

    N : Number to be Factored
    prime_bound : upper bound for primes in the factor base
    M : Sieve Interval
    ERROR_TERM : Error term for checking smoothness
    threshold : Extra smooth relations for factorization
    seed : generate pseudo prime numbers

    Examples
    ========

    >>> from sympy.ntheory import qs
    >>> qs(25645121643901801, 2000, 10000)
    {5394769, 4753701529}
    >>> qs(9804659461513846513, 2000, 10000)
    {4641991, 2112166839943}

    References
    ==========

    .. [1] https://pdfs.semanticscholar.org/5c52/8a975c1405bd35c65993abf5a4edb667c1db.pdf
    .. [2] https://www.rieselprime.de/ziki/Self-initializing_quadratic_sieve
    r-   r   é   éd   r+   r,   )r:   rm   r1   rV   r_   rd   r€   r„   r‘   r=   rš   rq   r   )r@   r4   rA   rt   rB   r7   r8   r6   rw   Úith_polyrs   rx   Ú	thresholdÚith_sieve_polyÚB_arrayra   Ús_relÚp_fr‚   r�   r‹   r”   ÚN_copyr•   rb   s                            r   Úqsr¥   µ  sÐ  € ðN �Ñ€JÜ&;¸KÈÓ&KÑ#€Hˆh˜ØÐØ€HØÐÜ“E€MØ”#�kÓ"Ñ" cÑ)€IØ
Ø�qŠ=Ü&BÀ1ÀaÈÐV^Ð`hÓ&iÑ#ˆN™Gä1°!°[À(ÈNÐ\cÓdˆNØ�A‰ˆØ�qœ3˜w›<¨!Ñ+Ñ,Ò,ØˆHÜ& q¨+Ó6ˆÜ*¨1¨a°¸kÈ>Ð[lÐnxÓy‰
ˆˆsØ˜EÑ!ÐØ˜ÑˆÜÐÓ ¤C¨Ó$4°yÑ$@Ò@Øð ô Ð+Ó,€FÜ(4°VÓ(<Ñ%€M�4˜Ø€FÜ”s˜=Ó)Ó*ò 
ˆÜ˜m¨T°<ÀÐHXÐZ[Ó\ˆØ�A‹:˜& 1›*Ø×Ñ˜fÔ%Ø˜6‘/ QÒ&Ø˜6Ñ!�ð ˜6‘/ QÓ&ä�vŒØ×!Ñ! &Ô)Øð Ðð ˜‹{ØØÐð
ð Ðr   )N)é   iÒ  )Úsympy.core.randomr   Úsympy.external.gmpyr   r   r   rl   Úsympy.ntheory.residue_ntheoryr   Úsympy.ntheoryr   Úmathr	   r   r   r:   rV   r_   rd   ri   r€   r„   r‘   rš   r¥   r   r   r   ú<module>r¬      sf   ðÝ &ß :Ñ :Ý ?Ý !ß ÷$ñ $÷Nñ ò.+ó:CòL%òPò6#òL<+ò@ò*'òZ%ôPJr   