鸡兔同笼,但是线性代数

灵感来自: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。 其实第三种和第二种结合可以变成一种更厉害的,一般用这种: 3. 把两行元素同时扩倍不同的(相同也可以)倍数后相加,结果存到这两行中的某一行中,记作 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 代码解出了超级难的鸡兔同笼问题!鼓掌!

相关推荐
能来帮帮蒟蒻吗1 小时前
Go语言学习(15)结构体标签与反射机制
开发语言·笔记·学习·golang
双叶8366 小时前
(C语言)虚数运算(结构体教程)(指针解法)(C语言教程)
c语言·开发语言·数据结构·c++·算法·microsoft
有个人神神叨叨6 小时前
OpenAI发布的《Addendum to GPT-4o System Card: Native image generation》文件的详尽笔记
人工智能·笔记
安全方案7 小时前
精心整理-2024最新网络安全-信息安全全套资料(学习路线、教程笔记、工具软件、面试文档).zip
笔记·学习·web安全
ElseWhereR8 小时前
矩阵对角线元素的和 - 简单
线性代数·矩阵
牵牛老人8 小时前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
序属秋秋秋9 小时前
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
c语言·c++·学习·算法
慵懒学者9 小时前
15 网络编程:三要素(IP地址、端口、协议)、UDP通信实现和TCP通信实现 (黑马Java视频笔记)
java·网络·笔记·tcp/ip·udp
KeithTsui9 小时前
GCC RISCV 后端 -- 控制流(Control Flow)的一些理解
linux·c语言·开发语言·c++·算法
mNinGInG10 小时前
c++练习
开发语言·c++·算法