
    \h`                        S r SSKJrJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SS	KJr  SS
KJr  S r " S S5      r\" 5       rS r\" SSSS9S 5       rS\S\4S jrS S jrS rS!S jrS rS"S jrS#S jrS rS rg)$z"
Generating and counting primes.

    )bisectbisect_leftcount)array)randint)sqrt   )isprime)
deprecated)as_intc                 0    SSK Jn  [        U" U 5      5      $ )zWrapping 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     N/var/www/auris/envauris/lib/python3.13/site-packages/sympy/ntheory/generate.py_as_int_ceilingr      s     <'!*    c                   r    \ rS rSrSrSS jrS rSS jrS rS r	S	 r
SS
 jrS rS rS rS rS rS rSrg)Sieve   a  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                 0  ^  ST l         [        S/ SQ5      T l        [        S/ SQ5      T l        [        S/ SQ5      T l        US::  a  [        S5      eUT l        [        U 4S	 jT R                  T R                  T R                  4 5       5      (       d   eg
)zInitial 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   T   >#    U  H  n[        U5      TR                  :H  v   M     g 7fN)len_n).0r"   selfs     r   	<genexpr>!Sieve.__init__.<locals>.<genexpr>C   s      U.T3q6TWW$.Ts   %(N)r'   _array_list_tlist_mlist
ValueErrorsieve_intervalall)r)   r1   s   ` r   __init__Sieve.__init__-   s     C!56
S"45S"78QJKK,Utzz4;;.TUUUUUr   c                 .   SS[        U R                  5      U R                  S   U R                  S   U R                  S   U R                  S   U R                  S   S[        U R                  5      U R                  S   U R                  S   U R                  S   U R                  S   U R                  S   S	[        U R                  5      U R                  S   U R                  S   U R                  S   U R                  S   U R                  S   4-  $ )
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__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                     [        S XU4 5       5      (       a  S=n=p#U(       a  U R                  SU R                   U l        U(       a  U R                  SU R                   U l        U(       a  U R                  SU R                   U l        gg)zQReset all caches (default). To reset one or more set the
desired keyword to True.c              3   (   #    U  H  oS L v   M
     g 7fr%    )r(   r"   s     r   r*   Sieve._reset.<locals>.<genexpr>V   s     ;":QDy":s   TN)r2   r-   r'   r.   r/   )r)   r6   r8   r9   s       r   _resetSieve._resetS   sw     ;56":;;;'++E+GHTWW-DJ++htww/DK++htww/DK r   c           
      4   [        U5      nU R                  S   S-   nX:  a  gUS-  nX1::  a:  U =R                  [        SU R                  X#5      5      -  sl        X3S-  p2X1::  a  M:  U =R                  [        SU R                  X!S-   5      5      -  sl        g)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   extendSieve.extend_   s     F jjnq 7AviJJ&d&6&6s&ABBJAg i 	

fS$"2"23A">??
r   c           
   #     #    US-  (       a  US-  nX:  a  [        U R                  X!-
  S-  5      nS/U-  nU R                  S[        U R                  [	        USU-  -   S-   5      5        H'  n[        US-   U-   * S-  U-  X55       H  nSXF'   M	     M)     [        U5       H  u  puU(       d  M  USU-  -   S-   v   M     USU-  -  nX:  a  M  gg7f)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)minr1   r-   r   r	   range	enumerate)r)   r   b
block_sizeblockptidxs           r   rD   Sieve._primerangex   s     4 q5FAeT0015Q,?J FZ'EZZ&T!a*n:Lq:P5Q"RS!a%!) 1Q6
FA$EH G T $E*1a#g+/) + ZA es   B+C1CCc                     [        U5      n[        U R                  5      U:  aF  U R                  [	        U R                  S   S-  5      5        [        U R                  5      U:  a  ME  gg)ax  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-   rH   rC   )r)   r"   s     r   extend_to_noSieve.extend_to_no   sM    . 1I$**o!KKDJJrNS012 $**o!r   c              #     #    Uc  [        U5      nSnO [        S[        U5      5      n[        U5      nX:  a  gU R                  U5        U R                  [	        U R                  U5      [	        U R                  U5        Sh  vN   g N7f)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   maxrH   r-   r   )r)   r   rN   s      r   
primerangeSieve.primerange   sz     0 9"AAAq)*A"A6A::k$**a8)$**a8: 	: 	:s   BBBBc           	   #     #    [        S[        U5      5      n[        U5      n[        U R                  5      nX:  a  gX#::  a$  [	        X5       H  nU R                  U   v   M     gU =R                  [        S[	        X25      5      -  sl        [	        SU5       Hl  nU R                  U   nXTS-
  :X  aG  X4-   S-
  U-  U-  n[	        XbU5       H*  nU R                  U==   U R                  U   U-  -  ss'   M,     XA:  d  Mh  Uv   Mn     [	        X25       Hi  nU R                  U   nXT:X  a:  [	        XBU5       H*  nU R                  U==   U R                  U   U-  -  ss'   M,     XA:  d  MX  U R                  U   v   Mk     g7f)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   )rY   r   r&   r.   rL   r,   )r)   r   rN   rE   r"   ti
startindexjs           r   totientrangeSieve.totientrange   sM     ?1%&A6V1[kk!n$ ! KK6#uQ{33K1a[[[^Q;"#%!)!1A!5J":!4A$++a.A*== 56H ! 1[[[^7"1^A$++a.A*== ,6++a.( !s   C=FA'F.Fc              #     #    [        S[        U5      5      n[        U5      n[        U R                  5      nX:  a  gX#::  a$  [	        X5       H  nU R                  U   v   M     gU =R                  [        SS/X#-
  -  5      -  sl        [	        SU5       HT  nU R                  U   nX4-   S-
  U-  U-  n[	        XbU5       H  nU R                  U==   U-  ss'   M     XA:  d  MP  Uv   MV     [	        X25       HJ  nU R                  U   n[	        SU-  X$5       H  nU R                  U==   U-  ss'   M     XA:  d  MF  Uv   ML     g7f)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   )rY   r   r&   r/   rL   r,   )r)   r   rN   rE   r"   mir^   r_   s           r   mobiusrangeSieve.mobiusrange  s%    & ?1%&A6V1[kk!n$ ! KK6#sAE{33K1a[[[^eaiA-1
za0AKKNb(N 16H ! 1[[[^q1ua+AKKNb(N ,6H !s   C"E
(AE
	E
c                    [        U5      n[        U5      nUS:  a  [        SU-  5      eXR                  S   :  a  U R	                  U5        [        U R                  U5      nU R                  US-
     U:X  a  X34$ X3S-   4$ )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   r0   r-   rH   r   )r)   rE   testrN   s       r   searchSieve.search1  s    " q!1Iq5;a?@@zz"~KKN4::q!::a!e$4K!e8Or   c                      [        U5      nUS:  d   e US-  S:X  a  US:H  $ U R                  U5      u  p#X#:H  $ ! [        [        4 a     gf = f)Nr   Fr   )r   r0   AssertionErrorrh   )r)   rE   r   rN   s       r   __contains__Sieve.__contains__N  s`    	q	A6M6 q5A:6M{{1~v N+ 		s   ; AAc              #   <   #    [        S5       H	  nX   v   M     g 7f)Nr
   r   )r)   rE   s     r   __iter__Sieve.__iter__Y  s     qA'M s   c                    [        U[        5      (       as  U R                  UR                  5        UR                  b  UR                  OSnUS:  a  [        S5      eU R                  US-
  UR                  S-
  UR                  2   $ US:  a  [        S5      e[        U5      nU R                  U5        U R                  US-
     $ )zReturn the nth prime numberr   r
   zSieve indices start at 1.)	
isinstanceslicerV   stopstart
IndexErrorr-   stepr   )r)   rE   ru   s      r   __getitem__Sieve.__getitem__]  s    aaff% ww2AGGEqy !!<==::eai
1669::1u !!<==q	Aa ::a!e$$r   )r-   r/   r'   r.   r1   )i@B )NNNr%   )__name__
__module____qualname____firstlineno____doc__r3   r:   r@   rH   rD   rV   rZ   r`   rd   rh   rl   ro   rx   __static_attributes__r>   r   r   r   r      sO    $V0C
0@2' R36":H#)J*X:	%r   r   c           	         [        U 5      nUS:  a  [        S5      eU[        [        R                  5      ::  a	  [        U   $ SSKJn  SSKJn  US:  a!  [        R                  SU-  5        [        U   $ Sn[        X" U5      R                  5       U" U" U5      5      R                  5       -   -  5      nXE:  a0  XE-   S-	  nU" U5      R                  5       U:  a  UnOUS-   nXE:  a  M0  [        US-
  U[        US-
  5      -
  5      $ )	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   r0   r&   siever-   &sympy.functions.elementary.exponentialr   'sympy.functions.special.error_functionsr   rH   rC   evalf	nextprime_primepi)nthrE   r   r   r   rN   mids          r   r6   r6   s  s    T 	sA1uHII 	CQx::4xQUQx	AAQ#c!f+"3"3"5567A %ulc7==?QAaA % QUA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                     SSK Jn  U" U 5      $ )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   )rE   func_primepis     r   r   r     s    p N?r   rE   returnc           	         U S:  a  gU [         R                  S   ::  a  [         R                  U 5      S   $ [        U 5      n[	        US-   5       Vs/ s H
  o"S-   S-	  PM     nnS/[	        SUS-   5       Vs/ s H  o U-  S-   S-	  PM     sn-   nS/US-   -  n[	        SUS-   S5       H  nXR   (       a  M  X2S-
     n[	        X!S-   U5       H  nSXW'   M	     [	        S[        XU-  -  U5      S-   S5       H>  nXW   (       a  M  X'-  nX::  a  XG==   XH   U-
  -  ss'   M*  XG==   X0U-     U-
  -  ss'   M@     [	        U[        XU-  S-
  5      S5       H  nX7==   X7U-     U-
  -  ss'   M     M     US   $ s  snf s  snf )a1  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)r   r-   rh   r	   rL   rK   )	rE   limr"   arr1arr2skiprQ   r_   sts	            r   r   r     s   x 	1uEKKO||Aq!!
q'C"'a.1.QUqL.D135C!G+<=+<aa4!8/+<==D7cAgD1cAgq! 7QKq'1%ADG & q#aElC014a8A wBy48a<'4R=1,, 9 sCqS1W-r2AGtF|a''G 33 "6 7N= 2=s   E:8E?c                    [        U 5      n [        U5      nUS::  a  [        S5      eU S:  a  Sn US-  nU [        R                  S   ::  a  [        R                  U 5      u  p4X2-   S-
  [        [        R                  5      :  a  [        R                  X2-   S-
     $ [        R                  S   n X#[        [        R                  5      -
  -  nSU S-  -  nXP:X  a)  U S-  n [        U 5      (       a  US-  nU(       d  U $ U S-  n O6X-
  S	:X  a)  U S-  n [        U 5      (       a  US-  nU(       d  U $ U S-  n OUS	-   n  [        U 5      (       a  US-  nU(       d  U $ U S-  n [        U 5      (       a  US-  nU(       d  U $ U S-  n MH  )
a  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
   r7   r#   r   r!   r   )rC   r   r0   r   r-   rh   r&   r   )rE   ithr"   l_nns         r   r   r   z  sw   P 	AAsAAv1221u	QEKKO||A519s5;;'';;quqy))KKO	U[[!!!	
AqDB	w	Q1::FA	Q	
1	Q1::FA	QF
1::FA	Q1::FA	Q r   c                    [        U 5      n U S:  a  [        S5      eU S:  a  SSSSSS.U    $ U [        R                  S   ::  a1  [        R	                  U 5      u  pX:X  a  [        US-
     $ [        U   $ S	U S	-  -  nX-
  S::  a  US-
  n [        U 5      (       a  U $ U S
-  n OUS-   n  [        U 5      (       a  U $ U S-  n [        U 5      (       a  U $ U S
-  n M0  )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 primesr   r   r   )r   r!   r   r   r   r#   r
   r   r!   )r   r0   r   r-   rh   r   )rE   r   ur   s       r   	prevprimer     s    & 	A1u.//1uqQ1-a00EKKO||A61:8O	
AqDBv{F1::H	QF
1::H	Q1::H	Q r   Nc              #     #    Uc  SU pX:  a  g[         R                  S   nX::  a  [         R                  X5       Sh  vN   gX::  a9  [         R                  [        [         R                  U 5      S  Sh  vN   US-   n OU S-  (       a  U S-  n [	        XS-  5      nX:  a  [         R                  X5       Sh  vN   Un X::  a  g [        U 5      n X:  a  U v   OgM   N Nl N)7f)ao  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
   )r   r-   rZ   r   rK   rD   r   )r   rN   largest_known_primetails       r   rZ   rZ     s     V 	y!1v++b/##A)));;{5;;:;<<<!#	
Q	Qq*+Dx$$Q---v
aL5G  	* 	= 	.s5   =C)C# 8C)8C%9AC)=C'>&C)%C)'C)c                     X:  a  g[        [        X45      u  p[        U S-
  U5      n[        U5      nX1:  a  [	        U5      nX0:  a  [        S5      eU$ )a  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)maprC   r   r   r   r0   )r   rN   rE   rQ   s       r   	randprimer   e  sZ    @ 	vsQFDAAqA!AvaLuABBHr   c                     U(       a  [        U 5      n O[        U 5      n U S:  a  [        S5      eSnU(       a&  [        SU S-   5       H  nU[	        U5      -  nM     U$ [        SU S-   5       H  nX#-  nM	     U$ )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   rC   r0   rL   r6   rZ   )rE   r   rQ   r"   s       r   	primorialr     s    d 1IF1u:;;	A
q!a%AqMA !
 H Aq1u%AFA &Hr   c              #     #    [        U=(       d    S5      nS=pEX" U5      pvSnU(       a  Uv   Xg:w  aL  U(       a  X:  a@  US-  nXE:X  a	  UnUS-  nSnU(       a  Uv   U " U5      nUS-  nXg:w  a  U(       d  M9  X:  a  M@  U(       a  X:X  a  U(       a  gUS4v   gU(       dF  Sn	U=pg[        U5       H  nU " U5      nM     Xg:w  a  U " U5      nU " U5      nU	S-  n	Xg:w  a  M  XY4v   gg7f)a  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)rC   rL   )
fx0nmaxvaluespowerlamtortoiseharer"   mus
             r   cycle_lengthr     s    f tyq>D OE2d	A

DAH	Q<HQJECJwq 
DDAH 	*sAT7D {HT7D!GB  g s   A5C)9C) A C)"C)c           	         [        U 5      nUS:  a  [        S5      e/ SQnUS::  a  X!S-
     $ S[        R                  S   pCX[	        U5      -
  S-
  ::  aJ  X4S-
  :  a+  X4-   S-	  nU[	        U5      -
  S-
  U:  a  UnOUnX4S-
  :  a  M+  [        U5      (       a  US-  nU$ SSKJn  SS	KJ	n  Sn[        X" U5      U" U" U5      5      -   -  5      nX4:  a'  X4-   S-	  nXW" U5      -
  S-
  U:  a  UnOUS-   nX4:  a  M'  U[	        U5      -
  S-
  nX:  a!  [        U5      (       d  US-  nUS-  nX:  a  M!  [        U5      (       a  US-  nU$ )
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   r   r   )r   r0   r   r-   r   r   r   r   r   r   rC   )	r   rE   composite_arrr   rN   r   r   r   n_compositess	            r   	compositer   +  so   0 	sA1uLMM8MBwU##ekk"oqOaa%i5Q,CXc]"Q&* a%i 1::FA::	AAs1vCF#$%A
%ulC=1q AaA % x{?Q&L

qzzAL	Q 
 qzz	QHr   c                 H    [        U 5      n U S:  a  gU [        U 5      -
  S-
  $ )a  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
   )rC   r   )rE   s    r   compositepir   l  s*    , 	AA1ux{?Qr   )r
   r%   )T)NF) r~   r   r   	itertoolsr   r   r,   sympy.core.randomr   sympy.external.gmpyr	   	primetestr   sympy.utilities.decoratorr   sympy.utilities.miscr   r   r   r   r6   r   rC   r   r   r   rZ   r   r   r   r   r   r>   r   r   <module>r      s   
 '  " % $  0 'T% T%n
 	F1R  kBDU	DUp_s _s _DPf,^fR)X?DUp>Br   