U
    ʹh3                     @   s  d dl Z d dlmZ d dlZzd dlZW n ek
rD   d dlZY nX d dlmZ	 d dl
Z
d dlmZmZmZ zd dlmZ dZW n ek
r   dZY nX ddlmZmZmZmZmZmZmZmZmZmZmZ zd d	lmZ W nF ek
r&   zd d	lmZ W n ek
r    d
d ZY nX Y nX dZ e
j!"ddd e#e dd e dd D dd Z$e
j!"ddd dgdd Z%e
j!j&e
j!"dedd Z'dd Z(dd Z)dd Z*dd  Z+G d!d" d"ej,Z-e	j.d#d$ Z/e	j.d%d& Z0e	j.d'd( Z1e	j.d)d* Z2e	j.d+d, Z3i Z4er6ej5ej6ge4d-< d.e4d/< d0ej7krJd1e4d2< e8e4Z9d0ej7krhde9d2< nd1e9d2< G d3d4 d4ej,Z:G d5d6 d6ej,Z;dS )7    N)reduce)givensettingsexample)HealthCheckTF   )SquareRootErrorJacobiErrorfactorizationgcdlcmjacobiinverse_modis_prime
next_primesmallprimessquare_root_mod_prime)mpzc                 C   s   | S N xr   r   =./venv/lib/python3.8/site-packages/ecdsa/test_numbertheory.pyr   (   s    r   )i@ iA i)A i/A iEA iSA iYA i]A iA iA iA iA iA iA iA iB iB iB i+B i/B zprime, next_pc                 C   s   g | ]\}}||fqS r   r   ).0pqr   r   r   
<listcomp>E   s     r   c                 C   s   t | |kstd S r   r   AssertionError)primeZnext_pr   r   r   test_next_primeD   s    r!   valc                 C   s   t | dkstd S N   r   )r"   r   r   r    test_next_prime_with_nums_less_2K   s    r%   r    c              
   C   s   t  }tdd| d  D ]8}|| |  }|| t|| }|| |  |kstqtd| D ].}||krjq\tt t||  W 5 Q R X q\d S )Nr   r   r$   )setrangeaddr   r   pytestZraisesr   )r    squaresnumsqrootZ	nonsquarer   r   r   +test_square_root_mod_prime_for_small_primesP   s    

r.   c                  C   s   t dd} | dkstd S )Nr   r$   r   r   )ar   r   r    test_square_root_mod_prime_for_2b   s    
r1   c                  C   s"   t dd} | |  d dkstd S )N	   e   r/   )r-   r   r   r   *test_square_root_mod_prime_for_small_primeg   s    
r4   c                  C   s6   d} | d dkst td| }|| |  dks2t d S )N            r   r   r   r-   r   r   r   ,test_square_root_mod_prime_for_p_congruent_5l   s    
r;   c                  C   s6   d} | d dkst td| }|| |  dks2t d S )N   r6   r7      r9   r:   r   r   r   4test_square_root_mod_prime_for_p_congruent_5_large_dt   s    
r>   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestSquareRootModPrimec              	   C   s$   |  t tdd W 5 Q R X d S )N       )assertRaisesr	   r   selfr   r   r   test_power_of_2_p}   s    z(TestSquareRootModPrime.test_power_of_2_pc              	   C   s6   |  t}tdd W 5 Q R X | dt|j d S )Nr@      zno square rootrB   r   r   ZassertInstrZ	exceptionrD   er   r   r   test_no_square   s    z%TestSquareRootModPrime.test_no_squarec              	   C   s6   |  t}tdd W 5 Q R X | dt|j d S )Nr@   !   p is not primerG   rI   r   r   r   test_non_prime   s    z%TestSquareRootModPrime.test_non_primec              	   C   s6   |  t}tdd W 5 Q R X | dt|j d S )Ni  i  rM   rG   rI   r   r   r   test_non_prime_with_negative   s    z3TestSquareRootModPrime.test_non_prime_with_negativeN)__name__
__module____qualname__rE   rK   rN   rO   r   r   r   r   r?   |   s   r?   c                    sB   | t jddd d | t jd d d fdd}| fS )Nr$      	min_value	max_valuer   c                    s   t |  dkS Nr   )r   r   modr   r   <lambda>       z'st_two_nums_rel_prime.<locals>.<lambda>)stintegersfilter)drawr+   r   rX   r   st_two_nums_rel_prime   s    
r`   c                 O   s4   d|krd|d< | t tt j||tB }|S )NrU   r   )r\   sampled_fromr   r]   r^   r   )r_   argskwargsr    r   r   r   	st_primes   s    rd   c                 C   s@   | t dd d}| tjdd|d  d}|| | }||fS )Nr$   rS   rV   r   r   rT   )rd   r\   r]   )r_   r    r+   r,   r   r   r   st_num_square_prime   s    rf   c                    sx   | t jtdd dddd| t jt ddd}ttj|d | t jdddfd	d
} fdd|D S )zM
    Strategy that returns lists of numbers, all having a common factor.
    r$      re   r   
   min_sizemax_size   rT   c                    s    t jt jt  ddd| dS N   )rk   r   ri   r\   listsra   n)primesr   r   rZ      s   z&st_comp_with_com_fac.<locals>.<lambda>c                    s   g | ]}t tj|d   qS r   r   operatormulr   nums)com_facr   r   r      s     z(st_comp_with_com_fac.<locals>.<listcomp>)	r\   rp   rd   ra   r   rv   rw   r]   flatmap)r_   Zcom_fac_primesZcomp_primesr   )rz   rs   r   st_comp_with_com_fac   s    

r|   c                    s   | t jtdd ddddd}| t jt |dt|d ddttjd}fdd	|D   sltstt| t j	dd
d
 fdd}dd	 |D }| t j	dt|d}||| |S )zQ
    Strategy that returns lists of numbers that don't have a common factor.
    r$   rg   re   rh   T)rj   rk   uniquer   c                    s   g | ]}| kr|qS r   r   )r   i)uncom_fac_primesr   r   r      s      z&st_comp_no_com_fac.<locals>.<listcomp>rl   rT   c                    s    t jt jt  ddd| dS rm   ro   rq   )leftover_primesr   r   rZ      s   z$st_comp_no_com_fac.<locals>.<lambda>c                 S   s   g | ]}t tj|d qS rt   ru   rx   r   r   r   r      s     r   )r\   rp   rd   ra   lenr   rv   rw   r   r]   r{   insert)r_   rs   Z	uncom_facZnumber_primesnumbersZ	insert_atr   )r   r   r   st_comp_no_com_fac   s:       


r   Zsuppress_health_checki  Zdeadlinez--fastrl   Zmax_examplesc                   @   sd   e Z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S )TestIsPrimec                 C   s   t dstd S )N   r   r   rC   r   r   r   test_very_small_prime  s    z!TestIsPrime.test_very_small_primec                 C   s   t drtd S )N   r   rC   r   r   r   test_very_small_composite  s    z%TestIsPrime.test_very_small_compositec                 C   s   t dstd S )Ni[r   rC   r   r   r   test_small_prime  s    zTestIsPrime.test_small_primec                 C   s   t drtd S )Ni(  r   rC   r   r   r   test_special_composite  s    z"TestIsPrime.test_special_compositec                 C   s   t dd d std S )Nr$      i)  r   rC   r   r   r   test_medium_prime_1"  s    zTestIsPrime.test_medium_prime_1c                 C   s   t dd d std S )Nr$   r   i-  r   rC   r   r   r   test_medium_prime_2&  s    zTestIsPrime.test_medium_prime_2c                 C   s   t dd d rtd S )Nr$   r   i0  r   rC   r   r   r   test_medium_trivial_composite*  s    z)TestIsPrime.test_medium_trivial_compositec                 C   s   t dd d rtd S )Nr$   r   i/  r   rC   r   r   r   !test_medium_non_trivial_composite-  s    z-TestIsPrime.test_medium_non_trivial_compositec                 C   s   t tdd d std S )Nr$   i   i  )r   r   r   rC   r   r   r   test_large_prime0  s    zTestIsPrime.test_large_primec                 C   s   t drtd S )Nl   *i:.S#q.m& r   rC   r   r   r   test_pseudoprime_base_194  s    z$TestIsPrime.test_pseudoprime_base_19c                 C   sf   t ddd}t|sttdD ]0}t|d|d  d  d|d  d  s$ qbq$dsbtd	d S )
Nz29 674 495 668 685 510 550 154 174 642 905 332 730 771 991 799 853 043 350 995 075 531 276 838 753 171 770 199 594 238 596 428 121 188 033 664 754 218 345 562 493 168 782 883  rh   i9  r   ia  Fzcomposite not detected)intreplacer   r   r'   )rD   r   _r   r   r   test_pseudoprime_base_3007  s     (z%TestIsPrime.test_pseudoprime_base_300N)rP   rQ   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s  e Zd Zdd Zeedef ee	ddge
e dd Zeedef ee	dd	d
ge
e dd Zef ee
ejejddd dddddd Zdd Zef ee
ejejddd dddddd Zeedef ee
e dd Zejjef ee
ejddde	de	ddd Zd d! Zd"d# Zd$d% Zd&d' Zef ee
ejd(d)dd*d+ d,d- Z ef ee
e! d.d/ Z"d0d1 Z#d2S )3TestNumbertheoryc                 C   s>   t ddddkstt dddgdks*tt ddks:td S )Ni            r8   r   r   rC   r   r   r   test_gcdM  s    zTestNumbertheory.test_gcdzwHypothesis 2.0.0 can't be made tolerant of hard to meet requirements (like `is_prime()`), the test case times-out on itig i c                 C   s:   t |}d|ks|dkst|D ]}|| dks tq d S Nr   r   r   rD   r   rr   r~   r   r   r   test_gcd_with_com_factorR  s    
z)TestNumbertheory.test_gcd_with_com_factori  i-  i  c                 C   s   t |}|dkstd S rW   r   )rD   r   rr   r   r   r   test_gcd_with_uncom_factora  s    
z+TestNumbertheory.test_gcd_with_uncom_factorr   r$   i    rT   rl   ri   c                 C   s&   t |}|D ]}|| dkstqd S Nr   r   r   r   r   r   test_gcd_with_random_numbersn  s    	z-TestNumbertheory.test_gcd_with_random_numbersc                 C   s>   t ddddkstt dddgdks*tt ddks:td S )Nr8   r      r   r   r   rC   r   r   r   test_lcm|  s    zTestNumbertheory.test_lcmc                 C   s&   t |}|D ]}|| dkstqd S r   r   r   r   r   r   test_lcm_with_random_numbers  s    	z-TestNumbertheory.test_lcm_with_random_numbersc                 C   s*   |\}}t ||}|| | |ks&td S r   r/   )rD   ZvalsZsquarer    Zcalcr   r   r   test_square_root_mod_prime  s    	
z+TestNumbertheory.test_square_root_mod_primel    J)l   5yl   1n
Yc                 C   s:   t |}d}|D ]}||d |d  9 }q||ks6td S r   )r
   r   )rD   r+   factorsmultr~   r   r   r   test_factorization  s
    z#TestNumbertheory.test_factorizationc                 C   sV   d}dt kstdt kstt|}d}|D ]}||d |d  9 }q,||ksRtd S )Ni(  r3   g   r   r   r   r   r
   rD   Zexpr   r   r~   r   r   r   test_factorisation_smallprimes  s    z/TestNumbertheory.test_factorisation_smallprimesc                 C   sV   d}dt kstdt kstt|}d}|D ]}||d |d  9 }q,||ksRtd S )Ni;< i  i  r   r   r   r   r   r   r   "test_factorisation_not_smallprimes  s    z3TestNumbertheory.test_factorisation_not_smallprimesc                 C   s   t dddkstd S )Nr   r8   r   r   rC   r   r   r   test_jacobi_with_zero  s    z&TestNumbertheory.test_jacobi_with_zeroc                 C   s   t dddkstd S )Nr   r8   r   rC   r   r   r   test_jacobi_with_one  s    z%TestNumbertheory.test_jacobi_with_oner8   i  c                 C   s   | d S r#   r   r   r   r   r   rZ     r[   zTestNumbertheory.<lambda>c                 C   s   t |}t|rt }td|D ]4}t |}t|| |dksBt||| |  q td|D ]&}||kr`t |}t||dks`tq`nRt|}td|D ]>}d}|D ]}|t||d |d  9 }q|t||kstqd S )Nr   r   r   )r   r   r&   r'   r   r   r(   r
   )rD   rY   r*   r-   r~   r   r0   cr   r   r   test_jacobi  s"    zTestNumbertheory.test_jacobic                 C   sD   |\}}t ||}d|  k r&|k s,n t|| | dks@td S )Nr   r   r   r   )rD   ry   r+   rY   invr   r   r   test_inverse_mod  s    
z!TestNumbertheory.test_inverse_modc                 C   s   dt ddkstd S )Nr      r   rC   r   r   r   test_inverse_mod_with_zero  s    z+TestNumbertheory.test_inverse_mod_with_zeroN)$rP   rQ   rR   r   unittestZ
skipUnless
HC_PRESENTr   HYP_SLOW_SETTINGSr   r   r|   r   r   r   r\   rp   r]   r   r   r   rf   r   r)   markslowr   r   r   r   r   r^   r   r`   r   r   r   r   r   r   r   L  sx   


r   )<rv   	functoolsr   sysZ	unittest2r   ImportErrorZhypothesis.strategiesZ
strategiesr\   r)   Z
hypothesisr   r   r   r   r   Znumbertheoryr   r	   r
   r   r   r   r   r   r   r   r   Zgmpy2r   ZgmpyZ	BIGPRIMESr   Zparametrizezipr!   r%   r   r.   r1   r4   r;   r>   ZTestCaser?   Z	compositer`   rd   rf   r|   r   ZHYP_SETTINGSZfilter_too_muchZtoo_slowargvdictr   r   r   r   r   r   r   <module>   s|   
4 "







.
7