
    EdG                          d Z ddlmZ ddlmZmZmZ d Zd Zd Z	d Z
d	 Zd
 Zd ZddZd Zd Zd Zd Zd Zd ZdS )a"  

Module for the ddm_* routines for operating on a matrix in list of lists
matrix representation.

These routines are used internally by the DDM class which also provides a
friendlier interface for them. The idea here is to implement core matrix
routines in a way that can be applied to any simple list representation
without the need to use any particular matrix class. For example we can
compute the RREF of a matrix like:

    >>> from sympy.polys.matrices.dense import ddm_irref
    >>> M = [[1, 2, 3], [4, 5, 6]]
    >>> pivots = ddm_irref(M)
    >>> M
    [[1.0, 0.0, -1.0], [0, 1.0, 2.0]]

These are lower-level routines that work mostly in place.The routines at this
level should not need to know what the domain of the elements is but should
ideally document what operations they will use and what functions they need to
be provided with.

The next-level up is the DDM class which uses these routines but wraps them up
with an interface that handles copying etc and keeps track of the Domain of
the elements of the matrix:

    >>> from sympy.polys.domains import QQ
    >>> from sympy.polys.matrices.ddm import DDM
    >>> M = DDM([[QQ(1), QQ(2), QQ(3)], [QQ(4), QQ(5), QQ(6)]], (2, 3), QQ)
    >>> M
    [[1, 2, 3], [4, 5, 6]]
    >>> Mrref, pivots = M.rref()
    >>> Mrref
    [[1, 0, -1], [0, 1, 2]]

    )mul   )DMShapeErrorDMNonInvertibleMatrixErrorDMNonSquareMatrixErrorc                 X    t          t          t           t          |                      }|S )zmatrix transpose)listmapzip)aaTs     :lib/python3.11/site-packages/sympy/polys/matrices/dense.pyddm_transposer   .   s"    	c$Q  	!	!BI    c                 |    t          | |          D ]*\  }}t          |          D ]\  }}||xx         |z  cc<   +dS )za += bNr   	enumerater   baibijbijs         r   ddm_iaddr   4   \    a))  Bmm 	 	FAsqEEESLEEEE	 r   c                 |    t          | |          D ]*\  }}t          |          D ]\  }}||xx         |z  cc<   +dS )za -= bNr   r   s         r   ddm_isubr   ;   r   r   c                 F    | D ]}t          |          D ]\  }}| ||<   dS )z
a  <--  -aNr   )r   r   r   aijs       r   ddm_inegr!   B   sF      mm 	 	FAsDBqEE	 r   c                 J    | D ]}t          |          D ]\  }}||z  ||<    d S Nr   r   r   r   r   r    s        r   ddm_imulr%   I   sH      mm 	 	FAs!GBqEE	 r   c                 J    | D ]}t          |          D ]\  }}||z  ||<    d S r#   r   r$   s        r   	ddm_irmulr'   O   sH      mm 	 	FAsGBqEE	 r   c           	          t          t          |           }t          ||           D ]G\  }}t          |          D ]2\  }}t          t	          t
          ||          ||                   ||<   3HdS )z
a += b @ cN)r	   r   r   sumr
   r   )r   r   ccTr   r   r   cTjs           r   ddm_imatmulr-   U   sy    	c1gBa)) 2 2Bmm 	2 	2FAsCS))2a511BqEE	22 2r   Fc           	          t                     }|sg S t           d                   }d}g }t          |          D ]L|r:t          t          ||           fd          } |          |         c |<    |<    |                  }|s@t          |dz   |          D ]+} |                  }|r |          |         c |<    |<    n, |         }|dz  }	t          |          D ]}
||
xx         |	z  cc<   t                     D ][\  }}||k    s|         s|         }|xx         |z  cc<   t          dz   |          D ]}
||
xx         |||
         z  z  cc<   \|                               |dz  }||k    r nN|S )za  <--  rref(a)r   c                 :    t          |                             S r#   )abs)ipr   r   s    r   <lambda>zddm_irref.<locals>.<lambda>p   s    QrU1X r   )keyr   )lenrangemaxr   append)r   _partial_pivotmnipivotsr1   r    r   aijinvlkakakjr   s   `             @r   	ddm_irrefrC   ^   s    	AA 	AaD		A	AF1XX . .  	&U1a[[&>&>&>&>&>???BB%1KAaD!B% d1g  		AaCmm  eAh "#B%1KAaD!B%E
  qTbq! 	 	AqEEEVOEEEE q\\ 	% 	%EArAv RU Q%CqEEESLEEE1Q3]] % %1r!u$% 	a	Q 6 	E	 Mr   c           	         t          |           }|s|j        S t          | d                   }|j        }|j        }t          |dz
            D ]}| |         |         sIt          |dz   |          D ],}| |         |         r| |         | |         c| |<   | |<   | } n
-|j        c S |r| |dz
           |dz
           n|j        }t          |dz   |          D ]f}t          |dz   |          D ]P}	 || |         |	         | |         |         z  | |         |         | |         |	         z  z
  |          | |         |	<   Qg|| d         d         z  S )za  <--  echelon(a); return detr   r   r4   )r5   oneexquor6   zero)
r   Kr:   r;   rF   ufr@   r<   akkm1r   s
             r   ddm_idetrK      s    	AA uAaD		AGE	
B1Q3ZZ J JtAw 	1Q3]]  Q47 !"1qtJAaD!A$BE
 v +!A#qsaeqsA 	J 	JA1Q3]] J J%!Q!Q!A$q'!A$q'/ A5II!QJ	J "b	>r   c                    j         st          d          t          |          }|sd S t          |d                   |k    rt          fdt	                    D             }d t          ||          D             }t          |          }|t          t	                              k    rt          d          fd|D             | d d <   d S )NzNot a fieldr   c                 J    g | ]fd t                    D             S )c                 8    g | ]}|k    rj         nj        S  )rE   rG   ).0r   rH   r<   s     r   
<listcomp>z'ddm_iinv.<locals>.<listcomp>.<listcomp>   s*    888!QT%AEEqv888r   )r6   )rP   r<   rH   r;   s    @r   rQ   zddm_iinv.<locals>.<listcomp>   s8    
K
K
KQ88888uQxx888
K
K
Kr   c                     g | ]
\  }}||z   S rO   rO   )rP   roweyerows      r   rQ   zddm_iinv.<locals>.<listcomp>   s     888[S&C&L888r   z Matrix det == 0; not invertible.c                 $    g | ]}|d          S r#   rO   )rP   rS   r;   s     r   rQ   zddm_iinv.<locals>.<listcomp>   s!    '''3s122w'''r   )	is_Field
ValueErrorr5   r   r6   r   rC   r	   r   )ainvr   rH   r:   eyeAaugr=   r;   s     `    @r   ddm_iinvr[      s    : (''' 	AA AaD		AAv %$$
K
K
K
K
K%((
K
K
KC88C3KK888Dt__FeAhh M()KLLL''''$'''DGGGr   c                 L   t          |          }|sg S t          |d                   }t          |          }|j        gt          ||          z  }t	          d|          D ]B}t          ||          }||         d|         | |         d|<   |d|         ||         d|<   C|S )zL, U  <--  LU(U)r   r   N)r5   ddm_ilurG   minr6   )	LUrH   r:   r;   swapszerosr<   r   s	            r   ddm_ilu_splitrc      s    AA 	AaD		AAJJEVHs1ayy E1a[[  1IIQ48!RaR!9!RaRLr   c           	      R   t          |           }|sg S t          | d                   }g }t          t          ||                    D ]}| |         |         sUt          |dz   |          D ]@}| |         |         r0|                    ||f           | |         | |         c| |<   | |<    nAet          |dz   |          D ]e}| |         |         | |         |         z  }|| |         |<   t          |dz   |          D ]'}| |         |xx         || |         |         z  z  cc<   (f|S )za  <--  LU(a)r   r   )r5   r6   r^   r8   )	r   r:   r;   ra   r<   r1   r   l_jir@   s	            r   r]   r]      s^   AA 	AaD		AE3q!99 * *tAw 	AaCmm  R58 LL!R)))"#B%1KAaD!B%E qsA 	* 	*AQ47QqT!W$DAaDG1Q3]] * *!Q4!A$q'>)*	* Lr   c                 L   t          |          }|sdS t          |d                   }t          |          }|st          d          t          |d                   ||k    rt          d          ||k     rt          d          |r+d |D             }|D ]\  }}	||	         ||         c||<   ||	<   fdt          |          D             }
t                    D ]_}t          |          D ]M}||         |         }t          |          D ]"}|||         |         |
|         |         z  z  }#||
|         |<   N`||k    r:t          ||          D ])}t                    D ]}|
|         |         rt          *t                    D ]}t          t          |                    D ]u}||         |         st          |
|         |         }t          |dz   |          D ]"}|||         |         | |         |         z  z  }#|||         |         z  | |         |<   vdS )zx  <--  solve(L*U*x = swaps(b))Nr   zShape mismtchUnderdeterminedc                 "    g | ]}|d d          S r#   rO   rP   rS   s     r   rQ   z!ddm_ilu_solve.<locals>.<listcomp>  s     !!!SV!!!r   c                     g | ]}d gz  	S r#   rO   )rP   _os     r   rQ   z!ddm_ilu_solve.<locals>.<listcomp>  s    &&&$!&&&r   r   )r5   r   NotImplementedErrorr6   r   reversed)xr_   r`   ra   r   r:   r;   m2i1i2yr@   r<   rhsr   rl   s                  @r   ddm_ilu_solveru      s   AA AaD		A	QB ,?+++AaD		ABw ,?+++1u 5!"3444 (!!q!!! 	( 	(FBR5!B%LAbE1R55 	'&&&U1XX&&&A1XX  q 	 	AA$q'C1XX ) )qtAw1a((AaDGG		 	1u 5q! 	5 	5A1XX 5 5Q47 54455
 1XX $ $%((## 	$ 	$AQ47 100A$q'C1Q3]] ) )qtAw1a((AaDGmAaDGG	$$ $r   c                    t          |           }|s	j        ggS t          | d                   |k    rt          d          dk    rj        g| d         d          ggS | d         d         }| d         dd          g}d | dd          D             }d | dd          D             }t          |          }fdt	          dz             D             }t	                    D ]!}	j        ||	         |	<   | ||	dz            |	<   "t	          ddz             D ]z}	|	dk    r|}
n!|
}fd|D             }
t          |
||           j        gg}t          |||
           t	          ddz   |	z
            D ]}|d         d          ||	|z            |<   {fd	t	          dz             D             }t          |||           |S )
Nr   z
Not squarer   c                      g | ]}|d          gS )r   rO   ri   s     r   rQ   zddm_berk.<locals>.<listcomp>>  s    ###c#a&###r   c                 "    g | ]}|d d         S )r   NrO   ri   s     r   rQ   zddm_berk.<locals>.<listcomp>?  s     """SQRR"""r   c                 &    g | ]}j         gz  S rO   rG   )rP   rk   rH   r;   s     r   rQ   zddm_berk.<locals>.<listcomp>C  s!    ***!!&A***r      c                      g | ]
}j         gS rO   rz   )rP   rS   rH   s     r   rQ   zddm_berk.<locals>.<listcomp>L  s    )))AF8)))r   c                      g | ]
}j         gS rO   rz   )rP   rk   rH   s     r   rQ   zddm_berk.<locals>.<listcomp>S  s    )))QVH)))r   )r5   rE   r   ddm_berkr6   r-   rG   )MrH   r:   r   RCAqTr<   AnCRAnCr   qoutr;   s    `            @r   r~   r~   0  s-   AA yAaD		AAv )<(((Av %1Q47($$	!QA	
1abb
A##QqrrU###A""AabbE"""AAA*****uQqSzz***A1XX  %!QB!A#q		1ac]] 
$ 
$6 	#CCA))))q)))CQ"""zD!S!!!q!A#a% 	$ 	$AaAacF1II	$ *)))eAaCjj)))DaKr   N)F)__doc__operatorr   
exceptionsr   r   r   r   r   r   r!   r%   r'   r-   rC   rK   r[   rc   r]   ru   r~   rO   r   r   <module>r      s:  # #H                           2 2 2; ; ; ;|  D( ( ((  $  8-$ -$ -$`% % % % %r   