o
    *ήcT2                     @   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
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)Tuple)S)DummySymbol)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 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sJ tddD ]G} tt}t| D ] |t d|    q	td| D ]' t | }t | d#}|r<t|}|  |ks:J q|  rCJ qqtd>d+d#g d?ksTJ td>d@d#g dAksaJ td>dBd#g dCksnJ td@d@d#g dDks{J 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sSJ qDtttd>d+tu scJ tttd>d+tttdu svJ 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 sJ 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 s,J tdddRdu s7J tdddPdu sBJ td@ddSdu sMJ tdBd	dTd#u sXJ tdBddUdu scJ tdVddWd#u snJ tdXddYd#u syJ 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sJ 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s'J ttd#drdddks5J tddndsdtgksAJ tduddvdwksLJ dxD ]\}}} t||| }t||| |ksdJ qNtdddyd u sqJ tdd	djd#d*dzgksJ 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#}	|| r1|| |	ks/J q|	g ks8J qqqtd	ddksHJ tdLdldksRJ td;ddks\J td)dd)ksfJ td>dd)kspJ 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sJ tdd)ksJ ttdd  tdd#d#d#d} tdd#dtdd#d t| dks*J tt fdd tt fdd t!ddddksGJ t!ddddksRJ t!ddd@ dd@ks_J t!ddd ddkslJ t"ddddkswJ 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sJ t$ddd ddksJ t$ddd ddksJ t%dddd>ksJ t%ddddks&J t%ddd ddks3J t%ddd ddks@J d}
t%|
 dksKJ t%t&|
  dksVJ t'ddddÃg dĢksdJ t'ddd	dLdd5gksrJ t'ddddȃg ks~J 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	s(J t(d  d dddgk	s:J t(dd  d  d5 dd)dgk	sPJ t(d d dd	gk	s_J t(d׈d  d  d dكddgk	suJ 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'   G/tmp/pip-target-vg8gfxp4/lib/python/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   0       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'  )even)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positive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[ 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   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rqvresargsr'   r   r(   test_residue   s  ,


	 2
2
2
&& 
4
2$,, 8 *r   N)&collectionsr   sympy.core.containersr   sympy.core.singletonr   sympy.core.symbolr   r   sympy.ntheoryr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   sympy.ntheory.residue_ntheoryr   r   r   r   r   sympy.polys.domainsr   sympy.testing.pytestr   r   r'   r'   r'   r(   <module>   s    L