Ë
    7^(h`‚  ã                   ó  — d Z ddlmZmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ d„ Z G d„ d«      Z e«       Zd„ Z eddd¬«      d„ «       Zdedefd„Zd d„Zd„ Zd!d„Zd„ Zd"d„Zd#d„Zd„ Zd„ Zy)$z"
Generating and counting primes.

é    )ÚbisectÚbisect_left©Úcount)Úarray)Úrandint)Úsqrté   )Úisprime)Ú
deprecated)Úas_intc                 ó0   — ddl m} t         || «      «      S )z� Wrapping ceiling in as_int will raise an error if there was a problem
        determining whether the expression was exactly an integer or not.r   )Úceiling)Ú#sympy.functions.elementary.integersr   r   )Úar   s     úT/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/ntheory/generate.pyÚ_as_int_ceilingr      s   € õ <Ü‘'˜!“*ÓÐó    c                   ód   — e Zd ZdZdd„Zd„ Zdd„Zd„ Zd„ Zd„ Z	dd	„Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚSievea  A list of prime numbers, implemented as a dynamically
    growing sieve of Eratosthenes. When a lookup is requested involving
    an odd number that has not been sieved, the sieve is automatically
    extended up to that number. Implementation details limit the number of
    primes to ``2^32-1``.

    Examples
    ========

    >>> from sympy import sieve
    >>> sieve._reset() # this line for doctest only
    >>> 25 in sieve
    False
    >>> sieve._list
    array('L', [2, 3, 5, 7, 11, 13, 17, 19, 23])
    c                 ó"  ‡ — d‰ _         t        dg d¢«      ‰ _        t        dg d¢«      ‰ _        t        dg d¢«      ‰ _        |dk  rt        d«      ‚|‰ _        t        ˆ fd	„‰ j                  ‰ j                  ‰ j                  fD «       «      sJ ‚y
)zú Initial parameters for the Sieve class.

        Parameters
        ==========

        sieve_interval (int): Amount of memory to be used

        Raises
        ======

        ValueError
            If ``sieve_interval`` is not positive.

        é   ÚL)é   é   é   é   é   é   )r   r
   r
   r   r   é   Úi)r   r
   éÿÿÿÿr"   r   r"   r   z+sieve_interval should be a positive integerc              3   óN   •K  — | ]  }t        |«      ‰j                  k(  –— Œ y ­w©N)ÚlenÚ_n)Ú.0r!   Úselfs     €r   ú	<genexpr>z!Sieve.__init__.<locals>.<genexpr>C   s   øè ø€ ÒU¨”3�q“6˜TŸW™WÕ$ÑUùs   ƒ"%N)r&   Ú_arrayÚ_listÚ_tlistÚ_mlistÚ
ValueErrorÚsieve_intervalÚall)r(   r/   s   ` r   Ú__init__zSieve.__init__-   s|   ø€ ð ˆŒÜ˜CÒ!5Ó6ˆŒ
Ü˜SÒ"4Ó5ˆŒÜ˜SÒ"7Ó8ˆŒØ˜QÒÜÐJÓKÐKØ,ˆÔÜÓU¨t¯z©z¸4¿;¹;ÈÏÉÐ.TÔUÔUÐUÑUr   c                 ó.  — ddt        | j                  «      | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   dt        | j                  «      | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   d	t        | j                  «      | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   fz  S )
Nzs<%s sieve (%i): %i, %i, %i, ... %i, %i
%s sieve (%i): %i, %i, %i, ... %i, %i
%s sieve (%i): %i, %i, %i, ... %i, %i>Úprimer   r
   r   éþÿÿÿr"   ÚtotientÚmobius)r%   r+   r,   r-   )r(   s    r   Ú__repr__zSieve.__repr__E   sà   € ð6ð ”c˜$Ÿ*™*“oØ—‘˜A‘ §
¡
¨1¡¨t¯z©z¸!©}Ø—‘˜B‘ §¡¨B¡Øœ˜DŸK™KÓ(Ø—‘˜Q‘ §¡¨Q¡Ø—‘˜Q‘ §¡¨R¡°$·+±+¸b±/Ø”s˜4Ÿ;™;Ó'Ø—‘˜Q‘ §¡¨Q¡Ø—‘˜Q‘ §¡¨R¡°$·+±+¸b±/ð	:CñCð 	Cr   Nc                 óü   — t        d„ |||fD «       «      rdx}x}}|r| j                  d| j                   | _        |r| j                  d| j                   | _        |r| j                  d| j                   | _        yy)z]Reset all caches (default). To reset one or more set the
            desired keyword to True.c              3   ó$   K  — | ]  }|d u –— Œ
 y ­wr$   © )r'   r!   s     r   r)   zSieve._reset.<locals>.<genexpr>V   s   è ø€ Ò;˜Qˆq�DŒyÑ;ùs   ‚TN)r0   r+   r&   r,   r-   )r(   r3   r5   r6   s       r   Ú_resetzSieve._resetS   sx   € ô Ñ; 5¨'°6Ð":Ô;Ô;Ø'+Ð+ˆEÐ+�G˜fÙØŸ™ H T§W¡WÐ-ˆDŒJÙØŸ+™+ h t§w¡wÐ/ˆDŒKÙØŸ+™+ h t§w¡wÐ/ˆD�Kð r   c           
      ó:  — t        |«      }| j                  d   dz   }||k  ry|dz  }||k  r<| xj                  t        d| j                  ||«      «      z  c_        ||dz  }}||k  rŒ<| xj                  t        d| j                  ||dz   «      «      z  c_        y)z÷Grow the sieve to cover all primes <= n.

        Examples
        ========

        >>> from sympy import sieve
        >>> sieve._reset() # this line for doctest only
        >>> sieve.extend(30)
        >>> sieve[10] == 29
        True
        r"   r
   Nr   r   )Úintr+   r*   Ú_primerange)r(   ÚnÚnumÚnum2s       r   ÚextendzSieve.extend_   s›   € ô �‹Fˆð �j‰j˜‰n˜qÑ ˆØˆsŠ7ØØ�A‰vˆØ�aŠiØ�JŠJœ&  d×&6Ñ&6°s¸DÓ&AÓBÑB�JØ˜d A™g�ˆCð �a‹ið 	�
Š
”f˜S $×"2Ñ"2°3¸¸A¹Ó">Ó?Ñ?Ž
r   c           
   #   óŽ  K  — |dz  r|dz  }||k  r²t        | j                  ||z
  dz  «      }dg|z  }| j                  dt        | j                  t	        |d|z  z   dz   «      «       D ]&  }t        |dz   |z    dz  |z  ||«      D ]  }d||<   Œ	 Œ( t        |«      D ]  \  }}|sŒ	|d|z  z   dz   –— Œ |d|z  z  }||k  rŒ±yy­w)a?   Generate all prime numbers in the range (a, b).

        Parameters
        ==========

        a, b : positive integers assuming the following conditions
                * a is an even number
                * 2 < self._list[-1] < a < b < nextprime(self._list[-1])**2

        Yields
        ======

        p (int): prime numbers such that ``a < p < b``

        Examples
        ========

        >>> from sympy.ntheory.generate import Sieve
        >>> s = Sieve()
        >>> s._list[-1]
        13
        >>> list(s._primerange(18, 31))
        [19, 23, 29]

        r   r
   TFN)Úminr/   r+   r   r	   ÚrangeÚ	enumerate)r(   r   ÚbÚ
block_sizeÚblockÚpÚtÚidxs           r   r>   zSieve._primerangex   sü   è ø€ ð4 ˆqŠ5Ø�‰FˆAØ�!ŠeÜ˜T×0Ñ0°1°q±5¸Q±,Ó?ˆJð �F˜ZÑ'ˆEØ—Z‘Z ¤&¨¯©´T¸!¸aÀ*¹nÑ:LÈqÑ:PÓ5QÓ"RÐSò %�Ü ! a¡%¨!¡) °Ñ 1°QÑ6¸
ÀAÓFò %�AØ$�E˜!’Hñ%ð%ô $ EÓ*ò *‘��QÚØ˜a #™g™+¨™/Ó)ð*ð ��Z‘ÑˆAð �!�eùs   ‚B#CÂ&CÃCc                 óÒ   — t        |«      }t        | j                  «      |k  rD| j                  t	        | j                  d   dz  «      «       t        | j                  «      |k  rŒCyy)að  Extend to include the ith prime number.

        Parameters
        ==========

        i : integer

        Examples
        ========

        >>> from sympy import sieve
        >>> sieve._reset() # this line for doctest only
        >>> sieve.extend_to_no(9)
        >>> sieve._list
        array('L', [2, 3, 5, 7, 11, 13, 17, 19, 23])

        Notes
        =====

        The list is extended by 50% if it is too short, so it is
        likely that it will be longer than requested.
        r"   g      ø?N)r   r%   r+   rB   r=   )r(   r!   s     r   Úextend_to_nozSieve.extend_to_no¡   sM   € ô. �1‹IˆÜ�$—*‘*‹o Ò!Ø�K‰Kœ˜DŸJ™J r™N¨SÑ0Ó1Ô2ô �$—*‘*‹o Õ!r   c              #   ó  K  — |€t        |«      }d}n t        dt        |«      «      }t        |«      }||k\  ry| j                  |«       | j                  t	        | j                  |«      t	        | j                  |«       E d{  –—†  y7 Œ­w)a(  Generate all prime numbers in the range [2, a) or [a, b).

        Examples
        ========

        >>> from sympy import sieve, prime

        All primes less than 19:

        >>> print([i for i in sieve.primerange(19)])
        [2, 3, 5, 7, 11, 13, 17]

        All primes greater than or equal to 7 and less than 19:

        >>> print([i for i in sieve.primerange(7, 19)])
        [7, 11, 13, 17]

        All primes through the 10th prime

        >>> list(sieve.primerange(prime(10) + 1))
        [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

        Nr   )r   ÚmaxrB   r+   r   )r(   r   rG   s      r   Ú
primerangezSieve.primerange¼   s}   è ø€ ð0 ˆ9Ü Ó"ˆAØ‰Aä�A” qÓ)Ó*ˆAÜ Ó"ˆAØ�Š6ØØ�‰�AŒØ—:‘:œk¨$¯*©*°aÓ8Ü)¨$¯*©*°aÓ8ð:÷ 	:ò 	:ús   ‚BBÂB
ÂBc           	   #   ó   K  — t        dt        |«      «      }t        |«      }t        | j                  «      }||k\  ry||k  r#t	        ||«      D ]  }| j                  |   –— Œ y| xj                  t        dt	        ||«      «      z  c_        t	        d|«      D ]j  }| j                  |   }||dz
  k(  rG||z   dz
  |z  |z  }t	        |||«      D ])  }| j                  |xx   | j                  |   |z  z  cc<   Œ+ ||k\  sŒg|–— Œl t	        ||«      D ]f  }| j                  |   }||k(  r9t	        |||«      D ])  }| j                  |xx   | j                  |   |z  z  cc<   Œ+ ||k\  sŒV| j                  |   –— Œh y­w)zêGenerate all totient numbers for the range [a, b).

        Examples
        ========

        >>> from sympy import sieve
        >>> print([i for i in sieve.totientrange(7, 18)])
        [6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16]
        r
   Nr   )rP   r   r%   r,   rE   r*   )r(   r   rG   r?   r!   ÚtiÚ
startindexÚjs           r   ÚtotientrangezSieve.totientrangeà   s  è ø€ ô �”? 1Ó%Ó&ˆÜ˜AÓˆÜ�—‘ÓˆØ�Š6ØØ�!ŠVÜ˜1˜a“[ò %�Ø—k‘k !‘nÓ$ñ%ð �KŠKœ6 #¤u¨Q°£{Ó3Ñ3�KÜ˜1˜a“[ò �Ø—[‘[ ‘^�Ø˜˜Q™’;Ø"# a¡%¨!¡)°Ñ!1°AÑ!5�JÜ" :¨q°!Ó4ò >˜ØŸ™ A›¨$¯+©+°a©.¸AÑ*=Ñ=œð>à˜“6Ø“Hðô ˜1˜a“[ò )�Ø—[‘[ ‘^�Ø˜’7Ü" 1 a¨›^ò >˜ØŸ™ A›¨$¯+©+°a©.¸AÑ*=Ñ=œð>à˜“6ØŸ+™+ a™.Ó(ñ)ùs   ‚C?E>ÄA'E>Å*E>c              #   óŒ  K  — t        dt        |«      «      }t        |«      }t        | j                  «      }||k\  ry||k  r#t	        ||«      D ]  }| j                  |   –— Œ y| xj                  t        ddg||z
  z  «      z  c_        t	        d|«      D ]R  }| j                  |   }||z   dz
  |z  |z  }t	        |||«      D ]  }| j                  |xx   |z  cc<   Œ ||k\  sŒO|–— ŒT t	        ||«      D ]G  }| j                  |   }t	        d|z  ||«      D ]  }| j                  |xx   |z  cc<   Œ ||k\  sŒD|–— ŒI y­w)a†  Generate all mobius numbers for the range [a, b).

        Parameters
        ==========

        a : integer
            First number in range

        b : integer
            First number outside of range

        Examples
        ========

        >>> from sympy import sieve
        >>> print([i for i in sieve.mobiusrange(7, 18)])
        [-1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1]
        r
   Nr!   r   r   )rP   r   r%   r-   rE   r*   )r(   r   rG   r?   r!   ÚmirT   rU   s           r   ÚmobiusrangezSieve.mobiusrange  sS  è ø€ ô& �”? 1Ó%Ó&ˆÜ˜AÓˆÜ�—‘ÓˆØ�Š6ØØ�!ŠVÜ˜1˜a“[ò %�Ø—k‘k !‘nÓ$ñ%ð �KŠKœ6 #¨ s¨A°©E¡{Ó3Ñ3�KÜ˜1˜a“[ò �Ø—[‘[ ‘^�Ø !™e a™i¨AÑ-°Ñ1�
Ü˜z¨1¨aÓ0ò )�AØ—K‘K “N bÑ(”Nð)à˜“6Ø“Hðô ˜1˜a“[ò �Ø—[‘[ ‘^�Ü˜q 1™u a¨Ó+ò )�AØ—K‘K “N bÑ(”Nð)à˜“6Ø“Hñùs   ‚C$EÃ'AEÄ=Ec                 ó  — t        |«      }t        |«      }|dk  rt        d|z  «      ‚|| j                  d   kD  r| j	                  |«       t        | j                  |«      }| j                  |dz
     |k(  r||fS ||dz   fS )a~  Return the indices i, j of the primes that bound n.

        If n is prime then i == j.

        Although n can be an expression, if ceiling cannot convert
        it to an integer then an n error will be raised.

        Examples
        ========

        >>> from sympy import sieve
        >>> sieve.search(25)
        (9, 10)
        >>> sieve.search(23)
        (9, 9)
        r   zn should be >= 2 but got: %sr"   r
   )r   r   r.   r+   rB   r   )r(   r?   ÚtestrG   s       r   ÚsearchzSieve.search1  s…   € ô" ˜qÓ!ˆÜ�1‹IˆØˆqŠ5ÜÐ;¸aÑ?Ó@Ð@Øˆt�z‰z˜"‰~ÒØ�K‰K˜ŒNÜ�4—:‘:˜qÓ!ˆØ�:‰:�a˜!‘eÑ Ò$Ø�a�4ˆKà�a˜!‘e�8ˆOr   c                 ó    — 	 t        |«      }|dk\  sJ ‚	 |dz  dk(  r|dk(  S | j                  |«      \  }}||k(  S # t        t        f$ r Y yw xY w)Nr   Fr   )r   r.   ÚAssertionErrorr\   )r(   r?   r   rG   s       r   Ú__contains__zSieve.__contains__N  sd   € ð	Ü�q“	ˆAØ˜’6ˆM‘6ð ˆq‰5�AŠ:Ø˜‘6ˆMØ�{‰{˜1‹~‰ˆˆ1Ø�A‰vˆøô œNÐ+ò 	Ùð	ús   ‚; »AÁAc              #   ó:   K  — t        d«      D ]	  }| |   –— Œ y ­w)Nr
   r   )r(   r?   s     r   Ú__iter__zSieve.__iter__Y  s"   è ø€ Ü�q“ò 	ˆAØ�q‘'‹Mñ	ùs   ‚c                 ó€  — t        |t        «      rq| j                  |j                  «       |j                  �|j                  nd}|dk  rt        d«      ‚| j                  |dz
  |j                  dz
  |j                  …   S |dk  rt        d«      ‚t        |«      }| j                  |«       | j                  |dz
     S )zReturn the nth prime numberr   r
   zSieve indices start at 1.)	Ú
isinstanceÚslicerN   ÚstopÚstartÚ
IndexErrorr+   Ústepr   )r(   r?   rf   s      r   Ú__getitem__zSieve.__getitem__]  s¬   € ä�aœÔØ×Ñ˜aŸf™fÔ%Ø Ÿw™wÐ2�A—G’G¸ˆEØ�qŠyô !Ð!<Ó=Ð=Ø—:‘:˜e a™i¨¯©°©
°1·6±6Ð9Ñ:Ð:à�1Šuô !Ð!<Ó=Ð=Ü�q“	ˆAØ×Ñ˜aÔ Ø—:‘:˜a !™eÑ$Ð$r   )i@B )NNNr$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r7   r;   rB   r>   rN   rQ   rV   rY   r\   r_   ra   ri   r:   r   r   r   r      sO   „ ñó$Vò0Có
0ò@ò2' òR3ó6":òH#)òJ*òXò:	òó%r   r   c           	      ó  — t        | «      }|dk  rt        d«      ‚|t        t        j                  «      k  r	t        |   S ddlm} ddlm} |dk  r!t        j                  d|z  «       t        |   S d}t        | ||«      j                  «        | ||«      «      j                  «       z   z  «      }||k  r/||z   dz	  } ||«      j                  «       |kD  r|}n|dz   }||k  rŒ/t        |dz
  |t        |dz
  «      z
  «      S )	a…  
    Return the nth prime number, where primes are indexed starting from 1:
    prime(1) = 2, prime(2) = 3, etc.

    Parameters
    ==========

    nth : int
        The position of the prime number to return (must be a positive integer).

    Returns
    =======

    int
        The nth prime number.

    Examples
    ========

    >>> from sympy import prime
    >>> prime(10)
    29
    >>> prime(1)
    2
    >>> prime(100000)
    1299709

    See Also
    ========

    sympy.ntheory.primetest.isprime : Test if a number is prime.
    primerange : Generate all primes in a given range.
    primepi : Return the number of primes less than or equal to a given number.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Prime_number_theorem
    .. [2] https://en.wikipedia.org/wiki/Logarithmic_integral_function
    .. [3] https://en.wikipedia.org/wiki/Skewes%27_number
    r
   z-nth must be a positive integer; prime(1) == 2r   ©Úlog©Úliiè  é   r   )r   r.   r%   Úsiever+   Ú&sympy.functions.elementary.exponentialrp   Ú'sympy.functions.special.error_functionsrr   rB   r=   ÚevalfÚ	nextprimeÚ_primepi)Únthr?   rp   rr   r   rG   Úmids          r   r3   r3   s  sö   € ôT 	ˆs‹€AØˆ1‚uÜÐHÓIÐIð 	ŒC”—‘ÓÒÜ�Q‰xˆå:Ý:àˆ4‚xä�‰�Q˜‘UÔÜ�Q‰xˆà	€AäˆA‘�Q“—‘“¡#¡c¨!£f£+×"3Ñ"3Ó"5Ñ5Ñ6Ó7€Að ˆaŠ%Ø�1‰u˜‰lˆÙˆc‹7�=‰=‹?˜QÒØ‰Aà�a‘ˆAð ˆa‹%ô �Q˜‘U˜A¤¨¨Q©£Ñ/Ó0Ð0r   zgThe `sympy.ntheory.generate.primepi` has been moved to `sympy.functions.combinatorial.numbers.primepi`.z1.13z%deprecated-ntheory-symbolic-functions)Údeprecated_since_versionÚactive_deprecations_targetc                 ó   — ddl m}  || «      S )a�
   Represents the prime counting function pi(n) = the number
        of prime numbers less than or equal to n.

        .. deprecated:: 1.13

            The ``primepi`` function is deprecated. Use :class:`sympy.functions.combinatorial.numbers.primepi`
            instead. See its documentation for more information. See
            :ref:`deprecated-ntheory-symbolic-functions` for details.

        Algorithm Description:

        In sieve method, we remove all multiples of prime p
        except p itself.

        Let phi(i,j) be the number of integers 2 <= k <= i
        which remain after sieving from primes less than
        or equal to j.
        Clearly, pi(n) = phi(n, sqrt(n))

        If j is not a prime,
        phi(i,j) = phi(i, j - 1)

        if j is a prime,
        We remove all numbers(except j) whose
        smallest prime factor is j.

        Let $x= j \times a$ be such a number, where $2 \le a \le i / j$
        Now, after sieving from primes $\le j - 1$,
        a must remain
        (because x, and hence a has no prime factor $\le j - 1$)
        Clearly, there are phi(i / j, j - 1) such a
        which remain on sieving from primes $\le j - 1$

        Now, if a is a prime less than equal to j - 1,
        $x= j \times a$ has smallest prime factor = a, and
        has already been removed(by sieving from a).
        So, we do not need to remove it again.
        (Note: there will be pi(j - 1) such x)

        Thus, number of x, that will be removed are:
        phi(i / j, j - 1) - phi(j - 1, j - 1)
        (Note that pi(j - 1) = phi(j - 1, j - 1))

        $\Rightarrow$ phi(i,j) = phi(i, j - 1) - phi(i / j, j - 1) + phi(j - 1, j - 1)

        So,following recursion is used and implemented as dp:

        phi(a, b) = phi(a, b - 1), if b is not a prime
        phi(a, b) = phi(a, b-1)-phi(a / b, b-1) + phi(b-1, b-1), if b is prime

        Clearly a is always of the form floor(n / k),
        which can take at most $2\sqrt{n}$ values.
        Two arrays arr1,arr2 are maintained
        arr1[i] = phi(i, j),
        arr2[i] = phi(n // i, j)

        Finally the answer is arr2[1]

        Examples
        ========

        >>> from sympy import primepi, prime, prevprime, isprime
        >>> primepi(25)
        9

        So there are 9 primes less than or equal to 25. Is 25 prime?

        >>> isprime(25)
        False

        It is not. So the first prime less than 25 must be the
        9th prime:

        >>> prevprime(25) == prime(9)
        True

        See Also
        ========

        sympy.ntheory.primetest.isprime : Test if n is prime
        primerange : Generate all primes in a given range
        prime : Return the nth prime
    r   )Úprimepi)Ú%sympy.functions.combinatorial.numbersr   )r?   Úfunc_primepis     r   r   r   ¼  s   € õp NÙ˜‹?Ðr   r?   Úreturnc           	      óî  — | dk  ry| t         j                  d   k  rt         j                  | «      d   S t        | «      }t	        |dz   «      D �cg c]
  }|dz   dz	  ‘Œ }}dgt	        d|dz   «      D �cg c]  }| |z  dz   dz	  ‘Œ c}z   }dg|dz   z  }t	        d|dz   d«      D ]Á  }||   rŒ	||dz
     }t	        ||dz   |«      D ]  }d||<   Œ	 t	        dt        | ||z  z  |«      dz   d«      D ]<  }||   rŒ	||z  }||k  r||xx   ||   |z
  z  cc<   Œ'||xx   || |z     |z
  z  cc<   Œ> t	        |t        |||z  dz
  «      d«      D ]  }||xx   |||z     |z
  z  cc<   Œ ŒÃ |d   S c c}w c c}w )aÚ   Represents the prime counting function pi(n) = the number
    of prime numbers less than or equal to n.

    Explanation
    ===========

    In sieve method, we remove all multiples of prime p
    except p itself.

    Let phi(i,j) be the number of integers 2 <= k <= i
    which remain after sieving from primes less than
    or equal to j.
    Clearly, pi(n) = phi(n, sqrt(n))

    If j is not a prime,
    phi(i,j) = phi(i, j - 1)

    if j is a prime,
    We remove all numbers(except j) whose
    smallest prime factor is j.

    Let $x= j \times a$ be such a number, where $2 \le a \le i / j$
    Now, after sieving from primes $\le j - 1$,
    a must remain
    (because x, and hence a has no prime factor $\le j - 1$)
    Clearly, there are phi(i / j, j - 1) such a
    which remain on sieving from primes $\le j - 1$

    Now, if a is a prime less than equal to j - 1,
    $x= j \times a$ has smallest prime factor = a, and
    has already been removed(by sieving from a).
    So, we do not need to remove it again.
    (Note: there will be pi(j - 1) such x)

    Thus, number of x, that will be removed are:
    phi(i / j, j - 1) - phi(j - 1, j - 1)
    (Note that pi(j - 1) = phi(j - 1, j - 1))

    $\Rightarrow$ phi(i,j) = phi(i, j - 1) - phi(i / j, j - 1) + phi(j - 1, j - 1)

    So,following recursion is used and implemented as dp:

    phi(a, b) = phi(a, b - 1), if b is not a prime
    phi(a, b) = phi(a, b-1)-phi(a / b, b-1) + phi(b-1, b-1), if b is prime

    Clearly a is always of the form floor(n / k),
    which can take at most $2\sqrt{n}$ values.
    Two arrays arr1,arr2 are maintained
    arr1[i] = phi(i, j),
    arr2[i] = phi(n // i, j)

    Finally the answer is arr2[1]

    Parameters
    ==========

    n : int

    r   r   r"   r
   Fr   T)rt   r+   r\   r	   rE   rD   )	r?   Úlimr!   Úarr1Úarr2ÚskiprJ   rU   Ústs	            r   ry   ry     sÈ  € ðx 	ˆ1‚uØØŒE�K‰K˜‰OÒÜ�|‰|˜A‹˜qÑ!Ð!Ü
ˆq‹'€CÜ"'¨¨a©£.Ö1˜QˆQ�‰U�q‹LÐ1€DÐ1Øˆ3¬5°°C¸!±GÓ+<Ö= a�1�a‘4˜!‘8 “/Ò=Ñ=€DØˆ7�c˜A‘gÑ€DÜ�1�c˜A‘g˜qÓ!ò (ˆð �Š7àØ��Q‘‰KˆÜ�q˜# ™' 1Ó%ò 	ˆAØˆD�ŠGð	ô �qœ#˜a A¨¡E™l¨CÓ0°1Ñ4°aÓ8ò 		-ˆAð �AŠwØØ�Q‘ˆBØ�SŠyØ�Q“˜4 ™8 a™<Ñ'”à�Q“˜4  R¡™=¨1Ñ,Ñ,”ð		-ô �sœC  Q q¡S¨1¡WÓ-¨rÓ2ò 	(ˆAØ�‹G�t˜A ™F‘| aÑ'Ñ'ŒGñ	(ð3(ð6 �‰7€Nùò= 2ùÚ=s   ÁE-Á4E2c                 ó´  — t        | «      } t        |«      }|dk  rt        d«      ‚| dk  rd} |dz  }| t        j                  d   k  r…t        j                  | «      \  }}||z   dz
  t        t        j                  «      k  rt        j                  ||z   dz
     S t        j                  d   } ||t        t        j                  «      z
  z  }d| dz  z  }|| k(  r| dz  } t        | «      r	|dz  }|s| S | dz  } n,| |z
  d	k(  r| dz  } t        | «      r	|dz  }|s| S | dz  } n|d	z   } 	 t        | «      r	|dz  }|s| S | dz  } t        | «      r	|dz  }|s| S | dz  } Œ3)
aU   Return the ith prime greater than n.

        Parameters
        ==========

        n : integer
        ith : positive integer

        Returns
        =======

        int : Return the ith prime greater than n

        Raises
        ======

        ValueError
            If ``ith <= 0``.
            If ``n`` or ``ith`` is not an integer.

        Notes
        =====

        Potential primes are located at 6*j +/- 1. This
        property is used during searching.

        >>> from sympy import nextprime
        >>> [(i, nextprime(i)) for i in range(10, 15)]
        [(10, 11), (11, 13), (12, 13), (13, 17), (14, 17)]
        >>> nextprime(2, ith=2) # the 2nd prime after 2
        5

        See Also
        ========

        prevprime : Return the largest prime smaller than n
        primerange : Generate all primes in a given range

    r   zith should be positiver   r
   r4   r"   r   r    r   )r=   r   r.   rt   r+   r\   r%   r   )r?   Úithr!   ÚlÚ_Únns         r   rx   rx   z  s{  € ôP 	ˆA‹€AÜˆs‹€AØˆA‚vÜÐ1Ó2Ð2Øˆ1‚uØˆØ	ˆQ‰ˆØŒE�K‰K˜‰OÒÜ�|‰|˜A‹‰ˆˆ1Øˆq‰5�1‰9”sœ5Ÿ;™;Ó'Ò'Ü—;‘;˜q 1™u q™yÑ)Ð)Ü�K‰K˜‰OˆØ	ˆQ””U—[‘[Ó!Ñ!Ñ!ˆØ	
ˆAˆq‰D‰€BØ	ˆQ‚wØ	ˆQ‰ˆÜ�1Œ:Ø�‰FˆAÙØ�Ø	ˆQ‰‰Ø	
ˆR‰�1ŠØ	ˆQ‰ˆÜ�1Œ:Ø�‰FˆAÙØ�Ø	ˆQ‰‰à�‰FˆØ
Ü�1Œ:Ø�‰FˆAÙØ�Ø	ˆQ‰ˆÜ�1Œ:Ø�‰FˆAÙØ�Ø	ˆQ‰ˆð r   c                 óŽ  — t        | «      } | dk  rt        d«      ‚| dk  rddddddœ|    S | t        j                  d   k  r2t        j	                  | «      \  }}||k(  rt        |dz
     S t        |   S d	| d	z  z  }| |z
  dk  r|dz
  } t        | «      r| S | d
z  } n|dz   } 	 t        | «      r| S | dz  } t        | «      r| S | d
z  } Œ%)aß   Return the largest prime smaller than n.

        Notes
        =====

        Potential primes are located at 6*j +/- 1. This
        property is used during searching.

        >>> from sympy import prevprime
        >>> [(i, prevprime(i)) for i in range(10, 15)]
        [(10, 7), (11, 7), (12, 11), (13, 11), (14, 13)]

        See Also
        ========

        nextprime : Return the ith prime greater than n
        primerange : Generates all primes in a given range
    r   zno preceding primesrs   r   r   )r   r    r   r   r   r"   r
   r   r    )r   r.   rt   r+   r\   r   )r?   r‹   Úur�   s       r   Ú	prevprimer�   Í  sî   € ô& 	˜Ó€AØˆ1‚uÜÐ.Ó/Ð/Øˆ1‚uØ˜˜q Q¨1Ñ-¨aÑ0Ð0ØŒE�K‰K˜‰OÒÜ�|‰|˜A‹‰ˆˆ1Ø�Š6Ü˜˜1™‘:Ðä˜‘8ˆOØ	
ˆAˆq‰D‰€BØˆ2�v�‚{Ø�‰FˆÜ�1Œ:ØˆHØ	ˆQ‰‰à�‰FˆØ
Ü�1Œ:ØˆHØ	ˆQ‰ˆÜ�1Œ:ØˆHØ	ˆQ‰ˆð r   Nc              #   óÐ  K  — |€d| }} | |k\  ryt         j                  d   }||k  rt         j                  | |«      E d{  –—†  y| |k  r9t         j                  t        t         j                  | «      d E d{  –—†  |dz   } n
| dz  r| dz  } t	        ||dz  «      }| |k  r t         j                  | |«      E d{  –—†  |} || k  ry	 t        | «      } | |k  r| –— nyŒ7 ŒŸ7 Œh7 Œ(­w)a
   Generate a list of all prime numbers in the range [2, a),
        or [a, b).

        If the range exists in the default sieve, the values will
        be returned from there; otherwise values will be returned
        but will not modify the sieve.

        Examples
        ========

        >>> from sympy import primerange, prime

        All primes less than 19:

        >>> list(primerange(19))
        [2, 3, 5, 7, 11, 13, 17]

        All primes greater than or equal to 7 and less than 19:

        >>> list(primerange(7, 19))
        [7, 11, 13, 17]

        All primes through the 10th prime

        >>> list(primerange(prime(10) + 1))
        [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

        The Sieve method, primerange, is generally faster but it will
        occupy more memory as the sieve stores values. The default
        instance of Sieve, named sieve, can be used:

        >>> from sympy import sieve
        >>> list(sieve.primerange(1, 30))
        [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

        Notes
        =====

        Some famous conjectures about the occurrence of primes in a given
        range are [1]:

        - Twin primes: though often not, the following will give 2 primes
                    an infinite number of times:
                        primerange(6*n - 1, 6*n + 2)
        - Legendre's: the following always yields at least one prime
                        primerange(n**2, (n+1)**2+1)
        - Bertrand's (proven): there is always a prime in the range
                        primerange(n, 2*n)
        - Brocard's: there are at least four primes in the range
                        primerange(prime(n)**2, prime(n+1)**2)

        The average gap between primes is log(n) [2]; the gap between
        primes can be arbitrarily large since sequences of composite
        numbers are arbitrarily large, e.g. the numbers in the sequence
        n! + 2, n! + 3 ... n! + n are all composite.

        See Also
        ========

        prime : Return the nth prime
        nextprime : Return the ith prime greater than n
        prevprime : Return the largest prime smaller than n
        randprime : Returns a random prime in a given range
        primorial : Returns the product of primes based on condition
        Sieve.primerange : return range from already computed primes
                           or extend the sieve to contain the requested
                           range.

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Prime_number
        .. [2] https://primes.utm.edu/notes/gaps.html
    Nr   r"   r
   )rt   r+   rQ   r   rD   r>   rx   )r   rG   Úlargest_known_primeÚtails       r   rQ   rQ   ü  s  è ø€ ðV 	€yØ�!ˆ1ˆØˆA‚vØäŸ+™+ b™/ÐØÐÒÜ×#Ñ# A qÓ)×)Ð)ØàÐÒÜ—;‘;œ{¬5¯;©;¸Ó:Ð;Ð<×<Ð<Ø !Ñ#‰Ø	
ˆQŠØ	ˆQ‰ˆÜˆqÐ&¨Ñ*Ó+€DØˆ4‚xÜ×$Ñ$ Q¨Ó-×-Ð-ØˆØˆA‚vØà
Ü�a‹LˆØˆqŠ5Ø‹Gàð ð 	*øð 	=øð 	.ús6   ‚>C&Á C Á8C&Á9C"Á:AC&Â;C$Â<%C&Ã"C&Ã$C&c                 ó°   — | |k\  ryt        t        | |f«      \  } }t        | dz
  |«      }t        |«      }||k\  rt	        |«      }|| k  rt        d«      ‚|S )aG   Return a random prime number in the range [a, b).

        Bertrand's postulate assures that
        randprime(a, 2*a) will always succeed for a > 1.

        Note that due to implementation difficulties,
        the prime numbers chosen are not uniformly random.
        For example, there are two primes in the range [112, 128),
        ``113`` and ``127``, but ``randprime(112, 128)`` returns ``127``
        with a probability of 15/17.

        Examples
        ========

        >>> from sympy import randprime, isprime
        >>> randprime(1, 30) #doctest: +SKIP
        13
        >>> isprime(randprime(1, 30))
        True

        See Also
        ========

        primerange : Generate all primes in a given range

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Bertrand's_postulate

    Nr
   z&no primes exist in the specified range)Úmapr=   r   rx   r�   r.   )r   rG   r?   rJ   s       r   Ú	randprimer–   e  sd   € ð@ 	ˆA‚vØÜŒs�Q˜�FÓ�D€A€qÜ��A‘�qÓ€AÜ�!‹€AØˆA‚vÜ�a‹LˆØˆ1‚uÜÐAÓBÐBØ€Hr   c                 óÚ   — |rt        | «      } nt        | «      } | dk  rt        d«      ‚d}|r$t        d| dz   «      D ]  }|t	        |«      z  }Œ |S t        d| dz   «      D ]  }||z  }Œ	 |S )a:  
    Returns the product of the first n primes (default) or
    the primes less than or equal to n (when ``nth=False``).

    Examples
    ========

    >>> from sympy.ntheory.generate import primorial, primerange
    >>> from sympy import factorint, Mul, primefactors, sqrt
    >>> primorial(4) # the first 4 primes are 2, 3, 5, 7
    210
    >>> primorial(4, nth=False) # primes <= 4 are 2 and 3
    6
    >>> primorial(1)
    2
    >>> primorial(1, nth=False)
    1
    >>> primorial(sqrt(101), nth=False)
    210

    One can argue that the primes are infinite since if you take
    a set of primes and multiply them together (e.g. the primorial) and
    then add or subtract 1, the result cannot be divided by any of the
    original factors, hence either 1 or more new primes must divide this
    product of primes.

    In this case, the number itself is a new prime:

    >>> factorint(primorial(4) + 1)
    {211: 1}

    In this case two new primes are the factors:

    >>> factorint(primorial(4) - 1)
    {11: 1, 19: 1}

    Here, some primes smaller and larger than the primes multiplied together
    are obtained:

    >>> p = list(primerange(10, 20))
    >>> sorted(set(primefactors(Mul(*p) + 1)).difference(set(p)))
    [2, 5, 31, 149]

    See Also
    ========

    primerange : Generate all primes in a given range

    r
   zprimorial argument must be >= 1r   )r   r=   r.   rE   r3   rQ   )r?   rz   rJ   r!   s       r   Ú	primorialr˜   ‘  sŒ   € ñd Ü�1‹I‰ä�‹FˆØˆ1‚uÜÐ:Ó;Ð;Ø	€AÙ
Ü�q˜!˜a™%“ò 	ˆAØ”�q“‰M‰Að	ð
 €Hô ˜A˜q 1™uÓ%ò 	ˆAØ�‰F‰Að	à€Hr   c              #   ó†  K  — t        |xs d«      }dx}}| | |«      }}d}|r|–— ||k7  r;|r||k  r4|dz  }||k(  r	|}|dz  }d}|r|–—  | |«      }|dz  }||k7  r	|sŒ.||k  rŒ4|r||k(  r
|ry|df–— y|sEd}	|x}}t        |«      D ]
  } | |«      }Œ ||k7  r | |«      } | |«      }|	dz  }	||k7  rŒ||	f–— yy­w)aw  For a given iterated sequence, return a generator that gives
    the length of the iterated cycle (lambda) and the length of terms
    before the cycle begins (mu); if ``values`` is True then the
    terms of the sequence will be returned instead. The sequence is
    started with value ``x0``.

    Note: more than the first lambda + mu terms may be returned and this
    is the cost of cycle detection with Brent's method; there are, however,
    generally less terms calculated than would have been calculated if the
    proper ending point were determined, e.g. by using Floyd's method.

    >>> from sympy.ntheory.generate import cycle_length

    This will yield successive values of i <-- func(i):

        >>> def gen(func, i):
        ...     while 1:
        ...         yield i
        ...         i = func(i)
        ...

    A function is defined:

        >>> func = lambda i: (i**2 + 1) % 51

    and given a seed of 4 and the mu and lambda terms calculated:

        >>> next(cycle_length(func, 4))
        (6, 3)

    We can see what is meant by looking at the output:

        >>> iter = cycle_length(func, 4, values=True)
        >>> list(iter)
        [4, 17, 35, 2, 5, 26, 14, 44, 50, 2, 5, 26, 14]

    There are 6 repeating values after the first 3.

    If a sequence is suspected of being longer than you might wish, ``nmax``
    can be used to exit early (and mu will be returned as None):

        >>> next(cycle_length(func, 4, nmax = 4))
        (4, None)
        >>> list(cycle_length(func, 4, nmax = 4, values=True))
        [4, 17, 35, 2]

    Code modified from:
        https://en.wikipedia.org/wiki/Cycle_detection.
    r   r
   r   N)r=   rE   )
ÚfÚx0ÚnmaxÚvaluesÚpowerÚlamÚtortoiseÚharer!   Úmus
             r   Úcycle_lengthr£   Ó  s#  è ø€ ôf ˆtŠy�q‹>€Dð €O€EˆCØ™˜2›ˆd€HØ	€AÙØŠØ
�dÒ
¡D¨A°ªHØ	ˆQ‰ˆØ�CŠ<ØˆHØ�Q‰JˆEØˆCÙØŠJÙ�‹wˆØˆq‰ˆð �dÒ
¢D¨A°«Hñ ��T’	ÙØà˜�*ÒØÙàˆØÐˆ�4Ü�s“ò 	ˆAÙ�T“7‰Dð	à˜$ÒÙ˜“{ˆHÙ�T“7ˆDØ�!‰GˆBð ˜$Óð �2ˆg‹ð ùs   ‚ACÁ"CÁ(ACÂ9Cc           	      ót  — t        | «      }|dk  rt        d«      ‚g d¢}|dk  r||dz
     S dt        j                  d   }}||t	        |«      z
  dz
  k  rD||dz
  k  r*||z   dz	  }|t	        |«      z
  dz
  |kD  r|}n|}||dz
  k  rŒ*t        |«      r|dz  }|S ddlm} dd	lm	} d}t        | ||«       | ||«      «      z   z  «      }||k  r'||z   dz	  }| ||«      z
  dz
  |kD  r|}n|dz   }||k  rŒ'|t	        |«      z
  dz
  }||kD  rt        |«      s|dz  }|dz  }||kD  rŒt        |«      r|dz  }|S )
a£   Return the nth composite number, with the composite numbers indexed as
        composite(1) = 4, composite(2) = 6, etc....

        Examples
        ========

        >>> from sympy import composite
        >>> composite(36)
        52
        >>> composite(1)
        4
        >>> composite(17737)
        20000

        See Also
        ========

        sympy.ntheory.primetest.isprime : Test if n is prime
        primerange : Generate all primes in a given range
        primepi : Return the number of primes less than or equal to n
        prime : Return the nth prime
        compositepi : Return the number of positive composite numbers less than or equal to n
    r
   z1nth must be a positive integer; composite(1) == 4)
r    r   rs   é	   é
   é   é   é   é   é   r¦   r    r"   r   ro   rq   )r   r.   rt   r+   ry   r   ru   rp   rv   rr   r=   )	rz   r?   Úcomposite_arrr   rG   r{   rp   rr   Ún_compositess	            r   Ú	compositer®   +  s  € ô0 	ˆs‹€AØˆ1‚uÜÐLÓMÐMÚ8€MØˆB‚wØ˜Q ™UÑ#Ð#àŒe�k‰k˜"‰o€q€AØˆA”˜“‰O˜aÑÒØ�!�a‘%ŠiØ�q‘5˜Q‘,ˆCØ”X˜c“]Ñ" QÑ&¨Ò*Ø‘à�ð �!�a‘%‹iô �1Œ:Ø�‰FˆAØˆå:Ý:Ø	€AÜˆA‰s�1‹v™™C ›F›Ñ#Ñ$Ó%€Aà
ˆaŠ%Ø�1‰u˜‰lˆØ‘�C“‰=˜1Ñ˜qÒ Ø‰Aà�a‘ˆAð ˆa‹%ð ”x “{‘? QÑ&€LØ
˜Ò
Ü�qŒzØ˜AÑˆLØ	ˆQ‰ˆð ˜Ó
ô ˆq„zØ	ˆQ‰ˆØ€Hr   c                 óF   — t        | «      } | dk  ry| t        | «      z
  dz
  S )ak   Return the number of positive composite numbers less than or equal to n.
        The first positive composite is 4, i.e. compositepi(4) = 1.

        Examples
        ========

        >>> from sympy import compositepi
        >>> compositepi(25)
        15
        >>> compositepi(1000)
        831

        See Also
        ========

        sympy.ntheory.primetest.isprime : Test if n is prime
        primerange : Generate all primes in a given range
        prime : Return the nth prime
        primepi : Return the number of primes less than or equal to n
        composite : Return the nth composite number
    r    r   r
   )r=   ry   )r?   s    r   Úcompositepir°   l  s*   € ô, 	ˆA‹€AØˆ1‚uØØŒx˜‹{‰?˜QÑÐr   )r
   r$   )T)NF) rm   r   r   Ú	itertoolsr   r   r*   Úsympy.core.randomr   Úsympy.external.gmpyr	   Ú	primetestr   Úsympy.utilities.decoratorr   Úsympy.utilities.miscr   r   r   rt   r3   r   r=   ry   rx   r�   rQ   r–   r˜   r£   r®   r°   r:   r   r   ú<module>r·      s»   ðñ÷
 'Ý õ "å %Ý $Ý Ý 0Ý 'ò÷T%ñ T%ñn
 	‹€òF1ñR ð kàØBôDñUó	DðUðp_ˆsð _�só _óDPòf,ó^fòR)óX?óDUòp>óBr   