U
    ZÊ¹j�B  ã                   @   s‚  d dl Z d dlZd dlmZ d gd ZeddƒD ],Zegdde >  ede> dded > …< q0dEdd„ZdFdd	„Z	d
d„ Z
dd„ Zdd„ Zdd„ Ze jdd… dkr²ejZejZnd dlm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%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Z d5d6„ Z!d7d8„ Z"d9d:„ Z#d;d<„ Z$d=d>„ Z%d?d@„ Z&dAdB„ Z'dCdD„ Z(dS )Gé    Né   é   é   é   c                 C   sÌ   | sd S t | |? ƒ} | d@ }|r,t| | S d| }| dL } |  ¡ d }| d|> kr\|| S |dk r€| d@ s¼| dL } |d7 }qdn<|d? }| d@ s¼| d|> d @ rª|dL }q�| |L } ||7 }qˆ|t| d@   S )Néÿ   r   r   i,  )ÚabsÚ_small_trailingÚ
bit_length)ÚxÚnZlow_byteÚtÚzÚp© r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/external/ntheory.pyÚ	bit_scan1   s,    

r   c                 C   s   t | d|>  |ƒS )Nr   )r   )r
   r   r   r   r   Ú	bit_scan01   s    r   c                 C   sÐ   |dk rt dƒ‚| dkrdS |dkr8t| ƒ}| |? |fS d}t| |ƒ\}}|sÈ|} |d7 }|dkr¸|d g}|r¸|d }t| |ƒ\}}|s®|dt|ƒ> 7 }|} | |d ¡ ql| ¡  qlt| |ƒ\}}qJ| |fS )Né   zfactor must be > 1r   )r   r   r   é   éÿÿÿÿ)Ú
ValueErrorr   ÚdivmodÚlenÚappendÚpop)r
   ÚfÚbÚmÚyÚremZpow_listÚ_fr   r   r   Úremove5   s0    

r!   c                 C   s   t t t | ƒ¡ƒS )z
Return x!.)ÚintÚmlibZifac©r
   r   r   r   Ú	factorialQ   s    r%   c                 C   s   t t t | ƒ¡ƒS )zInteger square root of x.)r"   r#   Úisqrtr$   r   r   r   ÚsqrtV   s    r'   c                 C   s"   t  t| ƒ¡\}}t|ƒt|ƒfS )z'Integer square root of x and remainder.©r#   Úsqrtremr"   )r
   ÚsÚrr   r   r   r)   [   s    r)   r   )é   é	   ©Úreducec                  G   s   t tj| dƒS )zgcd of multiple integers.r   )r/   ÚmathÚgcd©Úargsr   r   r   r1   k   s    r1   c                  G   s   d| krdS t dd„ | dƒS )zlcm of multiple integers.r   c                 S   s   | | t  | |¡ S )N)r0   r1   ©r
   r   r   r   r   Ú<lambda>t   ó    zlcm.<locals>.<lambda>r   r.   r2   r   r   r   Úlcmp   s    r7   c                 C   s   | dk rd|  fS d| fS )Nr   r   r   r   ©r   r   r   r   Ú_signw   s    
r9   c                 C   s®   | r|s2t | ƒpt |ƒ}|s dS || | || fS t| ƒ\}} t|ƒ\}}d\}}d\}}|rœt| |ƒ\}	}
||
 } }|||	|   }}|||	|   }}qZ| || || fS )N)r   r   r   )r   r   ©r   r   )r   r9   r   )Úar   ÚgZx_signZy_signr
   r+   r   r*   ÚqÚcr   r   r   Úgcdext}   s    
r?   c                 C   sz   | dk rdS dd| d@ > @ r dS | d }dd|d > @ r<dS d	d|d
 > @ rPdS dd|d > @ rddS t  t| ƒ¡d dkS )z$Return True if x is a square number.r   Fl	   ì}ù{·wïoÏ^¿?{þ~ý r   é   iE¯ l   ì}}k-î[o{?_}éc   l   ì=}:žM¯vÏ?£_ é[   l   ì}¬sŽ�;®y½éU   r(   ©r
   r   r   r   r   Ú	is_square’   s    rE   c                 C   s0   zt | d|ƒW S  tk
r*   tdƒ‚Y nX dS )zÍModular inverse of x modulo m.

    Returns y such that x*y == 1 mod m.

    Uses ``math.pow`` but reproduces the behaviour of ``gmpy2.invert``
    which raises ZeroDivisionError if no inverse exists.
    r   zinvert() no inverse existsN)Úpowr   ÚZeroDivisionErrorrD   r   r   r   Úinvert¶   s    rH   c                 C   sH   |dks|d st dƒ‚| |; } | s(dS t| |d d |ƒdkrDdS dS )z€Legendre symbol (x / y).

    Following the implementation of gmpy2,
    the error is raised only when y is an even number.
    r   r   zy should be an odd primer   r   )r   rF   r4   r   r   r   ÚlegendreÄ   s    rI   c                 C   sÐ   |dks|d st dƒ‚| |; } | s0t|dkƒS |dks@| dkrDdS t| |ƒdkrVdS d}| dkrÌ| d dkr’| dkr’| dL } |d dkrb| }qb||  } }| d |d   kr¸dkrÂn n| }| |; } qZ|S )	zJacobi symbol (x / y).r   r   z#y should be an odd positive integerr   r   ©r,   r   é   r,   )r   r"   r1   )r
   r   Újr   r   r   ÚjacobiÔ   s(    
 
rM   c                 C   sv   t | |ƒdkrdS |dkrdS |dk r2| dk r2dnd}t|ƒ}t|ƒ}||L }|d rh| d dkrh| }|t| |ƒ S )zKronecker symbol (x / y).r   r   r   r   r   rJ   )r1   r   r   rM   )r
   r   Úsignr*   r   r   r   Ú	kroneckerì   s    rO   c           	      C   s˜  | dk rt dƒ‚|dk r t dƒ‚| dkr0| dfS |dkr@| dfS |dkrdt | ¡\}}t|ƒ| fS ||  ¡ krtdS zt| d	|  d
 ƒ}W n\ tk
rè   t | ¡| }|dkrØt|d ƒ}td||  d ƒ|> }ntd| ƒ}Y nX |dk�rDd| }}||d  }||d | | |  |  }}t|| ƒdk � rþ�qH� qþn|}|| }|| k �rn|d7 }|| }�qP|| k�rŒ|d8 }|| }�qn||| kfS )Nr   zy must be nonnegativer   zn must be positiver:   Tr   )r   Fg      ð?g      à?é5   g       @l           r   )	r   r#   r)   r"   r	   ÚOverflowErrorr0   Úlog2r   )	r   r   r
   r   ÚguessÚexpÚshiftZxprevr   r   r   r   Úirootû   sH    




rV   c                 C   sr   |dk rt dƒ‚| dk r t dƒ‚| dkr,dS | d dkr@| dkS || ; }t| |ƒdkr^t dƒ‚t|| d | ƒdkS )Nr   z7is_fermat_prp() requires 'a' greater than or equal to 2r   z.is_fermat_prp() requires 'n' be greater than 0Fr   z&is_fermat_prp() requires gcd(n,a) == 1)r   r1   rF   ©r   r;   r   r   r   Úis_fermat_prp)  s    rX   c                 C   s|   |dk rt dƒ‚| dk r t dƒ‚| dkr,dS | d dkr@| dkS || ; }t| |ƒdkr^t dƒ‚t|| d? | ƒt|| ƒ|  kS )Nr   z6is_euler_prp() requires 'a' greater than or equal to 2r   z-is_euler_prp() requires 'n' be greater than 0Fr   z%is_euler_prp() requires gcd(n,a) == 1)r   r1   rF   rM   rW   r   r   r   Úis_euler_prp8  s    rY   c                 C   sv   t | d ƒ}t|| |? | ƒ}|dks0|| d kr4dS t|d ƒD ]0}t|d| ƒ}|| d krb dS |dkr@ dS q@dS )Nr   Tr   F)r   rF   Úrange)r   r;   r*   Ú_r   r   r   Ú_is_strong_prpG  s    r\   c                 C   sh   |dk rt dƒ‚| dk r t dƒ‚| dkr,dS | d dkr@| dkS || ; }t| |ƒdkr^t dƒ‚t| |ƒS )Nr   z7is_strong_prp() requires 'a' greater than or equal to 2r   z.is_strong_prp() requires 'n' be greater than 0Fr   z&is_strong_prp() requires gcd(n,a) == 1)r   r1   r\   rW   r   r   r   Úis_strong_prpU  s    r]   c           	      C   sÒ  |dkrdS |d d|  }d}|}||  }|dkrÂt |ƒdd… D ]x}|| |  }|| d |  }|dkrD|| | || ||   }}|d@ rš|| 7 }|d@ rª|| 7 }|d? |d?  }}qD�nþ|dk�rt|d	k�rtt |ƒdd… D ]€}|| |  }|dk�r|| d |  }n|| d |  }d}|dkræ|| |d>  }}|d@ �rR|| 7 }|dL }||7 }d	}qæ|| ; }�nL|dk�rt |ƒdd… D ]€}|| |  }|| d|  |  }||9 }|dk�r|| || d>  }}|d@ �rì|| 7 }|dL }|| }||9 }|| ; }�qŽn®t |ƒdd… D ]œ}|| |  }|| d|  |  }||9 }|dk�r´|| | || ||   }}|d@ �rˆ|| 7 }|d@ �rš|| 7 }|d? |d?  }}||9 }|| ; }�q"||  ||  |fS )
aÀ  Return the modular Lucas sequence (U_k, V_k, Q_k).

    Explanation
    ===========

    Given a Lucas sequence defined by P, Q, returns the kth values for
    U and V, along with Q^k, all modulo n. This is intended for use with
    possibly very large values of n and k, where the combinatorial functions
    would be completely unusable.

    .. math ::
        U_k = \begin{cases}
             0 & \text{if } k = 0\\
             1 & \text{if } k = 1\\
             PU_{k-1} - QU_{k-2} & \text{if } k > 1
        \end{cases}\\
        V_k = \begin{cases}
             2 & \text{if } k = 0\\
             P & \text{if } k = 1\\
             PV_{k-1} - QV_{k-2} & \text{if } k > 1
        \end{cases}

    The modular Lucas sequences are used in numerous places in number theory,
    especially in the Lucas compositeness tests and the various n + 1 proofs.

    Parameters
    ==========

    n : int
        n is an odd number greater than or equal to 3
    P : int
    Q : int
        D determined by D = P**2 - 4*Q is non-zero
    k : int
        k is a nonnegative integer

    Returns
    =======

    U, V, Qk : (int, int, int)
        `(U_k \bmod{n}, V_k \bmod{n}, Q^k \bmod{n})`

    Examples
    ========

    >>> from sympy.external.ntheory import _lucas_sequence
    >>> N = 10**2000 + 4561
    >>> sol = U, V, Qk = _lucas_sequence(N, 3, 1, N//2); sol
    (0, 2, 1)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Lucas_sequence

    r   )r   r   r   r   rK   r   r,   NÚ1r   )Úbin)	r   ÚPÚQÚkÚDÚUÚVÚQkr   r   r   r   Ú_lucas_sequenced  sv    9







rg   c                 C   sz   |d d|  }|dks(|dks(|dkr0t dƒ‚| dk r@t dƒ‚| dkrLdS | d dkr`| dkS t| ||| ƒd ||  kS )	Nr   rK   r   )r   r   z,invalid values for p,q in is_fibonacci_prp()r   z1is_fibonacci_prp() requires 'n' be greater than 0F)r   rg   ©r   r   r=   Údr   r   r   Úis_fibonacci_prpã  s    rj   c                 C   sŽ   |d d|  }|dkr t dƒ‚| dk r0t dƒ‚| dkr<dS | d dkrP| dkS t| || ƒd| fkrnt dƒ‚t| ||| t|| ƒ ƒd dkS )	Nr   rK   r   z(invalid values for p,q in is_lucas_prp()r   z-is_lucas_prp() requires 'n' be greater than 0Fz)is_lucas_prp() requires gcd(n,2*q*D) == 1)r   r1   rg   rM   rh   r   r   r   Úis_lucas_prpð  s    rk   c                 C   s�   t dddƒD ]v}|d@ r| }t|| ƒ}|dkrVt| dd| d | d ƒd dk  S |dkrl||  rl dS |d	krt| ƒr dS qtd
ƒ‚dS )ad  Lucas compositeness test with the Selfridge parameters for n.

    Explanation
    ===========

    The Lucas compositeness test checks whether n is a prime number.
    The test can be run with arbitrary parameters ``P`` and ``Q``, which also change the performance of the test.
    So, which parameters are most effective for running the Lucas compositeness test?
    As an algorithm for determining ``P`` and ``Q``, Selfridge proposed method A [1]_ page 1401
    (Since two methods were proposed, referred to simply as A and B in the paper,
    we will refer to one of them as "method A").

    method A fixes ``P = 1``. Then, ``D`` defined by ``D = P**2 - 4Q`` is varied from 5, -7, 9, -11, 13, and so on,
    with the first ``D`` being ``jacobi(D, n) == -1``. Once ``D`` is determined,
    ``Q`` is determined to be ``(P**2 - D)//4``.

    References
    ==========

    .. [1] Robert Baillie, Samuel S. Wagstaff, Lucas Pseudoprimes,
           Math. Comp. Vol 35, Number 152 (1980), pp. 1391-1417,
           https://doi.org/10.1090%2FS0025-5718-1980-0583518-6
           http://mpqs.free.fr/LucasPseudoprimes.pdf

    r   é@B r   r   r   rK   r   Fé   z=appropriate value for D cannot be found in is_selfridge_prp()N)rZ   rM   rg   rE   r   )r   rc   rL   r   r   r   Ú_is_selfridge_prpÿ  s    
&rn   c                 C   s8   | dk rt dƒ‚| dkrdS | d dkr0| dkS t| ƒS )Nr   ú1is_selfridge_prp() requires 'n' be greater than 0Fr   r   )r   rn   r8   r   r   r   Úis_selfridge_prp'  s    rp   c           
      C   sø   |d d|  }|dkr t dƒ‚| dk r0t dƒ‚| dkr<dS | d dkrP| dkS t| || ƒd| fkrnt dƒ‚t|| ƒ}t| | ƒ}t| ||| | |? ƒ\}}}|dks°|dkr´d	S t|d ƒD ]2}	|| d|  |  }|dkræ d	S t|d| ƒ}qÀdS )
Nr   rK   r   z/invalid values for p,q in is_strong_lucas_prp()r   ro   Fz0is_strong_lucas_prp() requires gcd(n,2*q*D) == 1T)r   r1   rM   r   rg   rZ   rF   )
r   r   r=   rc   rL   r*   rd   re   rf   r[   r   r   r   Úis_strong_lucas_prp1  s,    
rq   c                 C   sø   t dddƒD ]Þ}|d@ r| }t|| ƒ}|dkr¾t| d ƒ}t| dd| d | d |? ƒ\}}}|dksp|dkrv dS t |d ƒD ]4}|| d|  |  }|dkrª  dS t|d| ƒ}q‚ d	S |dkrÔ||  rÔ d	S |d
krt| ƒr d	S qtdƒ‚d S )Nr   rl   r   r   r   rK   r   TFrm   zDappropriate value for D cannot be found in is_strong_selfridge_prp())rZ   rM   r   rg   rF   rE   r   )r   rc   rL   r*   rd   re   rf   r[   r   r   r   Ú_is_strong_selfridge_prpJ  s(    
$rr   c                 C   s8   | dk rt dƒ‚| dkrdS | d dkr0| dkS t| ƒS )Nr   z8is_strong_selfridge_prp() requires 'n' be greater than 0Fr   r   )r   rr   r8   r   r   r   Úis_strong_selfridge_prpb  s    rs   c                 C   sB   | dk rt dƒ‚| dkrdS | d dkr0| dkS t| dƒo@t| ƒS )Nr   z,is_bpsw_prp() requires 'n' be greater than 0Fr   r   )r   r\   rn   r8   r   r   r   Úis_bpsw_prpl  s    rt   c                 C   sB   | dk rt dƒ‚| dkrdS | d dkr0| dkS t| dƒo@t| ƒS )Nr   z3is_strong_bpsw_prp() requires 'n' be greater than 0Fr   r   )r   r\   rr   r8   r   r   r   Úis_strong_bpsw_prpv  s    ru   )r   )r   ))Úsysr0   Zmpmath.libmpZlibmpr#   r   rZ   rL   r   r   r!   r%   r'   r)   Úversion_infor1   r7   Ú	functoolsr/   r9   r?   rE   rH   rI   rM   rO   rV   rX   rY   r\   r]   rg   rj   rk   rn   rp   rq   rr   rs   rt   ru   r   r   r   r   Ú<module>   sN   
*
 
$.(


