Source code for diplomat.utils.point_spread_patterns

from math import ceil, sqrt


[docs] def L1(n): denominator = ceil(sqrt(n)) - 1.0 return 1.0 / max(1.0, denominator)
[docs] def L2(n): denominator = ceil(sqrt(n + 1.0)) - 3.0 + sqrt(2.0 + sqrt(3.0)) return 1.0 / max(1.0, denominator)
[docs] def L3a(n): denominator = ceil(sqrt(n + 2.0)) - 2.0 + (0.5 * sqrt(3.0)) return 1.0 / max(1.0, denominator)
[docs] def L3b(n): denominator = ceil(sqrt(n + 2.0)) - 5.0 + (2.0 * sqrt(2.0 + sqrt(3.0))) return 1.0 / max(1.0, denominator)
[docs] def L4(n): m = ceil(sqrt(2.0 * n)) for k in range(1, m + 1): if n == k * (k + 1.0): numerator = k**2.0 - k - sqrt(2.0 * k) if numerator == 0: return 0 denominator = k**3.0 - (2.0 * k**2.0) return numerator / denominator return 0
[docs] def L5(n): m = ceil(sqrt(4.0 * n)) for p in range(1, m + 1): for q in range(1, m + 1): if (p**2 < 3 * q**2) and (q**2 < 3 * p**2): if n == ceil(((p + 1) * (q + 1)) / 2): return sqrt((1 / p**2) + (1 / q**2)) return 0
[docs] def approximate_maxmin_distance(n): if n == 3: return sqrt(6) - sqrt(2) else: return max(L1(n), L2(n), L3a(n), L3b(n), L4(n), L5(n))