separation or container)import numberdb.sage as numberdb
from sage.rings.integer_ring import ZZ
from sage.rings.real_arb import RealBallField
R = RealBallField(numberdb.bits(100, losing=64))
def triangular_packing(k):
k = ZZ(k)
if k < 2:
raise ValueError('k must be at least 2')
n = k * (k + 1) // 2
d = R(1) / R(k - 1)
S = R(2) * R(k - 1) + R(2) * R(3).sqrt()
return n, d, S
print(triangular_packing(6))
Each container row is computed in Sage real ball arithmetic from the exact radical formula transcribed from [5], read on 23-Sep-2026. Each transcribed formula was checked against the decimal printed for the same row in the source table. The separation rows are computed from Formula (1), and the generator checks that converting them back gives the same $S_n$.