勾股三角形的内切圆与外切圆Incircles and Excircles of Pythagorean triangles
数学博客深入探讨了勾股三角形(毕达哥拉斯三角形)的内切圆和外切圆半径特性,揭示了其与 Star Trek 引理之间的奇妙联系。作者在研究勾股数时偶然发现,这类特殊三角形的内切圆和外切圆半径满足一系列特定的代数关系。文章以直观的方式展示了这些几何属性是如何在代数方程中完美统一的。这为理解数论与几何学之间的跨学科联系提供了一个极具启发性的案例。
John
这篇文章将揭示我之前两篇博文之间的联系:一篇关于 Star Trek 引理,另一篇关于勾股数。
在写后一篇文章的过程中,我查阅了维基百科上关于勾股数的词条,并注意到了这段有趣的文字。
在每个毕达哥拉斯三角形中,内切圆半径和三个旁切圆的半径都是正整数。具体来说,对于本原三元组,内切圆半径为 r = n(m − n),而与边 m2 − n2、2mn 以及斜边 m2 + n2 相对的旁切圆半径分别为 m(m − n)、n(m + n) 和 m(m + n)。
上述段落的引用来源是我以前的同办公室同事所写的书,这也引出了关于 Star Trek 引理的那篇博文。维基百科所引用的 Arthur Baragar 书中的段落是练习题 15.3。
设 ΔABC 为边长为整数的直角三角形。证明其内切圆半径 r 和旁切圆半径 ra、rb、rc 均为整数。
我不知道 Arthur 是否发现了这个定理,但在本文中我将称其为 Baragar 定理。
为了详细解释 Baragar 定理,我们先来介绍一下什么是内切圆和旁切圆。内切圆相对更广为人知。三角形的内切圆是能够内接于该三角形内部的最大圆,这个圆的半径就是内切圆半径。
既然内切圆是一个内接的圆,你可能以为旁切圆就是一个外接圆,但事实并非如此。一个三角形有三个旁切圆,每条边对应一个。要找到某条边的旁切圆,需要延长另外两条边,然后找到与该边及两条延长线相切的圆。旁切圆的半径即为其旁切圆半径。
证明
Baragar 定理可以直接由前一篇博文中提到的欧几里得勾股数公式推导得出
以及内切圆半径 r 和旁切圆半径 ra、rb、rc 的公式。
这里 K 是三角形的面积,在我们的例子中为 ab/2,s 是半周长,即周长的一半。
用 m 和 n 表示这些半径,就能得到上面维基百科中所引用的值。
图示该定理
我想编写一个 Python 脚本来演示该定理,了解圆的半径会有所帮助,但我们还需要知道这些圆的圆心位置。
内切圆的圆心是各个顶点的加权平均值,其权重由对边的长度决定。也就是说,如果顶点为 A、B 和 C,与这些顶点相对的边分别为 a、b 和 c,那么内切圆圆心为
旁切圆圆心的表达式惊人地相似。对于与某个顶点相对的圆的圆心,只需将对应边的符号取反即可。
Python 代码
将所有内容组合起来,下面是该定理的一个图示。
这是生成该图的代码。请注意,本节中的所有内容适用于一般的直角三角形,而不仅限于毕达哥拉斯三角形。
import numpy as np
import matplotlib.pyplot as plt
def connect(A, B):
plt.plot([A[0], B[0]], [A[1], B[1]], "C0")
def draw_circle(c, r, color):
t = np.linspace(0, 2*np.pi)
plt.plot(r*np.cos(t) + c[0], r*np.sin(t) + c[1], color=color)
a, b, c, = 3, 4, 5
A = np.array([0, b])
B = np.array([-a, 0])
C = np.array([0, 0])
s = (a + b + c)/2
K = a*b/2
r = K/s
ra = K/(s - a)
rb = K/(s - b)
rc = K/(s - c)
I = (a*A + b*B + c*C)/(a + b + c)
Ia = (-a*A + b*B + c*C)/(-a + b + c)
Ib = (a*A - b*B + c*C)/(a - b + c)
Ic = (a*A + b*B - c*C)/(a + b - c)
draw_circle(I, r, "C1")
draw_circle(Ia, ra, "C2")
draw_circle(Ib, rb, "C3")
draw_circle(Ic, rc, "C4")
plt.plot([-2*rc, 2*rb], [0, 0], "C0")
plt.plot([0, 0], [-2*ra, 2*rc], "C0")
plt.plot([(-2*ra - b)*a/b, 2*rb], [-2*ra, 2*rb*b/a + b], "C0")
plt.gca().set_aspect("equal")
plt.show()需要完整排版与评论请前往来源站点阅读。