U
    ZÊ¹j¶@  ã                   @   s  d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 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mZmZmZmZmZmZ 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( d dl)m*Z* d d	l+m,Z, d d
l-m.Z.m/Z/ dd„ Z0dd„ Z1dd„ Z2dS )é    )Údefaultdict)ÚTuple)ÚS)ÚDummyÚSymbol)Útotient)Ún_orderÚis_primitive_rootÚis_quad_residueÚlegendre_symbolÚjacobi_symbolÚ
primerangeÚsqrt_modÚprimitive_rootÚquadratic_residuesÚis_nthpow_residueÚnthroot_modÚsqrt_mod_iterÚmobiusÚdiscrete_logÚquadratic_congruenceÚpolynomial_congruenceÚsieve)Ú_primitive_root_prime_iterÚ _primitive_root_prime_power_iterÚ!_primitive_root_prime_power2_iterÚ_nthroot_mod_prime_powerÚ_discrete_log_trial_mulÚ_discrete_log_shanks_stepsÚ_discrete_log_pollard_rhoÚ_discrete_log_index_calculusÚ_discrete_log_pohlig_hellmanÚ_binomial_mod_prime_powerÚbinomial_mod)ÚZZ)Úraises)ÚrandintÚchoicec                     sÌ  t ddƒdkst‚dd„ tddƒD ƒddd	dd	dgks:t‚t d
dƒdksLt‚t ddƒt d	dƒksdt‚t ddƒd	ksvt‚t ddd d d ƒdks”t‚ttdd„ ƒ tddƒdks´t‚tddƒdksÆt‚tddƒdksØt‚tddƒtddƒksðt‚ttdd„ ƒ tddƒD ]Æ} tt| ƒƒ}|d t	|ƒk�s.t‚|D ]}t || ƒ| d k�s2t‚�q2t
|ƒtt| ƒƒk�slt‚tddƒD ]T}tt| |ƒƒ}tt| |ƒƒ}t
|ƒt
|ƒ  k�rÂtt| | ƒƒk�svn t‚�qv�qtdƒd
k�sât‚t tddƒdƒtdƒk�s t‚tdƒd
k�st‚t tddƒdƒtdƒk�s0t‚td ƒd
k�sBt‚t td dƒd ƒtd ƒk�s`t‚td!ƒdk�srt‚t td!dƒd!ƒtd!ƒk�s�t‚td"ƒdk�s¢t‚t td"dƒd"ƒtd"ƒk�sÀt‚dd d } t| ƒdk�sÞt‚t t| dƒ| ƒt| ƒk�süt‚td|  ƒdk�st‚t td|  dƒd|  ƒtd|  ƒk�s<t‚t| d ƒdk�sRt‚t t| d dƒ| d ƒt| d ƒk�s|t‚td#ƒd k�rštd#dƒd k�sžt‚td$ƒd k�r¼td$dƒd k�sÀt‚ttd%d„ ƒ tddƒdk�sât‚tddƒd&k�söt‚td'd(ƒtd)d(ƒk�st‚td*d+ƒd&k�s$t‚tddƒd&k�s8t‚tddƒd&k�sLt‚tddƒtddƒ  k�rpd&k�svn t‚tddƒd&k�sŠt‚tdd,ƒdk�sžt‚td-d.ƒd&k�s²t‚d/d„ tdƒD ƒddddddd0dgk�sÞt‚ttd1d„ ƒ ttd2d„ ƒ ttjƒdgk�st‚tdƒdgk�s$t‚tdƒdddd0gk�s>t‚tdƒddddd0ddgk�s^t‚d3d„ tdd4ƒD ƒdddddddddd	d	dddd	dd0ddgk�s¢t‚ttd	dƒƒdgk�s¼t‚tddƒdk�sÐt‚tdd5ƒdk�sät‚td	d6ƒdk�søt‚td7d8ƒd7k�st‚td9dƒd k�s t‚td:d;ƒd k�s4t‚tddƒD ]Œ} ttƒ}t| ƒD ]‰ |tˆ d| ƒ  ˆ ¡ �qRtd| ƒD ]L‰ tˆ | ƒ}tˆ | d&ƒ}|�r¶t|ƒ}|ˆ  |k�sÄt‚n|ˆ  �rzt‚�qz�q>td0d,d&ƒdd	dd$d<d=gk�sît‚td0d>d&ƒdd=d?d@dAdBgk�st‚td0dCd&ƒddBdDdEdFdGgk�s2t‚td>d>d&ƒdd0dHd,dIdJdKdLdMg	k�sZt‚td>dCd&ƒd0dHdIdJdLdMdNdOdPdQdRdSdTdUdVd*dWdXgk�s”t‚td>dYd&ƒd0dMdNdSdTdXdZd[d\d]d^d_d`dadbdcdddegk�sÎt‚td>dfd&ƒd0dXdZd_d`dedgdhdidjdkdldmdndodpdqdrgk�st‚dsD ]&\}	} tt|	| ƒd| ƒ|	k�st‚�qdt}
dud|
  d|
  dvd|
d   d|
d    }	} t|	| ƒ}tdƒD ] ‰ tt|ƒd| ƒ|	k�s|t‚�q|dud|
  d|
  dvd|
d   d|
d    }	} t|	| ƒ}tdƒD ] ‰ tt|ƒd| ƒ|	k�sât‚�qâd}
dud|
  d|
  dvd|
d   d|
d    }	} t|	| ƒ}tdƒD ] ‰ tt|ƒd| ƒ|	k�	sLt‚�	qLtttd0d,ƒƒƒtk�	sŠt‚tttd0d,tƒƒƒttdƒƒk�	s°t‚tttddtƒƒƒttdƒƒk�	sÖt‚tddd
ƒ�	sèt‚tdddƒdk�	sþt‚tdddƒd&k�
st‚tdddƒd&k�
s*t‚tdddƒd&k�
s@t‚tdddƒd&k�
sVt‚tddd0ƒdk�
slt‚tdd
d?ƒd&k�
s‚t‚td<dd4ƒd&k�
s˜t‚tddd4ƒdk�
s®t‚td
dd4ƒd&k�
sÄt‚tdddwƒdk�
sÚt‚tdddxƒd&k�
sðt‚tddd=ƒdk�st‚tddd=ƒd&k�st‚tddd=ƒdk�s2t‚tdddwƒdk�sHt‚td>ddyƒdk�s^t‚tdCd
dzƒd&k�stt‚tdCdd{ƒdk�sŠt‚td|dd}ƒd&k�s t‚td~d	dƒd&k�s¶t‚td€d0d�ƒd&k�sÌt‚d‚dƒ„ td„ƒD ƒ‰d…dƒ„ td„ƒD ƒˆk�sút‚d†dƒ„ td‡ƒD ƒ‰dˆdƒ„ td‡ƒD ƒˆk�s(t‚d‰dƒ„ tdŠƒD ƒ‰d‹d„ ˆD ƒ�sNt‚dŒdƒ„ tdŠƒD ƒ‰d�d„ ˆD ƒ�stt‚tdŽdd�ƒ�s†t‚td0ddIƒ�s˜t‚td�dd‘ƒ�sªt‚tddd’ƒ�s¼t‚td“dd‘ƒ�sÎt‚tddd
ƒ�ràt‚td”dd•ƒ�sòt‚ttd&d–�d ddƒd&k�st‚tddƒD �]6} tdƒD �]$}	tdd
ƒD �]}
t|	|
| dƒ}t |tƒ�s^t‚t
|ƒdk�rÂt| ƒD ] }t||
| ƒ|	|  k�stt‚�qttddƒD ]}t|	|
| |ƒg k�s t‚�q nˆt| ƒD ],}t||
| ƒ|	|  k}|||kA �rÊt‚�qÊtddƒD ]F}t|	|
| |ƒ}|�s  �q:|D ] }t||
| | ƒ|	k�s$t‚�q$�q�q:�q*�qt!td&d—�ddƒdk�srt‚t!dd“d˜ƒdJk�sˆt‚t!d™ddšƒd#k�sžt‚d›D ].\}	}} t!|	|| ƒ}t||| ƒ|	k�s¢t‚�q¢t!dddœƒd k�sèt‚t!dd
dId&ƒdd�gk�st‚t!d0ddId&ƒdd0d$d<d,džgk�s(t‚t!dddŸƒd k�s>t‚t!d|dd}d&ƒd d¡gk�sZt‚t!ddd¢d&ƒdgk�stt‚t!dddd&ƒddd4d?dxdd£dtd¤dNg
k�s t‚t!ddd,d&ƒd
d�gk�s¼t‚t!ddd¥d&ƒd¦d§gk�sØt‚t!dddd&ƒg k�sðt‚tdd4ƒD ]®} t| ƒD ]ž}	td| ƒD ]Œ}
t!|	|
| d&ƒ}t |tƒ�s6t‚t| ƒD ](}t||
| ƒ|	k}|||kA �r>t‚�q>t!|	|
| dƒ}|d k�r�|g k�sžt‚n||k�st‚�q�q�qút"d¨d&d©�‰t"dªd&d«�‰ t#d¬d­dƒdk�sØt‚t#d®d¯dƒdHk�sît‚t#d°dd> dƒd>k�st‚t#d±d¦d² d¦ƒd²k�s"t‚t$d³d´dƒdk�s8t‚t$dµd¶d
ƒd¦k�sNt‚t$d·dd¸ dƒd¸k�sht‚t$d¹ddº dƒdºk�s‚t‚t%d»d’ddd¼�d	k�sœt‚t%d½d¾ddd¼�d¦k�s¶t‚t%d¿dÀddd¼�dxk�sÐt‚t%dÁdd\ ddd¼�d\k�sît‚ttdÂd„ ƒ ttdÃd„ ƒ t&dÄdÅddÆƒdÇk�s"t‚t&dÈdÉddÊƒdËk�s:t‚t&dÌdÍddÎƒdÏk�sRt‚t&dÐdÑddÒƒdÓk�sjt‚t&dÔdÕdÖd×ƒdØk�s‚t‚t'dÙdÚdƒd0k�s˜t‚t'dÛdÜdƒd“k�s®t‚t'dÝddÞ dƒdÞk�sÈt‚t'dßddà dƒdàk�sât‚t(d¬dádƒd0k�søt‚t(d¹dâdƒd@k�st‚t(dÝddã dƒdãk�s(t‚t(däddå dƒdåk�sBt‚t(dædçdƒdèk�sXt‚t(dédêdëƒdìk�snt‚dí}t(|Ž dîk�s„t‚t(t)|Ž Ž dîk�sšt‚t*dïdðdñdòƒdódôdõdöd÷gk�s¼t‚t*dd	d
duƒdd4gk�sØt‚t*død¤dùdúƒg k�sðt‚t*d$dddƒdgk�s
t‚t*dd$ddƒddûgk�s&t‚t*düdýdþdÿƒdR�d gk�sDt‚t*�ddë�d�dƒ�d�dgk�sjt‚t*�dd¥dM�dƒ�ddZgk�sŒt‚t*d
dddƒdgk�s¦t‚t*ddd¦dƒdgk�sÀt‚t*ddd4dƒddgk�sÜt‚t+d	ˆd
  dˆd   d
ˆd   ˆd  ˆ d �d	ƒ�d
�d�d�d�d�d�d�dgk�sBt‚t+ˆd dˆd   dˆ  d" �dƒ�dgk�sxt‚t+ˆd ˆ �d �dƒ�d�dgk�s¤t‚t+dˆd  dˆ  d4 dƒddgk�sÐt‚t+ˆd d dƒd
gk�sît‚t+�dˆd  d¥ˆ  dM �dƒ�ddZgk�s t‚t+ˆd d d,ƒd
d�gk�s@t‚t+�dˆd  d	ˆd   �dˆ  �d �dƒ�d�d�d�dgk�sŒt‚t+ˆd d0 dIƒdd0d$d<d,džgk�s´t‚t+ˆd	 dˆd
   �d �d ƒ�d!gk�sät‚tt‡f�d"d„ƒ tt‡ ‡f�d#d„ƒ tt‡f�d$d„ƒ t,�d%ddƒdk�s:t‚t,d�d%dƒdk�sRt‚tt�d&d„ ƒ t,d@ddƒdk�sxt‚t,dŠdúdYƒ�dk�s�t‚t,�d'�d(dƒdk�sªt‚t,�d)�d*�d+ƒ�d,k�sÈt‚d S (-  Né   é   é   c                 S   s   g | ]}t |d ƒ‘qS )é   ©r   ©Ú.0Úa© r0   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/ntheory/tests/test_residue.pyÚ
<listcomp>   s     z test_residue.<locals>.<listcomp>é   r+   é   é   é   é   é   é   ée   éw   é
   é2   é—   l   zX     4ädéCx ^Êy2V°?WâÈYâ|gÄO¬s&YR5I c                   S   s
   t ddƒS )Nr5   é	   r,   r0   r0   r0   r1   Ú<lambda>   ó    ztest_residue.<locals>.<lambda>Fé   é   é   c                   S   s
   t ddƒS )Nr4   r5   )r	   r0   r0   r0   r1   r@   #   rA   éd   r   é   éa   iÁ$  i'ž  iñ)´aéR   é,   é   c                   S   s   t dƒS )Néýÿÿÿ)r   r0   r0   r0   r1   r@   D   rA   TiL0  é‹   é„   éÏ   éû   é   l    $O l    $ÔU c                 S   s   g | ]}t |d ƒr|‘qS )rC   ©r
   )r.   Újr0   r0   r1   r2   P   s     
 r?   c                   S   s
   t ddƒS )Ngš™™™™™ñ?r(   rQ   r0   r0   r0   r1   r@   R   rA   c                   S   s
   t ddƒS )Nr(   r   rQ   r0   r0   r0   r1   r@   S   rA   c                 S   s   g | ]}t t|ƒƒ‘qS r0   )Úlenr   ©r.   Úir0   r0   r1   r2   Y   s     é   ióÿÿÿé   iY  i²  éC   iü  i™ é   é   éQ   é   é3   é9   éN   éó   éT   éŸ   é¥   éð   é   é$   é-   é6   é?   éH   éZ   éc   éu   é~   é�   é™   é«   é´   éÆ   éá   éê   iÙ  éü   i;  iM  iŒ  iž  iÝ  iï  i.  i@  i  i‘  iÐ  é‹  iâ  iÃ  iÕ  i¶  iÈ  i©  i»  iœ  i®  i�  i¡  i‚  ))é  �l     @B )rx   l      ! )i   i   )l   )1mQ l   K'šR )l    )bm.Ql    ,z±h”éF   é   i	=  é0   é(   iÌ  iï  iÝë iªŒ  iVU iˆo  iª  i(j ijÃ  c                 S   s   h | ]}t |d dƒ’qS ©é8   é   ©ÚpowrT   r0   r0   r1   Ú	<setcomp>­   s     ztest_residue.<locals>.<setcomp>r   c                 S   s   h | ]}t |d dƒr|’qS r}   ©r   r-   r0   r0   r1   r‚   ®   s      c                 S   s   h | ]}t |d dƒ’qS ©é   é   r€   rT   r0   r0   r1   r‚   ¯   s     r†   c                 S   s   h | ]}t |d dƒr|’qS r„   rƒ   r-   r0   r0   r1   r‚   °   s      c                 S   s   h | ]}t |d dƒ’qS ©r9   i ñ r€   rT   r0   r0   r1   r‚   ±   s     éè  c                 S   s   g | ]}t |d dƒ‘qS r‡   rƒ   r-   r0   r0   r1   r2   ²   s     c                 S   s   h | ]}t |d dƒ’qS ©r7   l   pLŠX r€   rT   r0   r0   r1   r‚   ³   s     c                 S   s   g | ]}t |d dƒ‘qS r‰   rƒ   r-   r0   r0   r1   r2   ´   s     i¤  iô  é    é)   é@   é   ic!  i'  )Zeven)ZoddéJ   é	  ég
  ))iÒÊ  r(   i	 )é+   r4   ém   )r�   r9   r�   )iˆŽi  ic ü)iÛ  r+   r�   )iS  r5   r�   )i²  r*   r�   )i=o  r?   i?‚  r’   é   é!   ih“1 i�  iF¸  é%   é<   éP   éy   é   éf   Úx)ZpositiverU   )ÚintegeriK  é€   i­  l   ±,"$. i…  é¿   é{   iÿÁ é1   iSW l   =ÁHcEi¶ìh éG   i«|% iA  iÁ[ ©Zrseedi_«] i   iU0l        i[àvc                   S   s   t ddddd�S )Nr9   r+   r�   r   r¢   ©r   r0   r0   r0   r1   r@     rA   c                   S   s   t ddddd�S )Néã   rw   r6   r   r¢   r£   r0   r0   r0   r1   r@     rA   i×  i´  ië  é·   i'ª	 i"U  iÕ iÐ	 iO("8i6&i'iÛê%l   ‡4¨M¢l   \^;l   CÔ&Ñl   ‚+q … l   ¿ù;, l   fIÛ	 l   ­8( i3“u&iÖb2#iïÝl   +m i�8±l   #LWYÉ
Ò1PúTª] iŽ©öéb   ióªá i¼  i   l   [+³c=F”^ÿ 9 é   l   I\ÿ“iD  l   ¯@{t{E l   vý
5 l   �L,â@l   nÛ-®{¡aÈníZ²
Ç.*/¢`Çy_{¾3¹KÚC\Zì/cSIk¦7l<l   I]M±*¨ ‘u2û,-
rMFy:¤×T� C;@[¿	»p;,Uó i@â l   ,ÊTƒi:< )§V«øEðaÄRgiÍQ|/wC~V6�eÝP¥jãù6à]Um )i“  iÈ  iG  i¯  i�  éU   é}   i@  i'  ig  i§  iç  i'  éx   é¯   iô  é   é    éÈ   i,  iÍ  i¯  i † iß%q l   ¹XÒk;Hœ]) l   ½K+\€1 l   Û'áf¾fí éA   i  éù   iàÔ iG_ i7µ i ioj i·É
 i§ iï~ ißÔ i3�  iOv  é/   ia	  i  iO  é#   i7  i	  iC i­S i5² i£Þ i+= éí  i¹  c                      s   t ˆ ˆ  dƒS ©Nr³   ©r   r0   ©r›   r0   r1   r@   /  rA   c                      s   t ˆˆ  dƒS r´   rµ   r0   ©rU   r›   r0   r1   r@   0  rA   c                      s   t dˆ d  d dƒS )Ngš™™™™™¹?r(   r5   rE   rµ   r0   r¶   r0   r1   r@   1  rA   éÿÿÿÿc                   S   s   t dddƒS )Nr(   r3   r¸   )r#   r0   r0   r0   r1   r@   5  rA   l   ÿÇNÎZoiÍ[l     ÈNÎZol    J)£l   É*(	 l   ,[> )-r   ÚAssertionErrorÚranger%   Ú
ValueErrorr	   r   Úlistr   ÚminrS   r   r   r   r   r
   r   r   ZOner   r   r   r�   ÚappendÚsortedÚnextÚtypeÚintr$   r   r   r   Ú
isinstancer   r   r   r   r   r    r!   r   r   r   r   r#   )ÚpZliÚgÚeZli_powerZ	li_power2ÚdÚitÚvr/   ÚnZansÚbÚkÚpredÚqÚrZans2Úargsr0   r·   r1   Útest_residue   sd   ÿ:**""*ÿ
 (ÿ

"""(        ÿ         ÿ         ÿ 2
2
2
&& .$,
þþ
"&"4ÿ"ÿ
6,,2 4  ÿ(0rÑ   c                  C   sü   ddgd  } }}t d| d ƒD ]&}|| | d 9 }|| }| |¡ q d}t |ƒD ]<}td| ƒtddƒ }}t| |d|ƒ|| d|  ksTt‚qTtt d|  ¡ƒ}d}	t |	ƒD ]F}td| ƒt|ƒtddƒ  }}
}t| ||
|ƒ|| |
|  ks°t‚q°d S )Nrˆ   r3   rE   r   rV   r(   r<   )	rº   r¾   r&   r"   r¹   r¼   r   r   r'   )rÊ   Z	binomialsZbinomialrU   Ztrials_2Ú_ÚmÚpowerZprimesZtrialsÚprimer0   r0   r1   Útest_binomial_p_pow<  s    $ rÖ   c               	   C   sz   ddl m}  | ƒ � tdƒdks$t‚W 5 Q R X | ƒ � tddƒdksHt‚W 5 Q R X | ƒ � tddƒdkslt‚W 5 Q R X d S )Nr   ©Úwarns_deprecated_sympyr4   r¸   r(   )Úsympy.testing.pytestrØ   r   r¹   r   r   r×   r0   r0   r1   Ú*test_deprecated_ntheory_symbolic_functionsQ  s    rÚ   N)3Úcollectionsr   Zsympy.core.containersr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Z%sympy.functions.combinatorial.numbersr   Zsympy.ntheoryr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsympy.ntheory.residue_ntheoryr   r   r   r   r   r   r   r    r!   r"   r#   Zsympy.polys.domainsr$   rÙ   r%   Zsympy.core.randomr&   r'   rÑ   rÖ   rÚ   r0   r0   r0   r1   Ú<module>   s   L4  )