0332 球面三角形
* * * *
拉格朗日计划
* * * *
球面三角形

球面三角形是在球面上由三条大圆圆弧两两相交所构成的图形。



记$C(r)$为中心在$(0,0,0)$,半径为r的球。记$Z(r)$为$C(r)$表面所有坐标为整数的点构成的集合。

记$T(r)$为顶点均在$Z(r)$中的球面三角形构成的集合,三个顶点都在同一大圆圆弧上的退化球面三角形不包含在$T(r)$中。

记$A(r)$为$T(r)$中的球面三角形的最小面积,例如$A(14)$四舍五入到六位小数是$3.294040$。

求$\sum_{r=1}^{50}A(r)$,答案四舍五入到六位小数。

本题难度:



解答

枚举r,先按要求生成Z(r)中的所有整点,再枚举其中三个点的所有组合计算面积取最小。

设O为原点,A、B、C是球面三角形的三个定点,则此三角形的面积(可以参考此处)是 $$S=r^2(\alpha+\beta+\gamma-\pi),$$ 其中$\alpha, \beta, \gamma$分别是A、B、C的内角。

而$\alpha$即$OA\times OB$与$OA\times OC$的夹角(可以参考此处),其中$\times$表示外积,$\beta, \gamma$的计算也类似。

最终结果是$2717.751525$。

注:为方便作除法,以下代码为Python 3。此外,本题似乎有一些精度问题,取$\epsilon$为0.01或0.001或0.0001都能获得正确的结果,更小的阈值则不可。

import math,itertools

cross=lambda u,v:(u[1]*v[2]-u[2]*v[1],u[2]*v[0]-u[0]*v[2],u[0]*v[1]-u[1]*v[0])
dot=lambda u,v:u[0]*v[0]+u[1]*v[1]+u[2]*v[2]
norm=lambda v:math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])
angle=lambda u,v,sign=1.0:math.acos(sign*(dot(u,v)/(norm(u)*norm(v))))

epsilon=0.001
t=0
for r in range(1,51):
    m=999999999
    for A,B,C in itertools.combinations(set((x,y,z) for x,y,z in itertools.product(range(-r,r+1),repeat=3) if x*x+y*y+z*z==r*r),3):
        AB=cross(A,B)
        AC=cross(A,C)
        BC=cross(B,C)
        try:
            alpha=angle(AB,AC)
            beta=angle(BC,AB,-1.0)
            gamma=angle(AC,BC)
            area=(alpha+beta+gamma-math.pi)*r*r
            for i in range(8):
                if area>epsilon:
                    m=min(m,area)
        except:
            continue
    t+=m
    print(f"{r} completed")
print(f"{t:.6f}")