U
    9%e                     @   s  d dl mZ d dlmZ d dl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 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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZI d dlJmKZKmLZLmMZM d dlNmOZO eddd\ZPZQZRZSZTZUZVZWZXZYZZZ[Z\Z]Z^Z_eddd\Z`ZaZbZcZdZeZfeddd\ZgZhZiedddZjdd Zkdd Zldd Zmdd Zndd  Zod!d" Zpd#d$ Zqd%d& Zrd'd( Zsd)d* Ztd+d, Zud-d. Zvd/d0 ZweKd1d2 Zxd3d4 Zyd5d6 Zzd7d8 Z{d9d: Z|d;d< Z}d=d> Z~d?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN ZdOdP ZdQdR ZdSdT ZdUdV ZdWdX ZdYdZ Zd[d\ Zd]d^ Zd_d` Zdadb Zdcdd Zdedf Zdgdh Zdidj ZeMdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Zdwdx ZeMdydz Zd{d| Zd}d~ Zdd Zdd ZdS )    )Add)Mul)Rationaloopi)Eq)S)symbols)Matrix)	factorint)powsimp)_mexpand)default_sort_key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)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   o/var/www/html/Darija-Ai-API/env/lib/python3.8/site-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   -   rL   )r?   	TypeErrorrG   rG   rG   rH   test_input_format+   s    rP   c                   C   s,   t dt kstt tdt ks(td S rM   )r   setAssertionErrorr   rG   rG   rG   rH   test_nosols0   s    rS   c                   C   sH   t td td d  ddhks$tt td td  ddhksDtd S )N      rT   rU   )r   rJ   rR   rG   rG   rG   rH   test_univariate6   s    $rX   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sttttt t tttgtt d
td
idfkst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st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s@tttt t t	 d	 t	tttgtt d
t	d
d
d	td
idfkstttt tt	  t	tttgtt d
t	t d
idfksttttd  d
 ttgttd  d
d
d
idfkst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sJtttd td  td  tttgtd d
td d
td d
idfkstd S )Nc                   S   s   t td d d S )NrU   rN   rT   )r+   rJ   rG   rG   rG   rH   rK   <   rL   z$test_classify_diop.<locals>.<lambda>c                   S   s   t dS NrT   r+   rG   rG   rG   rH   rK   =   rL   c                   S   s   t tt t t d S rY   )r+   wrJ   yzrG   rG   rG   rH   rK   >   rL   c                   S   s    t td td  td  d S )NrN      Z   )r+   rJ   r\   r]   rG   rG   rG   rH   rK   ?   rL      rU      *   rT   iZ
univariateZinhomogeneous_ternary_quadraticZinhomogeneous_general_quadraticZhomogeneous_general_quadraticZ
cubic_thuer^   b   iZgeneral_sum_of_even_powersZ$homogeneous_ternary_quadratic_normal)
r?   rO   
ValueErrorNotImplementedErrorr+   rJ   rR   r\   r]   r[   rG   rG   rG   rH   test_classify_diop;   sb      
  

  
  
  
        rf   c                   C   s
  t tdkstt dt dks$tt dt dks8tt td dksLtt dt d dksdtt dt d dks|tt tt tt fkstt tt d	 tt fkstt tt d	 tt fkstt d	t t d
 dkstt dt dt  d
 dt d
 dt d
 fks$tt dt dt  d
 dt d
 dt d
 fksZtt dt dt  d
 dt d
 dt d
 fkstt dt d
t  d
t dt fkstt dt dt  dt t fkstt dt dt  d dt d dt d fkstt dt dt  d dks:tt d	t dt  dt  d
 dt d
 dt d
 fksxtt dt dt  dt  d
 tdt dt  d
 dt dt  d
 fkstt dt dt  dt  d
 d dkstt dt dt  dt  d
 dkstt d
t dt  dt  d tdt dt  d dt dt  d fksntt dt dt  dt  d dt d tdt  tfkstt dt dt  dt  t tttt dt dt  dt  fkstt	t
dd  d S )N)r   rT   rN   )rU   rD   r^   )r      )rh         )NN   )r   ri   ri   NNN      	         c                   S   s   t td S NrU   )r   rJ   rG   rG   rG   rH   rK   o   rL   ztest_linear.<locals>.<lambda>)r   rJ   rR   r\   t_0r]   t_1r[   t_2r?   rO   rG   rG   rG   rH   test_linearT   s2    666*(6">P,*P@Jr{   c                	   C   sn  t dt t dt  dt  d ddhks0tt dt t dt  dt  d t ks^tt d	t t dt  d
t  d dhkstt dt t dt  dt  d dhkstt dt t dt  dt  d ddddddddhkstt dt t dt  dt  d t ks&tt tt t t d dtftdfhksTttdt t sjtd S )NrN   "   rs   rT   )i{)ri   irm   rU   r^   6   )   r      )rg   ri   8   rk   )i_rp   )i)i)ii)r   @   )irk   rT   )i   rh   rt   rg   0   )r   rJ   r\   rR   rQ   tr   rG   rG   rG   rH   %test_quadratic_simple_hyperbolic_caser   s     "...(   
0.r   c                   C   s:  t dtd  dt t  dtd   dt  dt  d dhksFtt d	td  d
td   dt  dt  d t kstt td td  dt  dt  d dhkstt dtd  dt t  dtd   dt  dt  d dhkstt dtd  dt t  dtd   d ddddhks6td S )Nrb   rU   rn   ra         i3  )r}   rg   r^   rN   ri      rs   rg   rg   rt   r`   V  )rm   
   r|   rg   rU   rT   rh   rT   rT   )r   rJ   r\   rR   rQ   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@tt dtd  dt t  dtd   dt  d	t  d stt dtd  dt t  dtd   d
t  dt  d stt dtd  d
t t  td  dt  d stt td dt t  td  dt  dt  d s.tt td dt t  td  dt  dt  d shtt td dt  d std S )Nrn   rU      rr   ri   rk      rm   rs   r^   rN   rT   )   (   check_solutionsrJ   r\   rR   rG   rG   rG   rH   test_quadratic_parabolic_case   s    @@@4::r   c                   C   s   t dt t stt dtd  dt t  td  d s@tt dtd  dt t  dtd   dt  dt  d stt d	td  d
t t  dtd   dt  dt  d	 stt dtd  dt t  dtd   dt  d
t  d stt dtd  dt t  dt  dt  d s8tt dt t dtd   dt  dt  d sntt td td  dt  dt  stt td dtd   dt  dt  stt dtd  dtd   dt  d	t  d std S )Nr   r^   rU   ri   rh   rN   r      rs      rn   r       r   r   rt   rm   r   rG   rG   rG   rH   test_quadratic_perfect_square   s    ,@@B66*.r   c                   C   s   t td dt  dtd   s$tt dtd  dtd   dt  dt  sTtt td tt  td  dt  s|tt td dtd   dt  dt  stttd td  dt  dt  d  dhkstd S )NrU   ri   rN   rt   rm   r   )r   rJ   r\   rR   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||r8tq8d S )NirU   rN   rT   rJ   r\   r   rI   ZxreplacedictziprR   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$tq$d S rw   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@tt dtd  dt t  dtd   d	t  d sxtt d
t dtd   t dt t  dtd   stt ddt  dtd   dt  tt  dtd   std S )Nrn   rU   r   r   r   r   rp   rk   ri   r   r^   rN   rT   r   rG   rG   rG   rH   test_quadratic_non_perfect_slow   s    @88r   c                   C   s  t dddgkstt ddg ks&tt dddgks:tt d	d
dgksNtt ddg ks`tt ddg ksrtt dddtfgkstt dddt tfgkstt ddg kstt dddgkstt dddgkstt dddgkstt ddddgkstt ddddddgks(tt dddgks>tt ddd gksTtt d!dd"gksjtt d#dd$gkstt d%dd&gkstt d
dd'gkstt d(dd)gkstt ddd*gkstt d%dg kstt d+dd,gkstt d-dd.gkstt d/dd0gks.tt d1dg ksBtt dd2d3d4d5gks\ttd6dd7d8dd2d9ksxtt dd:d;d<d=d>gksttt d?d@dAdBdCdDdEdFhkstt ddGdHgkstt dIdJg kstt dddKdLgkstt dMdNdAgkstt dMdOg ks$tt dPdOdQgks:ttdRddSddPdOsRtt dPdTdUdVgksjtt ddtdtfgkstt ddtg kstd S )WNrN   r   r   r   rj   ir   rU   rT   r~   r   r   r   ri   rt   r   r      )rr   r^   iL)rs   rm   rk   rg   rT   rU      )rs   ri   )ri   rs   )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^	 )!   rn      )   '   )rr   ri   r   )r   ri   i"  )r   rT   	S  l   !K2l   uGoX r   r   rN   rT   )  m   $   r   rp   r   r   Tr   )   =   r   r   )      rs   rN      rs   )r   rT   )i)  iS  )iX i  )ipi"'M)l   ;>x< i|)l   )fMOl   ?_r   )i  i     rr   )r   rT   )rm   rT      rU   rh   {   )r   rT   r   r}   i)rT   )r   rT   )r   rR   r   r   rQ   rG   rG   rG   rH   test_DN   sZ     r   c                   C   s   t dddddgkstt ddddd	d
gks2tt ddg ksDtt dddgksXtt ddddgksntt dddgkstt dddgkstt ddtdgkstt ddtdtfgkstt ddtdt tfdt tfgkstt ddtdgkstt ddtg kstd S )Nr   r   r   )rp   rT   r   r   r   )r   rN   r   )ir   r   rh     rT   )l   uL" l   EY   rq   rt   rT   r   r   rg   r   iT  )i  r   r   r   r^   rU   rN   )r   rR   r   rG   rG   rG   rH   test_bf_pell  s    (r   c                   C   s|   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sPtt dd
ddksdtt ddddksxtd S )NrU   rT   r   rh   r^   ri   rN   rj   r   r   rm   rk   r   r   )r!   rR   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 ]}|| krz dS qztd td dfD ]}|| krd||< q|td  dkrt|td  |td  ot|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>9  s     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<tt dtd  dt t  dtd   dt  dt  d	 s|tt td td  d
 stt td  dtd   d	 stt dtd  dt t  dtd   dt  dt  d stt dtd  dt t  td  dt  dt  d s8tt td dt t  dtd   dt  d	t  d svtt dtd  dt t  dtd   d	t  dt  d std S )Nr~   rU   rk   r`   r   r   ri   r   r   r   r   -   r      r   rN   r      r   ra   rt   r   )r   rJ   r\   rR   rG   rG   rG   rH   test_transformation_to_pellJ  s    <@"@>>r   c                   C   sL  t td dt  td  dks$tt td dtd   d dksHtt td dt t  dtd   d dksxtt dtd  d	t t  td  d
 dkstt dtd  dt t  td  d dkstt dtd  dt t  td  dkstt dtd  dt t  td  dt  dt  d dksHtd S )NrU   r   rN   ri   )rN   ri   r^   rk   )ri   rk   rn   rt   )ru   r   rs   )rn   T   rp   )rT   r   r~   r`   )e   i)r   rJ   r\   rR   rG   rG   rG   rH   test_find_DNU  s    $$000.r   c                  C   st   ddddddddd	d
ddg} | D ]<\}}t ||\}}}||d  ||d   |d ks tq t ddd ksptd S )Nr   r   rN   r}   r   i)r^   rl   )rl   r^   [   rp   r   rT   rg   )r^   r   r   r   i) rT   r   irU   rg   )r    rR   r   abr[   rJ   r\   rG   rG   rH   test_ldescent_  s       &r   c                   C   s  t dtd  dtd   td  s(tt dtd  dtd   td  sPtt dtd  dtd   td  sxtt dtd  d	td   dtd   stt td dtd   td  stt dtd  dtd   td  stt td td  td  stt d
td  td  dtd   s<tt d	td  td  dtd   sftt dtd  dtd   dtd   stt dtd  dtd   dtd   stt dtd  dtd   dtd   std S )N   rU   A  r   ih  ri   r^   rN   rm   r   r   r   r   rs   rt   r|   i-  |   r   1  r   rJ   r\   r]   rR   rG   rG   rG   rH   "test_diop_ternary_quadratic_normali  s    (((,$("**..r   c                    s   t | }|ttttg \ t| ttttf f}t fdd|j	D }     fD ]}||
 krr dS qrdS )Nc                    s    g | ]}t |j g qS rG   )r   r   r   r   r   ZrG   rH   r   }  s     z/is_normal_transformation_ok.<locals>.<listcomp>FT)r*   r
   rJ   r\   r]   rI   r   r   r   r   r   )rF   r   r   r   r   rG   r   rH   is_normal_transformation_okx  s     r   c                   C   s  t td dtd   td  dt t  dt t  dt t  sHtt td dtd   dtd   sptt td dt t  stt dtd  dtd   dt t  stt td dt t  dt t  dt t  stt td dt t  dt t  tt  stt td td  td  tt  tt  tt  sXtt td dt t  dtd   stt tt dt t  dt t  stt dt t dt t  std S )	NrU   rN   r   r   rs   d   r   r|   )r   rJ   r\   r]   rR   rG   rG   rG   rH   test_transformation_to_normal  s    H(,42:**r   c                  C   s  t dtd  td  td  dt t  s0tt td td  td  tt  tt  s`tt dtd  tt  tt  tt  stt td tt  tt  stt dtd  dt t  tt  stt dtd  dtd   tt  stt dtd  dtd   td  dt t  dt t  dt t  sJtt dtd  dt t  sltt dtd  dtd   dt t  td  stt td d	td   td  d
t t  dt t  stt dtd  dtd   dt t  dt t  dt t  s&tt td dtd   td  tt  dt t  s`tt td dtd   td  tt  dt t  dt t  stt td dtd   td  d
t t  dt t  dt t  stt tt dt t  d
t t  stttd td  td  dks@tttd td  d ks^tttdd  dt t dt t  dtd   dt t  dtd   } t| dksttdtd  dtd   td  dkstttt dt t  ddt	fkst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stttt dt t  dt t t	 td  td  tt fkstd S )NrU   r^   rN   ri   rk   rn   rs   r   1   r   r_   r   r   ro   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   )r5   rJ   r\   r]   rG   rG   rG   rH   rK     s    
"z-test_diop_ternary_quadratic.<locals>.<lambda>rh   rm   )rk   rU   r   )rT   r   rU   r   rj   rq   )r   rJ   r]   r\   rR   r   r?   rd   r   rC   r2   pqr   rE   rG   rG   rH   test_diop_ternary_quadratic  s>    00, ((N"6>F:FJ*&<"

08
r  c                   C   s   t dt d  krdks"n tt ddks2tt dt d  krNdksTn tt dt d  krpdksvn tt d	t d
  krdksn tt ddkstt ddkstt ddkstt ddkstt ddkstt td
dkstd S )NrT   rg   r   ri   rj   r^   r   rU   rs   r   rm   rr   rN   4   r  rk   i  r`   )r&   rR   r   rG   rG   rG   rH   test_square_factor  s    """"r  c                   C   s   t td td  td  s tt td dt t  td  sDtt dtd  dtd   td  sltt dtd  dtd   td  dt t  dt t  dt t  stt td td  td  stt td dtd   td  dt t  d	t t  stt d	t t td  s4tt d
td  dtd   dtd   sbtt dtd  dtd   dt t  dt t  dt t  stt dtd  dtd   dt t  dt t  dt t  stt d
td  dtd   dtd   std S )NrU   r   r   rN   ri   rk   r  r   rn   r   r   r         r   r   r_   r   rG   rG   rG   rH   "test_parametrize_ternary_quadratic  s     $(L >.FFr	  c                   C   s   t dt t tt  dt t  s(tt dt t dt t  dt t  sTtt dt t dt t  sttt tt tt  tt  stt dt t dt t  dt t  std S )NrU   rN      iY  rs   r   r|   r   rG   rG   rG   rH    test_no_square_ternary_quadratic  s
    (,  r  c               	   C   s   ddddddddd	g	} | D ]<\}}t ||\}}}||d
  ||d
   |d
 kstqttdd  ttdd  ttdd  d S )Nr   r   r   r   r   r   r   r   r   rU   c                   S   s
   t ddS )Nrg   rp   r   rG   rG   rG   rH   rK     rL   ztest_descent.<locals>.<lambda>c                   S   s
   t ddS )Nr   rN   r  rG   rG   rG   rH   rK     rL   c                   S   s
   t ddS )Nr^   rN   r  rG   rG   rG   rH   rK     rL   )r   rR   r?   rO   ZeroDivisionErrorr   rG   rG   rH   test_descent  s    &r  c               	   C   s  t tt tt  tt  s tt tt td td  td   sHtt tdt  dt  td td  td   s|tt td dtd   d stt td dt t  stt td dt t  td  stt ttd td  d  stt tdt dt  d  stt td dtd   d td td  d  sTtt td dtd   d tdt   stt td td  td  tdt  dt  dt   stt td dt t  dt t  stt td dt  d stttt ttttks(ttd td  d } t| d	d
t|  d	d
ks\ttdt t dt t  dt	 dt	 fhksttd td  td  d } dh}t| |kstt
t| }t| d	d
|kstttd ttdd  d t
 kstdtd  dtd   td  } |  }ttttf|dhksXt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stdtd  dtd   td  } |  }ttttf|dhks
t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sptdtd  dtd   dtd   } |  }ttttf|dhkst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s&td%td  d&td   d'td   } |  }ttttf|d(hksnt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sttd dtd   d1td   } |  }ttttf|d2hks tt| d3t t dtd  d3td   td d1td   fhksftttd4d5  tdt t
 ksttdt dt  tj d6d7d8d9d:hkstttd td  dt  d d	d
d;d<d=d>d?d@dAdBhkstttd td  dC dD ttfd	dEdFdGdHdIdJdKdLdMhks8tttd td  dC dD ttfd	dEdFdGdHdIdJdKdLdMhksxtt td t stt td t stttd t tttd fhkstttd t ttd t fhkstd S )NNrU   rN   rk   rT   ra   ri   r^   a   Tpermuter`   rT   rU   rN   \   c   )rt   rk   3   i{  rt   iKf   i  ij  r  )rT   rT   rU   rh   i  9      )i  iU
  i  i i ii ia i iڙ iV
 i=  i  i  )r        i	  i>  iipE i* i',  i  i  rs   )r   rU   rT   r   c                   S   s   t ttd  d S )NrU   rT   r   rJ   r\   rG   rG   rG   rH   rK   ,  rL   z"test_diophantine.<locals>.<lambda>)rm   rN   )rh   rT   )r^   r^   r   )rN   rm   )rg   rT   )r   rg   r   r   )r   rT   r   )r^   rT   )r^   rg   r   Q   )symsr  )rp   rh   )rp   rU   )rh   rp   )rh   rN   )rU   rp   rU   rN   )rN   rh   rN   rU   )r   rJ   r\   r]   rR   r[   r   r   r   rx   rQ   rA   popr   Zas_coefficients_dictr5   r  r  r?   re   r   ZHalfr   )rF   base_solcomplete_solnr   rG   rG   rH   test_diophantine  s     (4 $ "6.>*  4* 
 "" 
 "$
,
"
$
8"
 
6
."
$
$
&r#  c                  C   s  ddl m} m}m}m}m} t| d |d  |d  |d  sDtt| d d|d   d|d   |d  stttd| d  d|d   d|d   |d  sttd| d  d|d   d|d   d|d   sttd| d  d|d   d|d   d|d   stt|d  d| d   d|d   d|d   d|d   s^ttd| d  |d  d|d   |d  d|d   st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td S )	Nr   r   r   cderU   r^   rt   r   r   
parameters)	sympy.abcr   r   r%  r&  r'  r   rR   r<   r   rJ   r\   r]   r$  rG   rG   rH   test_general_pythagoreanB  s    (048:D>0Dr+  c                     s  t ddD ]*} ttdd td|  D |  s
tq
ttd td  d d ksVtttd td  td  d t	 ksttd td  td  d  t dhkstt
d td  td  td  td  d	  tt ddksttd
tdddf }tdd |D  d  dddddddddddddddd d!d"d#h}t |ksXttt dd$d%ksrttd&td  td  td  d'hksttd td  td  td  d(  tt fd)d* d S )+NrN   r   c                 s   s   | ]}|d  V  qdS rU   NrG   r   irG   rG   rH   	<genexpr>S  s     z9test_diop_general_sum_of_squares_quick.<locals>.<genexpr>z:%irU   r`   r  i!  z:56Tnegativec                 S   s   g | ]}|d  qS rW   rG   r-  rG   rG   rH   r   ^  s     z:test_diop_general_sum_of_squares_quick.<locals>.<listcomp>p   )r   rT   rT   ri   rm   rl   )rT   rT   rT   rN   rm   rq   )rU   rN   rN   r^   ri   rl   )r   rT   rT   rT   rN   r   )r   r   r^   r^   r^   rq   )rT   rU   rN   rN   ri   rq   )r   rT   rU   rN   rk   rl   )rU   rU   r^   r^   rm   r   )rT   rT   rN   r^   rm   rl   )r   rU   rN   rN   rN   r   )r   r   rU   rU   rU   r   )rT   rT   rU   rN   r^   r   )r   rT   rT   rU   ri   r   )r   r   rU   rm   rm   r   )rT   rN   r^   ri   ri   r   )r   rU   rU   rU   rm   rq   )r   rN   rN   rN   rm   rl   )r   rU   rN   ri   ri   rl   )r   rT   ri   ri   ri   r   r  i  rs   )rU   rU   rU   r^   c                      s
   t   S rD   rZ   rG   rE   rG   rH   rK   n  rL   z8test_diop_general_sum_of_squares_quick.<locals>.<lambda>)ranger   sumr	   rR   r   rJ   r\   r]   rQ   r   r   lenr   r   r   r   r%  r&  r?   re   )r.  var	base_solnrG   rE   rH   &test_diop_general_sum_of_squares_quickQ  sD    ( *,           ,$r9  c                  C   sX   t d td  td  d } ddddddd	d
ddddddddddh}t| |ksTtd S )NrU   i@B )r   r     )r   `  i  )  X    )r   r>  r   )r   r>  i  )r   r<  iX  )        )r   r=     )  @  r   )   r<  `  )r   rC  rA  )r;  h  rF  )i  r<  r   )rG  r<  rB  )r@  r=  r   )`   rG  i  )r?  rD  rB  )rH  r<  ih  )rJ   r\   r]   r   rR   )rF   r8  rG   rG   rH   test_issue_23807q  s"    
          rI  c                  C   s   dD ]4} t ddD ]$}t| |D ]}t||ks tq qqttddg ksPtdd tdddD dddddgddddd	gdddddggkstttdd
gkstttddd
gkstdd tdD dddgdd	gdggkstd S )N)rn   r   rT   rn   rN   ri   c                 S   s   g | ]}t |qS rG   list)r   r  rG   rG   rH   r     s     z'test_diop_partition.<locals>.<listcomp>r   rU   rG   c                 S   s   g | ]}t |qS rG   rJ  r-  rG   rG   rH   r     s     )r4  r#   r6  rR   rK  )nkr  rG   rG   rH   test_diop_partition|  s      
rN  c                  C   sf   dD ](} t | \}}|d |d  | kstqt dd ks>tt d}|dkr^t|d tksbtd S )N)
ri   r   r   rv   %   r   i%	  i  i  iY  rU   rk   i5 )i  i  r   )r%   rR   typeint)r.  r   r   ansrG   rG   rH    test_prime_as_sum_of_two_squares  s    rS  c                  C   s|   dD ]2} t | \}}}|d |d  |d  | kstqt dd ksHtt dd ksXtt ddkshtt ddksxtd S )	N)r   rT   rU   r|   r   l   my l   85Jdl   8l9_	 rB  i!  i"  i#  i$  i%  i&  rU   rk   i <  r   )ri   r   r   r^   r   r   rU   )r(   rR   )r.  r   r   r%  rG   rG   rH   test_sum_of_three_squares  s    "rU  c                  C   s   ddl m}  | dd}tdd t|D |ks4ttddksDttdd	ksTttd
dksdttddkstttddksttddkstd S )Nr   )randintrT   l    @ k c                 s   s   | ]}|d  V  qdS r,  rG   r-  rG   rG   rH   r/    s     z+test_sum_of_four_squares.<locals>.<genexpr>)r   r   r   r   r`   )r   rT   rU   rN   ra   )rT   rT   rU   rN   rr   )rT   rU   rU   rN   r   )r   rT   rN   rN   r   )r   r^   r^   r^   )Zsympy.core.randomrV  r5  r'   rR   )rV  rL  rG   rG   rH   test_sum_of_four_squares  s    
rW  c               	   C   sB  dddddddg} | D ]x}|\}}}t |||}zBt|}t||ksJtd}|D ]}|||  }qR||ksptW q0 tk
r   Y qY q0X q0qtt d	d
ddddgkstttdd  ttdd  ttdd  tt dd
d
g ksttt ddddgksttt dd
dg ks&ttt dd
ddgksBttt dddddddgksdttt dddddg ksttt ddd
d gksttt ddd
g ksttt ddd
dd!gksttt ddd
dg kstttt d"d
ddkstd#}	d$D ]$}
tt|	d
|	|
 g kstqd S )%N)r   rN   rU   )r   rU   r^   )rU   rT   rU   )rN   rT   rN   )ri   rU   rU   )i@0  rU   r^   )i  rU   rN   r   ru   rU   r^   T)rT   rT   rN   rN   )r   r   rU   r^   c                   S   s   t tdddS )Ng333333?rU   rK  r$   rG   rG   rG   rH   rK     rL   z+test_power_representation.<locals>.<lambda>c                   S   s   t tdddS NrU   r   rX  rG   rG   rG   rH   rK     rL   c                   S   s   t tdddS rY  rX  rG   rG   rG   rH   rK     rL   rg   rT   rV   rN   rW   r  rm   )Zzeros)rT   rU   rU   rU   rU   rU   )r   r   r   r   r   rN   ri   Frh   r   r   i  pi   @)r   r   rk   ri   r^   rU   rT   )	r$   nextr6  rR   StopIterationrK  r?   rd   r3   )teststestrL  r  rM  flZchk_sumZl_ibigr.  rG   rG   rH   test_power_representation  sJ    

ra  c                  C   s   t dddd\} }t|d | |  d }|dddd	d
dhksBtt dddd\}}t|| d|  d|  d }|ddddddhkstdS )z<
    Test whether diophantine respects the assumptions.
    zm nT)rB   ZpositiverU   i  )ri   ru   )r   r   )_   ri   )y   r^   )   rU   )i  rT   za bFrN   rm   )r   rp   )r   r   )rl   rj   )r   r   )rj   rq   )r   r   N)r	   r   rR   )mrL  Zdiofr   r   rG   rG   rH   test_assumptions  s     rf  c                 C   sd   t | }t| }t| j}|jtd |r`| }|D ] }t|	t
||dkr8 q(q8dS q(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_argsrK  free_symbolssortr   r   rI   r   r   )rF   sZfactorsr7  solutionr^  rG   rG   rH   r     s    

r   c               	   C   s  dt  t d d } t| tdt d fhks2t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sttt td  d td  d t fhksttt t d tdt fksttd	ddd d
dkstdt d dt d f}tdddt|ks,ttdddd d
t	dd |D ksTtt
dddd ksjtt
ddddhkstt
ddddhkstttdd  tddddksttd  t d  td  td  } t| t|    krBtd td  td  dt t dt t td td  td  fksHn ttttdt d  tdt d  tdt gd	ksttttddtdt  tdt gd	ksttttdt  tddtdt gd	ksttdddksttdtd   krdksn ttd	td	   kr@dksFn ttddddks\tttdd  tdddd kstttd!d  ttd"d  tt d td  d d# d$d%d&d'd(d)d*d+hkstd S ),NrU   rT   rh   rm   rs   r^   rr   rN   r   r   r   rn   c                 s   s   | ]}| td V  qdS )r   N)r   r   )r   _rG   rG   rH   r/    s     z$test_diopcoverage.<locals>.<genexpr>ru   ri   r   r   r  c                   S   s   t dddS )Nr^   ru   rT   )r"   rG   rG   rG   rH   rK     rL   z#test_diopcoverage.<locals>.<lambda>r   r   r   TFr  c                   S   s   t dS )N)rU   r^   rm   )r9   rG   rG   rG   rH   rK   $  rL   r_   n   i6  )r   rT   ri   c                   S   s,   t td td  tt  dt t  d S )NrU   rs   )r   rJ   r\   r]   rG   rG   rG   rH   rK   )  rL   c                   S   s   t td td  S )NrN   rU   r  rG   rG   rG   rH   rK   *  rL   r  )r   rg   r   )rg   r   )rg   rt   )rT   r   )rT   rt   )rt   rg   r   )rJ   r\   r   rx   rR   r   r   r   r,   tupler-   r?   rd   r/   r[   r]   r   m1m2m3r6  r1   r   r   r6   r7   r8   r9   rO   r.   re   )rF   rR  rG   rG   rH   test_diopcoverage   sP    8,. ("
 
 :00((

rs  c                   C   sF   t dddddddkstt dddd	d	d
dks4tttdd  d S )NrU   rk   r   r^   O   r   rU   rk   r   rm   rT   r   )rU   rm   rU   c                   S   s   t ddddddS )NrU   rk   r`   r^   rt  r   )r0   rG   rG   rG   rH   rK   8  rL   ztest_holzer.<locals>.<lambda>)r0   rR   r?   rd   rG   rG   rG   rH   test_holzer/  s    rv  c            
         s    fdd} d\ d \}}}}d \}}}}| | dksFt | | dksVt t |d  |d  |d     kst t |d  |d  |d     kst t||| }	|	|kst d S )Nc                    s$    | d  |d   |d   S rw   rG   )rJ   r\   r]   r   r   r%  rG   rH   rK   =  rL   z"test_fail_holzer.<locals>.<lambda>)r^   rt  r   )   rT   r   ru  r   rU   )rR   maxr0   )
rF   rJ   r\   r]   Zxyzr   r   r   rR  hrG   rw  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sJtd S )Nrm   rt   ru   rv   )	r   r[   r\   rJ   r]   rx   ry   rz   rR   rG   rG   rG   rH   test_issue_9539I  s    $r|  c                   C   sJ   t dtd td  td   dtt tt  tt    dhksFtd S )NrN   rU   r`   r   r   r   )r   rJ   r\   r]   rR   rG   rG   rG   rH   test_issue_8943N  s
    6r~  c                     s   t d td  td  d  t ddhks0tt dddhksFttt fdd tdd	d
} t d td  | d  d  t dhkstt	t d td  d t
 ksttt d td  d ddt
 kstd S )Nr^   iq
  )rN   rm   rm   )rU   r^   rk   rU   c                      s   t   dS rw   )r   rG   rE   rG   rH   rK   X  rL   z.test_diop_sum_of_even_powers.<locals>.<lambda>negTr1  )rp   rm   rm   r   )limit)rJ   r\   r]   r   rR   r   r?   re   r	   r   rQ   )r  rG   rE   rH   test_diop_sum_of_even_powersT  s    "r  c                     s  ddddddddd	d
ddddh} t d td  td  td  td  d }t|t}t|dksft|| ksrtt	t
dd  ttddg kstttddg kstttddddgkstttddg kstttdddgkstttddg kstttddddgks(tttd ddd!d"gksFtttd#d#d$gks`td%d& td'D ddddddddddddddddddddddddddddddgkstd(d& td'D ddddddddddddddddddddddddddddddgksttd'D ]b tt dd}|rNt fd)d*|D sNttt d}t fd+d*|D stqt	t
d,d  t	t
d-d  ttd.ddd/gkstttd.ddg kstttddddgkstttddddd0d1gks
tttddddd2d3d4gks,tttd5ddg ksFtttd6ddg ks`tttd7ddd8gkrd7d7kstttdd9 ddg kstd S ):N)r   r   rT   rT   r   )r   r   ri   rk   rk   )r   rT   rN   rk   rn   )r   rT   r^   ri   rt   )r   rN   r^   rk   rk   )r   rN   ri   ri   rn   )rT   rT   rU   rm   rt   )rT   rT   rm   rm   rk   )rT   rU   rN   rN   r   )rT   rN   r^   r^   rt   )rT   ri   ri   rm   rm   )rU   rU   rN   ri   rt   )rU   rN   ri   rm   rk   )rN   rN   r^   ri   rn   rU   r   r`   c                   S   s   t tddS )Nr   rg   )rK  r4   rG   rG   rG   rH   rK   i  rL   z,test_sum_of_squares_powers.<locals>.<lambda>r   rN   r   Tr}  r^   rT   rW   ri   2   )ri   ri   )rT   rk   r   )rT   rT   rT   rU   rU   )r   r   rT   rT   rN   rn   )rT   rT   rT   rT   rT   rT   rT   rT   c                 S   s    g | ]}t tt|d dqS )ri   Tr6  rK  r4   r-  rG   rG   rH   r   u  s     z.test_sum_of_squares_powers.<locals>.<listcomp>r   c                 S   s   g | ]}t tt|d qS )ri   r  r-  rG   rG   rH   r   |  s     c                 3   s$   | ]}t d d |D  kV  qdS )c                 s   s   | ]}|d  V  qdS r,  rG   r   jrG   rG   rH   r/    s     7test_sum_of_squares_powers.<locals>.<genexpr>.<genexpr>Nr5  r   r.  rG   rH   r/    s     z-test_sum_of_squares_powers.<locals>.<genexpr>c                 3   s$   | ]}t d d |D  kV  qdS )c                 s   s   | ]}|d  V  qdS r,  rG   r  rG   rG   rH   r/    s     r  Nr  r   r  rG   rH   r/    s     c                   S   s   t tdddS )NrU   rg   rT   rK  r3   rG   rG   rG   rH   rK     rL   c                   S   s   t tdddS )NrU   rT   rg   r  rG   rG   rG   rH   rK     rL   rh   r   rT  )r   rT   rT   )r   ri   )rT   r^   r  rm      i  )rt   r:  )r   r   rJ   r\   r]   r   r   r6  rR   r?   rd   rK  r4   r4  rQ   allr3   )ZtrurF   rR  s1s2rG   r  rH   test_sum_of_squares_powers`  s          ,
                                                 "  "&r  c                   C   sr   t dddkstt dddks$tt dds2tt dds@tt ddsNtt dds\tt dddksntd S )	NrN   rg   Frp   rT   r   r^   rU   )r:   rR   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sFttt	|
 }t|dd|ksjt| d |d  |d  |d  |d  d	 }tt|d
ksttt|dddkstddddh}tdtd  dt t  dtd   d dd|kstd S )Nr   r$  r^   r  r  Tr  rU   r   #   i0  r   r   r   r   r   rs   r|   )r*  r   r   r%  r&  r'  r   rR   rQ   rA   r   r6  rJ   r\   )	r   r   r%  r&  r'  rF   r!  r"  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s4td S )NrU   r^   rT   r  r  r   )rT   rN   )rJ   r\   r   rR   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s6t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     rL   z!test_issue_9538.<locals>.<lambda>)rJ   r\   r   rx   rR   r?   rO   rG   rG   rE   rH   test_issue_9538  s    &r  c                  C   sF  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stt td dtd   dtd   } | d| | |d d|d   |d d|d   fhkstt dtd  dtd   td  } | d|d  |d  d|d  d| |  |d  d|d  d| |  d|d   fhkstt dtd  dtd   dtd   } | d|d  d|d   d	| | d
|d  d|d   fhkst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st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sBtd S )NrU   rh   r^   rN   H   r   r   rt   rm   rn   ri   rk   r   r   r   i~i i
  ix  i:
 ii  ib<  )	r   rJ   r\   r]   r   r   rh  rR   r2   )rj  r  r  rrG   rG   rH   test_ternary_quadratic  sJ    $.*$>$2"(FB  



" 
"r  c                     s  t g g  t t kst jdks*t jdks8ttt fdd t  g ks^tt t	t
gttgjt	t
fkstjttfkstttfdd d tdhkstddtf tddtfhksttt fdd t t	dt
tit	dt
d	igks(tt t	t
tgttgtjd
ksPttd
 t tt df ttd
 t tt dfhksttd
td	 d
t dfhkstd
td	 d
t dfhksttdtdidhkstdddhksttditd dt dfhks6tdtd dt dfhksXttdtd
 d td dfhkstd dtd
 d td dfhksttd
tdidhkstd
ddhksttdtdidhkstdddhkst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std S )NrG   c                      s     tfS rD   )addrJ   rG   )r  rG   rH   rK     rL   z/test_diophantine_solution_set.<locals>.<lambda>c                      s
     dS )NrV   r  rG   )r  rG   rH   rK     rL   )rN   r^   rg   c                      s
     S rD   )updaterG   )r  r  rG   rH   rK     rL   rN   r^   rU   rT   rk   rn   )r  rg   rT   ri   r   rp   )rs   r   rT   )   rn   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     rL   c                      s
     dS )NrG   r  rG   r  rG   rH   rK     rL   c                      s
     dS )N)rT   rU   rN   r^   r  rG   r  rG   rH   rK     rL   c                      s
     dS )Nr   r  rG   r  rG   rH   rK     rL   c                      s    dddS r  rG   rG   r  rG   rH   rK     rL   c                      s
    ddS )NrT   rl  rG   rG   r  rG   rH   rK      rL   r   r  r   r   )r;   rQ   rR   r	   r)  r?   rd   rK  Zdict_iteratorrJ   r\   r   r   r  r  r]   r6  r   rO   )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sNt|dddhksbtd S )	NirN   rU   r(  r   r  r   r   )rJ   r\   r=   r   r   r   rR   )rF   rk  rG   rG   rH    test_quadratic_parameter_passing  s    "r  N)Zsympy.core.addr   Zsympy.core.mulr   Zsympy.core.numbersr   r   r   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.core.symbolr	   Zsympy.matrices.denser
   Zsympy.ntheory.factor_r   Zsympy.simplify.powsimpr   Zsympy.core.functionr   Zsympy.core.sortingr   r   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   Zsympy.testing.pytestr>   r?   r@   Zsympy.utilities.iterablesrA   r   r   r%  r&  r  r  rJ   r\   r]   r[   r   r   r   r   r   r   rx   ry   rz   Zt_3Zt_4Zt_5Zt_6rp  rq  rr  rC   rI   rP   rS   rX   rf   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+  r9  rI  rN  rS  rU  rW  ra  rf  r   rs  rv  r{  r|  r~  r  r  r  r  r  r  r  r  r  rG   rG   rG   rH   <module>   s    &
	K	

$Y 	-/
6

1