
    Rie"                        d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZ ddlmZ  ed          Z ed	e
          Zd%dZd&dZd&dZd'dZd(dZd(dZd)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]]

    )annotations)mul   )DMShapeErrorDMNonInvertibleMatrixErrorDMNonSquareMatrixError)SequenceTypeVar)RingElementTR)boundmatrixSequence[Sequence[T]]returnlist[list[T]]c                T    t          t          t           t          |                      S )zmatrix transpose)listmapzip)r   s    :lib/python3.11/site-packages/sympy/polys/matrices/dense.pyddm_transposer   4   s    D#v,''(((    alist[list[R]]bSequence[Sequence[R]]Nonec                |    t          | |          D ]*\  }}t          |          D ]\  }}||xx         |z  cc<   +dS )za += bNr   	enumerater   r   aibijbijs         r   ddm_iaddr'   9   \    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.   G   sF      mm 	 	FAsDBqEE	 r   c                J    | D ]}t          |          D ]\  }}||z  ||<    d S Nr,   r   r   r#   r%   r-   s        r   ddm_imulr2   N   sH      mm 	 	FAs!GBqEE	 r   c                J    | D ]}t          |          D ]\  }}||z  ||<    d S r0   r,   r1   s        r   	ddm_irmulr4   T   sH      mm 	 	FAsGBqEE	 r   cc           	         t          t          |           }t          ||           D ]G\  }}t          |          D ]2\  }}t          t	          t
          ||          ||                   ||<   3HdS )z
a += b @ cN)r   r   r!   sumr   r   )r   r   r5   cTr$   r#   r%   cTjs           r   ddm_imatmulr:   Z   s{     
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 r0   )abs)ipr   r%   s    r   <lambda>zddm_irref.<locals>.<lambda>w   s    QrU1X r   )keyr   )lenrangemaxr!   append)r   _partial_pivotmnipivotsr>   r-   r#   aijinvlkakakjr%   s   `             @r   	ddm_irrefrP   e   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AvvRUvQ%CqEEESLEEE1Q3]] % %1r!u$% 	a	Q 66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   rA   )rB   oneexquorC   zero)
r   KrG   rH   rS   ufrM   rI   akkm1r%   s
             r   ddm_idetrX      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  )rR   rT   ).0r%   rU   rI   s     r   
<listcomp>z'ddm_iinv.<locals>.<listcomp>.<listcomp>   s)    888!QTTAEEqv888r   )rC   )r]   rI   rU   rH   s    @r   r^   zddm_iinv.<locals>.<listcomp>   s8    
K
K
KQ88888uQxx888
K
K
Kr   c                    g | ]
\  }}||z   S r\   r\   )r]   roweyerows      r   r^   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 r0   r\   )r]   r`   rH   s     r   r^   zddm_iinv.<locals>.<listcomp>   s!    '''3s122w'''r   )	is_Field
ValueErrorrB   r   rC   r   rP   r   r   )ainvr   rU   rG   eyeAaugrJ   rH   s     `    @r   ddm_iinvrh      s    : (''' 	AA AaD		AAvv$$
K
K
K
K
K%((
K
K
KC88C3KK888Dt__FeAhh()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)rB   ddm_ilurT   minrC   )	LUrU   rG   rH   swapszerosrI   r%   s	            r   ddm_ilu_splitrp      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   )rB   rC   rk   rE   )	r   rG   rH   rn   rI   r>   r%   l_jirM   s	            r   rj   rj      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 r0   r\   r]   r`   s     r   r^   z!ddm_ilu_solve.<locals>.<listcomp>  s     !!!SV!!!r   c                    g | ]}d gz  	S r0   r\   )r]   _os     r   r^   z!ddm_ilu_solve.<locals>.<listcomp>  s    &&&$!&&&r   r   )rB   r   NotImplementedErrorrC   r   reversed)xrl   rm   rn   r   rG   rH   m2i1i2yrM   rI   rhsr%   ry   s                  @r   ddm_ilu_solver     s   AA AaD		A	QB ,?+++AaD		ABww?+++1uu!"3444 (!!q!!! 	( 	(FBR5!B%LAbE1R55 	'&&&U1XX&&&A1XX  q 	 	AA$q'C1XX ) )qtAw1a((AaDGG		 	1uu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   r\   rv   s     r   r^   zddm_berk.<locals>.<listcomp>E  s    ###c#a&###r   c                "    g | ]}|d d         S )r   Nr\   rv   s     r   r^   zddm_berk.<locals>.<listcomp>F  s     """SQRR"""r   c                &    g | ]}j         gz  S r\   rT   )r]   rx   rU   rH   s     r   r^   zddm_berk.<locals>.<listcomp>J  s!    ***!!&A***r      c                     g | ]
}j         gS r\   r   )r]   r`   rU   s     r   r^   zddm_berk.<locals>.<listcomp>S  s    )))AF8)))r   c                     g | ]
}j         gS r\   r   )r]   rx   rU   s     r   r^   zddm_berk.<locals>.<listcomp>Z  s    )))QVH)))r   )rB   rR   r   ddm_berkrC   r:   rT   )MrU   rG   r   r   CAqr   rI   AnCRAnCr%   qoutrH   s    `            @r   r   r   7  s$   AA yAaD		AAvv<(((Avv1Q47($$	!QA	
1abb
A##QqrrU###A""AabbE"""AAA*****uQqSzz***A1XX  %!QB!A#q		1ac]] 
$ 
$66CCA))))q)))CQ"""zD!S!!!q!A#a% 	$ 	$AaAacF1II	$ *)))eAaCjj)))DaKr   N)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r5   r   r   r   )F)__doc__
__future__r   operatorr   
exceptionsr   r   r   typingr	   r
   sympy.polys.matrices._typingr   r   r   r   r'   r*   r.   r2   r4   r:   rP   rX   rh   rp   rj   r   r   r\   r   r   <module>r      s  # #H # " " " " "               
 % $ $ $ $ $ $ $ 4 4 4 4 4 4 GCLLGC{###) ) ) )
               2 2 2 2; ; ; ;|  D( ( ((  $  8-$ -$ -$`% % % % %r   