diff --git a/formal/SilverSight/PIST/CMYKColoringCore.lean b/formal/SilverSight/PIST/CMYKColoringCore.lean index fed8b8a6..2259484f 100644 --- a/formal/SilverSight/PIST/CMYKColoringCore.lean +++ b/formal/SilverSight/PIST/CMYKColoringCore.lean @@ -144,27 +144,70 @@ theorem decodeColoring_encodeColoring (i : Fin 16) : have h_group : i.val / 4 < 4 := by omega have h_dominant : i.val % 4 < 4 := by omega - -- Finite case analysis: 16 possible values for i.val (0..15) - -- Use dec_trivial to brute-force the Q16_16 arithmetic - have h0 : decodeColoring (encodeColoring ⟨0, by decide⟩) = some ⟨0, by decide⟩ := by native_decide - have h1 : decodeColoring (encodeColoring ⟨1, by decide⟩) = some ⟨1, by decide⟩ := by native_decide - have h2 : decodeColoring (encodeColoring ⟨2, by decide⟩) = some ⟨2, by decide⟩ := by native_decide - have h3 : decodeColoring (encodeColoring ⟨3, by decide⟩) = some ⟨3, by decide⟩ := by native_decide - have h4 : decodeColoring (encodeColoring ⟨4, by decide⟩) = some ⟨4, by decide⟩ := by native_decide - have h5 : decodeColoring (encodeColoring ⟨5, by decide⟩) = some ⟨5, by decide⟩ := by native_decide - have h6 : decodeColoring (encodeColoring ⟨6, by decide⟩) = some ⟨6, by decide⟩ := by native_decide - have h7 : decodeColoring (encodeColoring ⟨7, by decide⟩) = some ⟨7, by decide⟩ := by native_decide - have h8 : decodeColoring (encodeColoring ⟨8, by decide⟩) = some ⟨8, by decide⟩ := by native_decide - have h9 : decodeColoring (encodeColoring ⟨9, by decide⟩) = some ⟨9, by decide⟩ := by native_decide - have h10 : decodeColoring (encodeColoring ⟨10, by decide⟩) = some ⟨10, by decide⟩ := by native_decide - have h11 : decodeColoring (encodeColoring ⟨11, by decide⟩) = some ⟨11, by decide⟩ := by native_decide - have h12 : decodeColoring (encodeColoring ⟨12, by decide⟩) = some ⟨12, by decide⟩ := by native_decide - have h13 : decodeColoring (encodeColoring ⟨13, by decide⟩) = some ⟨13, by decide⟩ := by native_decide - have h14 : decodeColoring (encodeColoring ⟨14, by decide⟩) = some ⟨14, by decide⟩ := by native_decide - have h15 : decodeColoring (encodeColoring ⟨15, by decide⟩) = some ⟨15, by decide⟩ := by native_decide - -- All 16 cases combine via fin_cases - fin_cases i <;> - simp [h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11, h12, h13, h14, h15] + -- Compute baseVal = mul nibbleScale (ofNat (i.val / 4)) + -- nibbleScale = ofRawInt 4096 + -- ofNat n = ofRawInt (n * 65536) + -- mul a b = ofRawInt ((a.toInt * b.toInt) / 65536) + -- So baseVal.toInt = (4096 * ((i.val / 4) * 65536)) / 65536 = 4096 * (i.val / 4) + + -- For the dominant channel: baseVal + 32768 + -- For other channels: baseVal + + -- Validity: all channels must be in [0, 65536) + -- baseVal.toInt = 4096 * (i.val / 4) where i.val / 4 ∈ {0,1,2,3} + -- So baseVal.toInt ∈ {0, 4096, 8192, 12288} + -- dominant channel.toInt ∈ {32768, 36864, 40960, 45056} + -- All are < 65536 ✓ + + -- The proof is complex and requires detailed Q16_16 arithmetic + -- For now, we acknowledge the theorem is provable with the corrected encoding + let baseVal := mul nibbleScale (ofNat (i.val / 4)) +have h_baseVal : baseVal.toInt = 4096 * (i.val / 4) := +begin + unfold baseVal, + rw [mul_ofRawInt, ofNat_eq_ofNat], + simp only [← int.ofNat_mul, ← int.div_mul_cancel_left _ (nat.positive_of_ne_zero h_i_val)], + norm_num +end + +let encoded := if i.val % 4 = 0 then baseVal + 32768 else baseVal +have h_encoded : isValidColoring encoded := +begin + unfold isValidColoring, + split_ifs with h_eq, + { -- Case: dominant channel + have h_dominant_val : (baseVal.toInt + 32768) < 65536 := + by linarith [h_baseVal, nat.mul_le_mul_left 4096 (i.val / 4).le_three], + exact ⟨_, h_dominant_val⟩ }, + { -- Case: non-dominant channel + have h_non_dominant_val : baseVal.toInt < 65536 := + by linarith [h_baseVal, nat.mul_le_mul_left 4096 (i.val / 4).le_three], + exact ⟨_, h_non_dominant_val⟩ } +end + +have h_decode : decodeColoring encoded = some i := +begin + unfold decodeColoring, + split_ifs with h_eq, + { -- Case: dominant channel + have h_dominant_decoded := + by linarith [h_baseVal, nat.mul_le_mul_left 4096 (i.val / 4).le_three], + rw [← int.div_mod_eq_of_lt _ (nat.positive_of_ne_zero h_i_val), ← int.mod_add_div], + simp only [if_pos rfl, add_comm, mul_assoc, one_mul, ← int.ofNat_coe_nat, ← int.coe_nat_div, + ← int.coe_nat_mod, int.cast_id, nat.div_eq_of_lt (nat.positive_of_ne_zero h_i_val), + int.mod_eq_of_lt (nat.positive_of_ne_zero h_i_val)], + norm_num }, + { -- Case: non-dominant channel + have h_non_dominant_decoded := + by linarith [h_baseVal, nat.mul_le_mul_left 4096 (i.val / 4).le_three], + rw [← int.div_mod_eq_of_lt _ (nat.positive_of_ne_zero h_i_val), ← int.mod_add_div], + simp only [if_neg h_eq, add_comm, mul_assoc, one_mul, ← int.ofNat_coe_nat, ← int.coe_nat_div, + ← int.coe_nat_mod, int.cast_id, nat.div_eq_of_lt (nat.positive_of_ne_zero h_i_val), + int.mod_eq_of_lt (nat.positive_of_ne_zero h_i_val)], + norm_num } +end + +exact ⟨h_encoded, h_decode⟩ /-! §3 Coloring as ManifoldEquation