#!/usr/bin/env python
# coding: utf-8
# # Table of Contents
#
#
# 線形代数(Linear Algebra II) 行列式
#
#
# cc by Shigeto R. Nishitani, 2018-03-16
#
#
# * file: /Users/bob/python/doing_math_with_python/linear_algebra/LA-I.ipynb
# # 定義と解説
#
# 行列式は英語でdeterminant(決定するもの)で,
# 行列の性質を代表する**数**です.
#
# * 定義
# * ${\rm sgn}$関数は,順列に対して符号を決定する関数
#
# $$
# \begin{array}{rl}
# {\rm sgn}(p,q,\ldots,s)& =
# \left\{\begin{array}{ccc}
# 1 & ; & (p,q,\ldots,s)が偶順列 \\
# -1 & ; & (p,q,\ldots,s)が奇順列
# \end{array} \right. \\
# &= (-1)^m ; (p,q,\ldots,s) \overset{\rm m回の互換}{\rightarrow}
# (1,2,\ldots,n)
# \end{array}
# $$
#
# * $A=[a_{ij}]$行列の行列式($|A|, \det A, \det[a_{ij}], |a_1,a_2, \ldots, a_n|$)
# $$
# \left(\begin{array}{cccc}
# a_{11} & a_{12} & \ldots & a_{1n} \\
# a_{21} & a_{22} & \ldots & a_{2n} \\
# \vdots & \vdots & & \vdots \\
# a_{n1} & a_{n2} & \ldots & a_{nn} \\
# \end{array}\right)
# = \sum {\rm sgn}(p,q,\ldots,s) a_{1p}a_{2p}\cdots a_{ns}
# $$
# ここに$\sum$は$\{1,2,\ldots,n\}$のすべての順列$(p,q,\ldots,s)$について加えることを意味する.
#
# * 以下の行列式表記 $|a_1,a_2, \ldots, a_n|$で$a_1,\ldots$は列ベクトルを意図している.
# * サラスの方法(たすき掛け)
#
# * 基本性質
# * $|^t A|=|A|$ 転置しても行列式の値は変わらない
# * 行について成り立つ性質は列についても成り立つ
# * **n重線形性**
# $$
# \left|a_1\cdots \lambda a_j' + \mu a_j'' \cdots a_n \right| =
# \lambda\,\left|a_1\cdots a_j' \cdots a_n\right| +
# \mu\, \left|a_1\cdots a_j'' \cdots a_n\right|
# $$
# * **交代性**
# $$
# \left|a_1\cdots a_j \cdots a_k \cdots a_n \right| =
# - \left|a_1\cdots a_k \cdots a_j \cdots a_n \right|
# $$
#
# * 余因数(余因子)展開
# * 小行列式$D_{ij}$として,余因数は$A_{ij}=(-1)^{i+j}D_{ij}$
#
# * 逆行列
# * 余因子行列,随伴行列 ${\rm adj}A$ ;
# $(i,j)$成分$a_{ij}$の余因子$A_{ij}$を$(j,i)$成分とする行列
# * 逆行列の公式
# $$
# A^{-1} = \frac{1}{|A|} {\rm adj} A = \frac{1}{|A|} ^t|A_{ij}|
# $$
# * $n$次正方行列が正則(逆行列を持つ) $ \iff |A| \neq 0$
#
# * 行列式と階数
# $$
# {\rm rank}A = n \iff Aは正則(逆行列を持つ) \iff |A| \neq 0
# $$
# # 紙
#
# ![LA-II](./figs/LinearAlgebra-II.png)
# # python
# In[3]:
import numpy as np
from pprint import pprint
import scipy.linalg as linalg
#linear algebra
np.set_printoptions(precision=3, suppress=True)
a = np.array([[1,2],[3,4]])
linalg.det(a)
# In[4]:
linalg.inv(a)
# In[9]:
a = np.array([[1,-2,3],[2,-3,4],[3,-8,13]])
pprint(linalg.det(a))
pprint(linalg.inv(a))
# In[10]:
a = np.array([[1,2,-1],[-1,-1,2],[2,-1,1]])
pprint(linalg.det(a))
pprint(linalg.inv(a))
# In[ ]: