
    wg+&                         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  G d	 d
      ZexZZy)    )Expr)Dummy)_sympify)CoercionFailed)Polyparallel_poly_from_expr)QQ)DomainMatrix)DomainScalarc                   "    e Zd ZdZdddZed        Ze fd       Zd Zeddd       Z	d	 Z
d
 Zed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zd dZd Z d Z! xZ"S )!MutablePolyDenseMatrixax  
    A mutable matrix of objects from poly module or to operate with them.

    Examples
    ========

    >>> from sympy.polys.polymatrix import PolyMatrix
    >>> from sympy import Symbol, Poly
    >>> x = Symbol('x')
    >>> pm1 = PolyMatrix([[Poly(x**2, x), Poly(-x, x)], [Poly(x**3, x), Poly(-1 + x, x)]])
    >>> v1 = PolyMatrix([[1, 0], [-1, 0]], x)
    >>> pm1*v1
    PolyMatrix([
    [    x**2 + x, 0],
    [x**3 - x + 1, 0]], ring=QQ[x])

    >>> pm1.ring
    ZZ[x]

    >>> v1*pm1
    PolyMatrix([
    [ x**2, -x],
    [-x**2,  x]], ring=QQ[x])

    >>> pm2 = PolyMatrix([[Poly(x**2, x, domain='QQ'), Poly(0, x, domain='QQ'), Poly(1, x, domain='QQ'),             Poly(x**3, x, domain='QQ'), Poly(0, x, domain='QQ'), Poly(-x**3, x, domain='QQ')]])
    >>> v2 = PolyMatrix([1, 0, 0, 0, 0, 0], x)
    >>> v2.ring
    QQ[x]
    >>> pm2*v2
    PolyMatrix([[x**2]], ring=QQ[x])

    N)ringc          	      |   |s|t        d      ddg df\  }}}}nPt        |d   t              ro|d   |dd  }}|sddg }}}n)t        |d   t        t        f      r2t	        |      t	        |d         }}|D 	cg c]  }|D ]  }	|	  }}}	nt	        |      d}}|}n|d d D 
cg c]  }
t        |
       c}
t        t        t        gk(  r|d   |d   |d   |dd  f\  }}}}n|d d D 
cg c]  }
t        |
       c}
t        t        t        d       gk(  rI|d   |d   |d   |dd  f\  }}}}t        |      D cg c]  }t        |      D ]  } |||        }}}nt        d      t	        |      dk(  rt        |d   t              r|d   }| j                  |||||      S c c}	}w c c}
w c c}
w c c}}w )	Nz6The ring needs to be specified for an empty PolyMatrixr             c                       yNr   r   r       [/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/polys/polymatrix.py<lambda>z0MutablePolyDenseMatrix.__new__.<locals>.<lambda>G   s    r   zInvalid arguments)		TypeError
isinstancelisttuplelentypeintrange	from_list)clsr   argsrowscolsitemsgenselementsroweafuncijs                 r   __new__zMutablePolyDenseMatrix.__new__0   s   | XYY&'Bl#D$tQ&!!Wd12hdH$%q"EdHQK$7 ]C,<d&.<s<1<<< !]Ad #BQx(!d1g(S#t,<<&*1gtAwQab&I#D$t#BQx(!d1g(S#tI,GG%)!Wd1gtAwQR%H"D$d).tJAeDkJT!QZJZJEJ/00 t9>ja%87D }}T4d;;) =
 ) ) Ks   ;F(&F.,F3> F8c           
      z   |D cg c]  }t        |       }}|rt        d |D              rd}nd}|1t        |t              r~t	        dt               |      j                  }n]|r=|d   }|dd  D ]  }	|j                  |	      \  }}
 |j                  |j                     }nt        ||d      \  }}|d   |d	      }d}|rTt	        d|j                  |j                        |j                  j                  fd
}|D cg c]
  } ||       }}n/|j                  }|D cg c]  } ||j                                }}t        |      D cg c]$  }t        |      D cg c]  }|||z  |z       c}& }}}t!        |||f|      }| j#                  |      S c c}w c c}w c c}w c c}w c c}}w )Nc              3   <   K   | ]  }t        |t                y wN)r   r   ).0items     r   	<genexpr>z3MutablePolyDenseMatrix.from_list.<locals>.<genexpr>Z   s     BDD$/Bs   TFr   domainr   )fieldr7   r'   c                 h     | j                        d   j                  j                               S r   )unifyrepto_list)pp_ringto_rings    r   r   z2MutablePolyDenseMatrix.from_list.<locals>.<lambda>r   s(    WQWWV_Q-?-C-C-K-K-M%N r   )r   allr   strr   r   r7   r:   r'   r   symbolsr   r!   
from_sympyas_exprr    r
   from_dm)r"   r$   r%   r&   r'   r   r4   polysr=   p2_infoconvert_polyr(   convert_exprr*   r-   r.   elements_loldmr>   r?   s                       @@r   r!   z MutablePolyDenseMatrix.from_listU   s    -22D$22SBEBBEE $$Auwt4;;aAABi #wwr{1#88AFF#D1%TJKE4>$v,/DE !T\\$++>Fii))GNL167AQ7H7??L;@AaQYY[1AHA NSSW[YuT{C!!D&1*-CYY,td;{{2E 34 8 B DYs)   F#F(*F-F7)F2;F72F7c                     t         |   |       }|j                         }|j                  }||_        ||_        |j                  |_        |j                  |_        |S r2   )superr/   	to_sparser7   _dmr   rB   r'   )r"   rM   objR	__class__s       r   rE   zMutablePolyDenseMatrix.from_dm}   sN    goc"\\^IIXX
99
r   c                 6    | j                   j                         S r2   )rQ   	to_Matrixselfs    r   rV   z MutablePolyDenseMatrix.to_Matrix   s    xx!!##r   c                P     | g |j                   |j                         |d|iS )Nr   )shapeflat)r"   otherr   r'   s       r   from_Matrixz"MutablePolyDenseMatrix.from_Matrix   s)    @EKK@@@4@@r   c                 B    | j                  | j                         |      S r2   )r]   rV   )rX   r'   s     r   set_genszMutablePolyDenseMatrix.set_gens   s     0$77r   c                     | j                   | j                  z  r0dt        | j                               d d z   d| j                   dz   S d| j                    d| j                   d| j                   dS )Nr   z, ring=)zPolyMatrix(z, z, [], ring=)r$   r%   reprrV   r   rW   s    r   __repr__zMutablePolyDenseMatrix.__repr__   si    99tyy D!123B77GDII;a:PPP 2dii[DII;aPPr   c                 .    | j                   j                  S r2   )rQ   rZ   rW   s    r   rZ   zMutablePolyDenseMatrix.shape   s    xx~~r   c                      | j                   d   S r   rZ   rW   s    r   r$   zMutablePolyDenseMatrix.rows       zz!}r   c                      | j                   d   S Nr   rg   rW   s    r   r%   zMutablePolyDenseMatrix.cols   rh   r   c                 4    | j                   | j                  z  S r2   )r$   r%   rW   s    r   __len__zMutablePolyDenseMatrix.__len__   s    yy499$$r   c                      fd} j                   }t        |t              r)|j                         |   }|D cg c]
  } ||       c}S t        |t              r2t        | j                        \  }}|||f   } ||j                        S |\  }}t        |t              r't        |t              r ||||f   j                        S  j                  |||f         S c c}w )Nc                     j                   j                  j                  }j                   j                  j                  }t        | j	                         ||      S )Nr6   )rQ   r7   rB   r   to_dict)vgroundr'   rX   s      r   to_polyz3MutablePolyDenseMatrix.__getitem__.<locals>.to_poly   s>    XX__++F88??**D		T&99r   )	rQ   r   slicer[   r   divmodr%   elementrE   )	rX   keyrr   rM   r&   r4   r-   r.   r*   s	   `        r   __getitem__z"MutablePolyDenseMatrix.__getitem__   s    	:
 XXc5!GGIcNE.34dGDM44S!#tyy)DAq1Q3A199%%1a*Q"42ad8++,,<<1a4)) 5s   C c                 j    t        | t        |            st        S | j                  |j                  k(  S r2   )r   r   NotImplementedrQ   rX   r\   s     r   __eq__zMutablePolyDenseMatrix.__eq__   s)    $U,!!xx599$$r   c                     t        |t        |             r(| j                  | j                  |j                  z         S t        S r2   r   r   rE   rQ   ry   rz   s     r   __add__zMutablePolyDenseMatrix.__add__   2    eT$Z(<<599 455r   c                     t        |t        |             r(| j                  | j                  |j                  z
        S t        S r2   r}   rz   s     r   __sub__zMutablePolyDenseMatrix.__sub__   r   r   c                    t        |t        |             r(| j                  | j                  |j                  z        S t        |t              rt        |      }t        |t              rF| j                  }	 t        |j                  |      |      }| j                  | j                  |z        S t        S # t        t        f$ r t        j                  |      }Y Jw xY wr2   )r   r   rE   rQ   r   r   r   r   r   rC   r   
ValueErrorry   )rX   r\   Kxother_dss       r   __mul__zMutablePolyDenseMatrix.__mul__   s    eT$Z(<<599 455s#UOEeT"B:'e(<bA <<8 344 #J/ :'2259:s   6B5 5$CCc                     t        |t              rt        |      }t        |t              r3t	        j
                  |      }| j                  || j                  z        S t        S r2   )	r   r   r   r   r   rC   rE   rQ   ry   )rX   r\   r   s      r   __rmul__zMutablePolyDenseMatrix.__rmul__   sM    eS!UOEeT"#..u5H<<488 344r   c                    t        |t              r|j                         }nt        |t              rt	        |      }t        |t
              st        S | j                  j                  |      }| j                  j                  d|z  | j                        }t        || j                        }| j                  |z  }| j                  |      S rj   )r   r   rD   r   r   r   ry   r7   rC   r   convert_fromr   rQ   rE   )rX   r\   inverserM   s       r   __truediv__z"MutablePolyDenseMatrix.__truediv__   s    eT"MMOEs#UOE%&!!&&u-))((5$++>w		2XX||Br   c                 :    | j                  | j                         S r2   )rE   rQ   rW   s    r   __neg__zMutablePolyDenseMatrix.__neg__   s    ||TXXI&&r   c                 T    | j                  | j                  j                               S r2   )rE   rQ   	transposerW   s    r   r   z MutablePolyDenseMatrix.transpose   s    ||DHH..011r   c                 x    t        j                  | j                  |j                        }| j                  |      S r2   )r
   hstackrQ   rE   rX   r\   rM   s      r   row_joinzMutablePolyDenseMatrix.row_join   +      5995||Br   c                 x    t        j                  | j                  |j                        }| j                  |      S r2   )r
   vstackrQ   rE   r   s      r   col_joinzMutablePolyDenseMatrix.col_join   r   r   c                 x    | j                         j                  |      }| j                  || j                        S r2   )rV   	applyfuncr]   r'   )rX   r,   Ms      r   r   z MutablePolyDenseMatrix.applyfunc   s0    NN&&t,499--r   c                 Z    | j                  t        j                  |t        |               S r2   )rE   r
   eyer	   )r"   nr'   s      r   r   zMutablePolyDenseMatrix.eye  s"    {{<++Ar$x899r   c                 ^    | j                  t        j                  ||ft        |               S r2   )rE   r
   zerosr	   )r"   mr   r'   s       r   r   zMutablePolyDenseMatrix.zeros  s&    {{<--q!fbh?@@r   c                 L   | j                   j                  rt        d | D              st        d      | j                  }|j                  |j                   j                         }|j                         \  }}|j                  |j                         }| j                  |      |fS )Nc              3   4   K   | ]  }|j                     y wr2   	is_groundr3   r=   s     r   r5   z.MutablePolyDenseMatrix.rref.<locals>.<genexpr>       ,GQQ[[,G   z1PolyMatrix rref is only for ground field elements)r7   is_Fieldr@   r   rQ   
convert_torrefrE   )rX   simplifynormalize_lastrM   	dm_grounddm_rrefpivotss          r   r   zMutablePolyDenseMatrix.rref  s    $$,G$,G)GPQQXXMM"))"2"23	#..*$$RYY/||G$f,,r   c                    | j                   j                  rt        d | D              st        d      | j                  }| j                   | j
                  }}|j                  |      j                  d      j                  |      }|j                         }t        |j                  d         D cg c]  }|d d |f    }}|D cg c]  }| j                  |       c}S c c}w c c}w )Nc              3   4   K   | ]  }|j                     y wr2   r   r   s     r   r5   z3MutablePolyDenseMatrix.nullspace.<locals>.<genexpr>  r   r   z6PolyMatrix nullspace is only for ground field elementsT)divide_lastr   )r7   r   r@   r   rQ   r   r   	nullspacer   r    rZ   rE   )	rX   rM   Kr   dm_null_rowsdm_nullr-   dm_basisdmvecs	            r   r   z MutablePolyDenseMatrix.nullspace  s    $$,G$,G)GUVVXXTYY2}}Q'11d1CNNrR((**/a0@*ABQGAaCLBB19:U#:: C:s   2C#C(c                 N    | j                   t        | j                               z
  S r2   )r%   r   r   rW   s    r   rankzMutablePolyDenseMatrix.rank!  s    yy3t~~/000r   )ignorer   )#__name__
__module____qualname____doc__r/   classmethodr!   rE   rV   r]   r_   rd   propertyrZ   r$   r%   rl   rw   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rT   s   @r   r   r      s    D "& #<J % %N  $ ,0 A A8Q      %*.%


 '2  . : : A A-	;1r   r   N)sympy.core.exprr   sympy.core.symbolr   sympy.core.sympifyr   sympy.polys.polyerrorsr   sympy.polys.polytoolsr   r   sympy.polys.domainsr	   sympy.polys.matricesr
   !sympy.polys.matrices.domainscalarr   r   MutablePolyMatrix
PolyMatrixr   r   r   <module>r      s7      # ' 1 ? " - :U1 U1n "8 7 Jr   