ó
    ‰*£hýv  ã                  óÒ  • 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    ÚQ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/matrices/dense.pyÚ_iszeror      s   € à�9‰9Ðó    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_MatrixExprg…ëQ¸$@é   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ò	
ð �y‰y‹{Ð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   € Ø�x‰x˜vŸz™z¨(°DÓ9Ø#)§:¡:¨l¼GÓ#DØ'-§z¡zÐ2BÀEÓ'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!   € õ 	;Ø�|‰|˜DŸI™IŸN™NÓ,Ó-Ð-r   c                ó   • [        U 5      $ )zêReturns 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ð  €M�4Óà€LØ€Oàñ
ó ð
òLò
.òô"4ô<ò2ò2ð &/×%6Ñ%6€HÔØ%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×%Ñ%Ø�|‰|‹~ÐÜ	�A”u×	Ñ	ØˆÜ	��K×	 Ñ	 Ø�K‰K‹MˆÜˆq�w‰w‹<˜1ÓÜ˜1“:ÐÜ�a‹yÐØ€Hr   c                  ó   • \ rS rSrS rSrg)ÚMutableDenseMatrixés   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)z·Applies 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Ø#Ÿz™z›|×1Ñ1Ö3‰O‰FˆQ�GÙ" 7Ñ5¨fÑ5ˆD�A�‹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�!‹f�eÓ€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   € õ Ùˆa�g‰g�uÓ€AÜ�1—6‘6Ž]ˆÜ�q—v‘v–ˆAØ˜1˜‘gˆA�ˆd‹Gó ñ ð €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õ   € ô~ �cœ3×Ñ 3¨£7Üð #ß#)¡6¨#£;ó0ð 	0ð 	ƒvÜð (ß(.©¨q«ó6ð 	6ð ‹fˆÜ˜"œc×"Ñ" b¨1£f°¸1±WµÜð 6ß6<±f¸SÀ¹UÀAÓ6IóKð Kñ ô
 �E‹N€EÜˆE‹
€AÜˆE‹
€AÜˆC‹€AØ€a€d�GØ€a€d�GØ€a€d�GØˆb€Aˆ€d�GØ€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˜˜E qÑ)Ð)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Ù˜–ˆÜ£v¨s¯x©x¼¼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   ù€ ô> ””G˜TÓ"Ó#€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	[        X“5       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 �'œ:×&Ñ&Ø�G—M‘MÓ!ÜÐHÓIÐIØ�<‰<˜1ÓØ—i‘iˆGØ—.‘.Ó" 1Ñ%ˆÜ�7×ÑÜ�‹LˆÞÜÐ?Ó@Ð@ð ô ÐEÓFÐFÜ�1�f×ÑäÐBÀQÑFÓGÐGÜˆKÓ€AØ	‰€AÜ
�‹(€CÜ˜+Ö&‰ˆÜ�q˜&×!Ñ!äÐFÈÑJÓKÐKÜ�q–ˆAØŸF™F 7¡:Ó.ˆC�1‘5�‹Mó ñ	 'ô �1ŽXˆÜ�q–ˆAØ !§¡ w¡zÓ 2× 7Ñ 7¸¹
Ó CˆC�A‘�q‘u�Óó ñ ô �1ŽXˆÜ�q˜1‘u˜a–ˆAØ˜q˜D™	ˆC�1�‹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$ )zžReturns 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
[        X¡5      u  p¼UR                  X#5      X›U4'   M'     U	$ U H2  n
[        X¡5      u  p¼X¼::  d  M  UR                  X#5      =X›U4'   XœU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 != %iéd   )
Ú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Øˆæ�Q“VÜÐOÐSTÐRXÑXÓYÐYä	ˆq‰u‹€BØ�#ƒ~Ø�[‰[˜œS¤ R£¨¡°CÑ!7Ó8Ó9ˆäˆa‹€AæÛˆCÜ˜#“>‰DˆAØ—l‘l 3Ó,ˆA�ˆd‹Gñ ð €Hó ˆCÜ˜#“>‰DˆAØ�vØ$(§L¡L°Ó$:Ð:��Q�$‘˜!˜q˜D›'ñ ð
 €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Ñ"3°C¸Ô";r   )r   rh   r   ÚOner@   rº   )rú   rû   r-   r¼   r´   ÚWs   ``    r   Ú	wronskianrÿ     sV   ù€ ñ. &/Ó/¢Y ”˜–¡YÑ/€IÜˆI‹€AØˆAƒvÜ�u‰uˆÜˆqÕ;Ó<€AØ�5‰5�‹=Ðùò 0s   ‡A"c                 ób   • SU;   a  UR                  S5      US'   [        R                  " U 0 UD6$ )zžReturns 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   