Ë
    7^(h!  ã                   óz   — d dl mZ d dlmZm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„ Zdd„Zd	„ Zdd
„Zd„ Zy)é    )Úprod©ÚgcdÚgcdext©Úisprime)ÚZZ)Úgf_crtÚgf_crt1Úgf_crt2)Úas_intc                 ó    — | |dz  k  r| S | |z
  S )zÔReturn the residual mod m such that it is within half of the modulus.

    >>> from sympy.ntheory.modular import symmetric_residue
    >>> symmetric_residue(1, 6)
    1
    >>> symmetric_residue(4, 6)
    -2
    é   © )ÚaÚms     úS/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/ntheory/modular.pyÚsymmetric_residuer   
   s   € ð 	ˆA�‰F‚{ØˆØˆq‰5€Ló    c                 ó¤  ‡— |r2t        t        t        | «      «      } t        t        t        |«      «      }t        || t        «      Št        | «      }|rFt        ˆfd„t        || «      D «       «      s(t        t        t        || «      «      d|dœŽŠ‰€‰S ‰\  Š}|r t        t        ‰|«      «      t        |«      fS t        ‰«      t        |«      fS )ak  Chinese Remainder Theorem.

    The moduli in m are assumed to be pairwise coprime.  The output
    is then an integer f, such that f = v_i mod m_i for each pair out
    of v and m. If ``symmetric`` is False a positive integer will be
    returned, else \|f\| will be less than or equal to the LCM of the
    moduli, and thus f may be negative.

    If the moduli are not co-prime the correct result will be returned
    if/when the test of the result is found to be incorrect. This result
    will be None if there is no solution.

    The keyword ``check`` can be set to False if it is known that the moduli
    are coprime.

    Examples
    ========

    As an example consider a set of residues ``U = [49, 76, 65]``
    and a set of moduli ``M = [99, 97, 95]``. Then we have::

       >>> from sympy.ntheory.modular import crt

       >>> crt([99, 97, 95], [49, 76, 65])
       (639985, 912285)

    This is the correct result because::

       >>> [639985 % m for m in [99, 97, 95]]
       [49, 76, 65]

    If the moduli are not co-prime, you may receive an incorrect result
    if you use ``check=False``:

       >>> crt([12, 6, 17], [3, 4, 2], check=False)
       (954, 1224)
       >>> [954 % m for m in [12, 6, 17]]
       [6, 0, 2]
       >>> crt([12, 6, 17], [3, 4, 2]) is None
       True
       >>> crt([3, 6], [2, 5])
       (5, 6)

    Note: the order of gf_crt's arguments is reversed relative to crt,
    and that solve_congruence takes residue, modulus pairs.

    Programmer's note: rather than checking that all pairs of moduli share
    no GCD (an O(n**2) test) and rather than factoring all moduli and seeing
    that there is no factor in common, a check that the result gives the
    indicated residuals is performed -- an O(n) operation.

    See Also
    ========

    solve_congruence
    sympy.polys.galoistools.gf_crt : low level crt routine used by this routine
    c              3   ó:   •K  — | ]  \  }}||z  ‰|z  k(  –— Œ y ­w©Nr   )Ú.0Úvr   Úresults      €r   ú	<genexpr>zcrt.<locals>.<genexpr>Z   s"   øè ø€ Ò=©4¨1¨a�1�q‘5˜F Q™JÕ&Ñ=ùs   ƒF)ÚcheckÚ	symmetric)ÚlistÚmapr   r
   r	   r   ÚallÚzipÚsolve_congruenceÚintr   )r   r   r   r   Úmmr   s        @r   Úcrtr&      s·   ø€ ñt Ü””V˜Q“Ó ˆÜ””V˜Q“Ó ˆä�A�qœ"Ó€FÜ	ˆa‹€BáÜÓ=´3°q¸!³9Ô=Ô=Ü%¤t¬C°°1«I£Ø¨9ò6ˆFàˆ~Ø�Ø‰JˆF�BáÜÔ$ V¨RÓ0Ó1´3°r³7Ð:Ð:Üˆv‹;œ˜B›ÐÐr   c                 ó"   — t        | t        «      S )aC  First part of Chinese Remainder Theorem, for multiple application.

    Examples
    ========

    >>> from sympy.ntheory.modular import crt, crt1, crt2
    >>> m = [99, 97, 95]
    >>> v = [49, 76, 65]

    The following two codes have the same result.

    >>> crt(m, v)
    (639985, 912285)

    >>> mm, e, s = crt1(m)
    >>> crt2(m, v, mm, e, s)
    (639985, 912285)

    However, it is faster when we want to fix ``m`` and
    compute for multiple ``v``, i.e. the following cases:

    >>> mm, e, s = crt1(m)
    >>> vs = [[52, 21, 37], [19, 46, 76]]
    >>> for v in vs:
    ...     print(crt2(m, v, mm, e, s))
    (397042, 912285)
    (803206, 912285)

    See Also
    ========

    sympy.polys.galoistools.gf_crt1 : low level crt routine used by this routine
    sympy.ntheory.modular.crt
    sympy.ntheory.modular.crt2

    )r   r	   )r   s    r   Úcrt1r(   f   s   € ôL �1”b‹>Ðr   c                 óš   — t        || |||t        «      }|r t        t        ||«      «      t        |«      fS t        |«      t        |«      fS )aÃ  Second part of Chinese Remainder Theorem, for multiple application.

    See ``crt1`` for usage.

    Examples
    ========

    >>> from sympy.ntheory.modular import crt1, crt2
    >>> mm, e, s = crt1([18, 42, 6])
    >>> crt2([18, 42, 6], [0, 0, 0], mm, e, s)
    (0, 4536)

    See Also
    ========

    sympy.polys.galoistools.gf_crt2 : low level crt routine used by this routine
    sympy.ntheory.modular.crt
    sympy.ntheory.modular.crt1

    )r   r	   r$   r   )r   r   r%   ÚeÚsr   r   s          r   Úcrt2r,   �   sJ   € ô, �Q˜˜2˜q !¤RÓ(€FáÜÔ$ V¨RÓ0Ó1´3°r³7Ð:Ð:Üˆv‹;œ˜B›ÐÐr   c                  ó"  — d„ }| }|j                  dd«      }|j                  dd«      r§|D ��cg c]  \  }}t        |«      t        |«      f‘Œ }}}i }|D ]  \  }}||z  }||v r|||   k7  r yŒ|||<   Œ  |j                  «       D ��cg c]	  \  }}||f‘Œ }}}~t        d„ |D «       «      r#t	        t        |Ž «      \  }}t        |||d¬«      S d	}|D ]  }	 |||	«      }|€ y|\  }
}|
|z  }
Œ |rt        
«      |fS 
fS c c}}w c c}}w )
a  Compute the integer ``n`` that has the residual ``ai`` when it is
    divided by ``mi`` where the ``ai`` and ``mi`` are given as pairs to
    this function: ((a1, m1), (a2, m2), ...). If there is no solution,
    return None. Otherwise return ``n`` and its modulus.

    The ``mi`` values need not be co-prime. If it is known that the moduli are
    not co-prime then the hint ``check`` can be set to False (default=True) and
    the check for a quicker solution via crt() (valid when the moduli are
    co-prime) will be skipped.

    If the hint ``symmetric`` is True (default is False), the value of ``n``
    will be within 1/2 of the modulus, possibly negative.

    Examples
    ========

    >>> from sympy.ntheory.modular import solve_congruence

    What number is 2 mod 3, 3 mod 5 and 2 mod 7?

    >>> solve_congruence((2, 3), (3, 5), (2, 7))
    (23, 105)
    >>> [23 % m for m in [3, 5, 7]]
    [2, 3, 2]

    If you prefer to work with all remainder in one list and
    all moduli in another, send the arguments like this:

    >>> solve_congruence(*zip((2, 3, 2), (3, 5, 7)))
    (23, 105)

    The moduli need not be co-prime; in this case there may or
    may not be a solution:

    >>> solve_congruence((2, 3), (4, 6)) is None
    True

    >>> solve_congruence((2, 3), (5, 6))
    (5, 6)

    The symmetric flag will make the result be within 1/2 of the modulus:

    >>> solve_congruence((2, 3), (5, 6), symmetric=True)
    (-1, 6)

    See Also
    ========

    crt : high level routine implementing the Chinese Remainder Theorem

    c                 óâ   — | \  }}|\  }}|||z
  |}}}t        |||«      }	|||fD �
cg c]  }
|
|	z  ‘Œ	 c}
\  }}}|dk7  rt        ||«      \  }	}}|	dk7  ry||z  }|||z  z   ||z  }}||fS c c}
w )zùReturn the tuple (a, m) which satisfies the requirement
        that n = a + i*m satisfy n = a1 + j*m1 and n = a2 = k*m2.

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Method_of_successive_substitution
        é   Nr   )Úc1Úc2Úa1Úm1Úa2Úm2r   ÚbÚcÚgÚiÚinv_aÚ_r   s                 r   Úcombinez!solve_congruence.<locals>.combineà   s¢   € ð ‰ˆˆBØ‰ˆˆBØ�b˜2‘g˜rˆaˆ1ˆÜ��1�a‹LˆØ"# Q¨ Ö+˜A�1�a“4Ò+‰ˆˆ1ˆaØ�Š6Ü   A›,‰KˆAˆu�aØ�AŠvØØ�‰JˆAØ�B�q‘D‰y˜"˜Q™$ˆ1ˆØ�!ˆtˆùò ,s   ¨A,r   Fr   TNc              3   ó8   K  — | ]  \  }}t        |«      –— Œ y ­wr   r   )r   Úrr   s      r   r   z#solve_congruence.<locals>.<genexpr>  s   è ø€ Ò)™d˜a Œw�q�zÑ)ùs   ‚)r   r   )r   r/   )Úgetr   Úitemsr!   r   r"   r&   r   )Úremainder_modulus_pairsÚhintr<   Úrmr   r>   r   ÚuniqÚrvÚrmiÚns              r   r#   r#   ¬   sR  € òhð, 
!€BØ—‘˜ eÓ,€Ià‡x�x�˜ÔØ13×4©¨¨AŒv�a‹yœ& ›)Ò$Ð4ˆÑ4ð ˆØò 	‰DˆAˆqØ�‰FˆAØ�D‰yØ˜˜Q™’<ÙØØˆD�ŠGð	ð "&§¡£×.™˜˜Aˆq�!ŠfÐ.ˆÑ.Øô
 Ñ) bÔ)Ô)Üœ˜R˜“>‰DˆAˆqÜ�q˜! y¸Ô>Ð>à	€BØò 	ˆÙ�R˜ÓˆØˆ:ÙØ‰ˆˆ1Ø�‰E‰ð	ñ Ü$ Q¨Ó*¨AÐ-Ð-Ø�!ˆtˆùóS 5ùó* /s   ¯ DÂ
DN)FT)F)Úmathr   Úsympy.external.gmpyr   r   Úsympy.ntheory.primetestr   Úsympy.polys.domainsr	   Úsympy.polys.galoistoolsr
   r   r   Úsympy.utilities.miscr   r   r&   r(   r,   r#   r   r   r   ú<module>rN      s7   ðÝ ç +Ý +Ý "ß <Ñ <Ý 'òóK ò\&óR ó:wr   