
    Ed&                         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dS )    )Expr)Dummy_sympify)CoercionFailed)Polyparallel_poly_from_expr)QQ)DomainMatrix)DomainScalarc                   R    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\  }}}nut          |d         t                    r|d         |dd          }}|s	ddg c}}n=t          |d         t          t          f          r2t	          |          t	          |d                   c}d |D             }nt	          |          dc}|}nd |d d         D             t
          t
          t          gk    r&|d         |d         |d         |dd          f\  }}}nd	 |d d         D             t
          t
          t          d
           gk    rB|d         |d         |d         |dd          f\  }}fdt          |          D             }nt          d          t	          |          dk    r#t          |d         t                    r|d         }|                     ||||          S )Nz6The ring needs to be specified for an empty PolyMatrixr       c                     g | ]	}|D ]}|
S r   r   ).0rowes      6lib/python3.11/site-packages/sympy/polys/polymatrix.py
<listcomp>z2MutablePolyDenseMatrix.__new__.<locals>.<listcomp>?   s%    <<<s<<1<<<<    c                 ,    g | ]}t          |          S r   typer   as     r   r   z2MutablePolyDenseMatrix.__new__.<locals>.<listcomp>D       (((!d1gg(((r         c                 ,    g | ]}t          |          S r   r   r   s     r   r   z2MutablePolyDenseMatrix.__new__.<locals>.<listcomp>G   r   r   c                      dS Nr   r   r   r   r   <lambda>z0MutablePolyDenseMatrix.__new__.<locals>.<lambda>G   s    A r   c                 L    g | ] }t                    D ]} ||          !S r   range)r   ijcolsfuncs      r   r   z2MutablePolyDenseMatrix.__new__.<locals>.<listcomp>J   s6    JJJAeDkkJJTT!QZZJJJJr   zInvalid arguments)		TypeError
isinstancelisttuplelenintr   r(   	from_list)	clsr   argsrowsitemsgenselementsr+   r,   s	          @@r   __new__zMutablePolyDenseMatrix.__new__0   s    	1 Z XYYY&'Bl#D$ttQ&& 	1!!Wd122hdH 
!$%q"!dEEHQK$77 ! ]]C,<,<
d<<h<<< !]]A
d ((tBQBx(((S#t,<< 	1&*1gtAwQabb&I#D$tt((tBQBx(((S#tII,GG 	1%)!Wd1gtAwQRR%H"D$dJJJJJtJJJEE/000 t99> 	ja%88 	7D }}T4d;;;r   c                    d |D             }|rt          d |D                       rd}nd}|9t          |t                    r#t          dt	                      |          j        }nm|r@|d         }|dd          D ]}|                    |          \  }}	|j        |j                 }n+t          ||d          \  }}
|
d	         |
d
                  }d}|r=t          d|j	        |j                  |j
        j        fdfd|D             n|j        fd|D             fdt          |          D             }t          ||f|          }|                     |          S )Nc                 ,    g | ]}t          |          S r   r   r   items     r   r   z4MutablePolyDenseMatrix.from_list.<locals>.<listcomp>Y   s    222D$222r   c              3   @   K   | ]}t          |t                    V  d S N)r.   r   r=   s     r   	<genexpr>z3MutablePolyDenseMatrix.from_list.<locals>.<genexpr>Z   s,      BBDD$//BBBBBBr   TFr   domainr   )fieldrC   r8   c                 `     |                                d         j        j                  S r$   )unifyrep)pp_ringto_rings    r   r%   z2MutablePolyDenseMatrix.from_list.<locals>.<lambda>r   s&    WWQWWV__Q-?-C-G%H%H r   c                 &    g | ]} |          S r   r   )r   rH   convert_polys     r   r   z4MutablePolyDenseMatrix.from_list.<locals>.<listcomp>s   s!    777AQ777r   c                 J    g | ]} |                                            S r   )as_expr)r   r   convert_exprs     r   r   z4MutablePolyDenseMatrix.from_list.<locals>.<listcomp>v   s+    AAAaQYY[[11AAAr   c                 L    g | ]fd t                    D              S )c                 ,    g | ]}z  |z            S r   r   )r   r*   r+   r9   r)   s     r   r   z?MutablePolyDenseMatrix.from_list.<locals>.<listcomp>.<listcomp>y   s&    CCC!!D&1*-CCCr   r'   )r   r)   r+   r9   s    @r   r   z4MutablePolyDenseMatrix.from_list.<locals>.<listcomp>y   s;    YYYCCCCCCuT{{CCCYYYr   )allr.   strr   r   rC   rF   r8   r	   symbolsr   r3   
from_sympyr(   r   from_dm)r4   r6   r+   r7   r8   r   polysrH   p2_infoelements_loldmrO   rL   r9   rI   rJ   s     `          @@@@@r   r3   z MutablePolyDenseMatrix.from_listU   s    32E222 	SBBEBBBBB 	EEE  	$$$ <Auwwt444; 	aAABBi # #wwr{{118AF#DD1%TJJJKE4>$v,/DE  	B!T\$+>>>Fi)GHHHHHL7777777HH?LAAAA5AAAH ZYYYYUSW[[YYY,td;;{{2r   c                     t                                          |           }|                                }|j        }||_        ||_        |j        |_        |j        |_        |S r@   )superr:   	to_sparserC   _dmr   rT   r8   )r4   r\   objR	__class__s       r   rV   zMutablePolyDenseMatrix.from_dm}   sQ    ggooc""\\^^IX
9
r   c                 4    | j                                         S r@   )r`   	to_Matrixselfs    r   re   z MutablePolyDenseMatrix.to_Matrix   s    x!!###r   c                N     | g |j         |                                |R d|iS )Nr   )shapeflat)r4   otherr   r8   s       r   from_Matrixz"MutablePolyDenseMatrix.from_Matrix   s4    s@EK@@@@@4@@@r   c                 R    |                      |                                 |          S r@   )rl   re   )rg   r8   s     r   set_genszMutablePolyDenseMatrix.set_gens   s"     0 0$777r   c                     | j         | j        z  r8dt          |                                           d d         z   d| j         dz   S d| j          d| j         d| j         dS )Nr   z, ring=)zPolyMatrix(z, z, [], ring=)r6   r+   reprre   r   rf   s    r   __repr__zMutablePolyDenseMatrix.__repr__   st    9ty  	QD!1!1223B377:PDI:P:P:PPPPPPdiPPDIPPPPr   c                     | j         j        S r@   )r`   ri   rf   s    r   ri   zMutablePolyDenseMatrix.shape   s    x~r   c                     | j         d         S r$   ri   rf   s    r   r6   zMutablePolyDenseMatrix.rows       z!}r   c                     | j         d         S Nr   rv   rf   s    r   r+   zMutablePolyDenseMatrix.cols   rw   r   c                      | j         | j        z  S r@   )r6   r+   rf   s    r   __len__zMutablePolyDenseMatrix.__len__   s    y49$$r   c                      fd j         }t          |t                    r(|                                |         }fd|D             S t          |t                    r2t          | j                  \  }}|||f         } |j                  S |\  }}t          |t                    r-t          |t                    r |||f         j                  S                      |||f                   S )Nc                     j         j        j        }j         j        j        }t          |                                 ||          S )NrB   )r`   rC   rT   r   to_dict)vgroundr8   rg   s      r   to_polyz3MutablePolyDenseMatrix.__getitem__.<locals>.to_poly   s8    X_+F8?*D		T&9999r   c                 &    g | ]} |          S r   r   )r   r>   r   s     r   r   z6MutablePolyDenseMatrix.__getitem__.<locals>.<listcomp>   s!    444dGGDMM444r   )	r`   r.   slicerj   r2   divmodr+   elementrV   )rg   keyr\   r7   r)   r*   r   r   s   `      @r   __getitem__z"MutablePolyDenseMatrix.__getitem__   s
   	: 	: 	: 	: 	:
 Xc5!! 	&GGIIcNE4444e4444S!! 	&#ty))DAq1Q3A719%%%1a 	**Q"4"4 	*72ad8+,,,<<1a4)))r   c                 j    t          | t          |                    st          S | j        |j        k    S r@   )r.   r   NotImplementedr`   rg   rk   s     r   __eq__zMutablePolyDenseMatrix.__eq__   s/    $U,, 	"!!x59$$r   c                     t          |t          |                     r"|                     | j        |j        z             S t          S r@   r.   r   rV   r`   r   r   s     r   __add__zMutablePolyDenseMatrix.__add__   ;    eT$ZZ(( 	6<<59 4555r   c                     t          |t          |                     r"|                     | j        |j        z
            S t          S r@   r   r   s     r   __sub__zMutablePolyDenseMatrix.__sub__   r   r   c                    t          |t          |                     r"|                     | j        |j        z            S t          |t                    rt          |          }t          |t                    rt| j        }	 t          |	                    |          |          }n+# t          t          f$ r t          j	        |          }Y nw xY w|                     | j        |z            S t          S r@   )r.   r   rV   r`   r2   r   r   r   r   rU   r   
ValueErrorr   )rg   rk   Kxother_dss       r   __mul__zMutablePolyDenseMatrix.__mul__   s    eT$ZZ(( 	$<<59 4555s## 	$UOOEeT"" 	5B:'e(<(<bAA"J/ : : :'2599:<<8 3444s   #B% %%CCc                     t          |t                    rt          |          }t          |t                    r1t	          j        |          }|                     || j        z            S t          S r@   )	r.   r2   r   r   r   rU   rV   r`   r   )rg   rk   r   s      r   __rmul__zMutablePolyDenseMatrix.__rmul__   s`    eS!! 	$UOOEeT"" 	5#.u55H<<48 3444r   c                    t          |t                    r|                                }n$t          |t                    rt	          |          }t          |t
                    st          S | j                            |          }| j	        
                    d|z  | j                  }t          || j	                  }| j        |z  }|                     |          S ry   )r.   r   rN   r2   r   r   r   rC   rU   r   convert_fromr   r`   rV   )rg   rk   inverser\   s       r   __truediv__z"MutablePolyDenseMatrix.__truediv__   s    eT"" 	$MMOOEEs## 	$UOOE%&& 	"!!&&u--)((5$+>>w	22X||Br   c                 8    |                      | j                   S r@   )rV   r`   rf   s    r   __neg__zMutablePolyDenseMatrix.__neg__   s    ||TXI&&&r   c                 Z    |                      | j                                                  S r@   )rV   r`   	transposerf   s    r   r   z MutablePolyDenseMatrix.transpose   s"    ||DH..00111r   c                 j    t          j        | j        |j                  }|                     |          S r@   )r   hstackr`   rV   rg   rk   r\   s      r   row_joinzMutablePolyDenseMatrix.row_join   *     5955||Br   c                 j    t          j        | j        |j                  }|                     |          S r@   )r   vstackr`   rV   r   s      r   col_joinzMutablePolyDenseMatrix.col_join   r   r   c                     |                                                      |          }|                     || j                  S r@   )re   	applyfuncrl   r8   )rg   r,   Ms      r   r   z MutablePolyDenseMatrix.applyfunc   s7    NN&&t,,49---r   c                 h    |                      t          j        |t          |                             S r@   )rV   r   eyer
   )r4   nr8   s      r   r   zMutablePolyDenseMatrix.eye  s%    {{<+Ar$x88999r   c                 l    |                      t          j        ||ft          |                             S r@   )rV   r   zerosr
   )r4   mr   r8   s       r   r   zMutablePolyDenseMatrix.zeros  s)    {{<-q!fbh??@@@r   ignorec                 F   | j         j        rt          d | D                       st          d          | j        }|                    |j         j                   }|                                \  }}|                    |j                   }|                     |          |fS )Nc              3   $   K   | ]}|j         V  d S r@   	is_groundr   rH   s     r   rA   z.MutablePolyDenseMatrix.rref.<locals>.<genexpr>  $      ,G,GQQ[,G,G,G,G,G,Gr   z1PolyMatrix rref is only for ground field elements)rC   is_FieldrR   r   r`   
convert_torrefrV   )rg   simplifynormalize_lastr\   	dm_grounddm_rrefpivotss          r   r   zMutablePolyDenseMatrix.rref  s    $ 	R,G,G$,G,G,G)G)G 	RPQQQXMM")"233	#..**$$RY//||G$$f,,r   c                      j         j        rt          d  D                       st          d           j        } j          j        }}|                    |                                                              |          }|                                fdt          j
        d                   D             } fd|D             S )Nc              3   $   K   | ]}|j         V  d S r@   r   r   s     r   rA   z3MutablePolyDenseMatrix.nullspace.<locals>.<genexpr>  r   r   z6PolyMatrix nullspace is only for ground field elementsc                 (    g | ]}d d |f         S r@   r   )r   r)   dm_nulls     r   r   z4MutablePolyDenseMatrix.nullspace.<locals>.<listcomp>  s%    BBBQGAAAaCLBBBr   r   c                 :    g | ]}                     |          S r   )rV   )r   dmvecrg   s     r   r   z4MutablePolyDenseMatrix.nullspace.<locals>.<listcomp>  s%    :::U##:::r   )rC   r   rR   r   r`   r   r   	nullspacer   r(   ri   )rg   r\   Kr   dm_null_rowsdm_basisr   s   `     @r   r   z MutablePolyDenseMatrix.nullspace  s    $ 	W,G,G$,G,G,G)G)G 	WUVVVXTY2}}Q''1133>>rBB((**BBBB%a0@*A*ABBB::::::::r   c                 T    | j         t          |                                           z
  S r@   )r+   r1   r   rf   s    r   rankzMutablePolyDenseMatrix.rank!  s!    y3t~~//0000r   )r   r   )#__name__
__module____qualname____doc__r:   classmethodr3   rV   re   rl   rn   rs   propertyri   r6   r+   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rc   s   @r   r   r      sf          D "& #< #< #< #< #<J % % [%N     [$ $ $ ,0 A A A A [A8 8 8Q Q Q   X   X   X% % %* * *.% % %
  
  
         ' ' '2 2 2          . . . : : [: A A [A- - - -	; 	; 	;1 1 1 1 1 1 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      s                # # # # # # ' ' ' ' ' ' 1 1 1 1 1 1 ? ? ? ? ? ? ? ? " " " " " " - - - - - - : : : : : :U1 U1 U1 U1 U1 U1 U1 U1n "8 7 JJJr   