鸡兔同笼,但是线性代数

灵感来自:bilibili,巨佬!

我们有 14 14 14 个头, 32 32 32 只脚,所有鸡和兔都没有变异,头和脚都完整,没有数错。还有什么 Bug 吗

小学奥数

假设全是鸡,则有 14 × 2 = 28 14 \times 2 = 28 14×2=28 只脚。

但是少了 4 4 4 只脚,因为我们看到一只兔子就施展膜法将其变成了鸡,导致所有兔子都变成了鸡。

每只兔子变成鸡,头数不变,少了两只脚,所以有 4 ÷ 2 = 2 4 \div 2 = 2 4÷2=2 只兔子,有 14 − 2 = 12 14 - 2 = 12 14−2=12 只鸡。

初中

鸡爷解:设有 x x x 只鸡, y y y 只兔。

则有:

{ x + y = 14 2 x + 4 y = 32 \begin{cases} x+y=14 \\ 2x+4y=32 \end{cases} {x+y=142x+4y=32

解得(过程太简单不写了 ,自行高斯消元):

{ x = 12 y = 2 \begin{cases} x=12 \\ y=2 \end{cases} {x=12y=2

进入正题!(已经完全了解矩阵的神犇跳到最后)

线性变换(线性映射)是什么:一个函数,输入输出都是向量,满足如下性质:

f ( k x ⃗ ) = k f ( x ⃗ ) f ( x ⃗ + y ⃗ ) = f ( x ⃗ ) + f ( y ⃗ ) \begin{aligned} f(k\vec x)&=kf(\vec x) \\ f(\vec x + \vec y) &= f(\vec x) + f(\vec y) \end{aligned} f(kx )f(x +y )=kf(x )=f(x )+f(y )

这个 f f f 就是一个线性映射,通常记为 A A A。

向量是什么:一个 vector,还不懂吗。哦读者可能不是 C艹 党,所以说一下:向量就是一系列数,类似我们幼儿园就学过的数对。

向量也可以用来表示一个点,学习时通常是 2 2 2 维或 3 3 3 维的:

plain 复制代码
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--O--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+==+==+==+==+==+==+==+==+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+

-| 是坐标轴,= 是 x x x 轴,H 是 y y y 轴,每条小线段长度为 1 1 1)

我们要表示图中的 O 点,就可以用数对,注意到 O 点在第 3 3 3 列,第 2 2 2 行,所以可以表示为 ( 3 , 2 ) (3, 2) (3,2)。

如果我们想换种方法呢?

[ 3 2 ] \begin{bmatrix} 3 \\ 2 \end{bmatrix} [32]

记为 O ⃗ \vec{O} O 怎么样? O O O 是名字,上面的箭头 ⃗ \vec{} 表示它是一个向量。

实际上,向量可以理解为一个点,也可以理解为一条从原点指向某个点的箭头。

向量的数乘(就是一个数字乘上一个向量)就是把这个向量的长度乘上这个数,也就是把 x x x 和 y y y 坐标分别乘上这个数。

向量的加法(两个向量之和)就是把两个向量头尾拼起来,然后记录它们最终指向的点,它们的和就是这个点。

是不是感觉和复数有点像?没错,复数可以表示向量,但是仅限二维,然而向量可以是三维,四维,一维,零维,甚至 114514 114514 114514 维(我乱说的)和 12288 12288 12288 维(据说 GPT 内部的向量就是这个)。

现在我们有一个神奇的线性映射 A A A,作用是把向量的长度乘 2 2 2。容易验证它满足线性映射的条件。

则对 O ⃗ \vec{O} O 进行 A A A 映射会怎么样?原本要记作 A ( O ⃗ ) A(\vec{O}) A(O ) 的,但是我们可以省略括号(真的吗,函数也可以吗),记作 A O ⃗ A\vec{O} AO (不管你是怎么想的,反正目前数学界就是这么写的),也可以记作 A A A 和 O ⃗ \vec{O} O 的积,也就是它们相乘的结果。

其实,一个线性映射就是一个矩阵,它的具体含义暂且不谈,这里只需要知道两个矩阵相乘就是两个矩阵相继作用的结果,比如 A A A 和 B B B 相乘,就是 A B AB AB,表示先进行 B B B 变换再进行 A A A 变换,很奇怪,但是函数不就是这样的吗? A ( B ( u ⃗ ) ) A(B(\vec{u})) A(B(u )) 嘛,省略掉括号。

我们来看看这种运算是否满足交换律,结合律(显然满足分配律,因为就是定义):

f ( g ( x ) ) ≠ g ( f ( x ) ) f(g(x)) \not = g(f(x)) f(g(x))=g(f(x)),不满足交换律 😦

f ( g ( h ( x ) ) ) = f ( g ( h ( x ) ) ) f(g(h(x))) = f(g(h(x))) f(g(h(x)))=f(g(h(x))),满足结合律 😃

不过好像有点不太好?我们来详细地说一下。

( A B ) C = A ( B C ) (AB)C = A(BC) (AB)C=A(BC)

对于前者:依次进行 C C C, B B B, A A A 变换。

对于后者:依次进行 C C C, B B B, A A A 变换。

有什么可以证明的?

接下来讲讲矩阵里面具体是什么。

对于一个二维空间,所有点都可以由两个向量 u ⃗ \vec{u} u 和 v ⃗ \vec{v} v 分别乘上两个数 a a a 和 b b b 的和得到,具体来讲是 x ⃗ = a u ⃗ + b v ⃗ \vec{x}=a\vec{u}+b\vec{v} x =au +bv 。

通常,这个 u ⃗ \vec{u} u 就是 [ 1 0 ] \begin{bmatrix} 1\\0\end{bmatrix} [10],一条指向正右方的长度为 1 1 1 的向量, v ⃗ \vec{v} v 就是 [ 0 1 ] \begin{bmatrix} 0 \\ 1 \end{bmatrix} [01],而你会惊喜地发现 a a a 和 b b b 就分别是 x x x 坐标和 y y y 坐标,而这个向量就记作 [ a b ] \begin{bmatrix} a \\ b \end{bmatrix} [ab]。

而这里的 u ⃗ \vec{u} u 和 v ⃗ \vec{v} v 就称作二维空间中的两个基向量,两个二维的基向量可以张成一个二维空间(就是可以控制 a a a 和 b b b 到达二维空间上的每一个点),这个二维空间记作 s p a n ( u ⃗ , v ⃗ ) \mathrm{span}(\vec{u},\vec{v}) span(u ,v ),不过超纲了(大小写我也不大记得了)。

但如果 u ⃗ \vec{u} u 或者 v ⃗ \vec{v} v 不是这两个向量,那么还可不可以这样呢?绝大多数(无法这样的情况存在,但是是一个零测集)情况下,可以。但是就不会是 x x x 坐标和 y y y 坐标了。

比如加入 u ⃗ = [ 3 0 ] \vec{u} = \begin{bmatrix} 3 \\ 0 \end{bmatrix} u =[30], v ⃗ = [ 0 2 ] \vec{v} = \begin{bmatrix} 0 \\ 2 \end{bmatrix} v =[02],那么这里 a a a 和 b b b 就都是 1 1 1,可以记作由我们的新的基向量张成的空间上的点 [ 1 1 ] \begin{bmatrix} 1 \\ 1 \end{bmatrix} [11],此时 a = b = 1 a=b=1 a=b=1。

而一个矩阵就是两个基向量拼起来,输入的向量在表达上不变。

具体来讲,设原来的(通常是由上面提到的最经典的使得 a = x , b = y a=x,b=y a=x,b=y 的两个基向量)空间上有一个向量 u ⃗ \vec{u} u ,然后这个矩阵所含有的两个向量张成的空间上找到一个向量 v ⃗ \vec{v} v ,使得两个向量字面上一样。

比如原本的空间是这样的,两个基向量分别是 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \end{bmatrix} [10] 和 [ 0 1 ] \begin{bmatrix} 0 \\ 1 \end{bmatrix} [01]:

plain 复制代码
+--+--+--+--+--+--+--A--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--O--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+==+==+==+==+==+==+==+==+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+

矩阵的两个向量张成的空间是这样的,两个基向量分别是 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \end{bmatrix} [10] 和 [ 0 2 ] \begin{bmatrix} 0 \\ \color{red}2 \end{bmatrix} [02]:

plain 复制代码
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--P--+
|  |  |  |  H  |  |  |  |
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
|  |  |  |  H  |  |  |  |
+==+==+==+==+==+==+==+==+
|  |  |  |  H  |  |  |  |
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+
|  |  |  |  H  |  |  |  |
|  |  |  |  H  |  |  |  |
+--+--+--+--+--+--+--+--+

其中 O 点和 P 点在字面上都是 [ 3 2 ] \begin{bmatrix} 3 \\ 2 \end{bmatrix} [32],但是它们的位置却完全不一样。

而实际上,如果把第二个空间直接平移到第一个空间上面,使得原点重合(线性映射的性质保证了原点必然不变),那么 P P P 点会移动到 A A A 点的位置(实际上不会,因为我画的坐标轴的线是有宽度的,实际上不应该有宽度),而这个 A A A 点就是这个结果,也就是 [ 3 4 ] \begin{bmatrix} 3 \\ 4 \end{bmatrix} [34]。

那么,如何计算呢?每算一个都画两个网格完全没必要吧?没事,我们来跟踪一下 x x x 和 y y y,设两个基向量为 [ a b ] \begin{bmatrix} a \\ b \end{bmatrix} [ab] 和 [ c d ] \begin{bmatrix} c \\ d \end{bmatrix} [cd]。

那么先看 x x x 坐标,原本的基向量的 x x x 分别是 1 1 1 和 0 0 0,显然因为右边是 0 0 0,所以第一个基向量的系数(如果你记忆力还不错的话, a a a)就是原本的 x x x,而现在变成了 a x ax ax。而第二个基向量的系数为 y y y,所以 x x x 又增加了 c y cy cy,最终的 x x x 坐标为 a x + c y ax+cy ax+cy。

再看 y y y 坐标,同理,是 b x + d y bx+dy bx+dy。

而一个矩阵到底如何表示呢?很简单,把两个基向量拼到一起即可。

所以我们就得到了公式(注意,我把各个数的位置调换了一下,原本是 [ a c b d ] \begin{bmatrix} a & c \\ b & d \end{bmatrix} [abcd]):

[ a b c d ] [ e f ] = [ a e + b f c e + d f ] \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} e \\ f \end{bmatrix} = \begin{bmatrix} ae+bf \\ ce+df \end{bmatrix} [acbd][ef]=[ae+bfce+df]

鼓掌!

那么我们如何计算两个矩阵相继作用的结果,也就是它们的积呢?

[ a b c d ] [ e f g h ] = what? \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} e & f \\ g & h \end{bmatrix} = \text{what?} [acbd][egfh]=what?

我们可以看看两个基向量的去向。

首先,原本的基向量为 [ e g ] \begin{bmatrix} e \\ g \end{bmatrix} [eg] 和 [ f g ] \begin{bmatrix} f \\ g \end{bmatrix} [fg]。

第一个基向量变换后为 [ a e + b g c e + d g ] \begin{bmatrix} ae+bg \\ ce + dg\end{bmatrix} [ae+bgce+dg]。

第二个基向量变换后为 $\begin{bmatrix} af+bh \ cf+dh \end{bmatrix} $。

所以最终的矩阵为 [ a e + b g a f + b h c e + d g c f + d h ] \begin{bmatrix} ae+bg & af+bh \\ ce+dg & cf+dh\end{bmatrix} [ae+bgce+dgaf+bhcf+dh]。

当然,多次用矩阵乘法也可以证明结合律,试试看!(会逝世的,最好别试)

矩阵除法咋办? A B = A ⋅ 1 B = A B − 1 \dfrac{A}{B}=A \cdot \dfrac{1}{B} = AB^{-1} BA=A⋅B1=AB−1

矩阵求逆如何求? A − 1 = ? A^{-1}=? A−1=?。

先介绍一个单位矩阵的概念,其实就是多个最纯粹的基向量拼起来。比如二阶单位矩阵为 [ 1 0 0 1 ] \begin{bmatrix} 1& 0 \\ 0 & 1 \end{bmatrix} [1001],三阶单位矩阵为 [ 1 0 0 0 1 0 0 0 1 ] \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} 100010001 。

介绍一种方法:先把这个矩阵和单位矩阵拼起来,类似这样:$ \left[\begin{array}{c c|c c} a&b&1&0 \ c&d&0&1 \end{array}\right] (我擦这 KaTeX \\KaTeX KATEX 好难打),然后进行初等行变换直到左边为单位矩阵,类似这样: \left[\begin{array}{c c|c c} 1&0&e&f \ 0&1&g&h \end{array}\right] $,右边的就是 A A A 的逆。

初等行变换是什么?

  1. 交换两行,记作 r a ↔ r b r_a \leftrightarrow r_b ra↔rb。
  2. 把一行所有元素同时变成原来的某一倍,记作 k r a kr_a kra。
  3. 把两行元素相加,存到这两行中的某一行中,记作 r a + r b r_a+r_b ra+rb。

其实第三种和第二种结合可以变成一种更厉害的,一般用这种:

  1. 把两行元素同时扩倍不同的(相同也可以)倍数后相加,结果存到这两行中的某一行中,记作 k 1 r a + k 2 r b k_1r_a+k_2r_b k1ra+k2rb。

于是我们就可以这样干:

将鸡兔同笼的矩阵记为 [ 1 1 2 4 ] \begin{bmatrix} 1 & 1 \\ 2 & 4 \end{bmatrix} [1214]。

将题目记为 [ 14 32 ] \begin{bmatrix}14 \\ 32 \end{bmatrix} [1432]。

我们对矩阵求个逆:
[ 1 1 1 0 2 4 0 1 ] → r 2 − 2 r 1 [ 1 1 1 0 0 2 − 2 1 ] → r 1 − 1 2 r 2 [ 1 0 2 − 1 2 0 2 − 2 1 ] → 1 2 r 2 [ 1 0 2 − 1 2 0 1 − 1 1 2 ] \begin{aligned} & \left[\begin{array}{c c|c c} 1&1&1&0 \\ 2&4&0&1 \end{array}\right] \\ \xrightarrow{r_2-2r_1} & \left[\begin{array}{c c|c c} 1&1&1&0 \\ 0&2&-2&1 \end{array}\right] \\ \xrightarrow{r_1-{1 \over 2} r_2} & \left[\begin{array}{c c|c c} 1&0&2&-{1\over 2} \\ 0&2&-2&1 \end{array}\right] \\ \xrightarrow{{1 \over 2}r_2} & \left[\begin{array}{c c|c c} 1&0&2&-{1\over 2} \\ 0&1&-1&1 \over 2 \end{array}\right] \end{aligned} r2−2r1 r1−21r2 21r2 [12141001][10121−201][10022−2−211][10012−1−2121]

故逆矩阵为 [ 2 − 1 2 − 1 1 2 ] \begin{bmatrix} 2 & -{1 \over 2} \\ -1 & 1 \over 2 \end{bmatrix} [2−1−2121]。

将逆矩阵乘上 [ 14 32 ] \begin{bmatrix}14 \\ 32 \end{bmatrix} [1432]:

[ 2 − 1 2 − 1 1 2 ] [ 14 32 ] = [ 28 − 16 16 − 14 ] = [ 12 2 ] \begin{bmatrix} 2 & -{1 \over 2} \\ -1 & 1 \over 2 \end{bmatrix}\begin{bmatrix}14 \\ 32 \end{bmatrix}=\begin{bmatrix}28-16 \\ 16-14 \end{bmatrix}=\begin{bmatrix}12 \\ 2 \end{bmatrix} [2−1−2121][1432]=[28−1616−14]=[122]

我们成功地用 229 229 229 行 Markdown 代码解出了超级难的鸡兔同笼问题!鼓掌!

相关推荐
TuringSnowy3 小时前
Maximum_Likelihood
笔记·数学建模·概率论
不知名舍友3 小时前
C++:采用模板封装顺序表,栈,队列
开发语言·c++·算法
简单.is.good4 小时前
【Linux笔记】在VMware中,为基于NAT模式运行的CentOS虚拟机设置固定的网络IP地址
linux·网络·笔记
大母猴啃编程4 小时前
C++基础---类和对象(上)
c语言·开发语言·数据结构·c++·学习·算法·青少年编程
姆路4 小时前
Qt5和Qt6获取屏幕的宽高,有区别
c++·qt
技术卷4 小时前
golang学习笔记24-文件操作
笔记·学习·golang
霸王蟹4 小时前
uniapp中uni.request的统一封装 (ts版)
前端·javascript·vue.js·笔记·uni-app
逆旅行天涯4 小时前
【踩坑笔记】vue3 element-plus el-input 无法输入问题
vue.js·笔记·elementui
w_outlier5 小时前
匿名管道在进程池中的应用案例
linux·c++·管道通信