
    wg                        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     [/home/mcse/projects/flask/flask-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3q6TWW$Us   "%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,Utzz4;;.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tzz!}BBDKK(QQQR$++b/s4;;'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     ;QqDy;s   TN)r0   r+   r&   r,   r-   )r(   r3   r5   r6   s       r   _resetzSieve._resetS   sx     ;5'6":;;'++E+GfHTWW-DJ++htww/DK++htww/DK 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)zGrow 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 jjnq s7AvaiJJ&d&6&6sD&ABBJdAgC ai 	

fS$"2"23A">??
r   c           
   #     K   |dz  r|dz  }||k  rt        | 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 q5FA!eT001q5Q,?J FZ'EZZ&T!a*n:Lq:P5Q"RS %!a%!) 1Q6
AF %A$E!H%% $E* *Qa#g+/)* ZA !es   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    . 1I$**o!KKDJJrNS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)zGenerate 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1a[ %kk!n$% KK6#uQ{33K1a[ [[^Q;"#a%!)!1A!5J":q!4 >A$++a.A*==>6H 1a[ )[[^7"1a^ >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1a[ %kk!n$% KK6#sAE{33K1a[ [[^!eaiA-1
z1a0 )AKKNb(N)6H 1a[ [[^q1ua+ )AKKNb(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!1Iq5;a?@@tzz"~KKN4::q!::a!e$a4Ka!e8Or   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6M6 q5A:6M{{1~1Av 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aff%  !ww2AGGEqy !!<==::eai
1669::1u !!<==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36":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}t        | ||       | ||            z   z        }||k  r!||z   dz	  } ||      |kD  r|}n|dz   }||k  r!t        |dz
        }||k  rt        |      r|dz  }|dz  }||k  r|dz
  S )aK   Return the nth prime, with the primes indexed as prime(1) = 2,
        prime(2) = 3, etc.... The nth prime is approximately $n\log(n)$.

        Logarithmic integral of $x$ is a pretty nice approximation for number of
        primes $\le x$, i.e.
        li(x) ~ pi(x)
        In fact, for the numbers we are concerned about( x<1e11 ),
        li(x) - pi(x) < 50000

        Also,
        li(x) > pi(x) can be safely assumed for the numbers which
        can be evaluated by this function.

        Here, we find the least integer m such that li(m) > n using binary search.
        Now pi(m-1) < li(m-1) <= n,

        We find pi(m - 1) using primepi function.

        Starting from m, we have to find n - pi(m-1) more primes.

        For the inputs this implementation can handle, we will have to test
        primality for at max about 10**5 numbers, to get our answer.

        Examples
        ========

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

        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

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Prime_number_theorem#Table_of_.CF.80.28x.29.2C_x_.2F_log_x.2C_and_li.28x.29
        .. [2] https://en.wikipedia.org/wiki/Prime_number_theorem#Approximations_for_the_nth_prime_number
        .. [3] https://en.wikipedia.org/wiki/Skewes%27_number
    r
   z-nth must be a positive integer; prime(1) == 2r   loglir   )r   r.   r%   siever+   &sympy.functions.elementary.exponentialrp   'sympy.functions.special.error_functionsrr   r=   _primepir   )nthr?   rp   rr   r   rG   midn_primess           r   r3   r3   v  s    b 	sA1uHIICQx::	A 	As1vCF#$%A
a%1ulc7Q;AaA a% AH
Q,1:MH	Q Q, q5Lr   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           	      v   | dk  ry| t         j                  d   k  rt         j                  |       d   S t        |       }dg|dz   z  }dg|dz   z  }t	        d|dz         D ]  }|dz
  ||<   | |z  dz
  ||<    t	        d|dz         D ]  }||   ||dz
     k(  r||dz
     }t	        dt        | ||z  z  |      dz         D ]6  }||z  }||k  r||xx   ||   |z
  z  cc<   !||xx   || |z     |z
  z  cc<   8 t        |||z  dz
        }t	        ||d      D ]  }||xx   |||z     |z
  z  cc<     |d   S )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
   )rs   r+   r\   r	   rE   rD   )	r?   limarr1arr2r!   rJ   rU   stlim2s	            r   rv   rv     s   x 	1uEKKO||Aq!!
q'C3#'?D3#'?D1cAg a%Qq&1*Q 1cAg ( 7d1q5k!QKq#aAElC0145 	-AQBSyQ48a<'Q4R=1,,	- 3A	"sD"% 	(AGtAF|a''G	(( 7Nr   c                    t        |       } t        |      }|dk  rt        d      | dk  rd} |dz  }| t        j                  d   k  rt        j                  |       \  }}||z   dz
  t        t        j                        k  rt        j                  ||z   dz
     S t        t        j                  d   ||z   t        t        j                        z
        S d|k  rt        |      D ]  }t        |       }  | S d| dz  z  }|| k(  r| dz  } t        |       r| S | dz  } n%| |z
  d	k(  r| dz  } t        |       r| S | dz  } n|d	z   } 	 t        |       r| S | dz  } t        |       r| S | dz  } %)
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.   rs   r+   r\   r%   	nextprimerE   r   )r?   ithr!   l_nns         r   r   r   u  su   P 	AAsAAv1221u	QEKKO||A1q519s5;;'';;q1uqy))R!a%#ekk2B*BCC1uq 	A!A		
AqDB	Qw	Q1:H	Q	
R1	Q1:H	QF
1:H	Q1:H	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 primes   r   r   )r   r    r   r   r   r"   r
   r   r    )r   r.   rs   r+   r\   r   )r?   r   ur   s       r   	prevprimer     s    & 	A1u.//1uqQ1-a00EKKO||A161:8O	
AqDB2v{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
   )rs   r+   rQ   r   rD   r>   r   )r   rG   largest_known_primetails       r   rQ   rQ     s    V 	y!1Av++b/##Aq)));;{5;;:;<<<!#	
Q	Qq&*+D4x$$Q---Av
aLq5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   r   r   r.   )r   rG   r?   rJ   s       r   	randprimer   [  sd    @ 	AvsQFDAqAqA!AAvaL1u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?   rw   rJ   r!   s       r   	primorialr     s    d 1IF1u:;;	A
q!a% 	AqMA	
 H Aq1u% 	AFA	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 tyq>D OEC2dH	A
d
DAH	QC<HQJECJwq d
DAH T	*4s 	AT7D	${HT7D!GB $ 2g 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   r   	   
                  r   r    r"   r   ro   rq   )r   r.   rs   r+   rv   r   rt   rp   ru   rr   r=   )	rw   r?   composite_arrr   rG   rx   rp   rr   n_compositess	            r   	compositer   !  s   0 	sA1uLMM8MBwQU##ekk"oqAAOa!a%iq5Q,CXc]"Q&* !a%i 1:FA::	AAs1vCF#$%A
a%1ulC=1q AaA a% x{?Q&L

qzAL	Q 
 qz	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=   rv   )r?   s    r   compositepir   b  s*    , 	AA1u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   rs   r3   r}   r=   rv   r   r   rQ   r   r   r   r   r   r:   r   r   <module>r      s   
 '  " % $  0 'V% V%r
 	IV  kBDU	DUpUs Us UpK\,^fR)X?DUp>Br   