
    RieT2                         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	 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            	       +   t          dd          dk    sJ 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    sJ t          dddz  dz   dz            dk    sJ t          t          d            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    sJ t          t          d            t          dd          D ]M} t          |           }t          t          |                    t          t          |                     k    sJ Nt          d          dk    sJ t          d          dk    sJ t          d          dk    sJ t          d          dk    sJ t          d          dk    sJ ddz  dz   } t          |           dk    sJ t          d| z            dk    sJ t          | dz            dk    sJ t          t          d             t          dd          du sJ t          dd          d!u sJ 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          cxk    rd!u sn J t          dd(          d!u sJ t          dd)          du sJ t          d*d+          d!u sJ d, t          d          D             g d-k    sJ t          t          d.            t          t          d/            t          t          j                  d'gk    sJ t          d          d'gk    sJ t          d          g d0k    sJ t          d          g d1k    sJ d2 t          dd3          D             g d4k    sJ t          t          dd                    d'gk    sJ t!          dd          d(k    sJ t!          dd5          d(k    sJ t!          dd6          dk    sJ t!          d7d8          d7k    sJ t!          d9d          d k    sJ t!          d:d;          d k    sJ t          dd          D ]} t#          t                    }t          |           D ],|t%          d|                                                   -t          d|           D ]Mt          |           }t!          | d!          }|rt)          |          }|         |k    sJ C|         rJ Nt!          d<d)d!          g d=k    sJ t!          d<d>d!          g d?k    sJ t!          d<d@d!          g dAk    sJ t!          d>d>d!          g dBk    sJ t!          d>d@d!          g dCk    sJ t!          d>dDd!          g dEk    sJ t!          d>dFd!          g dGk    sJ dHD ]*\  }} t%          t!          ||           d|           |k    sJ +dI}dJd|z  z  d|z  z  dKd|dz   z  z  d|dz   z  z  } }t          ||           }t          d          D ]&t%          t+          |          d|           |k    sJ 'dJd|z  z  d|z  z  dKd|dz   z  z  d|dz   z  z  } }t          ||           }t          d          D ]&t%          t+          |          d|           |k    sJ 'd}dJd|z  z  d|z  z  dKd|dz   z  z  d|dz   z  z  } }t          ||           }t          d          D ]&t%          t+          |          d|           |k    sJ 't-          t+          t          d<d)                              t.          u sJ t-          t+          t          d<d)t0                                        t-          t1          d                    u sJ t-          t+          t          ddt0                                        t-          t1          d                    u sJ t3          ddd          sJ t3          dd'd          du sJ t3          dd'd          d!u sJ t3          dd'd          d!u sJ t3          d'dd          d!u sJ t3          ddd          d!u sJ t3          ddd<          du sJ t3          dddL          d!u sJ t3          dMdd3          d!u sJ t3          ddd3          du sJ t3          ddd3          d!u sJ t3          dddN          du sJ t3          dddO          d!u sJ t3          dddP          du sJ t3          dddP          d!u sJ t3          dddP          du sJ t3          dddN          du sJ t3          d>ddQ          du sJ t3          d@ddR          d!u sJ t3          d@ddS          du sJ t3          dTddU          d!u sJ t3          dVddW          d!u sJ t3          dXd<dY          d!u sJ dZ t          d[          D             d\ t          d[          D             k    sJ d] t          d^          D             d_ t          d^          D             k    sJ d` t          da          D             db D             sJ dc t          da          D             dd D             sJ t3          deddf          sJ t3          d<ddg          sJ t3          dhddi          sJ t3          d(ddj          sJ t3          dkd(di          sJ t3          ddd          rJ t3          dlddm          sJ t3          t5          d!n          dz   dd          d!k    sJ t7          t5          d!o          dd          dk    sJ t7          ddkdp          dqgk    sJ t7          drdds          dtk    sJ duD ].\  }}} t7          |||           }t%          |||           |k    sJ /t7          dddv          J t7          d
ddgd!          d(dwgk    sJ t7          d<d
dgd!          g dxk    sJ t7          d(ddy          g k    sJ t7          dTddUd!          dzd{gk    sJ t7          d'dd|d!          d'gk    sJ t7          d'ddd!          g d}k    sJ t7          d(d(d)d!          ddwgk    sJ t7          d(d(d~d!          ddgk    sJ t7          dddd!          g k    sJ t          dd          D ]} t          d| d(          }|D ]}t#          t                    }t          |           D ],|t%          ||                                                   -t          d| dz
            D ]3}t7          ||| d!          }	||         r||         |	k    sJ +|	g k    sJ 4t9          dd          dk    sJ t9          dJdi          dk    sJ t9          d9d          dk    sJ t9          d'd          d'k    sJ t9          d<d          d'k    sJ t          t          d            t;          dJdi          dk    sJ t;          dd          dk    sJ t;          dd<          d'k    sJ t;          dd          dk    sJ t;          dd          dk    sJ t;          dd<          dk    sJ t;          d'd          d'k    sJ t;          d'd          dk    sJ t;          dd          dk    sJ t;          dd          dk    sJ t          t          d            t=          d          dk    sJ t=          d          dk    sJ t=          d          dk    sJ t=          d          d'k    sJ t          t          d            t?          dd!d!d!          } t?          dd!          t?          dd!          t=          |           dk    sJ t          t@          fd           t          t          fd           tC          ddd          dk    sJ tC          ddd          dk    sJ tC          ddd>z  d          d>k    sJ tC          dddz  d          dk    sJ tE          ddd          dk    sJ tE          ddd          dk    sJ tE          dddz  d          dk    sJ tE          dddz  d          dk    sJ tG          ddjdd'          dk    sJ tG          dddd'          dk    sJ tG          dddd'          dOk    sJ tG          dddz  dd'          dk    sJ t          t          d            t          t          d            tI          ddd          d<k    sJ tI          ddd          dkk    sJ tI          dddz  d          dk    sJ tI          dddz  d          dk    sJ tK          ddd          d<k    sJ tK          ddd          dk    sJ tK          dddz  d          dk    sJ tK          dddz  d          dk    sJ d}
tK          |
 dk    sJ tK          tM          |
  dk    sJ tO          dddd          g dk    sJ tO          ddddJ          dd3gk    sJ tO          ddddŦ          g k    sJ tO          dddd          dgk    sJ tO          dddd          ddgk    sJ tO          dddd˦          ddgk    sJ tO          ddddѦ          ddgk    sJ tO          dd~dd֦          ddgk    sJ tO          dddd          d'gk    sJ tO          dd	dd          dgk    sJ tO          ddd3d          d'dgk    sJ tQ          ddz  z  dd(z  z  z   ddz  z  z   dz  z   z   dz   d٦          g dڢk    sJ tQ          dz  ddz  z  z
  dz  z   dz
  dۦ          dgk    sJ tQ          dz  z   dz   dަ          ddgk    sJ tQ          ddz  z  dz  z   d3z   d          d'dgk    sJ tQ          dz  dz   d
          dgk    sJ tQ          dԉdz  z  d~z  z   dz   d֦          ddgk    sJ tQ          d(z  d(z
  d)          ddwgk    sJ tQ          ddz  z  ddz  z  z
  dz  z
  dz   d          g dk    sJ tQ          d
z  d<z
  dg          g dxk    sJ tQ          dz  ddz  z  z
  dz
  d          dgk    sJ t          t          fd           t          t          fd           t          t          fd           d S )N         c                 .    g | ]}t          |d           S )   r   .0as     @lib/python3.11/site-packages/sympy/ntheory/tests/test_residue.py
<listcomp>z test_residue.<locals>.<listcomp>   s     ///aGAqMM///       r%   )r-         r.   r/   r!               r/   e   w   
   2      l   zX    4dCx ^y2V?WY|gOs&YR5I c                  "    t          dd          S )Nr/   	   r&    r,   r*   <lambda>ztest_residue.<locals>.<lambda>   s    wq!}} r,   Fr.            c                  "    t          dd          S )Nr.   r/   )r	   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>    s    0A66 r,   d   a   i$  i'  i)aR   c                       t          d          S N)r   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>0   s    ~b11 r,   TiL0              r         l    $O l    $U c                 2    g | ]}t          |d           |S )r>   r
   )r(   js     r*   r+   z test_residue.<locals>.<listcomp><   s'    ;;;!OAr$:$:;A;;;r,   )r   r-   r!   rK   r%   r=   r:   r3   c                  "    t          dd          S )Ng?r!   rN   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>>   s    sA66 r,   c                  "    t          dd          S )Nr!   r   rN   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>?       q!44 r,   )r   r-   rK   r:   )r   r-   r.   rK   r:   r6   r#   c                 F    g | ]}t          t          |                    S r;   )lenr   r(   is     r*   r+   z test_residue.<locals>.<listcomp>E   s)    ===1C"1%%&&===r,      )r-   r!   r!   r!   r.   rK   rK   r.   rK   r/   r/   rK   r%   r=   r/   rK   r:   r=   r6   i   iY  i  C   i  i r:   )r.   r/   r#            Q   )r.   r\      3   9   N      )r.   ra   T            )	r   r:      rL   $   -   6   ?   H   )r:   rg   rh   ri   rk   rl   Z   c   u   ~                  rI         i  )r:   rl   rm   rr   rs   rw      i;  M  i  i      i.  i@  i  i      )r:   rw   rx   rz   r{   r|   i  i  i  i  i  i  i  i  i  i  i  i  ))  l     @B )r~   l      ! )i   i   )l   )1mQ l   K'R )l    )bm.Ql    ,zhF      i	=  r^   r[   0   (   r\   i  i  i i  iVU io  i  i(j ij  c                 0    h | ]}t          |d d          S 8      powrU   s     r*   	<setcomp>ztest_residue.<locals>.<setcomp>   s$    ///aQD		///r,   r   c                 4    h | ]}t          |d d          |S r   r   r'   s     r*   r   ztest_residue.<locals>.<setcomp>   s*    EEE!&72t&D&DEAEEEr,   c                 0    h | ]}t          |d d          S       r   rU   s     r*   r   ztest_residue.<locals>.<setcomp>   s$    111#ad

111r,   r   c                 4    h | ]}t          |d d          |S r   r   r'   s     r*   r   ztest_residue.<locals>.<setcomp>   s*    FFF!&73&E&EFAFFFr,   c                 0    h | ]}t          |d d          S r3   i r   rU   s     r*   r   ztest_residue.<locals>.<setcomp>   s$    222#aV

222r,   i  c                 0    g | ]}t          |d d          S r   r   r'   s     r*   r+   z test_residue.<locals>.<listcomp>   s%    999!q"f--999r,   c                 0    h | ]}t          |d d          S r1   l   pLX r   rU   s     r*   r   ztest_residue.<locals>.<setcomp>   s$    777a#a[
!
!777r,   c                 0    g | ]}t          |d d          S r   r   r'   s     r*   r+   z test_residue.<locals>.<listcomp>   s%    >>>qq"k22>>>r,   i  i  rh       )   @      ic!  i'  )even)oddJ   ri   	  g
  ,   ))i  r!   i	 )+   r.   m   )r   r3   r   )ii  ic)i  r%   r   )iS  r/   r   )i  r#   r   )i=o  r:   i?  r      )r.   r:   rZ   r[   rL   !   ih1 i  iF  %   )
r   r6   rW   r^   r   r7   <   r   P   rm   y      f   c                  "    t          dd          S )Nr!   rK   )r   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>   rR   r,   iS   *   c                  "    t          dd          S )Nr.   r=   )r   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>   s    }Q22 r,   [   i     c                       t          d          S rE   r   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>   s    vbzz r,   p)integerpositiveprimex)r   rV   )r   c                  "    t                     S Nr   r   s   r*   r<   ztest_residue.<locals>.<lambda>   s    fQii r,   c                  "    t                     S r   r   )rV   s   r*   r<   ztest_residue.<locals>.<lambda>   s    vayy r,   iK     i  l   ,"$. rg   i     {   i 1   iSW l   =HcEih G   i|% iA  i[ rseedi_] i   iU0l        i[vry   c                  (    t          dddd          S )Nr3   r%   r   r   r   r   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>   s    8Q!LLL r,   c                  (    t          dddd          S )N   r}   r0   r   r   r   r;   r,   r*   r<   ztest_residue.<locals>.<lambda>   s    8dAQOOO r,   il   +m i8l   #LWY
1PT] ib   i i  i   l   [+c=F^ 9 r_      l   I\iD  )i  i  iG  i  i  U   }   i@  )i'  ig  i  i  i'  x   r      i  rZ            i,  i  rq   i  i i@ i%q l   Xk;H]) l   K+\1 l   'ff A   rl   i     rx   i )iG_ i7 i ioj i
 i i~ i i3  iOv  /   ia	  i  iO  #   i7  i	  iC )iS i5 i i+=   i  c                  *    t            z  d          S Nr   r   r   s   r*   r<   ztest_residue.<locals>.<lambda>      4QT4@@ r,   c                  *    t           z  d          S r   r   )rV   r   s   r*   r<   ztest_residue.<locals>.<lambda>  r   r,   c                  6    t          d dz  z  dz   d          S )Ng?r!   r/   rA   r   r   s   r*   r<   ztest_residue.<locals>.<lambda>  s    4SAX\3GG r,   ))r   ranger   
ValueErrorr	   r   r   rT   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argsrV   r   s              @@r*   test_residuer      s   1b>>R//5A;;///   1b>>R2r??gann,,,,3!!!!2Bq())  .S  S  S  S  S
:,,---Q""e++++Q""e++++R$$----R$$(9"b(A(AAAAA
:667773 4 4'**488}}

 3 333333"""""%  A%%%%%  A%%%% (##r))))"""""
BA!""""!A#"$$$$!Q$2%%%%
:112221a  E))))2r""d****5#&&/+s*K*KKKKK3$$,,,,1a  D((((1a  D((((1a  OAq$9$9AAAATAAAAAA1a  D((((1b!!U****;44<<<<;;uRyy;;;$$$% % % %
:66777
:44555ae$$++++a  QC''''b!!\\\1111b!!%<%<%<<<<<==a===@@@A A A A a##$$++++Ar??aAsq    Ar??b    C$$$$B$$$$D&!!T))))1c]]    q 	& 	&Ac!QllO""1%%%%q! 	  	 Aq!$$BAt$$A  1IItqyyyyyQ4	  Ar4  $:$:$:::::Ar4  $;$;$;;;;;AtT""&@&@&@@@@@Bd##'I'I'IIIIIBd## (9 (9 (9 9 9 9 9Bd## (> (> (> > > > >Bd## (G (G (G G G G G. . .1 8Aq>>1a((A-----
A19QT>4AaC=QqS1qA	q!		B2YY ( (488Q""a'''''19QT>4AaC=QqS1qA	q!		B1XX ( (488Q""a'''''A19QT>4AaC=QqS1qA	q!		B1XX ( (488Q""a''''']1b))**++s2222]1b"--..//41;;>>>>]1a,,--..$r!uu++====Q1%%%%% Q1%%....Q1%%----Q1%%----Q1%%----Q1%%----Q1%%....Q2&&$....RR((D0000QB''50000QB''4////QB''50000QB''4////QB''50000QB''4////QB''50000QB''50000RC((E1111S!T**d2222S!W--6666UAu--5555UAt,,4444UAu--5555//5;;///AEEuT{{EEEJJJJ11U4[[111AFFuT{{FFF!KKKK22eDkk222A99q999999775;;777A>>A>>>>>>S!T*****QB'''''RR(((((Q2&&&&&RB''''' Aq)))))T2u-----U---11a88D@@@@u1--2222r2r""rd****tR&&",,,,/ ! !1a 1a  1a||q     r1c""***r1b$''Ar72222q"b$''+A+A+AAAAAq!W%%++++ua--%????q"b$''A3....q!S$''+R+R+RRRRRq!R&&1b'1111q!S$''B94444q!Q%%++++1c]] % %1a^^ 		% 		%AD!!A1XX * *#aA,,&&q))))1a!e__ % %!!Q400Q4 %Q43;;;;;"99999%			% 1b!!Q&&&&2r""a''''2s##r))))1b!!Q&&&&1a  A%%%%
:44555R  A%%%%b!!R''''A!####R  B&&&&A"$$$$A!####A!####A!####A!####A!####
:22333$<<1!99>>>>&>>R%==A
:))***sD4t<<<AsT"""AsD!!!A!99????
9''''(((
:(((()))"3a00A5555"3q11R7777"32q11R7777"3C44;;;;%fdA66!;;;;%feQ772====%gq"ua88B>>>>%gq#vq99S@@@@$WdAQ???1DDDD$WeQa@@@BFFFF$XuaqAAARGGGG$Xq#vqBBBcIIII
:LLMMM
:OOPPP'%<<AAAA'&"==CCCC'"b&"==CCCC'"c'2>>#EEEET1%%******b0000"c'2..#5555afa00C7777D#%%%%&#----Rd337R7R7RRRRR1a,,B7777Rc22b8888B1--!44442q"--"b9999S#s33SzAAAA9MNNSgi}R~~~~~CS11c3Z????2r1--!4444BA..1#5555BA..1a&8888 1a4"QT'!1AadF!:QT!AA!E!I SSST T T T !A1a4"Q$!6!;UCCwNNNN AB55#tDDDD AqD2a4"!4a88QFBBBB A2..1#5555 AqD3q52!5s;;SzIIII A2..1b'9999 AqD1QT6!1CE!9D!@&II N  N  N          BB//3I3I3IIIII A!Q$!3T::tfDDDD
:@@@@AAA
:@@@@@AAA
:GGGGHHHHHr,   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*   <module>r      s   # # # # # # ' ' ' ' ' ' " " " " " " - - - - - - - -                                     
< < < < < < < < < < < < < < # " " " " " ' ' ' ' ' 'LI LI LI LI LIr,   