1-- Absorbing a countable set into the sphere: for a countable D ⊆ S² off2-- the z-axis there is a rotation ρ ∈ SO3 with ρⁿ(D) ∩ D = ∅ for every3-- n ≥ 1, and S² and S² ∖ D are SO3-equidecomposable4-- Part of Cumulus, the Grace17 mathematics library.5-- Copyright (c) 2026 Grant Passmore.6-- Released under the Apache License 2.0. See LICENSE in the repository root.7-- Authors: Grant Passmore89module Grace.Cumulus.Geometry.Absorption.Final10import Sphere11import Pieces1213-- A rotation separating D from its positive powers.14theorem sphere.exists_separating (D : Set)15requires countable : Countable(D)16requires subset : D ⊆ S²17requires offAxis : ∀ d ∈ D, vectorPoint(d) ≠ complexZero18shows∃ ρ ∈ Group.carrier(SO3), ∀ n ∈ ℕ,19 Disjoint(actImage(sphereAction, groupPow(SO3, ρ, n +1), D), D)20proof21obtain⟨t, real, separated⟩:= turn.separates with countable, subset, offAxis22have typed : Real(t) bytypecheck23have rotation := turn.so3 at t24exact⟨turn(t), rotation, separated⟩2526-- The sphere absorbs every countable set off the z-axis.27theorem sphere.absorb_countable (D : Set)28requires countable : Countable(D)29requires subset : D ⊆ S²30requires offAxis : ∀ d ∈ D, vectorPoint(d) ≠ complexZero31shows Equidecomposable(sphereAction, SO3, S², S², S² ∖ D)32proof33obtain⟨ρ, rotation, separated⟩:= sphere.exists_separating with countable, subset, offAxis34exact sphere.absorb with rotation, subset, separated35