B
    [l                 @   s   d Z ddlmZmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ d	d
 Zdd Zdd ZG dd dZe Zdd Zdd Zd'ddZdd Zdd Zdd Zd(ddZd)d!d"Zd#d$ Zd%d& ZdS )*z"
Generating and counting primes.

    )print_functiondivisionN)bisect)array   )isprime)as_intrangec             C   s   t ddg|  S )Nlr   )_array)n r   5lib/python3.7/site-packages/sympy/ntheory/generate.py_azeros   s    r   c              G   s
   t d| S )Nr
   )r   )vr   r   r   _aset   s    r   c             C   s   t dt| |S )Nr
   )r   r	   )abr   r   r   _arange   s    r   c               @   sj   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )Sievea  An infinite 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.

    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                sl   d _ tdddddd _tdd	d	ddd
 _tdd	dddd _t fdd j j jfD shtd S )N                     r   r      c             3   s   | ]}t | jkV  qd S )N)len_n).0i)selfr   r   	<genexpr>4   s    z!Sieve.__init__.<locals>.<genexpr>)r    r   _list_tlist_mlistallAssertionError)r#   r   )r#   r   __init__/   s
    zSieve.__init__c             C   s   ddt | j| jd | jd | jd | jd | jd dt | j| jd | jd | jd | jd | jd d	t | j| jd | jd | jd | jd | jd f S )
Nzs<%s sieve (%i): %i, %i, %i, ... %i, %i
%s sieve (%i): %i, %i, %i, ... %i, %i
%s sieve (%i): %i, %i, %i, ... %i, %i>primer   r   r   r   totientmobius)r   r%   r&   r'   )r#   r   r   r   __repr__6   s    


zSieve.__repr__Nc             C   sj   t dd |||fD r$d } }}|r:| jd| j | _|rP| jd| j | _|rf| jd| j | _dS )z]Reset all caches (default). To reset one or more set the
            desired keyword to True.c             s   s   | ]}|d kV  qd S )Nr   )r!   r"   r   r   r   r$   G   s    zSieve._reset.<locals>.<genexpr>TN)r(   r%   r    r&   r'   )r#   r+   r-   r.   r   r   r   _resetD   s    zSieve._resetc             C   s   t |}|| jd krdS t |d d }| | | jd d }t||d }x@| d|D ]0}| | }x t|t||D ]}d||< q~W q^W |  jtddd	 |D 7  _dS )
a  Grow the sieve to cover all primes <= n (a real number).

        Examples
        ========

        >>> from sympy import sieve
        >>> sieve._reset() # this line for doctest only
        >>> sieve.extend(30)
        >>> sieve[10] == 29
        True
        r   Ng      ?r   r   r   r
   c             S   s   g | ]}|r|qS r   r   )r!   xr   r   r   
<listcomp>s   s    z Sieve.extend.<locals>.<listcomp>)intr%   extendr   
primeranger	   r   r   )r#   r   ZmaxbaseZbeginZnewsievep
startindexr"   r   r   r   r4   P   s    

zSieve.extendc             C   s8   t |}x*t| j|k r2| t| jd d  q
W dS )a  Extend to include the ith prime number.

        i must be an integer.

        The list is extended by 50% if it is too short, so it is
        likely that it will be longer than requested.

        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])
        r   g      ?N)r   r   r%   r4   r3   )r#   r"   r   r   r   extend_to_nou   s    zSieve.extend_to_noc             c   s   ddl m} tdt||}t||}||kr6dS | | | |d }t| jd }x6||k r| j|d  }||k r|V  |d7 }q^dS q^W dS )zGenerate all prime numbers in the range [a, b).

        Examples
        ========

        >>> from sympy import sieve
        >>> print([i for i in sieve.primerange(7, 18)])
        [7, 11, 13, 17]
        r   )ceilingr   Nr   )#sympy.functions.elementary.integersr9   maxr   r4   searchr   r%   )r#   r   r   r9   r"   Zmaxir6   r   r   r   r5      s    



zSieve.primerangec       	      c   sD  ddl m} tdt||}t||}t| j}||kr@dS ||krjxt||D ]}| j| V  qTW n|  jt||7  _xftd|D ]X}| j| }|| d | | }x&t|||D ]}| j|  |8  < qW ||kr|V  qW xXt||D ]J}| j| }x,td| ||D ]}| j|  |8  < qW ||kr|V  qW dS )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   )r9   r   Nr   )r:   r9   r;   r   r   r&   r	   r   )	r#   r   r   r9   r   r"   Ztir7   jr   r   r   totientrange   s.    




zSieve.totientrangec       	      c   sF  ddl m} tdt||}t||}t| j}||kr@dS ||krjxt||D ]}| j| V  qTW n|  jt|| 7  _xftd|D ]X}| j| }|| d | | }x&t|||D ]}| j|  |8  < qW ||kr|V  qW xXt||D ]J}| j| }x,td| ||D ]}| j|  |8  < qW ||kr|V  qW dS )zGenerate all mobius numbers for the range [a, b).

        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   )r9   r   Nr   )r:   r9   r;   r   r   r'   r	   r   )	r#   r   r   r9   r   r"   Zmir7   r=   r   r   r   mobiusrange   s.    




zSieve.mobiusrangec             C   s   ddl m} t||}t|}|dk r4td| || jd krL| | t| j|}| j|d  |krr||fS ||d fS dS )a~  Return the indices i, j of the primes that bound n.

        If n is prime then i == j.

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

        Examples
        ========

        >>> from sympy import sieve
        >>> sieve.search(25)
        (9, 10)
        >>> sieve.search(23)
        (9, 9)
        r   )r9   r   zn should be >= 2 but got: %sr   r   N)r:   r9   r   
ValueErrorr%   r4   r   )r#   r   r9   Ztestr   r   r   r   r<      s    
zSieve.searchc          	   C   s\   yt |}|dkstW n ttfk
r0   dS X |d dkrF|dkS | |\}}||kS )Nr   Fr   )r   r)   r@   r<   )r#   r   r   r   r   r   r   __contains__  s    zSieve.__contains__c             C   sX   t |tr4| |j | j|jd |jd |j S t|}| | | j|d  S dS )zReturn the nth prime numberr   N)
isinstanceslicer8   stopr%   startstepr   )r#   r   r   r   r   __getitem__!  s    

zSieve.__getitem__)NNN)__name__
__module____qualname____doc__r*   r/   r0   r4   r8   r5   r>   r?   r<   rA   rG   r   r   r   r   r      s   
%''!r   c             C   s   t | }|dk rtd|ttjkr.t| S ddlm} ddlm} d}t	||||||  }x2||k r|| d? }|||kr|}qh|d }qhW t
|d }x$||k rt|r|d7 }|d7 }qW |d S )a5   Return the nth prime, with the primes indexed as prime(1) = 2,
        prime(2) = 3, etc.... The nth prime is approximately n*log(n).

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

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

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

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

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

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

        References
        ==========

        - https://en.wikipedia.org/wiki/Prime_number_theorem#Table_of_.CF.80.28x.29.2C_x_.2F_log_x.2C_and_li.28x.29
        - https://en.wikipedia.org/wiki/Prime_number_theorem#Approximations_for_the_nth_prime_number
        - https://en.wikipedia.org/wiki/Skewes%27_number

        Examples
        ========

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

        See Also
        ========

        sympy.ntheory.primetest.isprime : Test if n is prime
        primerange : Generate all primes in a given range
        primepi : Return the number of primes less than or equal to n
    r   z-nth must be a positive integer; prime(1) == 2r   )li)logr   )r   r@   r   siever%   'sympy.functions.special.error_functionsrL   &sympy.functions.elementary.exponentialrM   r3   primepir   )nthr   rL   rM   r   r   midZn_primesr   r   r   r+   /  s(    1

r+   c       	      C   s  t | } | dk rdS | tjd kr0t| d S t | d }|d8 }t|d}x|| | krf|d7 }qPW |d8 }dg|d  }dg|d  }x2td|d D ] }|d ||< | | d ||< qW xtd|d D ]}|| ||d  krq||d  }xntdt| ||  |d D ]N}|| }||krD||  || | 8  < n||  || |  | 8  < qW t||| d }x2t||dD ]"}||  |||  | 8  < qW qW |d S )aC   Return the value of the prime counting function pi(n) = the number
        of prime numbers less than or equal to n.

        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*a be such a number, where 2 <= a<= i / j
        Now, after sieving from primes <= j - 1,
        a must remain
        (because x, and hence a has no prime factor <= j - 1)
        Clearly, there are phi(i / j, j - 1) such a
        which remain on sieving from primes <= j - 1

        Now, if a is a prime less than equal to j - 1,
        x= j*a has smallest prime factor = a, and
        has already been removed(by sieving from a).
        So, we don't 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))

        => 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
        >>> primepi(25)
        9

        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   r   r   g      ?r   )r3   rN   r%   r<   r;   r	   min)	r   ZlimZarr1Zarr2r"   r6   r=   stZlim2r   r   r   rQ   z  s:    C
"
"&rQ   c             C   sB  t | } t|}|dkrD| }d}xt|}|d7 }||kr"P q"W |S | dk rPdS | dk rldddddd|  S | tjd krt| \}}||krt|d  S t| S d| d  }|| kr| d7 } t| r| S | d	7 } n4| | dkr| d7 } t| r| S | d	7 } n|d } x2t| r| S | d7 } t| r0| S | d	7 } qW d
S )aB   Return the ith prime greater than n.

        i must be 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   r   r   r   r   )r   r   r   r   r   r,   r   r   N)r3   r   	nextprimerN   r%   r<   r   )r   Zithr"   Zprr=   r
   unnr   r   r   rV     sN    



rV   c             C   s   ddl m} t|| } | dk r(td| dk rDdddddd|  S | tjd	 kr|t| \}}||krtt|d
  S t| S d| d  }| | d
kr|d
 } t| r| S | d8 } n|d
 } x,t| r| S | d8 } t| r| S | d8 } qW dS )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   )r9   r   zno preceding primes   r   r   )r   r   r   r   r   r   r   r   r   N)r:   r9   r   r@   rN   r%   r<   r   )r   r9   r
   rW   rX   r   r   r   	prevprime#  s2    
rZ   c             c   s   ddl m} | |krdS |tjd krFxt| |D ]
}|V  q4W dS t|| d } t||}x t| } | |k r|| V  qddS qdW dS )a   Generate a list of all prime numbers in the range [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.

        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.

        References
        ==========

        1. http://en.wikipedia.org/wiki/Prime_number
        2. http://primes.utm.edu/notes/gaps.html

        Examples
        ========

        >>> from sympy import primerange, sieve
        >>> print([i for i in primerange(1, 30)])
        [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:

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

        See Also
        ========

        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.
    r   )r9   Nr   r   )r:   r9   rN   r%   r5   r   rV   )r   r   r9   r"   r   r   r   r5   V  s    ;
r5   c             C   sZ   | |krdS t t| |f\} }t| d |}t|}||krFt|}|| k rVtd|S )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.

        References
        ==========

        - http://en.wikipedia.org/wiki/Bertrand's_postulate

        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

    Nr   z&no primes exist in the specified range)mapr3   randomZrandintrV   rZ   r@   )r   r   r   r6   r   r   r   	randprime  s    r]   Tc             C   sx   |rt | } nt| } | dk r&tdd}|rTxDtd| d D ]}|t|9 }q>W n xtd| d D ]}||9 }qdW |S )a*  
    Returns the product of the first n primes (default) or
    the primes less than or equal to n (when ``nth=False``).

    >>> from sympy.ntheory.generate import primorial, randprime, 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   r3   r@   r	   r+   r5   )r   rR   r6   r"   r   r   r   	primorial  s    /
r^   Fc       
      c   s  t |pd}d }}|| | }}d}xR||krx|r<||k rx|d7 }||kr\|}|d9 }d}|rf|V  | |}|d7 }q(W |r||kr|rdS |dfV  dS |sd}	| }}xt|D ]}| |}qW x$||kr| |}| |}|	d7 }	qW |	r|	d8 }	||	fV  dS )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 iter(func, i):
        ...     while 1:
        ...         ii = func(i)
        ...         yield ii
        ...         i = ii
        ...

    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, 2)

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

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

    There are 6 repeating values after the first 2.

    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)
        >>> [ni for ni in cycle_length(func, 4, nmax = 4, values=True)]
        [17, 35, 2, 5]

    Code modified from:
        http://en.wikipedia.org/wiki/Cycle_detection.
    r   r   r   N)r3   r	   )
fZx0ZnmaxvaluesZpowerZlamZtortoiseZharer"   Zmur   r   r   cycle_length  s>    4

ra   c       	   
   C   s  t | }|dk rtdddddddd	d
ddg
}|dkrD||d  S dtjd  }}||t| d krx:||d k r|| d? }|t| d |kr|}qj|}qjW t|r|d8 }|S ddlm} ddlm	} d}t
||||||  }x>||k r.|| d? }||| d |kr$|}q|d }qW |t| d }x*||krjt|s^|d8 }|d8 }qBW t|r~|d8 }|S )a   Return the nth composite number, with the composite numbers indexed as
        composite(1) = 4, composite(2) = 6, etc....

        Examples
        ========

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

        See Also
        ========

        sympy.ntheory.primetest.isprime : Test if n is prime
        primerange : Generate all primes in a given range
        primepi : Return the number of primes less than or equal to n
        prime : Return the nth prime
        compositepi : Return the number of positive composite numbers less than or equal to n
    r   z1nth must be a positive integer; composite(1) == 4r   r   rY   	   
                  r   r   )rL   )rM   )r   r@   rN   r%   rQ   r   rO   rL   rP   rM   r3   )	rR   r   Zcomposite_arrr   r   rS   rL   rM   Zn_compositesr   r   r   	compositef  sB    

ri   c             C   s$   t | } | dk rdS | t|  d S )ak   Return the number of positive composite numbers less than or equal to n.
        The first positive composite is 4, i.e. compositepi(4) = 1.

        Examples
        ========

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

        See Also
        ========

        sympy.ntheory.primetest.isprime : Test if n is prime
        primerange : Generate all primes in a given range
        prime : Return the nth prime
        primepi : Return the number of primes less than or equal to n
        composite : Return the nth composite number
    r   r   r   )r3   rQ   )r   r   r   r   compositepi  s    rj   )r   )T)NF)rK   Z
__future__r   r   r\   r   r   r   Z	primetestr   Zsympy.core.compatibilityr   r	   r   r   r   r   rN   r+   rQ   rV   rZ   r5   r]   r^   ra   ri   rj   r   r   r   r   <module>   s.     Ke
D3R&
?
YB