ó
    Š*£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      $ )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     ÚS/home/mande/repo/quber/.venv/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
)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   ó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¨”3�q“6˜TŸW™WÖ$Ò.Tùs   ƒ%(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Ø,ˆÔÜÔU¨t¯z©z¸4¿;¹;ÈÏÉÑ.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¡¨t¯z©z¸!©}Ø—‘˜B‘ §¡¨B¡Øœ˜DŸK™KÓ(Ø—‘˜Q‘ §¡¨Q¡Ø—‘˜Q‘ §¡¨R¡°$·+±+¸b±/Ø”s˜4Ÿ;™;Ó'Ø—‘˜Q‘ §¡¨Q¡Ø—‘˜Q‘ §¡¨R¡°$·+±+¸b±/ð	:CñCð 	Cr   Nc                 ó   • [        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   é € Ð;Ò":˜Q�D�yÒ":ùs   ‚TN)r2   r-   r'   r.   r/   )r)   r6   r8   r9   s       r   Ú_resetÚSieve._resetS   sw   € ô Ñ; 5°6Ñ":Ó;×;Ñ;Ø'+Ð+ˆEÐ+�GÞØŸ™ H T§W¡WÐ-ˆDŒJÞØŸ+™+ h t§w¡wÐ/ˆDŒKÞØŸ+™+ h t§w¡wÐ/ˆD�Kð 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)z·Grow the sieve to cover all primes <= n.

Examples
========

>>> from sympy import sieve
>>> sieve._reset() # this line for doctest only
>>> sieve.extend(30)
>>> sieve[10] == 29
True
r#   r
   Nr   r   )Úintr-   r,   Ú_primerange)r)   ÚnÚnumÚnum2s       r   ÚextendÚSieve.extend_   s�   € ô �‹Fˆð �j‰j˜‰n˜qÑ ˆØ‹7ØØ�A‰vˆØ‹iØ�JŠJœ&  d×&6Ñ&6°sÓ&AÓBÑB�JØ A™g�ð �ið 	�
Š
”f˜S $×"2Ñ"2°3¸A¹Ó">Ó?Ñ?Ž
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 ˆq�5Ø�‰FˆAØ‹eÜ˜T×0Ñ0°1±5¸Q±,Ó?ˆJð �F˜ZÑ'ˆEØ—Z‘Z ¤&¨¯©´T¸!¸aÀ*¹nÑ:LÈqÑ:PÓ5QÓ"RÓS�Ü ! a¡%¨!¡) °Ñ 1°QÑ6¸
ÖF�AØ$�E“Hó Gñ Tô $ EÖ*‘�ß�1Ø˜a #™g™+¨™/Ô)ñ +ð ��Z‘ÑˆAð �eùs   ‚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   € ô. �1‹IˆÜ�$—*‘*‹o Ó!Ø�K‰Kœ˜DŸJ™J r™N¨SÑ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)zºGenerate all totient numbers for the range [a, b).

Examples
========

>>> from sympy import sieve
>>> print([i for i in sieve.totientrange(7, 18)])
[6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16]
r
   Nr   )rY   r   r&   r.   rL   r,   )r)   r   rN   rE   r"   ÚtiÚ
startindexÚjs           r   ÚtotientrangeÚSieve.totientrangeà   sM  é € ô �”? 1Ó%Ó&ˆÜ˜AÓˆÜ�—‘ÓˆØ‹6ØØ‹VÜ˜1–[�Ø—k‘k !‘nÔ$ò !ð �KŠKœ6 #¤u¨Q£{Ó3Ñ3�KÜ˜1˜a–[�Ø—[‘[ ‘^�Ø˜Q™“;Ø"#¡%¨!¡)°Ñ!1°AÑ!5�JÜ" :°!Ö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–[�Ø—k‘k !‘nÔ$ò !ð �KŠKœ6 #¨ s¨A©E¡{Ó3Ñ3�KÜ˜1˜a–[�Ø—[‘[ ‘^�Ø™e a™i¨AÑ-°Ñ1�
Ü˜z¨aÖ0�AØ—K‘K “N bÑ(•Nñ 1à•6Ø”Hñ !ô ˜1–[�Ø—[‘[ ‘^�Ü˜q 1™u aÖ+�AØ—K‘K “N bÑ(•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Ó!ˆÜ�1‹IˆØˆq‹5ÜÐ;¸aÑ?Ó@Ð@Ø�z‰z˜"‰~ÓØ�K‰K˜ŒNÜ�4—:‘:˜qÓ!ˆØ�:‰:�a˜!‘eÑ Ó$Ø�4ˆKà˜!‘e�8ˆOr   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Ø˜“6ˆM‘6ð ˆq‰5�A‹:Ø˜‘6ˆMØ�{‰{˜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œ×ÑØ×Ñ˜aŸf™fÔ%Ø Ÿw™wÑ2�A—G’G¸ˆEØ�q‹yô !Ð!<Ó=Ð=Ø—:‘:˜e a™i¨¯©°©
°1·6±6Ð9Ñ:Ð:à�1‹uô !Ð!<Ó=Ð=Ü�q“	ˆAØ×Ñ˜aÔ Ø—:‘:˜a !™eÑ$Ð$r   )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3ô6":ò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Øˆ1ƒuÜÐHÓIÐIð 	ŒC”—‘ÓÓÜ�Q‰xˆå:Ý:àˆ4ƒxä�‰�Q˜‘UÔÜ�Q‰xˆà	€AäˆA��Q“—‘“¡#¡c¨!£f£+×"3Ñ"3Ó"5Ñ5Ñ6Ó7€Að ‹%Ø‰u˜‰lˆÙˆc‹7�=‰=‹?˜QÓØ‰Aà�a‘ˆAð �%ô �Q˜‘U˜A¤¨¨Q©£Ñ/Ó0Ð0r   zgThe `sympy.ntheory.generate.primepi` has been moved to `sympy.functions.combinatorial.numbers.primepi`.z1.13z%deprecated-ntheory-symbolic-functions)Údeprecated_since_versionÚactive_deprecations_targetc                 ó   • 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 	ˆ1ƒuØØŒE�K‰K˜‰OÓÜ�|‰|˜A‹˜qÑ!Ð!Ü
ˆq‹'€CÜ"'¨¨a©¤.Ó1¢.˜Q�‰U�qŒL¡.€DÐ1Øˆ3¬5°°C¸!±GÔ+<Ó=Ò+< a�a‘4˜!‘8 ”/Ñ+<Ñ=Ñ=€DØˆ7�c˜A‘gÑ€DÜ�1�c˜A‘g˜qÖ!ˆð �7áØ�Q‘‰KˆÜ�q ™' 1Ö%ˆAØˆD‹Gñ &ô �qœ#˜a¨¡E™l¨CÓ0°1Ñ4°aÖ8ˆAð �wÙØ‘ˆBØ‹yØ“˜4™8 a™<Ñ'•à“˜4 R¡™=¨1Ñ,Ñ,•ñ 9ô �sœC  q¡S¨1¡WÓ-¨rÖ2ˆAØ‹G�t ™F‘| aÑ'Ñ'�Gó 3ñ3 "ð6 �‰7€Nùò= 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ØˆAƒvÜÐ1Ó2Ð2Øˆ1ƒuØˆØ	ˆQ‰ˆØŒE�K‰K˜‰OÓÜ�|‰|˜A‹‰ˆØ‰5�1‰9”sœ5Ÿ;™;Ó'Ó'Ü—;‘;˜q™u q™yÑ)Ð)Ü�K‰K˜‰OˆØ	””U—[‘[Ó!Ñ!Ñ!ˆØ	
ˆAˆq‰D‰€BØ	ƒwØ	ˆQ‰ˆÜ�1�:‰:Ø�‰FˆAÞØ�Ø	ˆQ‰‰Ø	
‰�1‹Ø	ˆQ‰ˆÜ�1�:‰:Ø�‰FˆAÞØ�Ø	ˆQ‰‰à�‰FˆØ
Ü�1�:‰:Ø�‰FˆAÞØ�Ø	ˆQ‰ˆÜ�1�:‰:Ø�‰FˆAÞØ�Ø	ˆ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Øˆ1ƒuÜÐ.Ó/Ð/Øˆ1ƒuØ˜˜q Q¨1Ñ-¨aÑ0Ð0ØŒE�K‰K˜‰OÓÜ�|‰|˜A‹‰ˆØ‹6Ü˜˜1™‘:Ðä˜‘8ˆOØ	
ˆAˆq‰D‰€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Øà
Ü�a‹LˆØ‹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ØÜŒs�Q�FÓ�D€AÜ��A‘�qÓ€AÜ�!‹€AØƒvÜ�a‹LˆØƒ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 Ü�1‹I‰ä�‹FˆØˆ1ƒuÜÐ:Ó;Ð;Ø	€AÞ
Ü�q˜!˜a™%–ˆAØ”�q“‰MŠAñ !ð
 €Hô ˜A˜q 1™uÖ%ˆAØ‰FŠAñ &à€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 ˆt�y�q‹>€Dð €O€EØ˜˜2›ˆdØ	€AÞØŠØ
Ó
¦D¨A«HØ	ˆQ‰ˆØ‹<ØˆHØ�Q‰JˆEØˆCÞØŠJÙ�‹wˆØˆq‰ˆð Ó
§D D¨A­Hö �“	ÞØà˜�*ÒØÞàˆØÐˆÜ�s–ˆAÙ�T“7ŠDñ àÓÙ˜“{ˆHÙ�T“7ˆDØ�!‰GˆBð Õð ˆ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Øˆ1ƒuÜÐLÓMÐMÚ8€MØˆBƒwØ ™UÑ#Ð#àŒe�k‰k˜"‰o€qØ”˜“‰O˜aÑÓØ�a‘%‹iØ‘5˜Q‘,ˆCØ”X˜c“]Ñ" QÑ&¨Ó*Ø‘à�ð �a‘%�iô �1�:‰:Ø�‰FˆAØˆå:Ý:Ø	€AÜˆAˆs�1‹v™™C ›F›Ñ#Ñ$Ó%€Aà
‹%Ø‰u˜‰lˆØ��C“‰=˜1Ñ˜qÓ Ø‰Aà�a‘ˆAð �%ð ”x “{‘? QÑ&€LØ
Ó
Ü�q�z‰zØ˜AÑˆLØ	ˆQ‰ˆð Õ
ô ˆq‡z�zØ	ˆ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Øˆ1ƒuØØŒ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1ñR ð kàØBñDñUó	DðUðp_ˆsð _�sô _ôDPòf,ô^fòR)ôX?ôDUòp>óBr   