U
    L?h@                     @   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stttdd  tdddksttdddksttdddksttddtddkst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rtt| | ksvn tqvqtdd
kst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sttd"dkstt td"dd"td"kstdd d } t| dkstt t| d| t| kst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rtd#dd ksttd$d krtd$dd kstttd%d  tdddksttddd&kst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sttdd,dksttd-d.d&kstd/d tdD ddddddd0dgkst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stttd	ddgksttdddksttdd5dksttd	d6dkst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&}|rt|}|  |kstn|  rztqzq>td0d,d&dd	dd$d<d=gkst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sttd>dYd&d0dMdNdSdTdXdZd[d\d]d^d_d`dadbdcdddegkst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stqd}
dud|
  d|
  dvd|
d   d|
d    }	} t|	| }tdD ]  tt|d| |	k	sLt	qLtttd0d,tk	sttttd0d,tttdk	sttttddtttdk	sttddd
	sttddddk	st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
sttd<dd4d&k
sttddd4dk
sttd
dd4d&k
sttdddwdk
sttdddxd&k
st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sttd|dd}d&ksttd~d	dd&ksttdd0dd&kstdd tdD dd tdD kstdd tdD dd tdD ks(tdd tdD dd D sNtdd tdD dd D stttdddsttd0ddIsttdddsttdddsttdddsttddd
rttdddst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rt| D ] }t||
| |	|  ksttqttddD ]}t|	|
| |g kstqnt| D ],}t||
| |	|  k}|||kA rtqt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dddJkstt!dddd#kstdD ].\}	}} t!|	|| }t||| |	kstqt!dddd kstt!dd
dId&ddgkstt!d0ddId&dd0d$d<d,dgks(tt!dddd ks>tt!d|dd}d&ddgksZtt!dddd&dgksttt!dddd&ddd4d?dxdddtddNg
kstt!ddd,d&d
dgkstt!dddd&ddgkstt!dddd&g kst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stn||kstqqqt"dd&dt"dd&d t#ddddkstt#ddddHkstt#ddd> dd>kstt#ddd ddks"tt$ddddks8tt$ddd
dksNtt$ddd ddkshtt$ddd ddkstt%dddddd	kstt%ddddddkstt%ddddddxkstt%ddd\ dddd\kstttdd  ttdd  t&ddddƃdks"tt&ddddʃdks:tt&dddd΃dksRtt&dddd҃dksjtt&dddd׃dkstt'dddd0kstt'ddddkstt'ddd ddkstt'ddd ddkstt(dddd0kstt(dddd@kstt(ddd ddks(tt(ddd ddksBtt(ddddksXtt(ddddksntd}t(| dkstt(t)|  dkstt*dddddddddgkstt*dd	d
dudd4gkstt*ddddg kstt*d$ddddgks
tt*dd$ddddgks&tt*dddddRd gksDtt*ddddddgksjtt*dddMdddZgkstt*d
ddddgkstt*dddddgkstt*ddd4dddgkst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stt+dd  d  d4 dddgkstt+d d dd
gkstt+dd  d  dM dddZgks tt+d d d,d
dgks@tt+dd  d	d   d  d dddddgkstt+d d0 dIdd0d$d<d,dgkstt+d	 dd
   d d d!gkst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,dddYdkstt,d'd(ddkstt,d)d*d+d,kstd S (-  N         c                 S   s   g | ]}t |d qS )   r   .0a r0   R/var/www/html/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    4dC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)aR   ,      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 io  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   pLX 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oddJ   	  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      !   ih1 i  iF  %   <   P   y      f   x)ZpositiverU   )integeriK     i  l   ,"$. i     {   i 1   iSW l   =HcEih 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   4Ml   \^;l   C&l   +q  l   ;, l   fI	 l   8( i3u&ib2#il   +m i8l   #LWY
1PT] ib   i i  i   l   [+c=F^ 9    l   I\iD  l   @{t{E l   v
5 l   L,@l   n-{anZ
.*/`y_{3KC\Z/cSIk7l<l   I]M* u2,-
rMFy:T C;@[	p;,U i@ l   ,Ti:< )VEaRgiQ|/wC~V6ePj6]Um )i  i  iG  i  i  U   }   i@  i'  ig  i  i  i'  x      i           i,  i  i  i i%q l   Xk;H]) l   K+\1 l   'ff A   i     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   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   NZoi[l     NZ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stqd 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  )