
    \hv                       S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJrJr  S SKJr  S S	KJr  S S
KJr  SSKJr  SSKJrJr  SSKJr  SSKJrJr  SSKJrJ r   SS/0r!S r" " S S\5      r#S r$ " S S\#\5      r%\%=r&r'\(4S jr)\(4S jr*S3S jr+S r,S r-S r.S r/S  r0S! r1\" S"S#9S$ 5       r2S4S& jr3S' r4S%S(S).S* jr5S5S+ jr6S6S, jr7S- r8S. r9S/ r:  S7S0 jr;S8S1 jr<S2 r=g)9    )annotationsN)Basic)S)Symbol)sympify)cossin)doctest_depends_on)sympy_deprecation_warning)is_sequence   )
ShapeError)	_cholesky_LDLdecomposition)
MatrixBase)MutableRepMatrix	RepMatrix)_lower_triangular_solve_upper_triangular_solve)symarraynumpyc                    U R                   $ )zReturns True if x is zero.)is_zero)xs    L/var/www/auris/envauris/lib/python3.13/site-packages/sympy/matrices/dense.py_iszeror      s    99    c                      \ rS rSr% SrSrS\S'   SrSr\	S 5       r
S	 rS
 rS rSS jrSS jrS rS r\R                  \l        \R                  \l        \R                  \l        \R                  \l        Srg)DenseMatrix   zJMatrix implementation based on DomainMatrix as the internal representationFboolis_MatrixExprgQ$@   c                8    [        SSSS9  U R                  5       $ )Nzy
            The private _mat attribute of Matrix is deprecated. Use the
            .flat() method instead.
            z1.9z$deprecated-private-matrix-attributes)deprecated_since_versionactive_deprecations_target)r   flatselfs    r   _matDenseMatrix._mat*   s%    ! &+'M	
 yy{r   c                    U R                  UR                  SS5      UR                  S[        5      UR                  SS5      S9$ )NmethodGE
iszerofunctry_block_diagF)r-   r/   r0   )invgetr   )r)   kwargss     r   _eval_inverseDenseMatrix._eval_inverse7   sD    xxvzz(D9#)::lG#D'-zz2BE'J  L 	Lr   c                `    SSK Jn  UR                  U R                  R	                  5       5      $ )z4Returns an Immutable version of this Matrix
        r   )ImmutableDenseMatrix)	immutabler7   _fromrep_repcopy)r)   clss     r   as_immutableDenseMatrix.as_immutable<   s!     	;||DIINN,--r   c                    [        U 5      $ )zReturns a mutable version of this matrix

Examples
========

>>> from sympy import ImmutableMatrix
>>> X = ImmutableMatrix([[1, 2], [3, 4]])
>>> Y = X.as_mutable()
>>> Y[1, 1] = 5 # Can set values in Y
>>> Y
Matrix([
[1, 2],
[3, 5]])
)Matrixr(   s    r   
as_mutableDenseMatrix.as_mutableB   s     d|r   c                    [        XS9$ N)	hermitian)r   r)   rE   s     r   choleskyDenseMatrix.choleskyS   s    33r   c                    [        XS9$ rD   )r   rF   s     r   LDLdecompositionDenseMatrix.LDLdecompositionV   s     ;;r   c                    [        X5      $ N)r   r)   rhss     r   lower_triangular_solve"DenseMatrix.lower_triangular_solveY       &t11r   c                    [        X5      $ rM   )r   rN   s     r   upper_triangular_solve"DenseMatrix.upper_triangular_solve\   rR   r    NT)__name__
__module____qualname____firstlineno____doc__r"   __annotations___op_priority_class_prioritypropertyr*   r4   r=   rA   rG   rJ   rP   rT   r   r   r   r   __static_attributes__rV   r   r   r   r      s    T  M4LO
 
L
."4<22 &/%6%6H%6%>%>%<%D%D"%<%D%D"r   r   c                   [        U SS5      (       a  U R                  5       $ [        U [        5      (       a  U $ [	        U S5      (       a?  U R                  5       n[        UR                  5      S:X  a  [        U5      $ [        U 5      $ U $ )z0Return a matrix as a Matrix, otherwise return x.	is_MatrixF	__array__r   )
getattrrA   
isinstancer   hasattrrd   lenshaper   r@   )r   as     r   _force_mutablerk   e   sp    q+u%%||~	Au			K	 	 KKMqww<11:ayHr   c                      \ rS rSrS rSrg)MutableDenseMatrixs   c                ~    SSK Jn  U R                  5       R                  5        H  u  u  p4nU" U40 UD6XU4'   M     g)zApplies simplify to the elements of a matrix in place.

This is a shortcut for M.applyfunc(lambda x: simplify(x, ratio, measure))

See Also
========

sympy.simplify.simplify.simplify
r   )simplifyN)sympy.simplify.simplifyrp   todokitems)r)   r3   	_simplifyijelements         r   rp   MutableDenseMatrix.simplifyu   s<     	B#zz|113OFQG"75f5DAJ  4r   rV   N)rX   rY   rZ   r[   rp   ra   rV   r   r   rm   rm   s   s    6r   rm   c                f    SSK Jn  U" [        U 5      U5      n[        U 5       H	  u  pEXSU'   M     U$ )z]Converts Python list of SymPy expressions to a NumPy array.

See Also
========

matrix2numpy
r   empty)r   r{   rh   	enumerate)ldtyper{   rj   ru   ss         r   
list2numpyr      s3     c!feA!! Hr   c                    SSK Jn  U" U R                  U5      n[        U R                  5       H)  n[        U R
                  5       H  nXU4   X4U4'   M     M+     U$ )zIConverts SymPy's matrix to a NumPy array.

See Also
========

list2numpy
r   rz   )r   r{   ri   rangerowscols)mr~   r{   rj   ru   rv   s         r   matrix2numpyr      sS     agguA166]qvvA1gAdG   Hr   c                   [        U[        5      (       a  US:  a  [        SR                  U5      5      eX:X  a  [        SR                  X5      5      eX4 HD  n[        U[        5      (       a  US:  d
  XCS-
  :  d  M(  [        SR                  US-
  X5      5      e   [	        U5      n[        U5      n[        U5      n[        U5      nXWX 4'   XWX4'   XgX4'   U* XqU 4'   U$ )a
  Returns a a Givens rotation matrix, a a rotation in the
plane spanned by two coordinates axes.

Explanation
===========

The Givens rotation corresponds to a generalization of rotation
matrices to any number of dimensions, given by:

.. math::
    G(i, j, \theta) =
        \begin{bmatrix}
            1   & \cdots &    0   & \cdots &    0   & \cdots &    0   \\
            \vdots & \ddots & \vdots &        & \vdots &        & \vdots \\
            0   & \cdots &    c   & \cdots &   -s   & \cdots &    0   \\
            \vdots &        & \vdots & \ddots & \vdots &        & \vdots \\
            0   & \cdots &    s   & \cdots &    c   & \cdots &    0   \\
            \vdots &        & \vdots &        & \vdots & \ddots & \vdots \\
            0   & \cdots &    0   & \cdots &    0   & \cdots &    1
        \end{bmatrix}

Where $c = \cos(\theta)$ and $s = \sin(\theta)$ appear at the intersections
``i``\th and ``j``\th rows and columns.

For fixed ``i > j``\, the non-zero elements of a Givens matrix are
given by:

- $g_{kk} = 1$ for $k \ne i,\,j$
- $g_{kk} = c$ for $k = i,\,j$
- $g_{ji} = -g_{ij} = -s$

Parameters
==========

i : int between ``0`` and ``dim - 1``
    Represents first axis
j : int between ``0`` and ``dim - 1``
    Represents second axis
dim : int bigger than 1
    Number of dimensions. Defaults to 3.

Examples
========

>>> from sympy import pi, rot_givens

A counterclockwise rotation of pi/3 (60 degrees) around
the third axis (z-axis):

>>> rot_givens(1, 0, pi/3)
Matrix([
[      1/2, -sqrt(3)/2, 0],
[sqrt(3)/2,        1/2, 0],
[        0,          0, 1]])

If we rotate by pi/2 (90 degrees):

>>> rot_givens(1, 0, pi/2)
Matrix([
[0, -1, 0],
[1,  0, 0],
[0,  0, 1]])

This can be generalized to any number
of dimensions:

>>> rot_givens(1, 0, pi/2, dim=4)
Matrix([
[0, -1, 0, 0],
[1,  0, 0, 0],
[0,  0, 1, 0],
[0,  0, 0, 1]])

References
==========

.. [1] https://en.wikipedia.org/wiki/Givens_rotation

See Also
========

rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (clockwise around the x axis)
rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (clockwise around the y axis)
rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (clockwise around the z axis)
rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (counterclockwise around the x axis)
rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (counterclockwise around the y axis)
rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (counterclockwise around the z axis)
   z/dim must be an integer biggen than one, got {}.z'i and j must be different, got ({}, {})r   r   z=i and j must be integers between 0 and {}, got i={} and j={}.)rf   int
ValueErrorformatr   r   r	   eye)ru   rv   thetadimijcr   Ms           r   
rot_givensr      s    ~ c337 ##)6#;0 	0 	v ((.q6 	6 f"c""b1f1W 66<fSUA6IK K 
 ENEE
AE
ACAadGadGadGbAdGHr   c                    [        SSU SS9$ )a  Returns a rotation matrix for a rotation of theta (in radians)
about the 3-axis.

Explanation
===========

For a right-handed coordinate system, this corresponds to a
clockwise rotation around the `z`-axis, given by:

.. math::

    R  = \begin{bmatrix}
             \cos(\theta) & \sin(\theta) & 0 \\
            -\sin(\theta) & \cos(\theta) & 0 \\
                        0 &            0 & 1
        \end{bmatrix}

Examples
========

>>> from sympy import pi, rot_axis3

A rotation of pi/3 (60 degrees):

>>> theta = pi/3
>>> rot_axis3(theta)
Matrix([
[       1/2, sqrt(3)/2, 0],
[-sqrt(3)/2,       1/2, 0],
[         0,         0, 1]])

If we rotate by pi/2 (90 degrees):

>>> rot_axis3(pi/2)
Matrix([
[ 0, 1, 0],
[-1, 0, 0],
[ 0, 0, 1]])

See Also
========

rot_givens: Returns a Givens rotation matrix (generalized rotation for
    any number of dimensions)
rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (counterclockwise around the z axis)
rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (clockwise around the x axis)
rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (clockwise around the y axis)
r   r      r   r   r   s    r   	rot_axis3r   (      h aEq))r   c                    [        SSU SS9$ )a  Returns a rotation matrix for a rotation of theta (in radians)
about the 2-axis.

Explanation
===========

For a right-handed coordinate system, this corresponds to a
clockwise rotation around the `y`-axis, given by:

.. math::

    R  = \begin{bmatrix}
            \cos(\theta) & 0 & -\sin(\theta) \\
                       0 & 1 &             0 \\
            \sin(\theta) & 0 &  \cos(\theta)
        \end{bmatrix}

Examples
========

>>> from sympy import pi, rot_axis2

A rotation of pi/3 (60 degrees):

>>> theta = pi/3
>>> rot_axis2(theta)
Matrix([
[      1/2, 0, -sqrt(3)/2],
[        0, 1,          0],
[sqrt(3)/2, 0,        1/2]])

If we rotate by pi/2 (90 degrees):

>>> rot_axis2(pi/2)
Matrix([
[0, 0, -1],
[0, 1,  0],
[1, 0,  0]])

See Also
========

rot_givens: Returns a Givens rotation matrix (generalized rotation for
    any number of dimensions)
rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (clockwise around the y axis)
rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (counterclockwise around the x axis)
rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (counterclockwise around the z axis)
r   r   r   r   r   r   s    r   	rot_axis2r   _  r   r   c                    [        SSU SS9$ )a  Returns a rotation matrix for a rotation of theta (in radians)
about the 1-axis.

Explanation
===========

For a right-handed coordinate system, this corresponds to a
clockwise rotation around the `x`-axis, given by:

.. math::

    R  = \begin{bmatrix}
            1 &             0 &            0 \\
            0 &  \cos(\theta) & \sin(\theta) \\
            0 & -\sin(\theta) & \cos(\theta)
        \end{bmatrix}

Examples
========

>>> from sympy import pi, rot_axis1

A rotation of pi/3 (60 degrees):

>>> theta = pi/3
>>> rot_axis1(theta)
Matrix([
[1,          0,         0],
[0,        1/2, sqrt(3)/2],
[0, -sqrt(3)/2,       1/2]])

If we rotate by pi/2 (90 degrees):

>>> rot_axis1(pi/2)
Matrix([
[1,  0, 0],
[0,  0, 1],
[0, -1, 0]])

See Also
========

rot_givens: Returns a Givens rotation matrix (generalized rotation for
    any number of dimensions)
rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (counterclockwise around the x axis)
rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (clockwise around the y axis)
rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (clockwise around the z axis)
r   r   r   r   r   r   s    r   	rot_axis1r     r   r   c                    [        SSU SS9$ )a   Returns a rotation matrix for a rotation of theta (in radians)
about the 3-axis.

Explanation
===========

For a right-handed coordinate system, this corresponds to a
counterclockwise rotation around the `z`-axis, given by:

.. math::

    R  = \begin{bmatrix}
            \cos(\theta) & -\sin(\theta) & 0 \\
            \sin(\theta) &  \cos(\theta) & 0 \\
                       0 &             0 & 1
        \end{bmatrix}

Examples
========

>>> from sympy import pi, rot_ccw_axis3

A rotation of pi/3 (60 degrees):

>>> theta = pi/3
>>> rot_ccw_axis3(theta)
Matrix([
[      1/2, -sqrt(3)/2, 0],
[sqrt(3)/2,        1/2, 0],
[        0,          0, 1]])

If we rotate by pi/2 (90 degrees):

>>> rot_ccw_axis3(pi/2)
Matrix([
[0, -1, 0],
[1,  0, 0],
[0,  0, 1]])

See Also
========

rot_givens: Returns a Givens rotation matrix (generalized rotation for
    any number of dimensions)
rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (clockwise around the z axis)
rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (counterclockwise around the x axis)
rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (counterclockwise around the y axis)
r   r   r   r   r   r   s    r   rot_ccw_axis3r     r   r   c                    [        SSU SS9$ )a  Returns a rotation matrix for a rotation of theta (in radians)
about the 2-axis.

Explanation
===========

For a right-handed coordinate system, this corresponds to a
counterclockwise rotation around the `y`-axis, given by:

.. math::

    R  = \begin{bmatrix}
             \cos(\theta) & 0 & \sin(\theta) \\
                        0 & 1 &            0 \\
            -\sin(\theta) & 0 & \cos(\theta)
        \end{bmatrix}

Examples
========

>>> from sympy import pi, rot_ccw_axis2

A rotation of pi/3 (60 degrees):

>>> theta = pi/3
>>> rot_ccw_axis2(theta)
Matrix([
[       1/2, 0, sqrt(3)/2],
[         0, 1,         0],
[-sqrt(3)/2, 0,       1/2]])

If we rotate by pi/2 (90 degrees):

>>> rot_ccw_axis2(pi/2)
Matrix([
[ 0,  0,  1],
[ 0,  1,  0],
[-1,  0,  0]])

See Also
========

rot_givens: Returns a Givens rotation matrix (generalized rotation for
    any number of dimensions)
rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (clockwise around the y axis)
rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (counterclockwise around the x axis)
rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (counterclockwise around the z axis)
r   r   r   r   r   r   s    r   rot_ccw_axis2r     r   r   c                    [        SSU SS9$ )a   Returns a rotation matrix for a rotation of theta (in radians)
about the 1-axis.

Explanation
===========

For a right-handed coordinate system, this corresponds to a
counterclockwise rotation around the `x`-axis, given by:

.. math::

    R  = \begin{bmatrix}
            1 &            0 &             0 \\
            0 & \cos(\theta) & -\sin(\theta) \\
            0 & \sin(\theta) &  \cos(\theta)
        \end{bmatrix}

Examples
========

>>> from sympy import pi, rot_ccw_axis1

A rotation of pi/3 (60 degrees):

>>> theta = pi/3
>>> rot_ccw_axis1(theta)
Matrix([
[1,         0,          0],
[0,       1/2, -sqrt(3)/2],
[0, sqrt(3)/2,        1/2]])

If we rotate by pi/2 (90 degrees):

>>> rot_ccw_axis1(pi/2)
Matrix([
[1, 0,  0],
[0, 0, -1],
[0, 1,  0]])

See Also
========

rot_givens: Returns a Givens rotation matrix (generalized rotation for
    any number of dimensions)
rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis (clockwise around the x axis)
rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis (counterclockwise around the y axis)
rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis (counterclockwise around the z axis)
r   r   r   r   r   r   s    r   rot_ccw_axis1r   ;  r   r   )r   )modulesc                    SSK JnJn  U" U[        S9nU" U5       H5  n[	        U < SSR                  [        [        U5      5      < 340 UD6XV'   M7     U$ )a  Create a numpy ndarray of symbols (as an object array).

The created symbols are named ``prefix_i1_i2_``...  You should thus provide a
non-empty prefix if you want your symbols to be unique for different output
arrays, as SymPy symbols with identical names are the same object.

Parameters
----------

prefix : string
  A prefix prepended to the name of every symbol.

shape : int or tuple
  Shape of the created array.  If an int, the array is one-dimensional; for
  more than one dimension the shape must be a tuple.

\*\*kwargs : dict
  keyword arguments passed on to Symbol

Examples
========
These doctests require numpy.

>>> from sympy import symarray
>>> symarray('', 3)
[_0 _1 _2]

If you want multiple symarrays to contain distinct symbols, you *must*
provide unique prefixes:

>>> a = symarray('', 3)
>>> b = symarray('', 3)
>>> a[0] == b[0]
True
>>> a = symarray('a', 3)
>>> b = symarray('b', 3)
>>> a[0] == b[0]
False

Creating symarrays with a prefix:

>>> symarray('a', 3)
[a_0 a_1 a_2]

For more than one dimension, the shape must be given as a tuple:

>>> symarray('a', (2, 3))
[[a_0_0 a_0_1 a_0_2]
 [a_1_0 a_1_1 a_1_2]]
>>> symarray('a', (2, 3, 2))
[[[a_0_0_0 a_0_0_1]
  [a_0_1_0 a_0_1_1]
  [a_0_2_0 a_0_2_1]]
<BLANKLINE>
 [[a_1_0_0 a_1_0_1]
  [a_1_1_0 a_1_1_1]
  [a_1_2_0 a_1_2_1]]]

For setting assumptions of the underlying Symbols:

>>> [s.is_real for s in symarray('a', 2, real=True)]
[True, True]
r   )r{   ndindex)r~   _)r   r{   r   objectr   joinmapstr)prefixri   r3   r{   r   arrindexs          r   r   r   r  sS    B %
V
$CvsxxC/HI &$&
   Jr   Tc                   ^ ^ [        [        [        T 5      5      m U(       d  UU 4S jnOUU 4S jn[        T 5      n[	        XDU5      R                  5       $ )a  Given linear difference operator L of order 'k' and homogeneous
equation Ly = 0 we want to compute kernel of L, which is a set
of 'k' sequences: a(n), b(n), ... z(n).

Solutions of L are linearly independent iff their Casoratian,
denoted as C(a, b, ..., z), do not vanish for n = 0.

Casoratian is defined by k x k determinant::

           +  a(n)     b(n)     . . . z(n)     +
           |  a(n+1)   b(n+1)   . . . z(n+1)   |
           |    .         .     .        .     |
           |    .         .       .      .     |
           |    .         .         .    .     |
           +  a(n+k-1) b(n+k-1) . . . z(n+k-1) +

It proves very useful in rsolve_hyper() where it is applied
to a generating set of a recurrence to factor out linearly
dependent solutions and return a basis:

>>> from sympy import Symbol, casoratian, factorial
>>> n = Symbol('n', integer=True)

Exponential and factorial are linearly independent:

>>> casoratian([2**n, factorial(n)], n) != 0
True

c                4   > TU   R                  TTU -   5      $ rM   subsru   rv   nseqss     r   <lambda>casoratian.<locals>.<lambda>  s    aaQ/r   c                .   > TU   R                  TU 5      $ rM   r   r   s     r   r   r     s    aa+r   )listr   r   rh   r@   det)r   r   zerofks   ``   r   
casoratianr     sA    > GT"#D/+D	A!?  r   c                 .    [         R                  " U 0 UD6$ )zHCreate square identity matrix n x n

See Also
========

diag
zeros
ones
)r@   r   argsr3   s     r   r   r     s     ::t&v&&r   Fstrictunpackc                2    [         R                  " X US.UD6$ )a  Returns a matrix with the provided values placed on the
diagonal. If non-square matrices are included, they will
produce a block-diagonal matrix.

Examples
========

This version of diag is a thin wrapper to Matrix.diag that differs
in that it treats all lists like matrices -- even when a single list
is given. If this is not desired, either put a `*` before the list or
set `unpack=True`.

>>> from sympy import diag

>>> diag([1, 2, 3], unpack=True)  # = diag(1,2,3) or diag(*[1,2,3])
Matrix([
[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])

>>> diag([1, 2, 3])  # a column vector
Matrix([
[1],
[2],
[3]])

See Also
========
.matrixbase.MatrixBase.eye
.matrixbase.MatrixBase.diagonal
.matrixbase.MatrixBase.diag
.expressions.blockmatrix.BlockMatrix
r   )r@   diag)r   r   valuesr3   s       r   r   r     s    D ;;fGGGr   c                .    [         R                  " XSS.6$ )a  Apply the Gram-Schmidt process to a set of vectors.

Parameters
==========

vlist : List of Matrix
    Vectors to be orthogonalized for.

orthonormal : Bool, optional
    If true, return an orthonormal basis.

Returns
=======

vlist : List of Matrix
    Orthogonalized vectors

Notes
=====

This routine is mostly duplicate from ``Matrix.orthogonalize``,
except for some difference that this always raises error when
linearly dependent vectors are found, and the keyword ``normalize``
has been named as ``orthonormal`` in this function.

See Also
========

.matrixbase.MatrixBase.orthogonalize

References
==========

.. [1] https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process
T)	normalize	rankcheck)rm   orthogonalize)vlistorthonormals     r   GramSchmidtr     s    H ++	 r   c                j   [        U[        5      (       aJ  SUR                  ;  a  [        S5      eUR                  S:X  a  UR
                  nUR                  5       S   n[        U5      (       a  [        U5      nU(       d  [        S5      eO[        S5      e[        U S5      (       d  [        SU -  5      e[        U5      nXC-   n[        U5      n[        U5       HO  u  px[        US5      (       d  [        SU -  5      e[        U5       H  n	UR                  X   5      XgX-   4'   M     MQ     [        U5       HB  n	[        X5       H0  n
U R                  X   5      R                  X   5      XiU-   X-   4'   M2     MD     [        U5       H#  n	[        U	S-   U5       H  n
XiU
4   XjU	4'   M     M%     U$ )a~  Compute Hessian matrix for a function f wrt parameters in varlist
which may be given as a sequence or a row/column vector. A list of
constraints may optionally be given.

Examples
========

>>> from sympy import Function, hessian, pprint
>>> from sympy.abc import x, y
>>> f = Function('f')(x, y)
>>> g1 = Function('g')(x, y)
>>> g2 = x**2 + 3*y
>>> pprint(hessian(f, (x, y), [g1, g2]))
[                   d               d            ]
[     0        0    --(g(x, y))     --(g(x, y))  ]
[                   dx              dy           ]
[                                                ]
[     0        0        2*x              3       ]
[                                                ]
[                     2               2          ]
[d                   d               d           ]
[--(g(x, y))  2*x   ---(f(x, y))   -----(f(x, y))]
[dx                   2            dy dx         ]
[                   dx                           ]
[                                                ]
[                     2               2          ]
[d                   d               d           ]
[--(g(x, y))   3   -----(f(x, y))   ---(f(x, y)) ]
[dy                dy dx              2          ]
[                                   dy           ]

References
==========

.. [1] https://en.wikipedia.org/wiki/Hessian_matrix

See Also
========

sympy.matrices.matrixbase.MatrixBase.jacobian
wronskian
r   z)`varlist` must be a column or row vector.r   z `len(varlist)` must not be zero.z*Improper variable list in hessian functiondiffz'Function `f` (%s) is not differentiable)rf   r   ri   r   r   Ttolistr   rh   r   re   zerosr|   r   r   )r   varlistconstraintsr   r   Noutr   gru   rv   s              r   hessianr   F  s   X ':&&GMM!HII<<1iiG.."1%7L?@@  EFF1fBQFGGKA	A
(C+&q&!!FJKKqAFF7:.C15M 	 ' 1XqA !wz 2 7 7
 CCAqu   1Xq1uaAqD	C1I !  Jr   c                (    [         R                  XS9$ )z
Create a Jordan block:

Examples
========

>>> from sympy import jordan_cell
>>> from sympy.abc import x
>>> jordan_cell(x, 4)
Matrix([
[x, 1, 0, 0],
[0, x, 1, 0],
[0, 0, x, 1],
[0, 0, 0, x]])
)size
eigenvalue)r@   jordan_block)eigenvalr   s     r   jordan_cellr     s    " A;;r   c                $    U R                  U5      $ )a]  Return the Hadamard product (elementwise product) of A and B

>>> from sympy import Matrix, matrix_multiply_elementwise
>>> A = Matrix([[0, 1, 2], [3, 4, 5]])
>>> B = Matrix([[1, 10, 100], [100, 10, 1]])
>>> matrix_multiply_elementwise(A, B)
Matrix([
[  0, 10, 200],
[300, 40,   5]])

See Also
========

sympy.matrices.matrixbase.MatrixBase.__mul__
)multiply_elementwise)ABs     r   matrix_multiply_elementwiser     s      !!!$$r   c                 b    SU;   a  UR                  S5      US'   [        R                  " U 0 UD6$ )zReturns a matrix of ones with ``rows`` rows and ``cols`` columns;
if ``cols`` is omitted a square matrix will be returned.

See Also
========

zeros
eye
diag
r   r   )popr@   onesr   s     r   r   r     s0     f}Cv;;'''r   c                   U=(       d    [         R                  " U5      nUc  U nU(       a  X:w  a  [        SX4-  5      e[        X-  5      nUS:w  a*  UR	                  U[        [        U5      U-  S-  5      5      n[        X5      n	U(       d-  U H%  n
[        X5      u  pUR                  X#5      XU4'   M'     U	$ U H2  n
[        X5      u  pX::  d  M  UR                  X#5      =XU4'   XU4'   M4     U	$ )a  Create random matrix with dimensions ``r`` x ``c``. If ``c`` is omitted
the matrix will be square. If ``symmetric`` is True the matrix must be
square. If ``percent`` is less than 100 then only approximately the given
percentage of elements will be non-zero.

The pseudo-random number generator used to generate matrix is chosen in the
following way.

* If ``prng`` is supplied, it will be used as random number generator.
  It should be an instance of ``random.Random``, or at least have
  ``randint`` and ``shuffle`` methods with same signatures.
* if ``prng`` is not supplied but ``seed`` is supplied, then new
  ``random.Random`` with given ``seed`` will be created;
* otherwise, a new ``random.Random`` with default seed will be used.

Examples
========

>>> from sympy import randMatrix
>>> randMatrix(3) # doctest:+SKIP
[25, 45, 27]
[44, 54,  9]
[23, 96, 46]
>>> randMatrix(3, 2) # doctest:+SKIP
[87, 29]
[23, 37]
[90, 26]
>>> randMatrix(3, 3, 0, 2) # doctest:+SKIP
[0, 2, 0]
[2, 0, 1]
[0, 0, 1]
>>> randMatrix(3, symmetric=True) # doctest:+SKIP
[85, 26, 29]
[26, 71, 43]
[29, 43, 57]
>>> A = randMatrix(3, seed=1)
>>> B = randMatrix(3, seed=2)
>>> A == B
False
>>> A == randMatrix(3, seed=1)
True
>>> randMatrix(3, symmetric=True, percent=50) # doctest:+SKIP
[77, 70,  0],
[70,  0,  0],
[ 0,  0, 88]
z4For symmetric matrices, r must equal c, but %i != %id   )
randomRandomr   r   sampler   rh   r   divmodrandint)rr   minmaxseed	symmetricpercentprngr   r   ijkru   rv   s                r   
randMatrixr     s    b &6==&DyQVOSTRXXYY	quB#~[[SRC!789aAC#>DAll3,AdG  H C#>DAv$(LL$::Q$!qD' 
 Hr   c                   ^ ^ T  Vs/ s H  n[        U5      PM     snm [        T 5      nUS:X  a  [        R                  $ [	        XDU U4S j5      nUR                  U5      $ s  snf )a:  
Compute Wronskian for [] of functions

::

                     | f1       f2        ...   fn      |
                     | f1'      f2'       ...   fn'     |
                     |  .        .        .      .      |
    W(f1, ..., fn) = |  .        .         .     .      |
                     |  .        .          .    .      |
                     |  (n)      (n)            (n)     |
                     | D   (f1) D   (f2)  ...  D   (fn) |

see: https://en.wikipedia.org/wiki/Wronskian

See Also
========

sympy.matrices.matrixbase.MatrixBase.jacobian
hessian
r   c                .   > TU    R                  TU5      $ rM   )r   )ru   rv   	functionsvars     r   r   wronskian.<locals>.<lambda>3  s    )A,"3"3C";r   )r   rh   r   Oner@   r   )r   r   r-   r   r   Ws   ``    r   	wronskianr     sV    . &//YY/IIAAvuuq;<A55= 0s   A"c                 b    SU;   a  UR                  S5      US'   [        R                  " U 0 UD6$ )zReturns a matrix of zeros with ``rows`` rows and ``cols`` columns;
if ``cols`` is omitted a square matrix will be returned.

See Also
========

ones
eye
diag
r   r   )r   r@   r   r   s     r   r   r   7  s0     f}Cv<<(((r   )r   rW   )F)rV   )Nr   c   NFr   N)bareiss)>
__future__r   r   sympy.core.basicr   sympy.core.singletonr   sympy.core.symbolr   sympy.core.sympifyr   (sympy.functions.elementary.trigonometricr   r	   sympy.utilities.decoratorr
   sympy.utilities.exceptionsr   sympy.utilities.iterablesr   
exceptionsr   decompositionsr   r   
matrixbaser   	repmatrixr   r   solversr   r   __doctest_requires__r   r   rk   rm   MutableMatrixr@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rV   r   r   <module>r     s!   "  " " $ & = 8 @ 1 " 8 " 2 E &y1 
FE) FER6&6 6" , +   ! ,tn4*n4*n4*n4*n4*n4*n J'E (EX(!V' e "HJ&RJZ<(%&($ ?D!%IX>)r   