a
    db*                  	   @   s  d dl Z d dlmZ zd dlZW n ey:   d dlZY n0 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y   dZY n0 ddlmZmZmZmZmZmZmZmZmZmZ d	Ze	jd
dd eedd edd D dd Ze	jdg ddd Z e	jdedd Z!dd Z"dd Z#dd Z$dd Z%ej&dd  Z'ej&d!d" Z(ej&d#d$ Z)ej&d%d& Z*ej&d'd( Z+i Z,erej-ej.ge,d)< d*e,d+< e/e,Z0d,e0d-< G d.d/ d/ej1Z2G d0d1 d1ej1Z3dS )2    N)reduce)givensettingsexample)HealthCheckTF   )
SquareRootErrorfactorizationgcdlcmjacobiinverse_modis_prime
next_primesmallprimessquare_root_mod_prime)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   ).0pqr   r   h/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python3.9/site-packages/ecdsa/test_numbertheory.py
<listcomp>9       r   c                 C   s   t | |ksJ d S Nr   )primeZnext_pr   r   r   test_next_prime8   s    r   val)r   r   r   c                 C   s   t | dksJ d S N   r   )r   r   r   r    test_next_prime_with_nums_less_2?   s    r!   r   c              	   C   s   t  }tdd| d  D ]8}|| |  }|| t|| }|| |  |ksJ qtd| D ]B}||v rjq\tt t||  W d    q\1 s0    Y  q\d S )Nr   r   r    )setrangeaddr   pytestZraisesr   )r   squaresnumsqrootZ	nonsquarer   r   r   +test_square_root_mod_prime_for_small_primesD   s    

r*   c                  C   s   t dd} | dksJ d S )Nr   r    r   )ar   r   r    test_square_root_mod_prime_for_2U   s    
r-   c                  C   s"   t dd} | |  d dksJ d S )N	   e   r+   )r)   r   r   r   *test_square_root_mod_prime_for_small_primeZ   s    
r0   c                  C   s6   d} | d dksJ t d| }|| |  dks2J d S )N            r+   r   r)   r   r   r   ,test_square_root_mod_prime_for_p_congruent_5_   s    
r6   c                  C   s6   d} | d dksJ t d| }|| |  dks2J d S )N   r2   r3      r+   r5   r   r   r   4test_square_root_mod_prime_for_p_congruent_5_large_dg   s    
r9   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
   xmodr   r   <lambda>v   r   z'st_two_nums_rel_prime.<locals>.<lambda>)stintegersfilter)drawr'   r   rB   r   st_two_nums_rel_primeo   s    
rI   c                 O   s8   d|vrd|d< | t tt j|i |tB }|S )Nr<   r   )rE   sampled_fromr   rF   rG   r   )rH   argskwargsr   r   r   r   	st_primes|   s    rM   c                 C   s@   | t dd d}| tjdd|d  d}|| | }||fS )Nr    r:   r=   r   r   r;   )rM   rE   rF   )rH   r   r'   r(   r   r   r   st_num_square_prime   s    rO   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       rN   r   
   min_sizemax_size   r;   c                    s    t jt jt  ddd| dS N   )rT   r   rR   rE   listsrJ   n)primesr   r   rD      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      r   z(st_comp_with_com_fac.<locals>.<listcomp>)	rE   rY   rM   rJ   r   r_   r`   rF   flatmap)rH   Zcom_fac_primesZcomp_primesr   )rc   r\   r   st_comp_with_com_fac   s    

re   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   slJ stJ | 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    rP   rN   rQ   T)rS   rT   uniquer   c                    s   g | ]}| vr|qS r   r   )r   i)uncom_fac_primesr   r   r      r   z&st_comp_no_com_fac.<locals>.<listcomp>rU   r;   c                    s    t jt jt  ddd| dS rV   rX   rZ   )leftover_primesr   r   rD      s   z$st_comp_no_com_fac.<locals>.<lambda>c                 S   s   g | ]}t tj|d qS r]   r^   ra   r   r   r   r      r   r   )rE   rY   rM   rJ   lenr   r_   r`   rF   rd   insert)rH   r\   Z	uncom_facZnumber_primesnumbersZ	insert_atr   )ri   rh   r   st_comp_no_com_fac   s4    


rm   Zsuppress_health_checki  deadlinerQ   Zmax_examplesc                   @   sT   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S )TestIsPrimec                 C   s   t dsJ d S )N   r   selfr   r   r   test_very_small_prime   s    z!TestIsPrime.test_very_small_primec                 C   s   t drJ d S )N   rq   rr   r   r   r   test_very_small_composite   s    z%TestIsPrime.test_very_small_compositec                 C   s   t dsJ d S )Ni[rq   rr   r   r   r   test_small_prime   s    zTestIsPrime.test_small_primec                 C   s   t drJ d S )Ni(  rq   rr   r   r   r   test_special_composite   s    z"TestIsPrime.test_special_compositec                 C   s   t dd d sJ d S )Nr       i)  rq   rr   r   r   r   test_medium_prime_1   s    zTestIsPrime.test_medium_prime_1c                 C   s   t dd d sJ d S )Nr    ry   i-  rq   rr   r   r   r   test_medium_prime_2   s    zTestIsPrime.test_medium_prime_2c                 C   s   t dd d rJ d S )Nr    ry   i0  rq   rr   r   r   r   test_medium_trivial_composite   s    z)TestIsPrime.test_medium_trivial_compositec                 C   s   t dd d rJ d S )Nr    ry   i/  rq   rr   r   r   r   !test_medium_non_trivial_composite  s    z-TestIsPrime.test_medium_non_trivial_compositec                 C   s   t dd d sJ d S )Nr    i   i  rq   rr   r   r   r   test_large_prime  s    zTestIsPrime.test_large_primeN)__name__
__module____qualname__rt   rv   rw   rx   rz   r{   r|   r}   r~   r   r   r   r   ro      s   ro   c                   @   s  e Zd Zdd Zeedef i ee	e
 dd Zeedef i ee	e dd Ze	ejejdd	d
 dddddd Zdd Ze	ejejdd	d
 dddddd Zeedef i ee	e dd Zef i 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 i ee	ejd#d$dd%d& d'd( Ze	e d)d* Z d+d, Z!d-S ).TestNumbertheoryc                 C   s<   t ddddksJ t g ddks(J t ddks8J d S )Ni            )r   r   r   r4   r?   rr   r   r   r   test_gcd  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 itc                 C   s:   t |}d|v s|dksJ |D ]}|| dks J q d S Nr   r   r?   rs   rl   r[   rg   r   r   r   test_gcd_with_com_factor  s    	z)TestNumbertheory.test_gcd_with_com_factorc                 C   s   t |}|dksJ d S r>   r?   )rs   rl   r[   r   r   r   test_gcd_with_uncom_factor  s    	z+TestNumbertheory.test_gcd_with_uncom_factorr   r    i    r;   rU   rR   c                 C   s&   t |}|D ]}|| dksJ qd S Nr   r?   r   r   r   r   test_gcd_with_random_numbers*  s    z-TestNumbertheory.test_gcd_with_random_numbersc                 C   s<   t ddddksJ t g ddks(J t ddks8J d S )Nr4   r      r   )r4   r   r   r   rr   r   r   r   test_lcm7  s    zTestNumbertheory.test_lcmc                 C   s&   t |}|D ]}|| dksJ 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&J d S r   r+   )rs   valsZsquarer   Zcalcr   r   r   test_square_root_mod_primeH  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s6J d S r   )r	   )rs   r'   factorsmultrg   r   r   r   test_factorizationV  s
    z#TestNumbertheory.test_factorizationc                 C   sV   d}dt v sJ dt v sJ t|}d}|D ]}||d |d  9 }q,||ksRJ d S )Ni(  r/   g   r   r   r   r	   rs   expr   r   rg   r   r   r   test_factorisation_smallprimesa  s    z/TestNumbertheory.test_factorisation_smallprimesc                 C   sV   d}dt vsJ dt vsJ t|}d}|D ]}||d |d  9 }q,||ksRJ d S )Ni;< i  i  r   r   r   r   r   r   r   "test_factorisation_not_smallprimesk  s    z3TestNumbertheory.test_factorisation_not_smallprimesc                 C   s   t dddksJ d S )Nr   r4   r   rr   r   r   r   test_jacobi_with_zerou  s    z&TestNumbertheory.test_jacobi_with_zeroc                 C   s   t dddksJ d S )Nr   r4   r   rr   r   r   r   test_jacobi_with_onex  s    z%TestNumbertheory.test_jacobi_with_oner4   i  c                 C   s   | d S r   r   r@   r   r   r   rD   |  r   zTestNumbertheory.<lambda>c                 C   s   t |rrt }td|D ],}t|| |dks2J ||| |  qtd|D ]}||vrPt||dksPJ qPnRt|}td|D ]>}d}|D ]}|t||d |d  9 }q|t||ksJ qd S )Nr   r   r   )r   r"   r#   r   r$   r	   )rs   rC   r&   r)   rg   r   r,   cr   r   r   test_jacobi{  s    zTestNumbertheory.test_jacobic                 C   sD   |\}}t ||}d|  k r&|k s,n J || | dks@J d S )Nr   r   r   )rs   rb   r'   rC   invr   r   r   test_inverse_mod  s    
z!TestNumbertheory.test_inverse_modc                 C   s   dt ddksJ d S )Nr      r   rr   r   r   r   test_inverse_mod_with_zero  s    z+TestNumbertheory.test_inverse_mod_with_zeroN)"r   r   r   r   unittestZ
skipUnless
HC_PRESENTr   HYP_SLOW_SETTINGSr   re   r   rm   r   rE   rY   rF   r   r   r   HYP_SETTINGSrO   r   r   r   r   r   r   r   rG   r   rI   r   r   r   r   r   r   r   
  sl   




r   )4r_   	functoolsr   Z	unittest2r   ImportErrorZhypothesis.strategies
strategiesrE   r%   Z
hypothesisr   r   r   r   r   Znumbertheoryr   r	   r
   r   r   r   r   r   r   r   Z	BIGPRIMESmarkZparametrizezipr   r!   r*   r-   r0   r6   r9   Z	compositerI   rM   rO   re   rm   r   Zfilter_too_muchZtoo_slowdictr   ZTestCasero   r   r   r   r   r   <module>   s^   
0$





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