Theory Determinants_More

section‹Determinants›

theory Determinants_More
  imports "HOL-Analysis.Starlike"
begin

lemma hyperplane_subset_imp_scaled:
  fixes a :: "'a::euclidean_space"
  assumes "{x. a ∙ x = b} ⊆ {x. a' ∙ x = b'}"
      and "a ≠ 0"
      and "a' ≠ 0"
  shows "∃c. a' = c *R a ∧ b' = c * b ∧ c ≠ 0"
proof -
  let ?c = "(a ∙ a') / (a ∙ a)"
  let ?v = "a' - ?c *R a"
  have "a ∙ ?v = 0"
    by (simp add: inner_diff)
  let ?w = "(b / (a ∙ a)) *R a"
  have "a ∙ ?w = b"
    using assms(2) by simp
  then have "a' ∙ ?w = b'"
    using assms(1) by blast
  have "a ∙ (?w + ?v) = b"
    using ‹a ∙ ?w = b› ‹a ∙ ?v = 0›
    by (simp add: inner_add_right)
  then have "a' ∙ (?w + ?v) = b'"
    using assms(1) by blast
  then have "a' ∙ ?v = 0"
    using ‹a' ∙ ?w = b'›
    by (simp add: inner_add_right)
  have "?v ∙ ?v = 0"
    using ‹a' ∙ ?v = 0› ‹a ∙ ?v = 0›
    by (simp add: inner_diff_left)
  then have "?v = 0"
    by simp
  then have "a' = ?c *R a"
    by auto
  moreover have "b' = ?c * b"
    by (metis (mono_tags, lifting) assms(1) Collect_mono_iff ‹a' = ?c *R a› hyperplane_eq_Ex
        inner_scaleR_left assms(2))
  moreover have "?c ≠ 0"
    using ‹a' = ?c *R a› assms(3) by fastforce
  ultimately show ?thesis
    by blast
qed

lemma subset_hyperplanes:
  fixes a :: "'a::euclidean_space"
  shows "({x. a ∙ x = b} ⊆ {x. a' ∙ x = b'}) =
         ({x. a ∙ x = b} = {} ∨ {x. a' ∙ x = b'} = UNIV ∨
          {x. a ∙ x = b} = {x. a' ∙ x = b'})"
  (is "?lhs = ?rhs")
proof
  assume *: "?lhs"
  consider
    (a_zero) "a = 0" |
    (a'_zero) "a' = 0" |
    (nonzero) "a ≠ 0" "a' ≠ 0"
    by blast
  then show "?rhs"
  proof (cases)
    case a_zero
    then show ?thesis using * by auto
  next
    case a'_zero
    then show ?thesis using * by force
  next
    case nonzero
    then obtain c where ‹a' = c *R a› ‹b' = c * b›
      using * hyperplane_subset_imp_scaled by blast
    then show ?thesis
      by (smt (verit, ccfv_threshold) Collect_cong inner_scaleR_left
          nonzero(2) scaleR_eq_0_iff vector_space_over_itself.scale_left_imp_eq)
  qed
next
  assume "?rhs"
  then show "?lhs" by blast
qed

end