+
    i`                     
   R t ^ RIHtHt ^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
 ^RIHt ^ RIHt ^ RIHt R	 t ! R
 R4      t]! 4       tR t]! RRRR7      R 4       tR R ltRR ltR tRR ltR tRR ltR R ltR tR tR# )!z"
Generating and counting primes.

)bisectbisect_leftcount)array)randint)sqrt)isprime)
deprecated)as_intc                0    ^ RI Hp \        V! V 4      4      # )zWrapping ceiling in as_int will raise an error if there was a problem
determining whether the expression was exactly an integer or not.)ceiling)#sympy.functions.elementary.integersr   r   )ar   s   & v/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/sympy/ntheory/generate.py_as_int_ceilingr      s     <'!*    c                   ~   a  ] tR t^t o RtRR ltR tRR ltR tR t	R t
RR	 ltR
 tR tR tR tR tR tRtV tR# )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                  a  ^S n         \        R. RO4      S n        \        R. R	O4      S n        \        R. R
O4      S n        V^ 8:  d   \        R4      hVS n        \        ;QJ d@    V 3R lS P                  S P                  S P                  3 4       F  '       d   K   RM5	  RM1! V 3R lS P                  S P                  S P                  3 4       4      '       g   Q hR# )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iz+sieve_interval should be a positive integerc              3   T   <"   T F  p\        V4      SP                  8H  x  K  	  R # 5iN)len_n).0r   selfs   & r   	<genexpr>!Sieve.__init__.<locals>.<genexpr>C   s      U.T3q6TWW$.Ts   %(FTN)                  )       r'   r    r       )r&   r'   r)   r&   r)   )r   _array_list_tlist_mlist
ValueErrorsieve_intervalall)r   r/   s   f&r   __init__Sieve.__init__-   s     C!56
S"45S"78QJKK,sUtzz4;;.TUsssUtzz4;;.TUUUUUr   c                   R R\        V P                  4      V P                  ^ ,          V P                  ^,          V P                  ^,          V P                  R,          V P                  R,          R\        V P                  4      V P                  ^ ,          V P                  ^,          V P                  ^,          V P                  R,          V P                  R,          R\        V P                  4      V P                  ^ ,          V P                  ^,          V P                  ^,          V P                  R,          V P                  R,          3,          # )zs<%s sieve (%i): %i, %i, %i, ... %i, %i
%s sieve (%i): %i, %i, %i, ... %i, %i
%s sieve (%i): %i, %i, %i, ... %i, %i>primetotientmobiusr)   )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                t   \         ;QJ d    R WV3 4       F  '       d   K   RM	  RM! R WV3 4       4      '       d   R;p;r#V'       d   V P                  RV P                   V n        V'       d   V P                  RV P                   V n        V'       d!   V P                  RV P                   V n        R# R# )zQReset all caches (default). To reset one or more set the
desired keyword to True.c              3   (   "   T F  qR J x  K
  	  R # 5ir    )r   r   s   & r   r   Sieve._reset.<locals>.<genexpr>V   s     ;":QDy":s   FTN)r0   r+   r   r,   r-   )r   r4   r5   r6   s   &&&&r   _resetSieve._resetS   s     3;56":;333;56":;;;'++E+GHTWW-DJ++htww/DK++htww/DK r   c           
     j   \        V4      pV P                  R,          ^,           pW8  d   R# V^,          pW18:  d>   V ;P                  \        RV P                  W#4      4      ,          un        Y3^,          r2KC  V ;P                  \        RV P                  W!^,           4      4      ,          un        R# )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
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

fS$"2"23A">??
r   c           
   #  .  "   V^,          '       d
   V^,          pW8  d   \        V P                  W!,
          ^,          4      pR.V,          pV P                  ^\        V P                  \	        V^V,          ,           ^,           4      4        F7  p\        V^,           V,           ) ^,          V,          W54       F  pRWF&   K	  	  K9  	  \        V4       F(  w  ruV'       g   K  V^V,          ,           ^,           x  K*  	  V^V,          ,          pK  R# 5i)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]

TFN)minr/   r+   r   r   range	enumerate)r   r   b
block_sizeblockptidxs   &&&     r   rB   Sieve._primerangex   s     4 q55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 s   CD$1Dc                    \        V4      p\        V P                  4      V8  d5   V P                  \	        V P                  R,          R,          4      4       KN  R# )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.
g      ?Nr)   )r   r   r+   rF   rA   )r   r   s   &&r   extend_to_noSieve.extend_to_no   s@    . 1I$**o!KKDJJrNS012 "r   c              #  &  "   Vf   \        V4      p^pM \        ^\        V4      4      p\        V4      pW8  d   R# V P                  V4       V P                  \	        V P                  V4      \	        V P                  V4        Rj  xL
  R#  L5i)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]

N)r   maxrF   r+   r   )r   r   rL   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           	   #    "   \        ^\        V4      4      p\        V4      p\        V P                  4      pW8  d   R# W#8:  d*   \	        W4       F  pV P                  V,          x  K  	  R# V ;P                  \        R\	        W24      4      ,          un        \	        ^V4       F  pV P                  V,          pWT^,
          8X  dh   W4,           ^,
          V,          V,          p\	        WbV4       F:  pV P                  V;;,          V P                  V,          V,          ,          uu&   K<  	  WA8  g   K  Vx  K  	  \	        W24       F  pV P                  V,          pWT8X  dK   \	        WBV4       F:  pV P                  V;;,          V P                  V,          V,          ,          uu&   K<  	  WA8  g   Kn  V P                  V,          x  K  	  R# 5i)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]
Nr   )rW   r   r   r,   rJ   r*   )r   r   rL   rC   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   D2G9A<G:Gc              #    "   \        ^\        V4      4      p\        V4      p\        V P                  4      pW8  d   R# W#8:  d*   \	        W4       F  pV P                  V,          x  K  	  R# V ;P                  \        R^ .W#,
          ,          4      ,          un        \	        ^V4       Fq  pV P                  V,          pW4,           ^,
          V,          V,          p\	        WbV4       F"  pV P                  V;;,          V,          uu&   K$  	  WA8  g   Km  Vx  Ks  	  \	        W24       F[  pV P                  V,          p\	        ^V,          W$4       F"  pV P                  V;;,          V,          uu&   K$  	  WA8  g   KW  Vx  K]  	  R# 5i)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]
Nr   )rW   r   r   r-   rJ   r*   )r   r   rL   rC   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   DFA%F
Fc                4   \        V4      p\        V4      pV^8  d   \        RV,          4      hWP                  R,          8  d   V P	                  V4       \        V P                  V4      pV P                  V^,
          ,          V8X  d   W33# W3^,           3# )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)
zn should be >= 2 but got: %sr)   )r   r   r.   r+   rF   r   )r   rC   testrL   s   &&  r   searchSieve.search1  s    " q!1Iq5;a?@@zz"~KKN4::q!::a!e$4K!e8Or   c                     \        V4      pV^8  g   Q h T^,          ^ 8X  d   T^8H  # T P                  T4      w  r#Y#8H  #   \        \        3 d     R# i ; i)r    F)r   r.   AssertionErrorrf   )r   rC   r   rL   s   &&  r   __contains__Sieve.__contains__N  s`    	q	A6M6 q5A:6M{{1~v N+ 		s   A AAc              #  F   "   \        ^4       F  pW,          x  K  	  R# 5i)r'   Nr   )r   rC   s   & r   __iter__Sieve.__iter__Y  s     qA'M s   !c                   \        V\        4      '       d   V P                  VP                  4       VP                  e   VP                  M^ pV^8  d   \        R4      hV P                  V^,
          VP                  ^,
          VP                  1,          # V^8  d   \        R4      h\        V4      pV P                  V4       V P                  V^,
          ,          # )zReturn the nth prime numberzSieve indices start at 1.)	
isinstanceslicerT   stopstart
IndexErrorr+   stepr   )r   rC   rs   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,   r/   )i@B )NNNr   )__name__
__module____qualname____firstlineno____doc__r1   r8   r>   rF   rB   rT   rX   r^   rb   rf   rj   rm   rv   __static_attributes____classdictcell__)__classdict__s   @r   r   r      sW     $V0C
0@2' R36":H#)J*X:	% %r   r   c           	     l   \        V 4      pV^8  d   \        R4      hV\        \        P                  4      8:  d   \        V,          # ^ RIHp ^ RIHp VR8  d*   \        P                  ^V,          4       \        V,          # ^p\        W! V4      P                  4       V! V! V4      4      P                  4       ,           ,          4      pWE8  d:   WE,           ^,	          pV! V4      P                  4       V8  d   TpK4  V^,           pK?  \        V^,
          V\        V^,
          4      ,
          4      # )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
z-nth must be a positive integer; prime(1) == 2loglii  )r   r.   r   siever+   &sympy.functions.elementary.exponentialr   'sympy.functions.special.error_functionsr   rF   rA   evalf	nextprime_primepi)nthrC   r   r   r   rL   mids   &      r   r4   r4   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                    ^ RI Hp V! V 4      # )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
)primepi)%sympy.functions.combinatorial.numbersr   )rC   func_primepis   & r   r   r     s    p N?r   c                0    V ^8  d   QhR\         R\         /# )r    rC   return)rA   )formats   "r   __annotate__r     s     _ _s _s _r   c           	     L   V ^8  d   ^ # V \         P                  R,          8:  d   \         P                  V 4      ^ ,          # \        V 4      p\	        V^,           4       Uu. uF  q"^,           ^,	          NK  	  pp^ .\	        ^V^,           4       Uu. uF  q V,          ^,           ^,	          NK  	  up,           pR.V^,           ,          p\	        ^V^,           ^4       EF/  pWR,          '       d   K  W2^,
          ,          p\	        W!^,           V4       F  pRWW&   K	  	  \	        ^\        WV,          ,          V4      ^,           ^4       Fl  pWW,          '       d   K  W',          pW8:  d$   WG;;,          WH,          V,
          ,          uu&   KD  WG;;,          W0V,          ,          V,
          ,          uu&   Kn  	  \	        V\        WV,          ^,
          4      R4       F+  pW7;;,          W7V,          ,          V,
          ,          uu&   K-  	  EK2  	  V^,          # u upi u upi )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

FTr)   )r   r+   rf   r   rJ   rI   )	rC   limr   arr1arr2skiprO   r]   sts	   &        r   r   r     s   x 	1uEKKO||Aq!!
q'C"'a.1.QUqLL.D135C!G+<=+<aa4!8//+<==D7cAgD1cAgq! 77QKq'1%ADG & q#aElC014a8A wwBy48a<'4R=1,, 9 sCqS1W-r2AGtF|a''G 33 "6 7N= 2=s   !HH!c                   \        V 4      p \        V4      pV^ 8:  d   \        R4      hV ^8  d   ^p V^,          pV \        P                  R,          8:  d   \        P                  V 4      w  r4W2,           ^,
          \        \        P                  4      8  d%   \        P                  W2,           ^,
          ,          # \        P                  R,          p W#\        \        P                  4      ,
          ,          p^V ^,          ,          pWP8X  d8   V ^,          p \        V 4      '       d   V^,          pV'       g   V # V ^,          p MMW,
          ^8X  d8   V ^,          p \        V 4      '       d   V^,          pV'       g   V # V ^,          p M	V^,           p  \        V 4      '       d   V^,          pV'       g   V # V ^,          p \        V 4      '       d   V^,          pV'       g   V # V ^,          p K]  )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

zith should be positiver7   r)   )rA   r   r.   r   r+   rf   r   r	   )rC   ithr   l_nns   &&    r   r   r   z  sr   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           
     2   \        V 4      p V ^8  d   \        R4      hV ^8  d   ^^^^^^^^^^/V ,          # V \        P                  R,          8:  d?   \        P	                  V 4      w  rW8X  d   \        V^,
          ,          # \        V,          # ^V ^,          ,          pW,
          ^8:  d'   V^,
          p \        V 4      '       d   V # V ^,          p M	V^,           p  \        V 4      '       d   V # V ^,          p \        V 4      '       d   V # V ^,          p K;  )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
zno preceding primesr)   )r   r.   r   r+   rf   r	   )rC   r   ur   s   &   r   	prevprimer     s    & 	A1u.//1u1aAq!Q1-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              #    "   Vf   ^T rW8  d   R# \         P                  R,          pW8:  d    \         P                  W4       Rj  xL
  R# W8:  d>   \         P                  \        \         P                  V 4      R  Rj  xL
  V^,           p MV ^,          '       d
   V ^,          p \	        W^,          4      pW8  d    \         P                  W4       Rj  xL
  Tp W8:  d   R#  \        V 4      p W8  d   V x  K  R#  L L L,5i)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+   rX   r   rI   rB   r   )r   rL   largest_known_primetails   &&  r   rX   rX     s     V 	y!1v++b/##A)));;{5;;:;<<<!#	
Q	Qq*+Dx$$Q---v
aL5G) 	* 	= 	.s<   ADD:DDD 9DD)DDDc                    W8  d   R# \        \        W34      w  r\        V ^,
          V4      p\        V4      pW18  d   \	        V4      pW08  d   \        R4      hV# )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

Nz&no primes exist in the specified range)maprA   r   r   r   r.   )r   rL   rC   rO   s   &&  r   	randprimer   e  sZ    @ 	vsQFDAAqA!AvaLuABBHr   c                   V'       d   \        V 4      p M\        V 4      p V ^8  d   \        R4      h^pV'       d/   \        ^V ^,           4       F  pV\	        V4      ,          pK  	  V# \        ^V ^,           4       F  pW#,          pK  	  V# )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

zprimorial argument must be >= 1)r   rA   r.   rJ   r4   rX   )rC   r   rO   r   s   &&  r   	primorialr     s    d 1IF1u:;;	A
q!a%AqMA !
 H Aq1u%AFA &Hr   c              #    "   \        T;'       g    ^ 4      p^;rEY! V4      rv^pV'       d   Vx  Wg8w  dJ   V'       d   W8  d<   V^,          pWE8X  d   TpV^,          p^ pV'       d   Vx  V ! V4      pV^,          pKO  V'       d   W8X  d   V'       d   R# VR3x  R# V'       gH   ^ p	T;rg\        V4       F  pV ! V4      pK  	  Wg8w  d   V ! V4      pV ! V4      pV	^,          p	K!  WY3x  R# R# 5i)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.
N)rA   rJ   )
fx0nmaxvaluespowerlamtortoiseharer   mus
   &&&&      r   cycle_lengthr     s     f tyyq>D OE2d	A

DAH	Q<HQJECJwq	*sAT7D {HT7D!GBg s#   <C1)C1)C1C1C1(A	C1c           	     B   \        V 4      pV^8  d   \        R4      h. ROpV^
8:  d   W!^,
          ,          # ^\        P                  R,          rCW\	        V4      ,
          ^,
          8:  d_   W4^,
          8  d6   W4,           ^,	          pV\	        V4      ,
          ^,
          V8  d   TpK>  TpKB  \        V4      '       d
   V^,          pV# ^ RIHp ^ RIH	p ^p\        W! V4      V! V! V4      4      ,           ,          4      pW48  d9   W4,           ^,	          pWW! V4      ,
          ^,
          V8  d   TpK3  V^,           pK>  V\	        V4      ,
          ^,
          pW8  d&   \        V4      '       g
   V^,          pV^,          pK+  \        V4      '       d
   V^,          pV# )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
z1nth must be a positive integer; composite(1) == 4r   r   )
r(         	   
                  r)   )r   r.   r   r+   r   r	   r   r   r   r   rA   )	r   rC   composite_arrr   rL   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&*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                \    \        V 4      p V ^8  d   ^ # V \        V 4      ,
          ^,
          # )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
)rA   r   )rC   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   r4   r   r   r   r   rX   r   r   r   r   r   r<   r   r   <module>r      s   
 '  " % $  0 'T% T%n
 	F1R  kBDU	DUp_DPf,^fR)X?DUp>Br   