
    EdY                         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mZmZ d	 Zd
 Zd Zd Zd Zd ZdS )    )defaultdictAdd)Mul)S)construct_domain)PolyNonlinearError   )SDM	sdm_irrefsdm_particular_from_rrefsdm_nullspace_from_rrefc                    t          |          }t          | |          \  }}t          |||          }|j        }|j        s|j        r>|                                                                d                                         }t          |          \  }}}	|r|d         |k    rdS t          ||dz   |          }
t          ||j        |||	          \  }}t          t                    }|
                                D ]9\  }}|||                                      |                    |                     :t%          ||          D ]^\  }}||         }|                                D ]<\  }}|||                                      ||                    |          z             =_d |                                D             }t&          j        }t+          |          t+          |          z
  D ]}|||<   |S )a  Solve a linear system of equations.

    Examples
    ========

    Solve a linear system with a unique solution:

    >>> from sympy import symbols, Eq
    >>> from sympy.polys.matrices.linsolve import _linsolve
    >>> x, y = symbols('x, y')
    >>> eqs = [Eq(x + y, 1), Eq(x - y, 2)]
    >>> _linsolve(eqs, [x, y])
    {x: 3/2, y: -1/2}

    In the case of underdetermined systems the solution will be expressed in
    terms of the unknown symbols that are unconstrained:

    >>> _linsolve([Eq(x + y, 0)], [x, y])
    {x: -y, y: y}

    r   Nr
   c                 (    i | ]\  }}|t          | S  r   ).0stermss      =lib/python3.11/site-packages/sympy/polys/matrices/linsolve.py
<dictcomp>z_linsolve.<locals>.<dictcomp>j   s"    
6
6
6ha1c5k
6
6
6    )len_linear_eq_to_dictsympy_dict_to_dmdomainis_RealFieldis_ComplexFieldto_ddmrrefto_sdmr   r   r   oner   listitemsappendto_sympyzipr   Zeroset)eqssymsnsymseqsdictrhsAaugKArrefpivotsnzcolsPV	nonpivotssolivnpiVisymzeror   s                        r   	_linsolver>   .   s   . IIE &c400LGSGS$//DA
 	~ 0* 0{{}}!!##A&--// &dOOE66  &*% t 	!a88A +5!%OOLAy d

C		 + +1DGAJJqMM****y!$$ 5 5R3iHHJJ 	5 	5DAqQLajjmm 34444	5 7
6#))++
6
6
6C 6DYYS!  A Jr   c                 B    t          |          j        d | D              }t          |dd          \  }}t          t	          ||                    t          |           }t          |          }t          t	          |t          |                              g }t	          | |          D ]K\  }	}
fd|	                                D             }|
r|
          ||<   |r|                    |           Lt          t          |          ||dz   f|          }|S )z?Convert a system of dict equations to a sparse augmented matrixc              3   >   K   | ]}|                                 V  d S N)values)r   es     r   	<genexpr>z#sympy_dict_to_dm.<locals>.<genexpr>w   s*       @ @ @ @ @ @ @ @r   T)field	extensionc                 4    i | ]\  }}|         |         S r   r   )r   r   celem_map	sym2indexs      r   r   z$sympy_dict_to_dm.<locals>.<dictcomp>   s'    CCC1)A,CCCr   r
   )r)   unionr   dictr'   r   ranger$   r%   r   	enumerate)
eqs_coeffseqs_rhsr+   elemsr0   elems_Kneqsr,   r-   eqr.   eqdictsdm_augrI   rJ   s                @@r   r   r   u   s(   CLL @ @Z @ @ @AE!%ttDDDJAwCw''((Hz??DIIESuU||,,--IGz7++ # #CCCCCC

CCC 	,&smOF5M 	#NN6""")G$$tU1Woq99GNr   c                 &    d fd| D             S )zUse expand to cancel nonlinear terms.

    This approach matches previous behaviour of linsolve but should be
    deprecated.
    c                 V    | j         r| j        | j        z
  } |                                 S rA   )is_Equalitylhsr.   expand)rT   s    r   	expand_eqz)_expand_eqs_deprecated.<locals>.expand_eq   s'    > 	!"&Byy{{r   c                 &    g | ]} |          S r   r   )r   rT   r\   s     r   
<listcomp>z*_expand_eqs_deprecated.<locals>.<listcomp>   s!    (((bIIbMM(((r   r   )r*   r\   s    @r   _expand_eqs_deprecatedr_      s.      
 )(((C((((r   c                     	 t          | |          S # t          $ r" t          |           } t          | |          cY S w xY wz1Convert a system Expr/Eq equations into dict form)_linear_eq_to_dict_innerr	   r_   )r*   r+   s     r   r   r      sU    3'T222 3 3 3$S))'T222223s    )>>c                     t          |          }g g }}| D ]?}t          ||          \  }}|                    |           |                    |           @||fS ra   )r)   _lin_eq2dictr%   )r*   r+   r-   rP   rT   r.   rU   s          r   rb   rb      sj    t99D2WG  "2t,,VvsGr   c                    | |v rt           j        | t           j        ifS | j        rt	          t
                    }g }| j        D ]_}t          ||          \  }}|                    |           |	                                D ] \  }}||                             |           !`t          | d |	                                D             }	|	fS | j        r~dx}	}
g }| j        D ]:}t          ||          \  }}|s|                    |           -|	|}	|}
4t          t          | |	i fS fd|		                                D             }	|
z  |	fS | j        rt          | j        | j        z
  |          S  | j        | s| i fS t          )z?Efficiently convert a linear equation to a dict of coefficientsc                 (    i | ]\  }}|t          | S r   r   )r   r<   coeffss      r   r   z _lin_eq2dict.<locals>.<dictcomp>   s"    III{sFc6lIIIr   Nc                 "    i | ]\  }}||z  S r   r   )r   r<   rH   coeffs      r   r   z _lin_eq2dict.<locals>.<dictcomp>   s#    @@@QS%!)@@@r   )r   r(   Oneis_Addr   r#   argsrd   r%   r$   r   is_Mulr	   r   rY   rZ   r.   has_free)asymset
terms_list
coeff_listaicitimijcijr   terms_coeffri   s              @r   rd   rd      s   F{ $!v15z!!	
 "! &&

& 	, 	,B!"f--FBb!!!HHJJ , ,S3&&s++++,Z IIj6F6F6H6HIIIe|	
 !""
& 	) 	)B!"f--FB )!!"%%%% ) ((Z  	/"9@@@@%++--@@@EK'..	
 !AEAEM6222QZ  !"u  r   N)collectionsr   sympy.core.addr   sympy.core.mulr   sympy.core.singletonr   sympy.polys.constructorr   sympy.polys.solversr	   sdmr   r   r   r   r>   r   r_   r   rb   rd   r   r   r   <module>r      s  : $ # # # # #             " " " " " " 4 4 4 4 4 4 2 2 2 2 2 2           D D DN  &) ) )3 3 3  &! &! &! &! &!r   