o
    8VaY                     @   sd  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 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%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZF d d	lGmHZH ed
dd\ZIZJZKZLZMZNZOZPZQZRZSZTZUZVZWZXeddd\ZYZZZ[Z\Z]Z^Z_eddd\Z`ZaZbedddZcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkd d! Zld"d# Zmd$d% Znd&d' Zod(d) ZpeDd*d+ Zqd,d- Zrd.d/ Zsd0d1 Ztd2d3 Zud4d5 Zvd6d7 Zwd8d9 Zxd:d; Zyd<d= Zzd>d? Z{d@dA Z|dBdC Z}dDdE Z~dFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da ZeFdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo ZeFdpdq Zdrds Zdtdu Zdvdw Zdxdy ZdzS ){    )AddMatrixMulSsymbolsEqpi	factorintoopowsimpRational)_mexpand)ordered)sin)diophantine),diop_DN
diop_solvediop_ternary_quadratic_normaldiop_general_pythagoreandiop_ternary_quadraticdiop_lineardiop_quadraticdiop_general_sum_of_squaresdiop_general_sum_of_even_powersdescent
diop_bf_DN	divisible
equivalentfind_DNldescentlengthreconstruct	partitionpower_representationprime_as_sum_of_two_squaressquare_factorsum_of_four_squaressum_of_three_squarestransformation_to_DNtransformation_to_normalclassify_diopbase_solution_linear
cornacchia
sqf_normalgaussian_reduceholzercheck_paramparametrize_ternary_quadraticsum_of_powerssum_of_squares_diop_ternary_quadratic_normal_nint_or_floor_odd_even_remove_gcd_can_do_sum_of_squaresDiophantineSolutionSetGeneralPythagoreanBinaryQuadratic)default_sort_key)slowraisesXFAIL)signed_permutationsz.a, b, c, d, p, q, x, y, z, w, t, u, v, X, Y, ZT)integerzt_:7zm1:4n1c                 C   s   t tt | S N)r   r   eq rG   R/usr/lib/python3/dist-packages/sympy/solvers/diophantine/tests/test_diophantine.pydiop_simplify!   s   rI   c                   C   s    t tdd  t tdd  d S )Nc                   S   s   t ttS rD   )r   r   xrG   rG   rG   rH   <lambda>&       z#test_input_format.<locals>.<lambda>c                   S   s   t tt d S N   )r   rJ   r   rG   rG   rG   rH   rK   '       )r?   	TypeErrorrG   rG   rG   rH   test_input_format%   s   rQ   c                   C   s,   t dt ks	J t tdt ksJ d S rM   )r   setr   rG   rG   rG   rH   test_nosols*   s   rS   c                   C   sH   t td td d  ddhksJ t td td  ddhks"J d S )N      rT   rU   r   rJ   rG   rG   rG   rH   test_univariate0   s   $$rY   c                
   C   s  t tdd  t tdd  t tdd  t tdd  tdtd  dt  d	 tgd
dtdtd didfks:J ttt t tttgtt d
td
idfksRJ ttt t t td  ttttgtt d
td
td d
td
idfkswJ ttt tt  td  d
 tttgtt d
tt d
td d
d
d
idfksJ ttt t t d	 ttttgtt d
td
d
d	td
idfksJ ttt tt  ttttgtt d
tt d
idfksJ tttd  d
 ttgttd  d
d
d
idfksJ ttd td  td  d tttgd
dtd d
td d
td d
idfks!J ttd td  td  tttgtd d
td d
td d
idfksFJ d S )Nc                   S   s   t td d d S )NrU   rN   rT   )r*   rJ   rG   rG   rG   rH   rK   6       z$test_classify_diop.<locals>.<lambda>c                   S      t dS NrT   r*   rG   rG   rG   rH   rK   7       c                   S   s   t tt t t d S r\   )r*   wrJ   yzrG   rG   rG   rH   rK   8   s    c                   S   s    t td td  td  d S )NrN      Z   )r*   rJ   r`   ra   rG   rG   rG   rH   rK   9           rU      *   rT   iZ
univariateZinhomogeneous_ternary_quadraticZinhomogeneous_general_quadraticZhomogeneous_general_quadraticZ
cubic_thuerb   b   iZgeneral_sum_of_even_powersZ$homogeneous_ternary_quadratic_normal)	r?   rP   
ValueErrorNotImplementedErrorr*   rJ   r`   ra   r_   rG   rG   rG   rH   test_classify_diop5   s>   

&
(
"


($rk   c                   C   s   t tdksJ t dt dksJ t dt dksJ t td dks&J t dt d dks2J t dt d dks>J t tt tt fksKJ t tt d	 tt fksZJ t tt d	 tt fksiJ t d	t t d
 dkswJ t dt dt  d
 dt d
 dt d
 fksJ t dt dt  d
 dt d
 dt d
 fksJ t dt dt  d
 dt d
 dt d
 fksJ t dt d
t  d
t dt fksJ t dt dt  dt t fksJ t dt dt  d dt d dt d fksJ t dt dt  d dksJ t d	t dt  dt  d
 dt d
 dt d
 fks7J t dt dt  dt  d
 tdt dt  d
 dt dt  d
 fks_J t dt dt  dt  d
 d dksuJ t dt dt  dt  d
 dksJ t d
t dt  dt  d tdt dt  d dt dt  d fksJ t dt dt  dt  d dt d tdt  tfksJ t dt dt  dt  t tttt dt dt  dt  fksJ tt	dd  d S )N)r   rT   rN   )rU   rD   rb   )r      )rm         )NN   )r   rn   rn   NNN      	         c                   S   s   t td S NrU   rX   rG   rG   rG   rH   rK   i   rL   ztest_linear.<locals>.<lambda>)
r   rJ   r`   t_0ra   t_1r_   t_2r?   rP   rG   rG   rG   rH   test_linearN   s2   444(&6">P,*P@Jr   c                   C   s\  t dt t dt  dt  d ddhksJ t dt t dt  dt  d t ks/J t d	t t dt  d
t  d dhksFJ t dt t dt  dt  d dhks]J t dt t dt  dt  d h dksuJ t dt t dt  dt  d t ksJ t tt t t d dtftdfhksJ tdt t sJ d S )NrN   "   rx   rT   )i{)rn   irr   rU   rb   6   )   r      )rl   rn   8   rp   >   i_ru   iiiiirp   i   rm   r   @   rT   ry   rl   0   )r   rJ   r`   rR   tr   rG   rG   rG   rH   %test_quadratic_simple_hyperbolic_casel   s   "...0.,r   c                   C   s4  t dtd  dt t  dtd   dt  dt  d dhks#J t d	td  d
td   dt  dt  d t ks@J t td td  dt  dt  d dhksYJ t dtd  dt t  dtd   dt  dt  d dhks|J t dtd  dt t  dtd   d h dksJ d S )Nrg   rU   rs   rf         i3  )r   rl   rb   rN   rn      rx   rl   rl   ry   re   V  )rr   
   r      rl   rU   rT   rT   rT   rm   r   )r   rJ   r`   rR   rG   rG   rG   rH   test_quadratic_elliptical_case{   s   F:2F*r   c                   C   s  t dtd  dt t  dtd   dt  dt  d s J t dtd  dt t  dtd   dt  d	t  d s@J t dtd  dt t  dtd   d
t  dt  d s`J t dtd  d
t t  td  dt  d szJ t td dt t  td  dt  dt  d sJ t td dt t  td  dt  dt  d sJ t td dt  d sJ d S )Nrs   rU      rw   rn   rp      rr   rx   rb   rN   rT   )   (   check_solutionsrJ   r`   rG   rG   rG   rH   test_quadratic_parabolic_case   s   @@@488 r   c                   C   s  t dt t s
J t dtd  dt t  td  d s J t dtd  dt t  dtd   dt  dt  d s@J t d	td  d
t t  dtd   dt  dt  d	 s`J t dtd  dt t  dtd   dt  d
t  d sJ t dtd  dt t  dt  dt  d sJ t dt t dtd   dt  dt  d sJ t td td  dt  dt  sJ t td dtd   dt  dt  sJ t dtd  dtd   dt  d	t  d sJ d S )Nr   rb   rU   rn   rm   rN   r      rx      rs   r       r   r   ry   rr   r   rG   rG   rG   rH   test_quadratic_perfect_square   s   ,@@@44(,8r   c                   C   s   t td dt  dtd   sJ t dtd  dtd   dt  dt  s*J t td tt  td  dt  s>J t td dtd   dt  dt  sTJ ttd td  dt  dt  d  dhksoJ d S )NrU   rn   rN   ry   rr   r   )r   rJ   r`   r<   solverG   rG   rG   rH   !test_quadratic_non_perfect_square   s
   $0(,:r   c                  C   s^   ddt  dt  d   tdt d   } t tf}t| D ]}t| tt||r,J qd S )NirU   rN   rT   rJ   r`   r   rI   ZxreplacedictziprF   vZsolrG   rG   rH   test_issue_9106   s
   (r   c                  C   sJ   t d t  td  } t tf}t| D ]}t| tt||r"J qd S r|   r   r   rG   rG   rH   test_issue_18138   s
   r   c                   C   s   t dtd  dt t  dtd   dt  dt  d s J t dtd  dt t  dtd   d	t  d s<J t d
t dtd   t dt t  dtd   sXJ t ddt  dtd   dt  tt  dtd   svJ d S )Nrs   rU   r   r   r   r   ru   rp   rn   r   rb   rN   rT   r   rG   rG   rG   rH   test_quadratic_non_perfect_slow   s   @88@r   c                   C   st  t dddgks
J t ddg ksJ t dddgksJ t d	d
dgks'J t ddg ks0J t ddg ks9J t dddtfgksEJ t dddt tfgksSJ t ddg ks\J t dddgksfJ t dddgkspJ t dddgkszJ t ddddgksJ t ddg dksJ t dddgksJ t dddgksJ t dddgksJ t d dd!gksJ t d"dd#gksJ t d
dd$gksJ t d%dd&gksJ t ddd'gksJ t d"dg ksJ t d(dd)gksJ t d*dd+gksJ t d,dd-gksJ t d.dg ksJ t dd/g d0ksJ td1dd2d3dd/d4ks,J t dd5g d6ks8J tt d7d8h d9ksFJ t dd:d;gksQJ t d<d=g ks[J t ddd>d?gksgJ t d@dAdBgksrJ t d@dCg ks|J t dDdCdEgksJ tdFddGddDdCsJ t dDdHdIdJgksJ t ddtdtfgksJ t ddtg ksJ d S )KNrN   r   r   r   ro   ir   rU   rT   r   r   r   r   rn   ry   r   r      )rw   rb   iL)rx   rr   rp   rl   rT   rU      ))rx   rn   )rn   rx   )r   r   )r   r   rT   )i  r   i  )i  ix  i  )l   INd? l   j\i  )i  i"  i  )l   WRlQ]>I2l   AAJtWjU^	 )!   rs      )   '   )rw   rn   r   )r   rn   i"  )r   rT   	S  l   !K2l   uGoX r   r   )rN   rT   )  m   $   r   ru   r   r   Tr   ))   =   r   r   )i      rx   rN      rx   >   iX i  ipi"'Mi)  iS  l   )fMOl   ?_l   ;>x< i|r   rT   r   )i  i     rw   )r   rT   )rr   rT      rU   r   rm   {   )r   rT   r   r   i)rT   )r   rT   )r   r   r   rR   rG   rG   rG   rH   test_DN   sR   r   c                   C   s  t ddg dksJ t ddg dksJ t ddg ksJ t dd	d
gks)J t ddddgks4J t dddgks>J t dddgksHJ t ddtdgksSJ t ddtdtfgks`J t ddtdt tfdt tfgkstJ t ddtdgksJ t d	dtg ksJ d S )Nr   r   )r   )ru   rT   r   r   )r   )r   rN   r   )ir   r   rm     rT   )l   uL" l   EY   rv   ry   rT   r   r   rl   r   iT  )i  r   r   r   rb   rU   rN   )r   r   rG   rG   rG   rH   test_bf_pell  s   (r   c                   C   s|   t ddddks
J t ddddksJ t ddd	dksJ t ddd
dks(J t dd
ddks2J t ddddks<J d S )NrU   rT   r   rm   rb   rn   rN   ro   r   r   rr   rp   r   r   )r    rG   rG   rG   rH   test_length  s   r   c                 C   s  t | \}}|tttg | d }|tttg | d }t| tttf||f}t	dd |j
D }tt ttfD ]}|| v rH dS q=td td dfD ]}|| vr^d||< qR|td  dkrt|td  |td  o~t|d |td  S dS )a9  
    Test whether X*Y, X, or Y terms are present in the equation
    after transforming the equation using the transformation returned
    by transformation_to_pell(). If they are not present we are good.
    Moreover, coefficient of X**2 should be a divisor of coefficient of
    Y**2 and the constant term.
    r   rT   c                 S   s   g | ]}t |jttg qS rG   )reversedas_independentXY.0r   rG   rG   rH   
<listcomp>3      z-is_pell_transformation_ok.<locals>.<listcomp>FrU   T)r(   r   r   r   rI   subsr   rJ   r`   r   argskeysr   )rF   ABur   
simplifiedcoefftermrG   rG   rH   is_pell_transformation_ok&  s$   r   c                   C   s  t dtd  dt t  td  dt  dt  d sJ t dtd  dt t  dtd   dt  dt  d	 s>J t td td  d
 sLJ t td  dtd   d	 s]J t dtd  dt t  dtd   dt  dt  d s}J t dtd  dt t  td  dt  dt  d sJ t td dt t  dtd   dt  d	t  d sJ t dtd  dt t  dtd   d	t  dt  d sJ d S )Nr   rU   rp   re   r   r   rn   r   r   r   r   -   r      r   rN   r      r   rf   ry   r   )r   rJ   r`   rG   rG   rG   rH   test_transformation_to_pellD  s   <@"@<<Dr   c                   C   sH  t td dt  td  dksJ t td dtd   d dks$J t td dt t  dtd   d dks<J t dtd  d	t t  td  d
 dksTJ t dtd  dt t  td  d dkslJ t dtd  dt t  td  dksJ t dtd  dt t  td  dt  dt  d dksJ d S )NrU   r   rN   rn   )rN   rn   rb   rp   )rn   rp   rs   ry   )rz   r   rx   )rs   T   ru   )rT   r   r   re   )e   i)r   rJ   r`   rG   rG   rG   rH   test_find_DNO  s   $$000,Dr   c                  C   s`   g d} | D ]\}}t ||\}}}||d  ||d   |d ks$J qt ddd u s.J d S )N)r   r   rN   r   r   i)rb   rq   )rq   rb   [   ru   r   rT   rl   )rb   r   r   r   i) rT   r   irU   rl   )r   r   abr_   rJ   r`   rG   rG   rH   test_ldescentY  s
   &r  c                   C   s  t dtd  dtd   td  sJ t dtd  dtd   td  s(J t dtd  dtd   td  s<J t dtd  d	td   dtd   sRJ t td dtd   td  sdJ t dtd  dtd   td  sxJ t td td  td  sJ t d
td  td  dtd   sJ t d	td  td  dtd   sJ t dtd  dtd   dtd   sJ t dtd  dtd   dtd   sJ t dtd  dtd   dtd   sJ d S )N   rU   A  r   ih  rn   rb   rN   rr   r   r   r   r   rx   ry   r   i-  |   r   1  r   rJ   r`   ra   rG   rG   rG   rH   "test_diop_ternary_quadratic_normalc  s   (((,$( ((,,0r  c                    s   t | }|ttttg \ t| ttttf f}t fdd|j	D }     fD ]}||
 v rD dS q9dS )Nc                    s    g | ]}t |j g qS rG   )r   r   r   r   r   ZrG   rH   r   w  rd   z/is_normal_transformation_ok.<locals>.<listcomp>FT)r)   r   rJ   r`   ra   rI   r   r   r   r   r   )rF   r   r   r   r   rG   r  rH   is_normal_transformation_okr  s    r  c                   C   s  t td dtd   td  dt t  dt t  dt t  s$J t td dtd   dtd   s8J t td dt t  sFJ t dtd  dtd   dt t  s\J t td dt t  dt t  dt t  svJ t td dt t  dt t  tt  sJ t td td  td  tt  tt  tt  sJ t td dt t  dtd   sJ t tt dt t  dt t  sJ t dt t dt t  sJ d S )	NrU   rN   r   r   rx   d   r   r   )r  rJ   r`   ra   rG   rG   rG   rH   test_transformation_to_normal  s   H(,408(($r  c                  C   s  t dtd  td  td  dt t  sJ t td td  td  tt  tt  s0J t dtd  tt  tt  tt  sFJ t td tt  tt  sVJ t dtd  dt t  tt  sjJ t dtd  dtd   tt  s~J t dtd  dtd   td  dt t  dt t  dt t  sJ t dtd  dt t  sJ t dtd  dtd   dt t  td  sJ t td d	td   td  d
t t  dt t  sJ t dtd  dtd   dt t  dt t  dt t  sJ t td dtd   td  tt  dt t  s,J t td dtd   td  tt  dt t  dt t  sOJ t td dtd   td  d
t t  dt t  dt t  stJ t tt dt t  d
t t  sJ ttd td  td  dksJ ttd td  d u sJ ttdd  dt t dt t  dtd   dt t  dtd   } t| dksJ tdtd  dtd   td  dksJ ttt dt t  ddtfksJ dt t dt t  dt t  dtd   } t	| dt
d  dt
 t  dt
 t dtd   dt
 t fks@J ttt dt t  dt
 t t t
d  t
d  t
t fkscJ d S )NrU   rb   rN   rn   rp   rs   rx   r   1   r   rc   r   r   rt   c                
   S   s0   t tttftt dtd dtd dtd diS )NrT   rU   rN   r   )r4   rJ   r`   ra   rG   rG   rG   rH   rK     s   
"z-test_diop_ternary_quadratic.<locals>.<lambda>rm   rr   )rp   rU   r   )rT   r   rU   r   ro   rv   )r   rJ   ra   r`   r   r?   ri   r   rC   r1   pqr   rE   rG   rG   rH   test_diop_ternary_quadratic  s>   00, ((L 4<F:FJ*&<"

08
Jr  c                   C   s  t dt d  krdksJ  J t ddksJ t dt d  kr)dks,J  J t dt d  kr;dks>J  J t d	t d
  krMdksPJ  J t ddksXJ t ddks`J t ddkshJ t ddkspJ t ddksxJ t td
dksJ d S )NrT   rl   r   rn   ro   rb   r   rU   rx   r   rr   rw   rN   4   r  rp   i  re   )r%   r	   rG   rG   rG   rH   test_square_factor  s   $$$$r  c                   C   s  t td td  td  sJ t td dt t  td  s"J t dtd  dtd   td  s6J t dtd  dtd   td  dt t  dt t  dt t  s\J t td td  td  slJ t td dtd   td  dt t  d	t t  sJ t d	t t td  sJ t d
td  dtd   dtd   sJ t dtd  dtd   dt t  dt t  dt t  sJ t dtd  dtd   dt t  dt t  dt t  sJ t d
td  dtd   dtd   s	J d S )NrU   r	  r
  rN   rn   rp   r  r   rs   r  r   r        r   r   rc   r  rG   rG   rG   rH   "test_parametrize_ternary_quadratic  s    $(L <,DD2r  c                   C   s   t dt t tt  dt t  sJ t dt t dt t  dt t  s*J t dt t dt t  s:J t tt tt  tt  sJJ t dt t dt t  dt t  s`J d S )NrU   rN      iY  rx   r   r   r  rG   rG   rG   rH    test_no_square_ternary_quadratic  s
   (,  0r  c                  C   sx   g d} | D ]\}}t ||\}}}||d  ||d   |d ks$J qttdd  ttdd  ttdd  d S )N)	r   r   r   r   r   r  r  r  r  rU   c                   S   
   t ddS )Nrl   ru   r   rG   rG   rG   rH   rK        
 ztest_descent.<locals>.<lambda>c                   S   r  )Nr   rN   r   rG   rG   rG   rH   rK     r!  c                   S   r  )Nrb   rN   r   rG   rG   rG   rH   rK     r!  )r   r?   rP   ZeroDivisionErrorr  rG   rG   rH   test_descent  s   &r#  c                  C   s  t tt tt  tt  sJ t tt td td  td   s$J t tdt  dt  td td  td   s>J t td dtd   d sNJ t td dt t  s\J t td dt t  td  snJ t ttd td  d  s~J t tdt dt  d  sJ t td dtd   d td td  d  sJ t td dtd   d tdt   sJ t td td  td  tdt  dt  dt   sJ t td dt t  dt t  sJ t td dt  d sJ ttt ttttksJ td td  d } t| d	d
t|  d	d
ks(J tdt t dt t  dt dt fhksBJ td td  td  d } dh}t| |ks\J t	t
| }t| d	d
|ksoJ ttd ttdd  d t	 ksJ dtd  dtd   td  } |  }ttttf|dhksJ t| dtd  dtd   dtd  dt t  dtd   dtd  dt t  dtd   fhksJ dtd  dtd   td  } |  }ttttf|dhksJ t| dtd  td  dtd  dt t  td  dtd  dt t  dtd   fhks2J dtd  dtd   dtd   } |  }ttttf|dhksVJ t| dtd  dtd   dtd  d t t  d!td   d"td  d#t t  d$td   fhksJ d%td  d&td   d'td   } |  }ttttf|d(hksJ t| d)td  d*td   d+td  d,t t  d-td   d.td  d/t t  d0td   fhksJ td dtd   d1td   } |  }ttttf|d2hks
J t| d3t t dtd  d3td   td d1td   fhks-J ttd4d5  tdt t	 ks@J tdt dt  tj h d6ksTJ ttd td  dt  d d	d
h d7ksmJ ttd td  d8 d9 ttfd	d:h d;ksJ ttd td  d8 d9 ttfd	d:h d;ksJ t td t sJ t td t sJ ttd t tttd fhksJ ttd t ttd t fhksJ d S )<NrU   rN   rp   rT   rf   rn   rb   a   Tpermutere   rT   rU   rN   \   c   )ry   rp   3   i{  ry   iKf   i  ij  r*  )rT   rT   rU   rm   i  9      )i  iU
  i  i i ii ia i iڙ iV
 i=  i  i  )r        i	  i>  iipE i* i',  i  i  rx   )r   rU   rT   r   c                   S   s   t ttd  d S )NrU   rT   r   rJ   r`   rG   rG   rG   rH   rK   &  rZ   z"test_diophantine.<locals>.<lambda>>   rN   rr   rb   rb   rr   rN   rm   rT   r   >   rb   rT   rb   rl   r   rT   r   rl   rl   rT   r   r  r   r   Q   )symsr&  >   rU   ru   rN   rm   ru   rU   ru   rm   rm   rN   rm   ru   rU   rN   rN   rU   )r   rJ   r`   ra   r_   r   r   r   r}   rR   rA   popr   Zas_coefficients_dictr4   r  r  r?   rj   r   ZHalfr   )rF   base_solcomplete_solnr   rG   rG   rH   test_diophantine  s    (4 $  4,<(  4* 
8" 
0"$
,
"
$
8"
 
6
("
$
$
&,rG  c                  C   s  ddl m} m}m}m}m} t| d |d  |d  |d  s"J t| d d|d   d|d   |d  s:J td| d  d|d   d|d   |d  sTJ td| d  d|d   d|d   d|d   spJ td| d  d|d   d|d   d|d   sJ t|d  d| d   d|d   d|d   d|d   sJ td| d  |d  d|d   |d  d|d   sJ t| d |d  |d  |d  jt	t
tgdt	d t
d  td  dt	 t dt
 t t	d t
d  td  fhks
J d S )	Nr   r  r  cderU   rb   ry   r   r   
parameters)	sympy.abcr  r  rI  rJ  rK  r   r;   r   rJ   r`   ra   rH  rG   rG   rH   test_general_pythagorean=  s   (0488B<0DrO  c                     s  t ddD ]} ttdd td|  D |  sJ qttd td  d d u s+J ttd td  td  d t ks@J td td  td  d  t dhksWJ t	d t
d  td  td  td  d	  tt ddksxJ td
tdddf }tdd |D  d  h d}t |ksJ tt dddksJ tdtd  td  td  dhksJ td td  td  td  d  tt fdd d S )NrN   r   c                 s       | ]}|d  V  qdS rU   NrG   r   irG   rG   rH   	<genexpr>N      z9test_diop_general_sum_of_squares_quick.<locals>.<genexpr>z:%irU   re   r'  i!  z:56Tnegativec                 S   s   g | ]}|d  qS rW   rG   rR  rG   rG   rH   r   Y  rZ   z:test_diop_general_sum_of_squares_quick.<locals>.<listcomp>p   >   r   r   rU   rU   rU   r   r   r   rU   rr   rr   r   r   r   rb   rb   rb   rv   r   rT   rT   rT   rN   r   r   rT   rT   rU   rn   r   r   rT   rT   rn   rr   rq   r   rT   rU   rN   rp   rq   r   rT   rn   rn   rn   r   r   rU   rU   rU   rr   rv   r   rU   rN   rN   rN   r   r   rU   rN   rn   rn   rq   r   rN   rN   rN   rr   rq   rT   rT   rT   rN   rr   rv   rT   rT   rU   rN   rb   r   rT   rT   rN   rb   rr   rq   rT   rU   rN   rN   rn   rv   rT   rN   rb   rn   rn   r   rU   rU   rb   rb   rr   r   rU   rN   rN   rb   rn   rq   r%  i  rx   )rU   rU   rU   rb   c                      s
   t   S rD   r]   rG   rE   rG   rH   rK   i  r!  z8test_diop_general_sum_of_squares_quick.<locals>.<lambda>)ranger   sumr   r   rJ   r`   ra   rR   r   r   lenr   r   r  r  rI  rJ  r?   rj   )rS  varZ	base_solnrG   rE   rH   &test_diop_general_sum_of_squares_quickL  s$   ( *,*$rq  c                  C   s   dD ]} t ddD ]}t| |D ]
}t||ksJ qq	qdd tddD g ks+J dd tdddD g d	g d
g dgksCJ ttddgksNJ ttdddgksZJ dd tdD g dddgdggksoJ d S )N)rs   r   rT   rs   c                 S   s   g | ]}|qS rG   rG   r   r  rG   rG   rH   r   q  rO   z'test_diop_partition.<locals>.<listcomp>rN   rn   c                 S      g | ]}t |qS rG   listrr  rG   rG   rH   r   r  rZ   )r   r   r   r   rN   )r   r   r   rT   rU   )r   r   rT   rT   rT   r   rG   c                 S   rs  rG   rt  rR  rG   rG   rH   r   v  rZ   )rT   rT   rT   rU   )rm  r"   ro  ru  )nkr  rG   rG   rH   test_diop_partitionl  s   
.rx  c                  C   sf   dD ]} t | \}}|d |d  | ksJ qt dd u sJ t d}|dkr/t|d tu s1J d S )N)
rn   r   r   r{   %   r   i%	  i  i  iY  rU   rp   i5 )i  i  r   )r$   typeint)rS  r  r  ansrG   rG   rH    test_prime_as_sum_of_two_squaresy  s    r}  c                  C   s|   dD ]} t | \}}}|d |d  |d  | ksJ qt dd u s$J t dd u s,J t ddks4J t ddks<J d S )	N)r   rT   rU   r   r   l   my l   85Jdl   8l9_	 i   i!  i"  i#  i$  i%  i&  rU   rp   i <  r   )rn   r   r   rb   r   r   rU   )r'   )rS  r  r  rI  rG   rG   rH   test_sum_of_three_squares  s   "r  c                  C   s   ddl m}  | dd}tdd t|D |ksJ tddks"J tdd	ks*J td
dks2J tddks:J tddksBJ tddksJJ d S )Nr   )randintrT   l    @ k c                 s   rP  rQ  rG   rR  rG   rG   rH   rT    rU  z+test_sum_of_four_squares.<locals>.<genexpr>)r   r   r   r   re   )r   rT   rU   rN   rf   )rT   rT   rU   rN   rw   )rT   rU   rU   rN   r   )r   rT   rN   rN   r   )r   rb   rb   rb   )Zrandomr  rn  r&   )r  rv  rG   rG   rH   test_sum_of_four_squares  s   
r  c               	   C   s  g d} | D ]:}|\}}}t |||}	 z!t|}t||ks!J d}|D ]}|||  }q%||ks4J W n	 ty>   Y nw qqtt ddddddgksPJ ttd	d
  ttdd
  ttdd
  tt dddg ksqJ tt ddddgks~J tt dddg ksJ tt ddddgksJ tt dddddddgksJ tt dddddg ksJ tt ddddgksJ tt dddg ksJ tt dddddgksJ tt ddddg ksJ ttt ddddksJ d}	dD ]}
tt|	d|	|
 g ksJ qd S )N))r   rN   rU   )r	  rU   rb   )rU   rT   rU   )rN   rT   rN   )rn   rU   rU   )i@0  rU   rb   )i  rU   rN   Tr   rz   rU   rb   )rT   rT   rN   rN   )r   r   rU   rb   c                   S   s   t tdddS )Ng333333?rU   ru  r#   rG   rG   rG   rH   rK     rO   z+test_power_representation.<locals>.<lambda>c                   S   s   t tdddS NrU   r   r  rG   rG   rG   rH   rK     rO   c                   S   s   t tdddS r  r  rG   rG   rG   rH   rK     rO   rl   rT   rV   rN   rW   r:  rr   )Zzeros)rT   rU   rU   rU   rU   rU   )r   r   r   r   r   rN   rn   Frm   r   r   i  pi   @)r   r   rp   rn   rb   rU   rT   )r#   nextro  StopIterationru  r?   ri   r2   )Zteststestrv  r  rw  flZchk_sumZl_iZbigrS  rG   rG   rH   test_power_representation  sP   
 r  c                  C   s   t dddd\} }t|d | |  d }|h dksJ t dddd\}}t|| d|  d	|  d
 }|h dks>J dS )z<
    Test whether diophantine respects the assumptions.
    zm nT)rB   ZpositiverU   i  >   i  rT   rn   rz   r   r   _   rn   y   rb      rU   za bFrN   rr   >   r   ru   r   r   rq   ro   r   r   ro   rv   r   r   N)r   r   )mrv  Zdiofr  r  rG   rG   rH   test_assumptions  s    r  c                 C   sf   t | }t| }t| j}|jtd |r1| }|D ]}t|	t
||dkr, nqdS |sdS )z
    Determines whether solutions returned by diophantine() satisfy the original
    equation. Hope to generalize this so we can remove functions like check_ternay_quadratic,
    check_solutions_normal, check_solutions()
    )keyr   FT)r   r   Z	make_argsru  free_symbolssortr=   rD  rI   r   r   )rF   sZfactorsrp  solutionr  rG   rG   rH   r     s   

r   c                  C   s  dt  t d d } t| tdt d fhksJ dt d  dt  t  dt   dtd   dt  d } t| tt d fdt d t fhksKJ tt td  d td  d t fhksbJ tt t d tdt fksrJ td	ddd d
dks~J dt d dt d f}tdddt|ksJ tdddd d
tdd |D ksJ t	dddd u sJ t	ddddhksJ t	ddddhksJ t
tdd  tddddksJ td  t d  td  td  } t| t|    krtd td  td  dt t dt t td td  td  fksJ  J tttdt d  tdt d  tdt gd	ks<J tttddtdt  tdt gd	ksTJ tttdt  tddtdt gd	kslJ tdddksvJ tdtd   krdksJ  J td	td	   krdksJ  J tddddksJ t
tdd  tdddd ksJ t
td!d  t
td"d  tt d td  d d# h d$ksJ d S )%NrU   rT   rm   rr   rx   rb   rw   rN   r   r   r   rs   c                 s   s    | ]	}| td V  qdS )r   N)r   r   )r   _rG   rG   rH   rT    s    z$test_diopcoverage.<locals>.<genexpr>rz   rn   r   r   rC  c                   S   s   t dddS )Nrb   rz   rT   )r!   rG   rG   rG   rH   rK     rL   z#test_diopcoverage.<locals>.<lambda>r   r   r   TFr'  c                   S   r[   )N)rU   rb   rr   )r8   rG   rG   rG   rH   rK     r^   rc   n   i6  )r   rT   rn   c                   S   s,   t td td  tt  dt t  d S )NrU   rx   r   rJ   r`   ra   rG   rG   rG   rH   rK     s   , c                   S   s   t td td  S )NrN   rU   r0  rG   rG   rG   rH   rK     rZ   r:  >   rT   ry   rT   r   ry   rl   r   rl   rl   ry   rl   r   r   r   )rJ   r`   r   r}   r   r   r   r+   tupler,   r?   ri   r.   r_   ra   r   m1m2m3ro  r0   r   r   r5   r6   r7   r8   rP   r-   rj   )rF   r|  rG   rG   rH   test_diopcoverage  sN   8,. &"
  :00**

r  c                   C   sF   t dddddddksJ t dddd	d	d
dksJ ttdd  d S )NrU   rp   r   rb   O   r   rU   rp   r   rr   rT   r   )rU   rr   rU   c                   S   s   t ddddddS )NrU   rp   re   rb   r  r   )r/   rG   rG   rG   rH   rK   (  s    ztest_holzer.<locals>.<lambda>)r/   r?   ri   rG   rG   rG   rH   test_holzer  s   r  c            
         s    fdd} d\ d \}}}}d \}}}}| | dks#J | | dks+J t  |d  |d  |d     ksEJ t  |d  |d  |d     ks_J t||| }	|	|ksnJ d S )Nc                    s$    | d  |d   |d   S r|   rG   )rJ   r`   ra   r  r  rI  rG   rH   rK   -  s   $ z"test_fail_holzer.<locals>.<lambda>)rb   r  r   )   rT   r   r  r   rU   )maxr/   )
rF   rJ   r`   ra   Zxyzr   r   r  r|  hrG   r  rH   test_fail_holzer+  s   
44r  c                   C   sN   t dt dt  dt  t tttt dt dt  dt  fhks%J d S )Nrr   ry   rz   r{   )r   r_   r`   rJ   ra   r}   r~   r   rG   rG   rG   rH   test_issue_95399  s   $r  c                   C   sJ   t dtd td  td   dtt tt  tt    dhks#J d S )NrN   rU   re   r   r   r   r  rG   rG   rG   rH   test_issue_8943>  s
   6r  c                     s   t d td  td  d  t ddhksJ t dddhks#J tt fdd tdd	d
} t d td  | d  d  t dhksIJ tt d td  d t	 ksZJ tt d td  d ddt	 ksmJ d S )Nrb   iq
  )rN   rr   rr   )rU   rb   rp   rU   c                      s   t   dS r|   )r   rG   rE   rG   rH   rK   H  rL   z.test_diop_sum_of_even_powers.<locals>.<lambda>negTrW  )ru   rr   rr   r   )limit)
rJ   r`   ra   r   r   r?   rj   r   r   rR   )r  rG   rE   rH   test_diop_sum_of_even_powersD  s   "*r  c                     s
  h d} t d td  td  td  td  d }t|t}t|dks'J || ks-J tt	dd  t
tddg ks?J t
tddg ksJJ t
td	dd
dgksWJ t
td	dg ksbJ t
tdddgksnJ t
tddg ksyJ t
tddddgksJ t
tddd
ddgksJ t
tdddgksJ dd tdD g dksJ dd tdD g dksJ tdD ]- tt dd
}|rt fdd|D sJ tt d}t fd d|D sJ qtt	d!d  tt	d"d  t
td#ddd$gksJ t
td#ddg ksJ t
tddddgks'J t
tdddd
d%d&gks7J t
tdddd
g d'ksGJ t
td(ddg ksTJ t
td)ddg ksaJ t
td*ddd+gkrrd*d*kstJ t
tdd, ddg ksJ d S )-N>   r   r   rT   rT   r   r   r   rn   rp   rp   r   rT   rN   rp   rs   r   rT   rb   rn   ry   r   rN   rb   rp   rp   r   rN   rn   rn   rs   rT   rT   rU   rr   ry   rT   rT   rr   rr   rp   rT   rU   rN   rN   r   rT   rN   rb   rb   ry   rT   rn   rn   rr   rr   rU   rU   rN   rn   ry   rU   rN   rn   rr   rp   rN   rN   rb   rn   rs   rU   r   re   c                   S   s   t tddS )Nr   rl   )ru  r3   rG   rG   rG   rH   rK   Y      z,test_sum_of_squares_powers.<locals>.<lambda>r   rN   r   Tr  rb   rT   rW   rn   2   )rn   rn   )rT   rp   r   )rT   rT   rT   rU   rU   )r   r   rT   rT   rN   rs   )rT   rT   rT   rT   rT   rT   rT   rT   c                 S   s    g | ]}t tt|d dqS )rn   Tro  ru  r3   rR  rG   rG   rH   r   e  rd   z.test_sum_of_squares_powers.<locals>.<listcomp>r   )rT   rT   rT   rT   rU   rU   rT   rT   rU   rU   rU   rU   rU   rN   rU   rT   rN   rN   rN   rN   rb   rN   rN   rU   rU   rb   rb   rb   rb   rn   c                 S   s   g | ]}t tt|d qS )rn   r  rR  rG   rG   rH   r   l  r   )r   r   r   r   r   rT   r   r   rT   r   r   rT   r   rT   rT   r   rT   rT   r   rT   rU   rT   rT   rT   rT   rT   rT   rT   rT   rN   c                 3   &    | ]}t d d |D  kV  qdS )c                 s   rP  rQ  rG   r   jrG   rG   rH   rT  u  rU  7test_sum_of_squares_powers.<locals>.<genexpr>.<genexpr>Nrn  r   rS  rG   rH   rT  u     $ z-test_sum_of_squares_powers.<locals>.<genexpr>c                 3   r  )c                 s   rP  rQ  rG   r  rG   rG   rH   rT  w  rU  r  Nr  r   r  rG   rH   rT  w  r  c                   S      t tdddS )NrU   rl   rT   ru  r2   rG   rG   rG   rH   rK   y  rO   c                   S   r  )NrU   rT   rl   r  rG   rG   rG   rH   rK   z  rO   rm   r   r~  )r   rT   rT   ))r   rn   )rT   rb   rB  rr      i  )ry   i  )r   r   rJ   r`   ra   r   r
   ro  r?   ri   ru  r3   rm  rR   allr2   )ZtrurF   r|  s1s2rG   r  rH   test_sum_of_squares_powersP  sF   ,

  &"r  c                   C   sr   t dddu s	J t dddu sJ t ddsJ t dds J t dds'J t dds.J t dddu s7J d S )	NrN   rl   Fru   rT   r   rb   rU   )r9   rG   rG   rG   rH   test__can_do_sum_of_squares  s   r  c            	      C   s  ddl m} m}m}m}m} | d |d  d }dh}t||ks#J tt|	 }t|dd|ks5J | d |d  |d  |d  |d  d	 }t
t|d
ksUJ t
t|dddksaJ h d}tdtd  dt t  dtd   d dd|ksJ d S )Nr   rH  rb   r$  rB  Tr%  rU   r	  #   i0  r   r   rx   r   )rN  r  r  rI  rJ  rK  r   rR   rA   rD  ro  rJ   r`   )	r  r  rI  rJ  rK  rF   rE  rF  ZsolnrG   rG   rH   test_diophantine_permute_sign  s   ,<r  c                  C   s8   t d td  d d } t| t tgdddhksJ d S )NrU   rb   rT   r:  r;  r   )rT   rN   )rJ   r`   r   rE   rG   rG   rH   test_not_implemented  s    r  c                      sL   t dt  d  t tt gdtdt d fhksJ tt fdd d S )NrN   rU   r  c                      s   t  tthdS )Nr  )r   r`   rJ   rG   rE   rG   rH   rK     rO   z!test_issue_9538.<locals>.<lambda>)rJ   r`   r   r}   r?   rP   rG   rG   rE   rH   test_issue_9538  s   &r  c                  C   sB  t dtd  td  dtd   } tt| j\}}}| |d d|d   d|d  d| |  d| |  d|d   |d d| |  d|d   d| |  fhksXJ t td dtd   dtd   } | d| | |d d|d   |d d|d   fhksJ t dtd  dtd   td  } | d|d  |d  d|d  d| |  |d  d|d  d| |  d|d   fhksJ t dtd  dtd   dtd   } | d|d  d|d   d	| | d
|d  d|d   fhksJ tdtd  dtd   td  dt t  dt t  dt t  d|d  d| |  |d  d|d  d| |  |d  d|d  d| |  d|d   fksYJ tdtd  dtd   dtd   d|d  d|d   d|d  d| |  d|d   d|d  d| |  d|d   fksJ d S )NrU   rm   rb   rN   H   r   r   ry   rr   rs   rn   rp   r  r   r  i~i i
  ix  i:
 ii  ib<  )r   rJ   r`   ra   r   r   r  r1   )r  r  r  rrG   rG   rH   test_ternary_quadratic  sD   $.*$<$2"(FBF


",
"r  c                     s  t g g  t t ksJ  jdksJ  jdksJ tt fdd t  g ks/J t tt	gt
tgjtt	fksAJ jt
tfksJJ ttfdd d tdhksaJ ddtf tddtfhksuJ tt fdd t tdt	titdt	d	igksJ t tt	tgt
tgtjd
ksJ t
d
 t t
t df tt
d
 t t
t dfhksJ t
d
td	 d
t dfhksJ d
td	 d
t dfhksJ t
dtdidhksJ dddhksJ t
ditd dt dfhksJ dtd dt dfhks&J tdt
d
 d t
d dfhks;J d dt
d
 d t
d dfhksOJ t
d
tdidhks^J d
ddhksiJ t
dtdidhksxJ dddhksJ ttfdd ttfdd ttfdd ttfdd ttfdd ttfdd ttfdd t tt	gt
tg} | t
dt
 f | t
 dt
 f | dddhksJ d S )NrG   c                      s     tfS rD   )addrJ   rG   )r  rG   rH   rK     rL   z/test_diophantine_solution_set.<locals>.<lambda>c                      
     dS )NrV   r  rG   )r  rG   rH   rK     r!  )rN   rb   rl   c                      s
     S rD   )updaterG   )r  r  rG   rH   rK     r!  rN   rb   rU   rT   rp   rs   )r,  rl   rT   rn   r   ru   )rx   r   rT   )   rs   rT   c                      s    j ddS )NrT   )rJ   r   rG   s3rG   rH   rK     rL   c                      s     dddS NrT   rU   rN   r  rG   r  rG   rH   rK     r  c                      r  )NrG   r  rG   r  rG   rH   rK     r!  c                      r  )N)rT   rU   rN   rb   r  rG   r  rG   rH   rK     r!  c                      r  )Nr   r  rG   r  rG   rH   rK     r!  c                      s    dddS r  rG   rG   r  rG   rH   rK     rL   c                      s
    ddS )NrT   r  rG   rG   r  rG   rH   rK     r!  r   r  r   r   )r:   rR   r   rM  r?   ri   ru  Zdict_iteratorrJ   r`   r   r   r  r  ra   ro  r   rP   )Zs4rG   )r  r  r  rH   test_diophantine_solution_set  sV   

($$ ("*(r  c                  C   sf   dt  t dtd   } t| jttgd}|tdt ft dt fhks'J |dddhks1J d S )	NirN   rU   rL  r   r  r   r   )rJ   r`   r<   r   r   r   )rF   r  rG   rG   rH    test_quadratic_parameter_passing  s   "r  N)Zsympyr   r   r   r   r   r   r   r	   r
   r   r   Zsympy.core.functionr   Zsympy.core.compatibilityr   Z(sympy.functions.elementary.trigonometricr   Zsympy.solvers.diophantiner   Z%sympy.solvers.diophantine.diophantiner   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   Zsympy.utilitiesr=   Zsympy.testing.pytestr>   r?   r@   Zsympy.utilities.iterablesrA   r  r  rI  rJ  r  r  rJ   r`   ra   r_   r   r   r   r   r   r  r}   r~   r   Zt_3Zt_4Zt_5Zt_6r  r  r  rC   rI   rQ   rS   rY   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r#  rG  rO  rq  rx  r}  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rG   rG   rG   rH   <module>   s   4 &
	K	

$Z 	-/
6

1