【全部勾股数的可视化】- 有点意思的数学13
欣赏由[遇见数学]提供 3Blue1Brown 视频, 或者看下面整理编写的文字+动图版:
正文当你第一次学到勾股定理的时候, 一定会见到 3,4,5 为边的三角形, 或者5, 12, 13 为边的三角形. 并觉得能存在这些例子是理所当然的. 即两个整数的平方和恰好能等于另一个整数的平方.
但是把这个指数换成比 2 大的任何整数, 这样的方程就不再会有任何整数解. 这就是著名的费马大定理
满足 a2+b2=c2" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">a2+b2=c2a2+b2=c2 的三个整数 a, b, c 有一个专门的名字, 叫做勾股数(Pythagorean triple, 毕氏三元组). 今天的视频里, 我们想要找到所有的勾股数. 并且有图像表示出这些数组直接的关系.
这个是古老的问题, 古巴比伦人早在公元前 1800 年, 毕达哥拉斯生前一千多年就在泥板上刻下了许多勾股数.
现在来看下我最喜欢的定理证明, 点击播放 GIF 动图来查看动图.
好了,回到寻找整数解的问题. 我们先换一种问法: 在坐标系里所有的整数坐标的点中, 也就是这些网格线相交的点. 有哪些点到原点的距离是正数. 比如这个(3,4)点距离原点的距离为 5, 而点(12, 5)离原点是 13. 所以想找勾股数就只需要找在这些网格点中, 离原点距离是整数的点.
当然大多数点,比如(2,1)到原点的距离并不是整数, 但一定是某个整数的平方根: 5" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">√55.
现在我们把坐标系想象成是复平面, 将平面中的每一个点, 比如 (2,1) 都对应一个复数, 比如 (2,1) 对应 2+i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">2+i2+i . 想要得到离原点距离是整数的新的点, 做一个很简单的办法取平方. 代数上讲如果你平方米一个复数, 展开乘积, 合并同类项之后, 因为所有运算都只是整数之间的加减乘, 所以最后的结果中每个部分也都是整数, 这里得到 3+4i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">3+4i3+4i .
同时我们也可以从几何的角度考虑复数的乘法, 我们取从原点到这个数的线段, 注意它和 x 轴的夹角 θ" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">θθ 以及线段的长度. 在这里,它的长度是 5" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">√55 . 任何数和这个复数相乘, 就是将那个数选转 θ" role="presentation" style="display: inline-block; line-height: 0; font-weight: normal; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">θθ 角度, 再拉伸到 5" role="presentation" style="display: inline-block; line-height: 0; font-weight: normal; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">√55 倍.(如不理解可查看: 不可能的数字:复数)
所以当你将这个数和自身相乘的时候,角度就会翻倍; 长度就变成了原先的平方, 因为它原先的长度是某个整数的平方根, 那么长度的平方就一定是一个整数, 这里是 5.
我们在是另外一个例子, 先选一个有整数坐标的复数, 比如 3+2i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">3+2i3+2i , 它到原点的距离是 32+22" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">√32+2232+22, 也就是 13" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">√1313. 平方后得到5+12i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">5+12i5+12i , 也就是 5, 12, 13 这组勾股数.
这样看来, 这个过程就显得很神奇. 不论你选那个网格点, 比如 4+i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">4+i4+i , 把它平方, 就能得到一组勾股数 15,8,17 . 用代数的方法演算这个式子,发现它确实是对的. 你也可以试试带入其他的任意整数来得到勾股数.
当然其中有些结果没有什么意义, 比如, 如果起始点的两个坐标相等, 或者有一个坐标是 0, 平方的结果虚部或实部其中一个也就是 0. 比如 2+2i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">2+2i2+2i 的平方是 8i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">8i8i.
原则上着确实是一个到原点距离是整数的网格点, 但对于这个点对应的勾股数就只是 02+82=82" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">02+82=8202+82=82 .
但大多数时候, 将复数平方是一种很简单的得到非平凡勾股数的办法. 甚至可以得到一个漂亮的公式:
也就是说你输入一对整数, 它就会输出一组勾股数. 有一个很好的可视化方法, 就是把平面上的每一个点 z 移动到 z2" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">z2z2 . 比如把 3+2i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">3+2i3+2i 移动到 5+12i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">5+12i5+12i ; i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">ii 会被旋转 90∘" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">90∘90∘.
我们对平面上每个点都如此操作, 结果会是这样.
这些网格会编程抛物线型的弧线, 而它们的每一个交点都是原先的网格点, 所以也就对应一组勾股数. 也就是说, 如果三角形的斜边是其中的一个点到原点的连线, 且直角边与坐标轴平行的话, 这个三角形的三条边就都是整数了.
这个方法好就好在, 如果你简单地去看所有的勾股数组, 他们看起来就很随机, 没有什么规律. 但现在看来, 这些数组是有条理的: 坐落在这些均匀分布的弧线交点上.
也许你会好奇这些点是不是涵盖了所有的勾股数, 很遗憾,并不是. 比如你不能得到 6+8i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">6+8i6+8i . 虽然 6, 8, 10 确实是一组勾股数, 但没有任何整数 u, v 使得 (u+iv)2=6+8i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">(u+iv)2=6+8i(u+iv)2=6+8i , 同样的你也不能得到 9+12i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">9+12i9+12i. 但这也并不新鲜, 因为它们其实都是3, 4, 5的倍数.
稍后会解释, 为什么每一个我们无法得到的勾股数组都都是某个我们已得到的数组的倍数. 再举一个例子,我们无法得到 4+3i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">4+3i4+3i , 没有任何整数 u, v 使得 (u+iv)2=4+3i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">(u+iv)2=4+3i(u+iv)2=4+3i .
事实上你不能等到任何虚数部分是奇数的数.
但是用 8+6i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">8+6i8+6i 我们就能得到 8+6i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">8+6i8+6i . 所以虽然无法得到 4+3i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">4+3i4+3i,但是它只是我们得到某个点(8+6i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">8+6i8+6i)的一半而已. 顺带提一下, 我们永远不用把任何结果缩小到一半以下.
一个找回我们错过这些倍数的办法, 就是取每个我们能得到的点, 然后过它从原点画一条射线, 只要把这条射线通过的所有格点标注起来, 就会得到之前错过的所有点.
再来看一个更大范围的图形:
对所有的点如此操作,我们就会得到所有的勾股数组, 每一个你见过或还没见过的边长都是整数的直角三角形, 都能在这个图里找到.
想知道原因的话, 我们要换一个角度来考虑, 研究在单位圆上, 有理数坐标的点. 如果你把 a2+b2=c2" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">a2+b2=c2a2+b2=c2 左右,同时除以 c2" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">c2c2. 得到 a2c2+b2c2=1" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">a2c2+b2c2=1a2c2+b2c2=1 . 这就对应了单位圆上 x2+y2=1" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">x2+y2=1x2+y2=1 上的一个点, 而且 x 和 y 的坐标都是有理数, 这些点叫做单位圆上的有理点.
反过来, 如果你在单位圆上找到一个有理点, 并且让它的坐标去乘 x 和 y 的任何公分母. 得到的就是到原点距离是整数的一个整数坐标点. 比如 1213+5i13" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">1213+5i131213+5i13 有理点得到的是 12+5i" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">12+5i12+5i.
回到我们的图像, 其中我们平方了每个网格点, 并且对每个点都画了一条射线, 来得到我们可能错过的所有勾股数. 如果你把这些点都通过画出的射线, 投影到单位圆上, 你就会得到很多单位圆上的有理点.
注意, 这里我只画了有限多的点和线, 如果我画了对应的所有网格点平方的无限条射线的话, 它们就会充满整个屏幕.
如果我们的方法是不完整的, 也即是说, 如果我们错过了某个勾股数组, 那么说明, 圆上一定有某个有理点用之前的方法是无法达到的, 下面来说明一下为什么这是不可能的.
选取任何一个有理点, 画一条它与 (-1,0) 的连线, 当你计算这条线的斜率的时候, 你会发现 △y" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">△y△y 和 △x" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">△x△x 都是有理数, 所以斜率也一定是有理数.
如果我们能证明, 取平方的方法, 可以得到所有的有理数斜率的话, 我们就能保证得到所有的单位圆上的有理点了.
我们从头整理下思路, 先是从某个有整数坐标的点 u+iv" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">u+ivu+iv 开始, 这个点和 x 轴形成了某个夹角 θ" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">θθ , 平方之后, 得到的角度就会是 2θ" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">2θ2θ . 当然,当你把点投影到单位圆上时, 因为是沿同一条射线, 所以单位圆上对应的有理点与 x 轴的夹角也是 2θ" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">2θ2θ .
这里我要提一点圆的几何特性: 取圆心和圆周上两点, 连线组成的夹角(圆心角), 它总是等于 2 倍的圆周上的这两点和任意另一点的连线夹角(圆周角), 只要第三点不在前两点的中间就好
在这里我们就能知道, 单位圆上的有理点和 (-1,0) 的连线与 x 轴形成的角度一定是 θ" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">θθ . 换句话说, 这条线(下图粉红色线)与最初的点 u+iv" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">u+ivu+iv 到原点的连线, 斜率相等.
但给定整数 u 和 v 之后, 后者的斜率, 就是 vu" role="presentation" style="display: inline-block; line-height: 0; font-size: 14.4px; word-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; margin: 0px; padding: 1px 0px;">vuvu , 而且我们可以选择任意的整数 u 和 v . 所以我们确实能得到所有的有理数斜率. 由任意 u 和 v 决定的所有射线, 一定经过单位圆上每一个有理点. 因此我们的方法就一定能找到所有可能的勾股数.
最后附[遇见数学]制作的两张图片, 第一张 GIF 动图绘制的第一象限内斜边小于 2000 内的所有勾股数, 观察其中的规律:
直角三角形斜边小于 10000 内的所有勾股数:
「予人玫瑰, 手留余香」
如果感到本文有些许帮助, 感谢转发, 支持本号更快发展!
遇见数学
拨开知识的层层密林,探寻美妙数学中的趣味。
感谢关注遇见数学!