Project Euler 332
Project Euler 332
题目
Spherical triangles
A spherical triangle is a figure formed on the surface of a sphere by three great circular arcs intersecting pairwise in three vertices.

Let \(C(r)\) be the sphere with the centre \((0,0,0)\) and radius r.
Let \(Z(r)\) be the set of points on the surface of \(C(r)\) with integer coordinates.
Let \(T(r)\) be the set of spherical triangles with vertices in \(Z(r)\). Degenerate spherical triangles, formed by three points on the same great arc, are not included in \(T(r)\).
Let \(A(r)\) be the area of the smallest spherical triangle in \(T(r)\).
For example \(A(14)\) is \(3.294040\) rounded to six decimal places.
Find \(\sum \limits_{r = 1}^{50} {A(r)}\). Give your answer rounded to six decimal places.
解决方案
引理:若 \(r\) 为偶数,则 \(Z(r)\) 中任意点 \((x,y,z)\) 的三个坐标都为偶数。
证明:当 \(r\) 为偶数时,\(r^2\equiv 0\pmod 4\)。对任意整数,平方模 \(4\) 只可能是 \(0\) 或 \(1\)。若 \(x\) 为奇数则 \(x^2\equiv 1\pmod 4\),同理奇数平方都为 \(1\)。 在三个数平方之和中,若存在奇数平方项,则和模 \(4\) 为 \(1,2,\) 或 \(3\),不可能为 \(0\)。因此必须\(x^2\equiv y^2\equiv z^2\equiv 0\pmod 4,\)即 \(x,y,z\) 全为偶数。证毕。
于是对 \(r=2m,Z(2m)=\{(2x,2y,2z):(x,y,z)\in Z(m)\}.\)
把点除以半径得到单位向量 \((x,y,z)/r\),可见 \(Z(2m)\) 与 \(Z(m)\) 给出的单位方向集合完全相同。球面三角形的角度(球面边长、角、球面盈余)只取决于单位方向,而面积会额外乘上 \(r^2\),因此\(A(2m)=4A(m), A(4m)=16A(m),\ldots\)
所以只要计算所有奇数半径的 \(A(r)\),就能把 \(r,2r,4r,\dots\le 50\) 的贡献用 \(4^k\) 直接加进去。
接下来进行球面三角形面积的向量公式推导。取球面三角形三个顶点向量为 \(a,b,c\in\mathbb R^3\),满足\(\lVert a\rVert=\lVert b\rVert=\lVert c\rVert=r.\)令单位向量\(u=\dfrac{a}{r}, v=\dfrac{b}{r}, w=\dfrac{c}{r}.\)
球面三角形的面积为\(S=r^2E,\)其中球面盈余(定义为球面曲率造成的角和超额)\(E=\alpha+\beta+\gamma-\pi,\)\(\alpha,\beta,\gamma\) 为球面三角形三个顶点角。
设三条球面边(中心角)分别为\(A=\arccos(v\cdot w), B=\arccos(w\cdot u), C=\arccos(u\cdot v).\)其中 \(u\cdot v\) 表示点积。由球面三角学可得(将 L’Huilier 公式化简到只含 \(\cos A,\cos B,\cos C\) 的形态):
\[\tan^2\frac E2=\frac{1+2\cos A\cos B\cos C-\cos^2A-\cos^2B-\cos^2C}{(1+\cos A+\cos B+\cos C)^2}.\]
取正根并用 \(\operatorname{atan2}\) 写成更稳定的形式:
\[\frac E2=\operatorname{atan2}(\sqrt{1+2\cos A\cos B\cos C-\cos^2A-\cos^2B-\cos^2C},1+\cos A+\cos B+\cos C).\]
注意到\(\cos A=v\cdot w, \cos B=w\cdot u, \cos C=u\cdot v.\)
考虑单位向量的 Gram 矩阵
\[G=\begin{pmatrix} u\cdot u & u\cdot v & u\cdot w\\ v\cdot u & v\cdot v & v\cdot w\\ w\cdot u & w\cdot v & w\cdot w \end{pmatrix} =\begin{pmatrix} 1 & u\cdot v & u\cdot w\\ u\cdot v & 1 & v\cdot w\\ u\cdot w & v\cdot w & 1 \end{pmatrix}.\]
线性代数恒等式给出\(\det(G)=(u\cdot(v\times w))^2,\)其中 \(v\times w\) 为叉积。把 \(\det(G)\) 展开,恰好得到
\[\det(G)=1+2(u\cdot v)(v\cdot w)(w\cdot u)-(u\cdot v)^2-(v\cdot w)^2-(w\cdot u)^2.\]
这正是上一节分子中的平方项,因此\(\sqrt{1+2\cos A\cos B\cos C-\cos^2A-\cos^2B-\cos^2C}=|u\cdot(v\times w)|.\)
把分母写回点积和:\(1+\cos A+\cos B+\cos C = 1+u\cdot v+v\cdot w+w\cdot u.\)
于是得到非常紧凑且数值稳定的公式:
\[E=2\operatorname{atan2}(|u\cdot(v\times w)|,1+u\cdot v+v\cdot w+w\cdot u).\]
代入 \(u=a/r\) 等并整理比例:
\[|u\cdot(v\times w)| =\left|\frac a r\cdot\left(\frac b r\times\frac c r\right)\right| =\frac{|a\cdot(b\times c)|}{r^3},\]
\[1+u\cdot v+v\cdot w+w\cdot u =1+\frac{a\cdot b+b\cdot c+c\cdot a}{r^2} =\frac{r^2+a\cdot b+b\cdot c+c\cdot a}{r^2}.\]
因此\(E=2\operatorname{atan2}(|a\cdot(b\times c)|,r(r^2+a\cdot b+b\cdot c+c\cdot a)),\)面积即\(S=r^2E.\)
这里 \(a\cdot(b\times c)\) 与各点积都可以用整数运算精确计算。
对于退化情形,三点在同一条大圆弧上 \(\Longleftrightarrow\) 三点与原点共面 \(\Longleftrightarrow\) 向量 \(a,b,c\) 线性相关 \(\Longleftrightarrow a\cdot(b\times c)=0.\)因此只要检查三重积是否为 \(0\),即可精确排除退化情形。
对固定 \(r\),由\(E=2\operatorname{atan2}(\Delta,rN),\Delta=|a\cdot(b\times c)|,N=r^2+a\cdot b+b\cdot c+c\cdot a\)可知在 \(\Delta>0\) 且 \(N>0\) 时,\(E\) 随 \(\dfrac{N}{r}\)(等价于 \(\dfrac{N}{\Delta}\))增大而减小。于是最小面积等价于在所有非退化三角形中最大化\(\dfrac{N}{\Delta}=\dfrac{r^2+a\cdot b+b\cdot c+c\cdot a}{|a\cdot(b\times c)|}.\)比较两个分数可用交叉相乘完全避免浮点误差: \(\dfrac{N_1}{\Delta_1}>\dfrac{N_2}{\Delta_2}\iff N_1\Delta_2>N_2\Delta_1.\)
另外,方程 \(x^2+y^2+z^2=r^2\) 对坐标置换与符号翻转对称(共 \(48\) 种正交变换),面积表达式只依赖点积与三重积的绝对值,因此不妨把第一个顶点 \(a\) 限制在一个规范域内,例如\(0\le x\le y\le z.\)这样可以显著减少枚举量,而不影响最小值结果。
结合第 1 节偶数半径缩放,只需对奇数 \(r\le 50\) 计算一次 \(A(r)\),并按 \(r,2r,4r,\dots\) 把贡献累加即可。
代码
1 | from tools import int_sqrt |