o
    8Va82                     @   s   d dl mZ d dl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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 d dlm Z  d dl!m"Z" dd Z#d	S )
    )defaultdict)SSymbolTupleDummy)n_orderis_primitive_rootis_quad_residuelegendre_symboljacobi_symboltotient
primerangesqrt_modprimitive_rootquadratic_residuesis_nthpow_residuenthroot_modsqrt_mod_itermobiusdiscrete_logquadratic_congruencepolynomial_congruence)_primitive_root_prime_iter_discrete_log_trial_mul_discrete_log_shanks_steps_discrete_log_pollard_rho_discrete_log_pohlig_hellman)ZZ)raisesc                     s  t dddks	J dd tddD g dksJ t d	d
dks"J t d
dt ddks.J t dddks7J t ddd d d dksFJ ttdd  tdddu sVJ tdddu s_J tdddu shJ tdd
tdd
kstJ ttdd  tddD ]} t| }tt|t	t	| ksJ qt
dd	ksJ t
dd	ksJ t
dd	ksJ t
d dksJ t
d!dksJ dd d } t
| dksJ t
d|  dksJ t
| d dksJ ttd"d  tdddu sJ tddd#u sJ td$d%td&d%ksJ td'd(d#u sJ td)dd#u sJ tddd#u s#J td)dtdd  kr6d#u s9J  J tdd*d#u sCJ tdd+du sMJ td,d-d#u sWJ d.d tdD g d/ksgJ ttd0d  ttd1d  ttjd)gksJ tdd)gksJ tdg d2ksJ tdg d2ksJ tdg d3ksJ d4d tdd5D g d6ksJ ttddd)gksJ tddd*ksJ tdd7d*ksJ tdd8dksJ td9d:d9ksJ td;dd ksJ td<d=d ksJ tddD ]G} tt}t| D ] |t d|    qtd| D ]' t | }t | d#}|rGt|}|  |ksEJ q(|  rNJ q(q
td>d+d#g d?ks_J td>d@d#g dAkslJ td>dBd#g dCksyJ td@d@d#g dDksJ td@dBd#g dEksJ td@dFd#g dGksJ td@dHd#g dIksJ dJD ]\}} tt|| d| |ksJ qdK}dLd|  d|  dMd|d   d|d   }} t|| }tdD ] tt|d| |ksJ qdLd|  d|  dMd|d   d|d   }} t|| }tdD ] tt|d| |ks)J qd}dLd|  d|  dMd|d   d|d   }} t|| }tdD ] tt|d| |ks^J qOtttd>d+tu snJ tttd>d+tttdu sJ tttddtttdu sJ tddd	sJ tdd)ddu sJ tdd)dd#u sJ tdd)dd#u sJ td)ddd#u sJ tdddd#u sJ tddd>du sJ tdd	dNd#u sJ tdOdd5d#u sJ tddd5du s J td	dd5d#u sJ tdddPdu sJ tdddQd#u s!J tdddRdu s,J tdddRd#u s7J tdddRdu sBJ tdddPdu sMJ td@ddSdu sXJ tdBd	dTd#u scJ tdBddUdu snJ tdVddWd#u syJ tdXddYd#u sJ tdZd>d[d#u sJ d\d] td^D d_d] td^D ksJ d`d] tdaD dbd] tdaD ksJ dcd] tddD ded D sJ dfd] tddD dgd D sJ tdhddisJ td>ddjsJ tdkddlsJ td*ddmsJ tdnd*dlsJ tddd	rJ tdoddps"J ttd#dqd ddd#ks2J ttd#drdddks@J tddndsdtgksLJ tduddvdwksWJ dxD ]\}}} t||| }t||| |ksoJ qYtdddyd u s|J tdd	djd#d*dzgksJ td>ddjd#g d{ksJ td*dd|g ksJ tdVddWd#d}d~gksJ td)ddd#d)gksJ td)ddd#g dksJ td*d*d+d#d	dzgksJ td*d*dd#ddgksJ tdddd#g ksJ td	dD ]O} td| d*}|D ]C}tt}t| D ] |t ||    qtd| d D ]!}t||| d#}	|| r<|| |	ks:J q#|	g ksCJ q#qqtd	ddksSJ tdLdldks]J td;ddksgJ td)dd)ksqJ td>dd)ks{J ttdd  tdLdldksJ tdddksJ tdd>d)ksJ tdddksJ tdd	dksJ tdd>dksJ td)dd)ksJ td)ddksJ tdddksJ tdddksJ ttdd  tddksJ tddksJ tddksJ tdd)ksJ ttdd  tdd#d#d#d} tdd#dtdd#d t| dks5J tt fdd tt fdd t!ddddksRJ t!ddddks]J t!ddd@ dd@ksjJ t!ddd ddkswJ t"ddddksJ t"ddd	dksJ t"ddd ddksJ t"ddd ddksJ t#ddmdd)ddksJ t#dddd)ddksJ t#dddd)ddQksJ t#ddd dd)ddksJ ttdd  ttdd  t$dddd>ksJ t$ddddnksJ t$ddd ddksJ t$ddd ddksJ t%dddd>ks&J t%ddddks1J t%ddd ddks>J t%ddd ddksKJ d}
t%|
 dksVJ t%t&|
  dksaJ t'ddddÃg dĢksoJ t'ddd	dLdd5gks}J t'ddddȃg ksJ t'dddddgksJ t'ddddddgksJ t'dddd΃ddgksJ t'ddddԃddgksJ t'ddddكddgksJ t'd	dddd)gksJ t'dd
dddgksJ t'ddd5dd)dgksJ t(dd	  dd*   d	d   d   d d܃g dݢk	sJ t(d dd   d  d! dރdgk	s3J t(d  d dddgk	sEJ t(dd  d  d5 dd)dgk	s[J t(d d dd	gk	sjJ t(d׈d  d  d dكddgk	sJ t(d* d* d+d	dzgk	sJ t(dd  dd   d  d dg dk	sJ t(d d> djg d{k	sJ t(d dd	   d ddgk	sJ ttfdd tt fdd ttfdd d S )N         c                 S   s   g | ]}t |d qS )   r   .0a r'   B/usr/lib/python3/dist-packages/sympy/ntheory/tests/test_residue.py
<listcomp>       z test_residue.<locals>.<listcomp>   r"   )r+         r,   r-   r               r-   e   w   
   2      l   zX    4dCx ^y2V?WY|gOs&YR5I c                   S   
   t ddS )Nr-   	   r#   r'   r'   r'   r(   <lambda>      
 ztest_residue.<locals>.<lambda>Fr,            c                   S   r7   )Nr,   r-   )r   r'   r'   r'   r(   r9      r:   d   a   i$  i'  i)aR   c                   S      t dS N)r   r'   r'   r'   r(   r9   .       TiL0              r         l    $O l    $U c                 S   s   g | ]	}t |d r|qS )r<   r	   )r%   jr'   r'   r(   r)   :   s    )r   r+   r   rI   r"   r;   r8   r1   c                   S   r7   )Ng?r   rK   r'   r'   r'   r(   r9   <   r:   c                   S   r7   )Nr   r   rK   r'   r'   r'   r(   r9   =   r:   )r   r+   rI   r8   )r   r+   r,   rI   r8   r4   r!   c                 S   s   g | ]}t t|qS r'   )lenr   r%   ir'   r'   r(   r)   E          )r+   r   r   r   r,   rI   rI   r,   rI   r-   r-   rI   r"   r;   r-   rI   r8   r;   r4   i   iY  i  C   i  i r8   )r,   r-   r!            Q   )r,   rV      3   9   N      )r,   r[   T            )	r   r8      rJ   $   -   6   ?   H   )r8   ra   rb   rc   re   rf   Z   c   u   ~                  rG         i  )r8   rf   rg   rl   rm   rq      i;  M  i  i      i.  i@  i  i      )r8   rq   rr   rt   ru   rv   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	=  rX   rU   0   (   rV   i  i  i i  iVU io  i  i(j ij  c                 S      h | ]}t |d dqS 8      powrN   r'   r'   r(   	<setcomp>   rP   ztest_residue.<locals>.<setcomp>r   c                 S      h | ]
}t |d dr|qS r~   r   r$   r'   r'   r(   r          c                 S   r}         r   rN   r'   r'   r(   r      rP   r   c                 S   r   r   r   r$   r'   r'   r(   r      r   c                 S   r}   r1   i r   rN   r'   r'   r(   r      rP   i  c                 S      g | ]}t |d dqS r   r   r$   r'   r'   r(   r)      rP   c                 S   r}   r/   l   pLX r   rN   r'   r'   r(   r      rP   c                 S   r   r   r   r$   r'   r'   r(   r)      rP   i  i  rb       )   @      ic!  i'  )Zeven)ZoddJ   rc   	  g
  ,   ))i  r   i	 )+   r,   m   )r   r1   r   )ii  ic)i  r"   r   )iS  r-   r   )i  r!   r   )i=o  r8   i?  r      )r,   r8   rT   rU   rJ   !   ih1 i  iF  %   )
r   r4   rQ   rX   r|   r5   <   ry   P   rg   y      f   c                   S   r7   )Nr   rI   )r
   r'   r'   r'   r(   r9      r:   iS   *   c                   S   r7   )Nr,   r;   )r   r'   r'   r'   r(   r9      r:   [   i     c                   S   rA   rB   r   r'   r'   r'   r(   r9      rD   p)integerpositiveZprimex)r   rO   )r   c                         t  S Nr   r'   r   r'   r(   r9      rD   c                      r   r   r   r'   )rO   r'   r(   r9      rD   iK     i  l   ,"$. ra   i     {   i 1   iSW l   =HcEih G   i|% iA  i[ Zrseedi_] i   iU0l        i[vrs   c                   S      t dddddS )Nr1   r"   r   r   r   r   r'   r'   r'   r(   r9          c                   S   r   )N   rw   r.   r   r   r   r'   r'   r'   r(   r9      r   il   +m i8l   #LWY
1PT] ib   i i  i   l   [+c=F^ 9 rY      l   I\iD  )i  i  iG  i  i  U   }   i@  )i'  ig  i  i  i'  x   r      i  rT            i,  i  rk   i  i i@ i%q l   Xk;H]) l   K+\1 l   'ff A   rf   i     rr   i )iG_ i7 i ioj i
 i i~ i i3  iOv  /   ia	  i  iO  #   i7  i	  iC )iS i5 i i+=   i  c                      s   t    dS Nr   r   r'   r   r'   r(   r9         c                      s   t   dS r   r   r'   rO   r   r'   r(   r9     r   c                      s   t d d  d dS )Ng?r   r-   r>   r   r'   r   r'   r(   r9     r*   ))r   ranger   
ValueErrorr   r   r   rM   listr   r   r	   r   r   ZOner   r   r   r   appendsortednexttypeintr   r   r   r   r
   r   r   r   	TypeErrorr   r   r   r   r   r   r   r   )r   itdvr&   nqrZqvresargsr'   r   r(   test_residue   s  ,


	 2
2
2
&& 
4
2$,, 8 *r   N)$collectionsr   Zsympyr   r   r   r   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   Zsympy.polys.domainsr   Zsympy.testing.pytestr   r   r'   r'   r'   r(   <module>   s    L