
    MZdT2                         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%y
)    )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            	      f$   t        dd      dk(  sJ t        dd      D  cg c]  } t        | d       c} 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 ]8  }t        |      }t        t        |            t        t        |            k(  r8J  t        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J  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 cg c]  }t        |d      s| c}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 d.k(  sJ t        d      g d/k(  sJ t        dd0      D cg c]  }t        t        |             c}g d1k(  sJ t        t        dd            d&gk(  sJ t!        dd      d'k(  sJ t!        dd2      d'k(  sJ t!        dd3      d
k(  sJ t!        d4d5      d4k(  sJ t!        d6d      d k(  sJ t!        d7d8      d k(  sJ t        dd      D ]  }t#        t              }t        |      D ]!  |t%        d|         j'                         # t        d|      D ]:  t        |      }t!        |d       }|rt)        |      }|   |k(  r2J |   s:J   t!        d9d(d       g d:k(  sJ t!        d9d;d       g d<k(  sJ t!        d9d=d       g d>k(  sJ t!        d;d;d       g d?k(  sJ t!        d;d=d       g d@k(  sJ t!        d;dAd       g dBk(  sJ t!        d;dCd       g dDk(  sJ dED ]!  \  } }t%        t!        | |      d|      | k(  r!J  dF}dGd|z  z  d|z  z  dHd|dz   z  z  d|dz   z  z  }} t        | |      }t        d      D ]  t%        t+        |      d|      | k(  rJ  dGd|z  z  d|z  z  dHd|dz   z  z  d|dz   z  z  }} t        | |      }t        d      D ]  t%        t+        |      d|      | k(  rJ  d}dGd|z  z  d|z  z  dHd|dz   z  z  d|dz   z  z  }} t        | |      }t        d      D ]  t%        t+        |      d|      | k(  rJ  t-        t+        t        d9d(                  t.        u sJ t-        t+        t        d9d(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d9      du sJ t3        dddI      d u sJ t3        dJd
d0      d u sJ t3        ddd0      du sJ t3        ddd0      d u sJ t3        dddK      du sJ t3        dddL      d u sJ t3        dddM      du sJ t3        dddM      d u sJ t3        dddM      du sJ t3        dddK      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        dQddR      d u sJ t3        dSddT      d u sJ t3        dUd9dV      d u sJ t        dW      D ch c]  }t%        |dXdW       c}t        dW      D  ch c]  } t3        | dXdW      s|  c} k(  sJ t        dY      D ch c]  }t%        |dZdY       c}t        dY      D  ch c]  } t3        | dZdY      s|  c} k(  sJ t        d[      D ch c]  }t%        |d
d\       c}D  cg c]  } t3        | d
d\       c} sJ t        d[      D ch c]  }t%        |dd]       c}D  cg c]  } t3        | dd]       c} sJ t3        d^dd_      sJ t3        d9dd`      sJ t3        daddb      sJ t3        d'ddc      sJ t3        ddd'db      sJ t3        ddd      rJ t3        deddf      sJ t3        t5        d g      dz   dd      d k(  sJ t7        t5        d h      dd      dk(  sJ t7        ddddi      djgk(  sJ t7        dkd
dl      dmk(  sJ dnD ]%  \  } }}t7        | ||      }	t%        |	||      | k(  r%J  t7        d
ddo      J t7        d	dd`d       d'dpgk(  sJ t7        d9d	d`d       g dqk(  sJ t7        d'ddr      g k(  sJ t7        dQddRd       dsdtgk(  sJ t7        d&ddud       d&gk(  sJ t7        d&ddd       g dvk(  sJ t7        d'd'd(d       ddpgk(  sJ t7        d'd'dwd       dxdygk(  sJ t7        dddd       g k(  sJ t        dd      D ]  }t        d|d'      }
|
D ]y  }t#        t              }t        |      D ]!  |t%        ||         j'                         # t        d|dz
        D ]'  } t7        | ||d       }||    r||    |k(  rJ |g k(  r'J  {  t9        dd
      dk(  sJ t9        dGdb      dk(  sJ t9        d6d      dzk(  sJ t9        d&d      d&k(  sJ t9        d9d      d&k(  sJ t        t        d{        t;        dGdb      dk(  sJ t;        d|d}      dzk(  sJ t;        dd9      d&k(  sJ t;        d~d      dzk(  sJ t;        dd      dzk(  sJ t;        dd9      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      dzk(  sJ t=        d      d&k(  sJ t        t        d        t?        dd d d       }t?        dd       t?        dd       t=        |      dzk(  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        ddxdz  dx      dk(  sJ tE        ddd      dk(  sJ tE        ddd      dxk(  sJ tE        dddz  d      dk(  sJ tE        dddz  d      dk(  sJ tG        ddcdd&      dk(  sJ tG        dddd&      dxk(  sJ tG        dddd&      dLk(  sJ tG        dddz  dd&      dk(  sJ t        t        d        t        t        d        tI        ddd
      d9k(  sJ tI        ddd
      ddk(  sJ tI        dd
dz  d
      dk(  sJ tI        dd
dz  d
      dk(  sJ tK        ddd      d9k(  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dG      dd0g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        ddwddϫ      ddgk(  sJ tO        dddd      d&gk(  sJ tO        dddxd      dgk(  sJ tO        ddd0d      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   d0z   d      d&dgk(  sJ tQ        dz  dz   d	      dgk(  sJ tQ        d͉dz  z  dwz  z   dz   dϫ      ddgk(  sJ tQ        d'z  d'z
  d(      ddpg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  d9z
  d`      g dq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       y c c} w c c}w c c}w c c}w c c} w c c}w c c} w c c}w c c} w c c}w c c} w )N               )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        B/usr/lib/python3/dist-packages/sympy/ntheory/tests/test_residue.py<lambda>ztest_residue.<locals>.<lambda>   s    wq!} r4   Fr&            c                      t        dd      S )Nr&   r'   )r	   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>    s    0A6 r4   d   a   i$  i'  i)aR   c                      t        d      S N)r   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>0   s    ~b1 r4   TiL0              r         l    $O l    $U )r   r$   r!   rE   r%   r7   r2   r+   c                      t        dd      S )Ng?r!   r
   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>>   s    sA6 r4   c                      t        dd      S )Nr!   r   rH   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>?       q!4 r4   )r   r$   rE   r2   )r   r$   r&   rE   r2   r.   r#      )r$   r!   r!   r!   r&   rE   rE   r&   rE   r'   r'   rE   r%   r7   r'   rE   r2   r7   r.   i   iY  i  C   i  i r2   )r&   r'   r#            Q   )r&   rP      3   9   N      )r&   rU   T            )	r   r2      rF   $   -   6   ?   H   )r2   r[   r\   r]   r_   r`   Z   c   u   ~                  rC         i  )r2   r`   ra   rf   rg   rk      i;  M  i  i      i.  i@  i  i      )r2   rk   rl   rn   ro   rp   i  i  i  i  i  i  i  i  i  i  i  i  ))  l     @B )rr   l      ! )i   i   )l   )1mQ l   K'R )l    )bm.Ql    ,zhF      i	=  rR   rO   0   (   rP   i  i  i i  iVU io  i  i(j ij  i   8   i      i  i l   pLX i  i  r\       )   @      ic!  i'  )even)oddJ   r]   	  g
  ,   ))i  r!   i	 )+   r&   m   )r   r+   r   )ii  ic)i  r%   r   )iS  r'   r   )i  r#   r   )i=o  r2   i?  r      )r&   r2   rN   rO   rF   !   ih1 i  iF  %   )
r   r.   rK   rR   rv   r/   <   rs   P   ra   y      f   c                      t        dd      S )Nr!   rE   )r   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>   rJ   r4   iS   *   c                      t        dd      S )Nr&   r7   )r   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>   s    }Q2 r4   [   i     c                      t        d      S r?   r   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>   s
    vbz r4   p)integerpositiveprimex)r   i)r   c                      t               S Nr   r   s   r5   r6   ztest_residue.<locals>.<lambda>   s    fQi r4   c                      t               S r   r   )r   s   r5   r6   ztest_residue.<locals>.<lambda>   s    vay r4   iK     i  l   ,"$. r[   i     {   i 1   iSW l   =HcEih G   i|% iA  i[ rseedi_] i   iU0l        i[vrm   c                       t        dddd      S )Nr+   r%   r|   r   r   r   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>   s    8Q!L r4   c                       t        dddd      S )N   rq   r(   r   r   r   r3   r4   r5   r6   ztest_residue.<locals>.<lambda>   s    8dAQO r4   il   +m i8l   #LWY
1PT] ib   i i  i   l   [+c=F^ 9 rS      l   I\iD  )i  i  iG  i  i  U   }   i@  )i'  ig  i  i  i'  x   r      i  rN            i,  i  re   i  i i@ i%q l   Xk;H]) l   K+\1 l   'ff A   r`   i     rl   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   r5   r6   ztest_residue.<locals>.<lambda>      4QT4@ r4   c                  "    t         z  d      S r   r   )r   r   s   r5   r6   ztest_residue.<locals>.<lambda>  r   r4   c                  .    t        d dz  z  dz   d      S )Ng?r!   r'   r;   r   r   s   r5   r6   ztest_residue.<locals>.<lambda>  s    4SAX\3G r4   ))r   ranger   
ValueErrorr	   r   r   lenlistr   r   r
   r   r   Oner   r   r   powappendsortednexttypeintr   r   r   r   r   r   r   r   	TypeErrorr   r   r   r   r   r   r   r   )ar   itjr   dvnqrqvresargsr   s       `        @r5   test_residuer      sT   1b>R#(A;/aGAqM/  1b>R2r?gan,,,3!!!2Bq()  .S  S  S  S
:,-Q"e+++Q"e+++R$---R$(9"b(AAAA
:673 4'*48}
 33334 """"% A%%%% A%%% (#r)))""""
BA!"""!A#"$$$!Q$2%%%
:121a E)))2r"d***5#&/+s*KKKK3$,,,1a D(((1a D(((1a OAq$9ATAAAAA1a D(((1b!U***;4<<<Ry;!OAr$:A;$% % %
:67
:45aee$+++a QC'''b!\111b!%<<<<05a=1C"1%&=@A A A a#$+++Ar?aAsq   Ar?b   C$$$B$$$D&!T)))1c]  q 	&Ac!QlO""1%	&q! 	 Aq!$BAt$A1Itqy yQ4x	 	  Ar4 $::::Ar4 $;;;;AtT"&@@@@Bd#'IIIIBd# (9 9 9 9Bd# (> > > >Bd# (G G G G. .1 8Aq>1a(A---.
 	A19QT>4AaC=QqS1qA	q!	B2Y (48Q"a'''(19QT>4AaC=QqS1qA	q!	B1X (48Q"a'''(A19QT>4AaC=QqS1qA	q!	B1X (48Q"a'''( ]1b)*+s222]1b"-./41;>>>]1a,-.$r!u+===Q1%%% Q1%...Q1%---Q1%---Q1%---Q1%---Q1%...Q2&$...RR(D000QB'5000QB'4///QB'5000QB'4///QB'5000QB'4///QB'5000QB'5000RC(E111S!T*d222S!W-666UAu-555UAt,444UAu-555#(;/aQD	/AT{E!&72t&DAEJJJ%*4[1#ad
1AT{F!&73&EAF!KKK&+Dk2#aV
2A789!q"f-999+0;7a#a[
!7A<=>qq"k2>>>S!T***QB'''RR(((Q2&&&RB''' Aq)))T2u---U-11a8D@@@u1-222r2r"rd***tR&",,,/ !1a 1a 1a|q   	!
 r1c"***r1b$'Ar7222q"b$'+AAAAq!W%+++ua-%???q"b$'A3...q!S$'+RRRRq!R&1b'111q!S$'B9444q!Q%+++1c] %1a^ 		%AD!A1X *#aA,&&q)*1a!e_ %!!Q40Q4Q43;&;"9$9%			%% 1b!Q&&&2r"a'''2s#r)))1b!Q&&&1a A%%%
:45R A%%%b!R'''A!###R B&&&A"$$$A!###A!###A!###A!###A!###
:23$<1!9>>&>R%=A
:)*sD4t<AsT"AsD!A!9??
9'(
:()"3a0A555"3q1R777"32q1R777"3C4;;;%fdA6!;;;%feQ72===%gq"ua8B>>>%gq#vq9S@@@$WdAQ?1DDD$WeQa@BFFF$XuaqARGGG$Xq#vqBcIII
:LM
:OP'%<AAA'&"=CCC'"b&"=CCC'"c'2>#EEET1%****b000"c'2.#555afa0C777D#%%%&#---Rd37RRRR1a,B777Rc2b888B1-!4442q"-"b999S#s3SzAAA9MNSgi}R~~~~CS1c3Z???2r1-!444BA.1#555BA.1a&888 1a4"QT'!1AadF!:QT!AA!E!IST T T !A1a4"Q$!6!;UCwNNN AB5#tDDD AqD2a4"!4a8QFBBB A2.1#555 AqD3q52!5s;SzIII A2.1b'999 AqD1QT6!1CE!9D!@&I N        BB/3IIII A!Q$!3T:tfDDD
:@A
:@A
:GHU 0P < >h 	0E1F297>sa   AG<4AHAHAHAH%AH8AHAH5AHAH!AH<AH$"AH)=AH.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   r3   r4   r5   <module>r      sC    # ' " -    
< < # 'LIr4   