Pith. sign in

IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.IntegerOrder

IndisputableMonolith/Foundation/PrimitiveRecognitionCalculus/IntegerOrder.lean · 7692 lines · 443 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: pending

   1/-
   2  PrimitiveRecognitionCalculus/IntegerOrder.lean
   3
   4  Round-trip sources:
   5    δ/PRC_Kernel_Spec_20260526.html
   6    δ/PRC_Universal_Foundation_Execution_Plan_20260526.html
   7
   8  Spec anchors:
   9    Build Order step 1: internal signed-orbit order and absolute value.
  10
  11  This module is the named certificate surface for integer order. The core
  12  declarations live in `IntegerRational.lean` because `RatioOrbit.recipNonzero`
  13  needs `SignedOrbit.abs` and `SignedOrbit.nonnegFlag` without creating an
  14  import cycle.
  15-/
  16
  17import Mathlib
  18import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.IntegerRational
  19
  20namespace IndisputableMonolith
  21namespace Foundation
  22namespace PrimitiveRecognitionCalculus
  23
  24namespace SignedOrbit
  25
  26/-! ## Closed order laws for the signed-orbit surface -/
  27
  28theorem le_refl (a : SignedOrbit) : SignedOrbit.le a a :=
  29  (SignedOrbit.le_iff_toInt_le a a).mpr (by omega)
  30
  31theorem le_trans {a b c : SignedOrbit}
  32    (hab : SignedOrbit.le a b) (hbc : SignedOrbit.le b c) :
  33    SignedOrbit.le a c := by
  34  rw [SignedOrbit.le_iff_toInt_le] at *
  35  omega
  36
  37theorem le_antisymm_balanced {a b : SignedOrbit}
  38    (hab : SignedOrbit.le a b) (hba : SignedOrbit.le b a) :
  39    SignedOrbit.balanced a b := by
  40  rw [SignedOrbit.le_iff_toInt_le] at hab hba
  41  rw [SignedOrbit.balanced_iff_toInt_eq]
  42  omega
  43
  44theorem le_total (a b : SignedOrbit) :
  45    SignedOrbit.le a b ∨ SignedOrbit.le b a := by
  46  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le]
  47  omega
  48
  49theorem trichotomy (a b : SignedOrbit) :
  50    SignedOrbit.lt a b ∨
  51      SignedOrbit.balanced a b ∨
  52        SignedOrbit.lt b a := by
  53  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.balanced_iff_toInt_eq,
  54    SignedOrbit.lt_iff_toInt_lt]
  55  omega
  56
  57/-! ## Sign-flag complement laws -/
  58
  59theorem negativeFlag_eq_true_iff_nonnegFlag_eq_false (z : SignedOrbit) :
  60    z.negativeFlag = true ↔ z.nonnegFlag = false := by
  61  unfold SignedOrbit.negativeFlag
  62  cases z.nonnegFlag <;> simp
  63
  64theorem negativeFlag_eq_false_iff_nonnegFlag_eq_true (z : SignedOrbit) :
  65    z.negativeFlag = false ↔ z.nonnegFlag = true := by
  66  unfold SignedOrbit.negativeFlag
  67  cases z.nonnegFlag <;> simp
  68
  69theorem signFlags_exclusive (z : SignedOrbit) :
  70    ¬ (z.nonnegFlag = true ∧ z.negativeFlag = true) := by
  71  intro h
  72  rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false] at h
  73  rcases h with ⟨hnonneg, hneg⟩
  74  rw [hnonneg] at hneg
  75  contradiction
  76
  77theorem signFlags_exhaustive (z : SignedOrbit) :
  78    z.nonnegFlag = true ∨ z.negativeFlag = true := by
  79  cases h : z.nonnegFlag with
  80  | true => exact Or.inl rfl
  81  | false =>
  82      right
  83      rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
  84      exact h
  85
  86theorem zero_le_iff_nonnegFlag (z : SignedOrbit) :
  87    SignedOrbit.le SignedOrbit.zero z ↔ z.nonnegFlag = true := by
  88  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.zero_toInt,
  89    SignedOrbit.nonnegFlag_eq_true_iff]
  90
  91theorem lt_zero_iff_negativeFlag (z : SignedOrbit) :
  92    SignedOrbit.lt z SignedOrbit.zero ↔ z.negativeFlag = true := by
  93  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.zero_toInt,
  94    SignedOrbit.negativeFlag_eq_true_iff_toInt_neg]
  95
  96theorem zero_lt_iff_nonnegFlag_and_not_balanced_zero (z : SignedOrbit) :
  97    SignedOrbit.lt SignedOrbit.zero z ↔
  98      z.nonnegFlag = true ∧
  99        ¬ SignedOrbit.balanced z SignedOrbit.zero := by
 100  unfold SignedOrbit.lt
 101  rw [SignedOrbit.zero_le_iff_nonnegFlag]
 102  constructor
 103  · intro h
 104    exact ⟨h.1, fun hz => h.2 (SignedOrbit.balanced_symm hz)⟩
 105  · intro h
 106    exact ⟨h.1, fun hz => h.2 (SignedOrbit.balanced_symm hz)⟩
 107
 108theorem nonnegFlag_eq_of_balanced {z w : SignedOrbit}
 109    (h : SignedOrbit.balanced z w) :
 110    z.nonnegFlag = w.nonnegFlag := by
 111  rw [SignedOrbit.balanced_iff_toInt_eq] at h
 112  cases hz : z.nonnegFlag <;> cases hw : w.nonnegFlag
 113  · rfl
 114  · have hzneg : z.toInt < 0 :=
 115      (SignedOrbit.nonnegFlag_eq_false_iff z).mp hz
 116    have hwnonneg : 0 ≤ w.toInt :=
 117      (SignedOrbit.nonnegFlag_eq_true_iff w).mp hw
 118    omega
 119  · have hznonneg : 0 ≤ z.toInt :=
 120      (SignedOrbit.nonnegFlag_eq_true_iff z).mp hz
 121    have hwneg : w.toInt < 0 :=
 122      (SignedOrbit.nonnegFlag_eq_false_iff w).mp hw
 123    omega
 124  · rfl
 125
 126theorem negativeFlag_eq_of_balanced {z w : SignedOrbit}
 127    (h : SignedOrbit.balanced z w) :
 128    z.negativeFlag = w.negativeFlag := by
 129  unfold SignedOrbit.negativeFlag
 130  rw [SignedOrbit.nonnegFlag_eq_of_balanced h]
 131
 132theorem nonneg_iff_of_balanced {z w : SignedOrbit}
 133    (h : SignedOrbit.balanced z w) :
 134    SignedOrbit.nonneg z ↔ SignedOrbit.nonneg w := by
 135  rw [SignedOrbit.nonneg_iff_toInt_nonneg, SignedOrbit.nonneg_iff_toInt_nonneg]
 136  exact ⟨fun hz => by
 137    rw [← (SignedOrbit.balanced_iff_toInt_eq z w).mp h]
 138    exact hz,
 139    fun hw => by
 140      rw [(SignedOrbit.balanced_iff_toInt_eq z w).mp h]
 141      exact hw⟩
 142
 143/-! ## Balanced congruence for signed-orbit operations -/
 144
 145theorem add_congr_of_balanced {a a' b b' : SignedOrbit}
 146    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 147    SignedOrbit.balanced (SignedOrbit.add a b) (SignedOrbit.add a' b') := by
 148  rw [SignedOrbit.balanced_iff_toInt_eq] at *
 149  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt, ha, hb]
 150
 151theorem negate_congr_of_balanced {a a' : SignedOrbit}
 152    (ha : SignedOrbit.balanced a a') :
 153    SignedOrbit.balanced (SignedOrbit.negate a) (SignedOrbit.negate a') := by
 154  rw [SignedOrbit.balanced_iff_toInt_eq] at *
 155  rw [SignedOrbit.negate_toInt, SignedOrbit.negate_toInt, ha]
 156
 157theorem sub_congr_of_balanced {a a' b b' : SignedOrbit}
 158    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 159    SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub a' b') := by
 160  unfold SignedOrbit.sub
 161  exact SignedOrbit.add_congr_of_balanced ha
 162    (SignedOrbit.negate_congr_of_balanced hb)
 163
 164theorem sub_congr_of_balanced_left {a a' b : SignedOrbit}
 165    (ha : SignedOrbit.balanced a a') :
 166    SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub a' b) := by
 167  have hb : SignedOrbit.balanced b b := by
 168    rw [SignedOrbit.balanced_iff_toInt_eq]
 169  exact SignedOrbit.sub_congr_of_balanced ha hb
 170
 171theorem sub_congr_of_balanced_right {a b b' : SignedOrbit}
 172    (hb : SignedOrbit.balanced b b') :
 173    SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub a b') := by
 174  have ha : SignedOrbit.balanced a a := by
 175    rw [SignedOrbit.balanced_iff_toInt_eq]
 176  exact SignedOrbit.sub_congr_of_balanced ha hb
 177
 178theorem nonnegFlag_sub_eq_of_balanced_left {a a' b : SignedOrbit}
 179    (ha : SignedOrbit.balanced a a') :
 180    (SignedOrbit.sub a b).nonnegFlag =
 181      (SignedOrbit.sub a' b).nonnegFlag :=
 182  SignedOrbit.nonnegFlag_eq_of_balanced
 183    (SignedOrbit.sub_congr_of_balanced_left ha)
 184
 185theorem nonnegFlag_sub_eq_of_balanced_right {a b b' : SignedOrbit}
 186    (hb : SignedOrbit.balanced b b') :
 187    (SignedOrbit.sub a b).nonnegFlag =
 188      (SignedOrbit.sub a b').nonnegFlag :=
 189  SignedOrbit.nonnegFlag_eq_of_balanced
 190    (SignedOrbit.sub_congr_of_balanced_right hb)
 191
 192theorem negativeFlag_sub_eq_of_balanced_left {a a' b : SignedOrbit}
 193    (ha : SignedOrbit.balanced a a') :
 194    (SignedOrbit.sub a b).negativeFlag =
 195      (SignedOrbit.sub a' b).negativeFlag :=
 196  SignedOrbit.negativeFlag_eq_of_balanced
 197    (SignedOrbit.sub_congr_of_balanced_left ha)
 198
 199theorem negativeFlag_sub_eq_of_balanced_right {a b b' : SignedOrbit}
 200    (hb : SignedOrbit.balanced b b') :
 201    (SignedOrbit.sub a b).negativeFlag =
 202      (SignedOrbit.sub a b').negativeFlag :=
 203  SignedOrbit.negativeFlag_eq_of_balanced
 204    (SignedOrbit.sub_congr_of_balanced_right hb)
 205
 206theorem nonnegFlag_sub_eq_of_balanced {a a' b b' : SignedOrbit}
 207    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 208    (SignedOrbit.sub a b).nonnegFlag =
 209      (SignedOrbit.sub a' b').nonnegFlag :=
 210  SignedOrbit.nonnegFlag_eq_of_balanced
 211    (SignedOrbit.sub_congr_of_balanced ha hb)
 212
 213theorem negativeFlag_sub_eq_of_balanced {a a' b b' : SignedOrbit}
 214    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 215    (SignedOrbit.sub a b).negativeFlag =
 216      (SignedOrbit.sub a' b').negativeFlag :=
 217  SignedOrbit.negativeFlag_eq_of_balanced
 218    (SignedOrbit.sub_congr_of_balanced ha hb)
 219
 220theorem scaleByNat_congr_of_balanced {z w : SignedOrbit}
 221    (h : SignedOrbit.balanced z w) (d : DistinctionNat) :
 222    SignedOrbit.balanced (z.scaleByNat d) (w.scaleByNat d) := by
 223  rw [SignedOrbit.balanced_iff_toInt_eq] at *
 224  rw [SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt, h]
 225
 226theorem scaleByNat_balanced_zero_of_balanced_zero {z : SignedOrbit}
 227    (h : SignedOrbit.balanced z SignedOrbit.zero) (d : DistinctionNat) :
 228    SignedOrbit.balanced (z.scaleByNat d) SignedOrbit.zero := by
 229  rw [SignedOrbit.balanced_iff_toInt_eq] at *
 230  rw [SignedOrbit.scaleByNat_toInt, SignedOrbit.zero_toInt, h]
 231  simp [SignedOrbit.zero_toInt]
 232
 233theorem mul_ofOrbit_balanced_scaleByNat
 234    (z : SignedOrbit) (d : DistinctionNat) :
 235    SignedOrbit.balanced
 236      (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
 237      (z.scaleByNat d) := by
 238  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
 239    SignedOrbit.ofOrbit_toInt, SignedOrbit.scaleByNat_toInt]
 240
 241theorem ofOrbit_mul_balanced_scaleByNat
 242    (d : DistinctionNat) (z : SignedOrbit) :
 243    SignedOrbit.balanced
 244      (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
 245      (z.scaleByNat d) := by
 246  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
 247    SignedOrbit.ofOrbit_toInt, SignedOrbit.scaleByNat_toInt]
 248  ring
 249
 250theorem abs_mul (z w : SignedOrbit) :
 251    (SignedOrbit.mul z w).abs = z.abs * w.abs := by
 252  apply DistinctionNat.toNat_inj
 253  rw [SignedOrbit.abs_toNat, SignedOrbit.mul_toInt, DistinctionNat.toNat_mul,
 254    SignedOrbit.abs_toNat, SignedOrbit.abs_toNat, Int.natAbs_mul]
 255
 256theorem mul_balanced_zero_iff
 257    (z w : SignedOrbit) :
 258    SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero ↔
 259      SignedOrbit.balanced z SignedOrbit.zero ∨
 260        SignedOrbit.balanced w SignedOrbit.zero := by
 261  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
 262    SignedOrbit.zero_toInt, SignedOrbit.balanced_iff_toInt_eq,
 263    SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 264  constructor
 265  · intro h
 266    rcases mul_eq_zero.mp h with hz | hw
 267    · exact Or.inl hz
 268    · exact Or.inr hw
 269  · intro h
 270    rcases h with hz | hw
 271    · rw [hz]
 272      ring
 273    · rw [hw]
 274      ring
 275
 276theorem mul_not_balanced_zero_iff
 277    (z w : SignedOrbit) :
 278    ¬ SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero ↔
 279      ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
 280        ¬ SignedOrbit.balanced w SignedOrbit.zero := by
 281  rw [SignedOrbit.mul_balanced_zero_iff]
 282  constructor
 283  · intro h
 284    constructor
 285    · intro hz
 286      exact h (Or.inl hz)
 287    · intro hw
 288      exact h (Or.inr hw)
 289  · intro h hzprod
 290    rcases hzprod with hz | hw
 291    · exact h.1 hz
 292    · exact h.2 hw
 293
 294theorem balanced_mul_left_iff_of_not_balanced_zero
 295    (a z w : SignedOrbit)
 296    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
 297    SignedOrbit.balanced (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
 298      SignedOrbit.balanced z w := by
 299  have haInt : a.toInt ≠ 0 := by
 300    intro hzero
 301    exact ha (by
 302      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 303      exact hzero)
 304  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
 305    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 306  constructor
 307  · intro h
 308    exact mul_left_cancel₀ haInt h
 309  · intro h
 310    rw [h]
 311
 312theorem balanced_mul_right_iff_of_not_balanced_zero
 313    (a z w : SignedOrbit)
 314    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
 315    SignedOrbit.balanced (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
 316      SignedOrbit.balanced z w := by
 317  have haInt : a.toInt ≠ 0 := by
 318    intro hzero
 319    exact ha (by
 320      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 321      exact hzero)
 322  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
 323    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 324  constructor
 325  · intro h
 326    exact mul_right_cancel₀ haInt h
 327  · intro h
 328    rw [h]
 329
 330theorem le_mul_left_iff_of_nonnegFlag_of_not_balanced_zero
 331    (a z w : SignedOrbit)
 332    (hanonneg : a.nonnegFlag = true)
 333    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
 334    SignedOrbit.le (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
 335      SignedOrbit.le z w := by
 336  have hanonnegInt : 0 ≤ a.toInt :=
 337    (SignedOrbit.nonnegFlag_eq_true_iff a).mp hanonneg
 338  have haInt : a.toInt ≠ 0 := by
 339    intro hzero
 340    exact ha (by
 341      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 342      exact hzero)
 343  have hapos : 0 < a.toInt := by omega
 344  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le,
 345    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 346  constructor <;> intro h <;> nlinarith
 347
 348theorem lt_mul_left_iff_of_nonnegFlag_of_not_balanced_zero
 349    (a z w : SignedOrbit)
 350    (hanonneg : a.nonnegFlag = true)
 351    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
 352    SignedOrbit.lt (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
 353      SignedOrbit.lt z w := by
 354  have hanonnegInt : 0 ≤ a.toInt :=
 355    (SignedOrbit.nonnegFlag_eq_true_iff a).mp hanonneg
 356  have haInt : a.toInt ≠ 0 := by
 357    intro hzero
 358    exact ha (by
 359      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 360      exact hzero)
 361  have hapos : 0 < a.toInt := by omega
 362  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt,
 363    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 364  constructor <;> intro h <;> nlinarith
 365
 366theorem le_mul_right_iff_of_nonnegFlag_of_not_balanced_zero
 367    (a z w : SignedOrbit)
 368    (hanonneg : a.nonnegFlag = true)
 369    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
 370    SignedOrbit.le (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
 371      SignedOrbit.le z w := by
 372  have hanonnegInt : 0 ≤ a.toInt :=
 373    (SignedOrbit.nonnegFlag_eq_true_iff a).mp hanonneg
 374  have haInt : a.toInt ≠ 0 := by
 375    intro hzero
 376    exact ha (by
 377      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 378      exact hzero)
 379  have hapos : 0 < a.toInt := by omega
 380  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le,
 381    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 382  constructor <;> intro h <;> nlinarith
 383
 384theorem lt_mul_right_iff_of_nonnegFlag_of_not_balanced_zero
 385    (a z w : SignedOrbit)
 386    (hanonneg : a.nonnegFlag = true)
 387    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
 388    SignedOrbit.lt (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
 389      SignedOrbit.lt z w := by
 390  have hanonnegInt : 0 ≤ a.toInt :=
 391    (SignedOrbit.nonnegFlag_eq_true_iff a).mp hanonneg
 392  have haInt : a.toInt ≠ 0 := by
 393    intro hzero
 394    exact ha (by
 395      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 396      exact hzero)
 397  have hapos : 0 < a.toInt := by omega
 398  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt,
 399    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 400  constructor <;> intro h <;> nlinarith
 401
 402theorem le_mul_left_iff_of_negativeFlag
 403    (a z w : SignedOrbit)
 404    (haneg : a.negativeFlag = true) :
 405    SignedOrbit.le (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
 406      SignedOrbit.le w z := by
 407  have hanegInt : a.toInt < 0 :=
 408    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg a).mp haneg
 409  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le,
 410    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 411  constructor <;> intro h <;> nlinarith
 412
 413theorem lt_mul_left_iff_of_negativeFlag
 414    (a z w : SignedOrbit)
 415    (haneg : a.negativeFlag = true) :
 416    SignedOrbit.lt (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
 417      SignedOrbit.lt w z := by
 418  have hanegInt : a.toInt < 0 :=
 419    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg a).mp haneg
 420  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt,
 421    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 422  constructor <;> intro h <;> nlinarith
 423
 424theorem le_mul_right_iff_of_negativeFlag
 425    (a z w : SignedOrbit)
 426    (haneg : a.negativeFlag = true) :
 427    SignedOrbit.le (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
 428      SignedOrbit.le w z := by
 429  have hanegInt : a.toInt < 0 :=
 430    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg a).mp haneg
 431  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le,
 432    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 433  constructor <;> intro h <;> nlinarith
 434
 435theorem lt_mul_right_iff_of_negativeFlag
 436    (a z w : SignedOrbit)
 437    (haneg : a.negativeFlag = true) :
 438    SignedOrbit.lt (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
 439      SignedOrbit.lt w z := by
 440  have hanegInt : a.toInt < 0 :=
 441    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg a).mp haneg
 442  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt,
 443    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
 444  constructor <;> intro h <;> nlinarith
 445
 446theorem abs_mul_eq_zero_iff
 447    (z w : SignedOrbit) :
 448    (SignedOrbit.mul z w).abs = DistinctionNat.zero ↔
 449      z.abs = DistinctionNat.zero ∨ w.abs = DistinctionNat.zero := by
 450  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero, SignedOrbit.mul_toInt,
 451    SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
 452    SignedOrbit.abs_eq_zero_iff_toInt_eq_zero]
 453  constructor
 454  · intro h
 455    rcases mul_eq_zero.mp h with hz | hw
 456    · exact Or.inl hz
 457    · exact Or.inr hw
 458  · intro h
 459    rcases h with hz | hw
 460    · rw [hz]
 461      ring
 462    · rw [hw]
 463      ring
 464
 465theorem abs_mul_ne_zero_iff
 466    (z w : SignedOrbit) :
 467    (SignedOrbit.mul z w).abs ≠ DistinctionNat.zero ↔
 468      z.abs ≠ DistinctionNat.zero ∧ w.abs ≠ DistinctionNat.zero := by
 469  have hzero := SignedOrbit.abs_mul_eq_zero_iff z w
 470  constructor
 471  · intro h
 472    constructor
 473    · intro hz
 474      exact h (hzero.mpr (Or.inl hz))
 475    · intro hw
 476      exact h (hzero.mpr (Or.inr hw))
 477  · intro h hzprod
 478    rcases hzero.mp hzprod with hz | hw
 479    · exact h.1 hz
 480    · exact h.2 hw
 481
 482theorem abs_mul_eq_zero_iff_balanced_zero
 483    (z w : SignedOrbit) :
 484    (SignedOrbit.mul z w).abs = DistinctionNat.zero ↔
 485      SignedOrbit.balanced z SignedOrbit.zero ∨
 486        SignedOrbit.balanced w SignedOrbit.zero := by
 487  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero, SignedOrbit.mul_toInt,
 488    SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
 489    SignedOrbit.zero_toInt]
 490  constructor
 491  · intro h
 492    rcases mul_eq_zero.mp h with hz | hw
 493    · exact Or.inl hz
 494    · exact Or.inr hw
 495  · intro h
 496    rcases h with hz | hw
 497    · rw [hz]
 498      ring
 499    · rw [hw]
 500      ring
 501
 502theorem abs_mul_ne_zero_iff_not_balanced_zero
 503    (z w : SignedOrbit) :
 504    (SignedOrbit.mul z w).abs ≠ DistinctionNat.zero ↔
 505      ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
 506        ¬ SignedOrbit.balanced w SignedOrbit.zero := by
 507  have hzero := SignedOrbit.abs_mul_eq_zero_iff_balanced_zero z w
 508  constructor
 509  · intro h
 510    constructor
 511    · intro hz
 512      exact h (hzero.mpr (Or.inl hz))
 513    · intro hw
 514      exact h (hzero.mpr (Or.inr hw))
 515  · intro h hzprod
 516    rcases hzero.mp hzprod with hz | hw
 517    · exact h.1 hz
 518    · exact h.2 hw
 519
 520theorem abs_scaleByNat (z : SignedOrbit) (d : DistinctionNat) :
 521    (z.scaleByNat d).abs = z.abs * d := by
 522  apply DistinctionNat.toNat_inj
 523  rw [SignedOrbit.abs_toNat, SignedOrbit.scaleByNat_toInt,
 524    DistinctionNat.toNat_mul, SignedOrbit.abs_toNat, Int.natAbs_mul,
 525    Int.natAbs_natCast]
 526
 527theorem abs_mul_ofOrbit_right (z : SignedOrbit) (d : DistinctionNat) :
 528    (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).abs = z.abs * d := by
 529  apply DistinctionNat.toNat_inj
 530  rw [SignedOrbit.abs_toNat, SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt,
 531    DistinctionNat.toNat_mul, SignedOrbit.abs_toNat, Int.natAbs_mul,
 532    Int.natAbs_natCast]
 533
 534theorem abs_mul_ofOrbit_left (d : DistinctionNat) (z : SignedOrbit) :
 535    (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).abs = z.abs * d := by
 536  apply DistinctionNat.toNat_inj
 537  rw [SignedOrbit.abs_toNat, SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt,
 538    DistinctionNat.toNat_mul, SignedOrbit.abs_toNat, Int.natAbs_mul,
 539    Int.natAbs_natCast]
 540  ring
 541
 542theorem mul_ofOrbit_right_balanced_zero_iff
 543    (z : SignedOrbit) (d : DistinctionNat) :
 544    SignedOrbit.balanced
 545        (SignedOrbit.mul z (SignedOrbit.ofOrbit d)) SignedOrbit.zero ↔
 546      SignedOrbit.balanced z SignedOrbit.zero ∨ d = DistinctionNat.zero := by
 547  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
 548    SignedOrbit.ofOrbit_toInt, SignedOrbit.zero_toInt]
 549  constructor
 550  · intro h
 551    rcases mul_eq_zero.mp h with hz | hd
 552    · left
 553      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 554      exact hz
 555    · right
 556      apply DistinctionNat.toNat_inj
 557      rw [DistinctionNat.toNat_zero]
 558      exact_mod_cast hd
 559  · intro h
 560    rcases h with hz | hd
 561    · rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hz
 562      rw [hz]
 563      ring
 564    · rw [hd, DistinctionNat.toNat_zero]
 565      ring
 566
 567theorem mul_ofOrbit_left_balanced_zero_iff
 568    (d : DistinctionNat) (z : SignedOrbit) :
 569    SignedOrbit.balanced
 570        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z) SignedOrbit.zero ↔
 571      SignedOrbit.balanced z SignedOrbit.zero ∨ d = DistinctionNat.zero := by
 572  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
 573    SignedOrbit.ofOrbit_toInt, SignedOrbit.zero_toInt]
 574  constructor
 575  · intro h
 576    rcases mul_eq_zero.mp h with hd | hz
 577    · right
 578      apply DistinctionNat.toNat_inj
 579      rw [DistinctionNat.toNat_zero]
 580      exact_mod_cast hd
 581    · left
 582      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 583      exact hz
 584  · intro h
 585    rcases h with hz | hd
 586    · rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hz
 587      rw [hz]
 588      ring
 589    · rw [hd, DistinctionNat.toNat_zero]
 590      ring
 591
 592theorem mul_ofOrbit_right_not_balanced_zero_iff
 593    (z : SignedOrbit) (d : DistinctionNat) :
 594    ¬ SignedOrbit.balanced
 595        (SignedOrbit.mul z (SignedOrbit.ofOrbit d)) SignedOrbit.zero ↔
 596      ¬ SignedOrbit.balanced z SignedOrbit.zero ∧ d ≠ DistinctionNat.zero := by
 597  rw [SignedOrbit.mul_ofOrbit_right_balanced_zero_iff]
 598  constructor
 599  · intro h
 600    constructor
 601    · intro hz
 602      exact h (Or.inl hz)
 603    · intro hd
 604      exact h (Or.inr hd)
 605  · intro h hzprod
 606    rcases hzprod with hz | hd
 607    · exact h.1 hz
 608    · exact h.2 hd
 609
 610theorem mul_ofOrbit_left_not_balanced_zero_iff
 611    (d : DistinctionNat) (z : SignedOrbit) :
 612    ¬ SignedOrbit.balanced
 613        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z) SignedOrbit.zero ↔
 614      ¬ SignedOrbit.balanced z SignedOrbit.zero ∧ d ≠ DistinctionNat.zero := by
 615  rw [SignedOrbit.mul_ofOrbit_left_balanced_zero_iff]
 616  constructor
 617  · intro h
 618    constructor
 619    · intro hz
 620      exact h (Or.inl hz)
 621    · intro hd
 622      exact h (Or.inr hd)
 623  · intro h hzprod
 624    rcases hzprod with hz | hd
 625    · exact h.1 hz
 626    · exact h.2 hd
 627
 628theorem nonnegFlag_scaleByNat_of_ne_zero
 629    (z : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
 630    (z.scaleByNat d).nonnegFlag = z.nonnegFlag := by
 631  have hdNat : d.toNat ≠ 0 := by
 632    intro hzero
 633    apply hd
 634    apply DistinctionNat.toNat_inj
 635    rw [hzero, DistinctionNat.toNat_zero]
 636  cases hz : z.nonnegFlag
 637  · rw [SignedOrbit.nonnegFlag_eq_false_iff,
 638      SignedOrbit.scaleByNat_toInt]
 639    have hzneg : z.toInt < 0 :=
 640      (SignedOrbit.nonnegFlag_eq_false_iff z).mp hz
 641    have hdpos : 0 < (d.toNat : ℤ) := by
 642      have : 0 < d.toNat := Nat.pos_of_ne_zero hdNat
 643      exact_mod_cast this
 644    nlinarith
 645  · rw [SignedOrbit.nonnegFlag_eq_true_iff,
 646      SignedOrbit.scaleByNat_toInt]
 647    have hznonneg : 0 ≤ z.toInt :=
 648      (SignedOrbit.nonnegFlag_eq_true_iff z).mp hz
 649    have hdnonneg : 0 ≤ (d.toNat : ℤ) := by exact_mod_cast Nat.zero_le d.toNat
 650    nlinarith
 651
 652theorem negativeFlag_scaleByNat_of_ne_zero
 653    (z : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
 654    (z.scaleByNat d).negativeFlag = z.negativeFlag := by
 655  unfold SignedOrbit.negativeFlag
 656  rw [SignedOrbit.nonnegFlag_scaleByNat_of_ne_zero z d hd]
 657
 658theorem scaleByNat_balanced_zero_iff
 659    (z : SignedOrbit) (d : DistinctionNat) :
 660    SignedOrbit.balanced (z.scaleByNat d) SignedOrbit.zero ↔
 661      SignedOrbit.balanced z SignedOrbit.zero ∨ d = DistinctionNat.zero := by
 662  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.scaleByNat_toInt,
 663    SignedOrbit.zero_toInt]
 664  constructor
 665  · intro h
 666    rcases mul_eq_zero.mp h with hz | hd
 667    · left
 668      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
 669      exact hz
 670    · right
 671      apply DistinctionNat.toNat_inj
 672      rw [DistinctionNat.toNat_zero]
 673      exact_mod_cast hd
 674  · intro h
 675    rcases h with hz | hd
 676    · rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hz
 677      rw [hz]
 678      ring
 679    · rw [hd, DistinctionNat.toNat_zero]
 680      ring
 681
 682theorem scaleByNat_not_balanced_zero_iff
 683    (z : SignedOrbit) (d : DistinctionNat) :
 684    ¬ SignedOrbit.balanced (z.scaleByNat d) SignedOrbit.zero ↔
 685      ¬ SignedOrbit.balanced z SignedOrbit.zero ∧ d ≠ DistinctionNat.zero := by
 686  rw [SignedOrbit.scaleByNat_balanced_zero_iff]
 687  constructor
 688  · intro h
 689    constructor
 690    · intro hz
 691      exact h (Or.inl hz)
 692    · intro hd
 693      exact h (Or.inr hd)
 694  · intro h hzscaled
 695    rcases hzscaled with hz | hd
 696    · exact h.1 hz
 697    · exact h.2 hd
 698
 699theorem abs_scaleByNat_eq_zero_iff
 700    (z : SignedOrbit) (d : DistinctionNat) :
 701    (z.scaleByNat d).abs = DistinctionNat.zero ↔
 702      z.abs = DistinctionNat.zero ∨ d = DistinctionNat.zero := by
 703  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
 704    SignedOrbit.scaleByNat_toInt, SignedOrbit.abs_eq_zero_iff_toInt_eq_zero]
 705  constructor
 706  · intro h
 707    rcases mul_eq_zero.mp h with hz | hd
 708    · exact Or.inl hz
 709    · right
 710      apply DistinctionNat.toNat_inj
 711      rw [DistinctionNat.toNat_zero]
 712      exact_mod_cast hd
 713  · intro h
 714    rcases h with hz | hd
 715    · rw [hz]
 716      ring
 717    · rw [hd, DistinctionNat.toNat_zero]
 718      ring
 719
 720theorem abs_scaleByNat_ne_zero_iff
 721    (z : SignedOrbit) (d : DistinctionNat) :
 722    (z.scaleByNat d).abs ≠ DistinctionNat.zero ↔
 723      z.abs ≠ DistinctionNat.zero ∧ d ≠ DistinctionNat.zero := by
 724  have hzero := SignedOrbit.abs_scaleByNat_eq_zero_iff z d
 725  constructor
 726  · intro h
 727    constructor
 728    · intro hz
 729      exact h (hzero.mpr (Or.inl hz))
 730    · intro hd
 731      exact h (hzero.mpr (Or.inr hd))
 732  · intro h hzscaled
 733    rcases hzero.mp hzscaled with hz | hd
 734    · exact h.1 hz
 735    · exact h.2 hd
 736
 737theorem abs_mul_ofOrbit_right_eq_zero_iff
 738    (z : SignedOrbit) (d : DistinctionNat) :
 739    (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).abs = DistinctionNat.zero ↔
 740      z.abs = DistinctionNat.zero ∨ d = DistinctionNat.zero := by
 741  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero, SignedOrbit.mul_toInt,
 742    SignedOrbit.ofOrbit_toInt, SignedOrbit.abs_eq_zero_iff_toInt_eq_zero]
 743  constructor
 744  · intro h
 745    rcases mul_eq_zero.mp h with hz | hd
 746    · exact Or.inl hz
 747    · right
 748      apply DistinctionNat.toNat_inj
 749      rw [DistinctionNat.toNat_zero]
 750      exact_mod_cast hd
 751  · intro h
 752    rcases h with hz | hd
 753    · rw [hz]
 754      ring
 755    · rw [hd, DistinctionNat.toNat_zero]
 756      ring
 757
 758theorem abs_mul_ofOrbit_left_eq_zero_iff
 759    (d : DistinctionNat) (z : SignedOrbit) :
 760    (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).abs = DistinctionNat.zero ↔
 761      z.abs = DistinctionNat.zero ∨ d = DistinctionNat.zero := by
 762  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero, SignedOrbit.mul_toInt,
 763    SignedOrbit.ofOrbit_toInt, SignedOrbit.abs_eq_zero_iff_toInt_eq_zero]
 764  constructor
 765  · intro h
 766    rcases mul_eq_zero.mp h with hd | hz
 767    · right
 768      apply DistinctionNat.toNat_inj
 769      rw [DistinctionNat.toNat_zero]
 770      exact_mod_cast hd
 771    · exact Or.inl hz
 772  · intro h
 773    rcases h with hz | hd
 774    · rw [hz]
 775      ring
 776    · rw [hd, DistinctionNat.toNat_zero]
 777      ring
 778
 779theorem abs_mul_ofOrbit_right_ne_zero_iff
 780    (z : SignedOrbit) (d : DistinctionNat) :
 781    (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).abs ≠ DistinctionNat.zero ↔
 782      z.abs ≠ DistinctionNat.zero ∧ d ≠ DistinctionNat.zero := by
 783  have hzero := SignedOrbit.abs_mul_ofOrbit_right_eq_zero_iff z d
 784  constructor
 785  · intro h
 786    constructor
 787    · intro hz
 788      exact h (hzero.mpr (Or.inl hz))
 789    · intro hd
 790      exact h (hzero.mpr (Or.inr hd))
 791  · intro h hzprod
 792    rcases hzero.mp hzprod with hz | hd
 793    · exact h.1 hz
 794    · exact h.2 hd
 795
 796theorem abs_mul_ofOrbit_left_ne_zero_iff
 797    (d : DistinctionNat) (z : SignedOrbit) :
 798    (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).abs ≠ DistinctionNat.zero ↔
 799      z.abs ≠ DistinctionNat.zero ∧ d ≠ DistinctionNat.zero := by
 800  have hzero := SignedOrbit.abs_mul_ofOrbit_left_eq_zero_iff d z
 801  constructor
 802  · intro h
 803    constructor
 804    · intro hz
 805      exact h (hzero.mpr (Or.inl hz))
 806    · intro hd
 807      exact h (hzero.mpr (Or.inr hd))
 808  · intro h hzprod
 809    rcases hzero.mp hzprod with hz | hd
 810    · exact h.1 hz
 811    · exact h.2 hd
 812
 813theorem le_scaleByNat_of_le {z w : SignedOrbit}
 814    (h : SignedOrbit.le z w) (d : DistinctionNat) :
 815    SignedOrbit.le (z.scaleByNat d) (w.scaleByNat d) := by
 816  rw [SignedOrbit.le_iff_toInt_le] at h ⊢
 817  rw [SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt]
 818  have hdnonneg : 0 ≤ (d.toNat : ℤ) := by exact_mod_cast Nat.zero_le d.toNat
 819  nlinarith
 820
 821theorem le_scaleByNat_iff_of_ne_zero
 822    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
 823    SignedOrbit.le (z.scaleByNat d) (w.scaleByNat d) ↔
 824      SignedOrbit.le z w := by
 825  have hdNat : d.toNat ≠ 0 := by
 826    intro hzero
 827    apply hd
 828    apply DistinctionNat.toNat_inj
 829    rw [hzero, DistinctionNat.toNat_zero]
 830  have hdpos : 0 < (d.toNat : ℤ) := by
 831    have hNatPos : 0 < d.toNat := Nat.pos_of_ne_zero hdNat
 832    exact_mod_cast hNatPos
 833  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le,
 834    SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt]
 835  constructor <;> intro h <;> nlinarith
 836
 837theorem lt_scaleByNat_iff_of_ne_zero
 838    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
 839    SignedOrbit.lt (z.scaleByNat d) (w.scaleByNat d) ↔
 840      SignedOrbit.lt z w := by
 841  have hdNat : d.toNat ≠ 0 := by
 842    intro hzero
 843    apply hd
 844    apply DistinctionNat.toNat_inj
 845    rw [hzero, DistinctionNat.toNat_zero]
 846  have hdpos : 0 < (d.toNat : ℤ) := by
 847    have hNatPos : 0 < d.toNat := Nat.pos_of_ne_zero hdNat
 848    exact_mod_cast hNatPos
 849  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt,
 850    SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt]
 851  constructor <;> intro h <;> nlinarith
 852
 853theorem balanced_scaleByNat_iff_of_ne_zero
 854    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
 855    SignedOrbit.balanced (z.scaleByNat d) (w.scaleByNat d) ↔
 856      SignedOrbit.balanced z w := by
 857  have hdNat : d.toNat ≠ 0 := by
 858    intro hzero
 859    apply hd
 860    apply DistinctionNat.toNat_inj
 861    rw [hzero, DistinctionNat.toNat_zero]
 862  have hdpos : 0 < (d.toNat : ℤ) := by
 863    have hNatPos : 0 < d.toNat := Nat.pos_of_ne_zero hdNat
 864    exact_mod_cast hNatPos
 865  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
 866    SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt]
 867  constructor <;> intro h <;> nlinarith
 868
 869theorem le_congr_left_of_balanced {a a' b : SignedOrbit}
 870    (ha : SignedOrbit.balanced a a') :
 871    SignedOrbit.le a b ↔ SignedOrbit.le a' b := by
 872  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le]
 873  rw [(SignedOrbit.balanced_iff_toInt_eq a a').mp ha]
 874
 875theorem le_congr_right_of_balanced {a b b' : SignedOrbit}
 876    (hb : SignedOrbit.balanced b b') :
 877    SignedOrbit.le a b ↔ SignedOrbit.le a b' := by
 878  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le]
 879  rw [(SignedOrbit.balanced_iff_toInt_eq b b').mp hb]
 880
 881theorem lt_congr_left_of_balanced {a a' b : SignedOrbit}
 882    (ha : SignedOrbit.balanced a a') :
 883    SignedOrbit.lt a b ↔ SignedOrbit.lt a' b := by
 884  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt]
 885  rw [(SignedOrbit.balanced_iff_toInt_eq a a').mp ha]
 886
 887theorem lt_congr_right_of_balanced {a b b' : SignedOrbit}
 888    (hb : SignedOrbit.balanced b b') :
 889    SignedOrbit.lt a b ↔ SignedOrbit.lt a b' := by
 890  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt]
 891  rw [(SignedOrbit.balanced_iff_toInt_eq b b').mp hb]
 892
 893theorem le_congr_of_balanced {a a' b b' : SignedOrbit}
 894    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 895    SignedOrbit.le a b ↔ SignedOrbit.le a' b' := by
 896  exact (SignedOrbit.le_congr_left_of_balanced ha).trans
 897    (SignedOrbit.le_congr_right_of_balanced hb)
 898
 899theorem lt_congr_of_balanced {a a' b b' : SignedOrbit}
 900    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 901    SignedOrbit.lt a b ↔ SignedOrbit.lt a' b' := by
 902  exact (SignedOrbit.lt_congr_left_of_balanced ha).trans
 903    (SignedOrbit.lt_congr_right_of_balanced hb)
 904
 905/-- Internal comparison selector. It is defined from signed-orbit order and
 906balanced length, not from the verifier integer display. -/
 907def cmp (a b : SignedOrbit) : Ordering :=
 908  if SignedOrbit.balanced a b then
 909    Ordering.eq
 910  else if (SignedOrbit.sub b a).nonnegFlag then
 911    Ordering.lt
 912  else
 913    Ordering.gt
 914
 915theorem cmp_eq_lt_of_lt {a b : SignedOrbit}
 916    (h : SignedOrbit.lt a b) :
 917    SignedOrbit.cmp a b = Ordering.lt := by
 918  have hnotbal : ¬ SignedOrbit.balanced a b := by
 919    rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.balanced_iff_toInt_eq] at *
 920    omega
 921  have hflag : (SignedOrbit.sub b a).nonnegFlag = true := by
 922    rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.sub_toInt]
 923    rw [SignedOrbit.lt_iff_toInt_lt] at h
 924    omega
 925  simp [SignedOrbit.cmp, hnotbal, hflag]
 926
 927theorem cmp_eq_eq_of_balanced {a b : SignedOrbit}
 928    (h : SignedOrbit.balanced a b) :
 929    SignedOrbit.cmp a b = Ordering.eq := by
 930  simp [SignedOrbit.cmp, h]
 931
 932theorem cmp_eq_gt_of_gt {a b : SignedOrbit}
 933    (h : SignedOrbit.lt b a) :
 934    SignedOrbit.cmp a b = Ordering.gt := by
 935  have hflag : (SignedOrbit.sub b a).nonnegFlag = false := by
 936    rw [SignedOrbit.nonnegFlag_eq_false_iff, SignedOrbit.sub_toInt]
 937    rw [SignedOrbit.lt_iff_toInt_lt] at h
 938    omega
 939  have hnotbal : ¬ SignedOrbit.balanced a b := by
 940    rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.balanced_iff_toInt_eq] at *
 941    omega
 942  simp [SignedOrbit.cmp, hflag, hnotbal]
 943
 944theorem cmp_eq_lt_iff (a b : SignedOrbit) :
 945    SignedOrbit.cmp a b = Ordering.lt ↔ SignedOrbit.lt a b := by
 946  constructor
 947  · intro hcmp
 948    unfold SignedOrbit.cmp at hcmp
 949    by_cases hbal : SignedOrbit.balanced a b
 950    · simp [hbal] at hcmp
 951    · by_cases hflag : (SignedOrbit.sub b a).nonnegFlag = true
 952      · rw [SignedOrbit.lt_iff_toInt_lt]
 953        rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.sub_toInt] at hflag
 954        rw [SignedOrbit.balanced_iff_toInt_eq] at hbal
 955        omega
 956      · simp [hbal, hflag] at hcmp
 957  · intro hlt
 958    exact SignedOrbit.cmp_eq_lt_of_lt hlt
 959
 960theorem cmp_eq_eq_iff (a b : SignedOrbit) :
 961    SignedOrbit.cmp a b = Ordering.eq ↔ SignedOrbit.balanced a b := by
 962  constructor
 963  · intro hcmp
 964    unfold SignedOrbit.cmp at hcmp
 965    by_cases hbal : SignedOrbit.balanced a b
 966    · exact hbal
 967    · by_cases hflag : (SignedOrbit.sub b a).nonnegFlag = true
 968      · simp [hbal, hflag] at hcmp
 969      · simp [hbal, hflag] at hcmp
 970  · intro hbal
 971    exact SignedOrbit.cmp_eq_eq_of_balanced hbal
 972
 973theorem cmp_eq_gt_iff (a b : SignedOrbit) :
 974    SignedOrbit.cmp a b = Ordering.gt ↔ SignedOrbit.lt b a := by
 975  constructor
 976  · intro hcmp
 977    unfold SignedOrbit.cmp at hcmp
 978    by_cases hbal : SignedOrbit.balanced a b
 979    · simp [hbal] at hcmp
 980    · by_cases hflag : (SignedOrbit.sub b a).nonnegFlag = true
 981      · simp [hbal, hflag] at hcmp
 982      · rw [SignedOrbit.lt_iff_toInt_lt]
 983        have hflagFalse : (SignedOrbit.sub b a).nonnegFlag = false := by
 984          cases hbranch : (SignedOrbit.sub b a).nonnegFlag with
 985          | false => rfl
 986          | true =>
 987              exfalso
 988              exact hflag hbranch
 989        rw [SignedOrbit.nonnegFlag_eq_false_iff, SignedOrbit.sub_toInt] at hflagFalse
 990        omega
 991  · intro hgt
 992    exact SignedOrbit.cmp_eq_gt_of_gt hgt
 993
 994theorem cmp_congr_of_balanced {a a' b b' : SignedOrbit}
 995    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
 996    SignedOrbit.cmp a b = SignedOrbit.cmp a' b' := by
 997  cases hcmp : SignedOrbit.cmp a b with
 998  | lt =>
 999      have hlt : SignedOrbit.lt a b :=
1000        (SignedOrbit.cmp_eq_lt_iff a b).mp hcmp
1001      have hlt' : SignedOrbit.lt a' b' :=
1002        ((SignedOrbit.lt_congr_left_of_balanced ha).mp
1003          ((SignedOrbit.lt_congr_right_of_balanced hb).mp hlt))
1004      exact (SignedOrbit.cmp_eq_lt_of_lt hlt').symm
1005  | eq =>
1006      have hbal : SignedOrbit.balanced a b :=
1007        (SignedOrbit.cmp_eq_eq_iff a b).mp hcmp
1008      have hbal' : SignedOrbit.balanced a' b' := by
1009        exact SignedOrbit.balanced_trans
1010          (SignedOrbit.balanced_symm ha)
1011          (SignedOrbit.balanced_trans hbal hb)
1012      exact (SignedOrbit.cmp_eq_eq_of_balanced hbal').symm
1013  | gt =>
1014      have hgt : SignedOrbit.lt b a :=
1015        (SignedOrbit.cmp_eq_gt_iff a b).mp hcmp
1016      have hgt' : SignedOrbit.lt b' a' :=
1017        ((SignedOrbit.lt_congr_left_of_balanced hb).mp
1018          ((SignedOrbit.lt_congr_right_of_balanced ha).mp hgt))
1019      exact (SignedOrbit.cmp_eq_gt_of_gt hgt').symm
1020
1021theorem cmp_scaleByNat_of_ne_zero
1022    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
1023    SignedOrbit.cmp (z.scaleByNat d) (w.scaleByNat d) =
1024      SignedOrbit.cmp z w := by
1025  cases hcmp : SignedOrbit.cmp z w with
1026  | lt =>
1027      have hlt : SignedOrbit.lt z w :=
1028        (SignedOrbit.cmp_eq_lt_iff z w).mp hcmp
1029      exact SignedOrbit.cmp_eq_lt_of_lt
1030        ((SignedOrbit.lt_scaleByNat_iff_of_ne_zero z w d hd).mpr hlt)
1031  | eq =>
1032      have hbal : SignedOrbit.balanced z w :=
1033        (SignedOrbit.cmp_eq_eq_iff z w).mp hcmp
1034      exact SignedOrbit.cmp_eq_eq_of_balanced
1035        (SignedOrbit.scaleByNat_congr_of_balanced hbal d)
1036  | gt =>
1037      have hgt : SignedOrbit.lt w z :=
1038        (SignedOrbit.cmp_eq_gt_iff z w).mp hcmp
1039      exact SignedOrbit.cmp_eq_gt_of_gt
1040        ((SignedOrbit.lt_scaleByNat_iff_of_ne_zero w z d hd).mpr hgt)
1041
1042theorem le_mul_ofOrbit_right_iff_of_ne_zero
1043    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
1044    SignedOrbit.le
1045        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
1046        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) ↔
1047      SignedOrbit.le z w := by
1048  exact (SignedOrbit.le_congr_of_balanced
1049      (SignedOrbit.mul_ofOrbit_balanced_scaleByNat z d)
1050      (SignedOrbit.mul_ofOrbit_balanced_scaleByNat w d)).trans
1051    (SignedOrbit.le_scaleByNat_iff_of_ne_zero z w d hd)
1052
1053theorem lt_mul_ofOrbit_right_iff_of_ne_zero
1054    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
1055    SignedOrbit.lt
1056        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
1057        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) ↔
1058      SignedOrbit.lt z w := by
1059  exact (SignedOrbit.lt_congr_of_balanced
1060      (SignedOrbit.mul_ofOrbit_balanced_scaleByNat z d)
1061      (SignedOrbit.mul_ofOrbit_balanced_scaleByNat w d)).trans
1062    (SignedOrbit.lt_scaleByNat_iff_of_ne_zero z w d hd)
1063
1064theorem balanced_mul_ofOrbit_right_iff_of_ne_zero
1065    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
1066    SignedOrbit.balanced
1067        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
1068        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) ↔
1069      SignedOrbit.balanced z w := by
1070  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1071    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt]
1072  have hdNat : d.toNat ≠ 0 := by
1073    intro hzero
1074    apply hd
1075    apply DistinctionNat.toNat_inj
1076    rw [hzero, DistinctionNat.toNat_zero]
1077  have hdpos : 0 < (d.toNat : ℤ) := by
1078    have hNatPos : 0 < d.toNat := Nat.pos_of_ne_zero hdNat
1079    exact_mod_cast hNatPos
1080  constructor <;> intro h <;> nlinarith
1081
1082theorem cmp_mul_ofOrbit_right_of_ne_zero
1083    (z w : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
1084    SignedOrbit.cmp
1085        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
1086        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) =
1087      SignedOrbit.cmp z w := by
1088  exact (SignedOrbit.cmp_congr_of_balanced
1089      (SignedOrbit.mul_ofOrbit_balanced_scaleByNat z d)
1090      (SignedOrbit.mul_ofOrbit_balanced_scaleByNat w d)).trans
1091    (SignedOrbit.cmp_scaleByNat_of_ne_zero z w d hd)
1092
1093theorem le_mul_ofOrbit_left_iff_of_ne_zero
1094    (d : DistinctionNat) (z w : SignedOrbit) (hd : d ≠ DistinctionNat.zero) :
1095    SignedOrbit.le
1096        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
1097        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) ↔
1098      SignedOrbit.le z w := by
1099  exact (SignedOrbit.le_congr_of_balanced
1100      (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d z)
1101      (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d w)).trans
1102    (SignedOrbit.le_scaleByNat_iff_of_ne_zero z w d hd)
1103
1104theorem lt_mul_ofOrbit_left_iff_of_ne_zero
1105    (d : DistinctionNat) (z w : SignedOrbit) (hd : d ≠ DistinctionNat.zero) :
1106    SignedOrbit.lt
1107        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
1108        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) ↔
1109      SignedOrbit.lt z w := by
1110  exact (SignedOrbit.lt_congr_of_balanced
1111      (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d z)
1112      (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d w)).trans
1113    (SignedOrbit.lt_scaleByNat_iff_of_ne_zero z w d hd)
1114
1115theorem balanced_mul_ofOrbit_left_iff_of_ne_zero
1116    (d : DistinctionNat) (z w : SignedOrbit) (hd : d ≠ DistinctionNat.zero) :
1117    SignedOrbit.balanced
1118        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
1119        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) ↔
1120      SignedOrbit.balanced z w := by
1121  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1122    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt]
1123  have hdNat : d.toNat ≠ 0 := by
1124    intro hzero
1125    apply hd
1126    apply DistinctionNat.toNat_inj
1127    rw [hzero, DistinctionNat.toNat_zero]
1128  have hdpos : 0 < (d.toNat : ℤ) := by
1129    have hNatPos : 0 < d.toNat := Nat.pos_of_ne_zero hdNat
1130    exact_mod_cast hNatPos
1131  constructor <;> intro h <;> nlinarith
1132
1133theorem cmp_mul_ofOrbit_left_of_ne_zero
1134    (d : DistinctionNat) (z w : SignedOrbit) (hd : d ≠ DistinctionNat.zero) :
1135    SignedOrbit.cmp
1136        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
1137        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) =
1138      SignedOrbit.cmp z w := by
1139  exact (SignedOrbit.cmp_congr_of_balanced
1140      (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d z)
1141      (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d w)).trans
1142    (SignedOrbit.cmp_scaleByNat_of_ne_zero z w d hd)
1143
1144theorem cmp_mul_left_of_nonnegFlag_of_not_balanced_zero
1145    (a z w : SignedOrbit)
1146    (hanonneg : a.nonnegFlag = true)
1147    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
1148    SignedOrbit.cmp (SignedOrbit.mul a z) (SignedOrbit.mul a w) =
1149      SignedOrbit.cmp z w := by
1150  cases hcmp : SignedOrbit.cmp z w with
1151  | lt =>
1152      have hlt : SignedOrbit.lt z w :=
1153        (SignedOrbit.cmp_eq_lt_iff z w).mp hcmp
1154      exact SignedOrbit.cmp_eq_lt_of_lt
1155        ((SignedOrbit.lt_mul_left_iff_of_nonnegFlag_of_not_balanced_zero
1156          a z w hanonneg ha).mpr hlt)
1157  | eq =>
1158      have hbal : SignedOrbit.balanced z w :=
1159        (SignedOrbit.cmp_eq_eq_iff z w).mp hcmp
1160      exact SignedOrbit.cmp_eq_eq_of_balanced
1161        ((SignedOrbit.balanced_mul_left_iff_of_not_balanced_zero
1162          a z w ha).mpr hbal)
1163  | gt =>
1164      have hgt : SignedOrbit.lt w z :=
1165        (SignedOrbit.cmp_eq_gt_iff z w).mp hcmp
1166      exact SignedOrbit.cmp_eq_gt_of_gt
1167        ((SignedOrbit.lt_mul_left_iff_of_nonnegFlag_of_not_balanced_zero
1168          a w z hanonneg ha).mpr hgt)
1169
1170theorem cmp_mul_right_of_nonnegFlag_of_not_balanced_zero
1171    (a z w : SignedOrbit)
1172    (hanonneg : a.nonnegFlag = true)
1173    (ha : ¬ SignedOrbit.balanced a SignedOrbit.zero) :
1174    SignedOrbit.cmp (SignedOrbit.mul z a) (SignedOrbit.mul w a) =
1175      SignedOrbit.cmp z w := by
1176  cases hcmp : SignedOrbit.cmp z w with
1177  | lt =>
1178      have hlt : SignedOrbit.lt z w :=
1179        (SignedOrbit.cmp_eq_lt_iff z w).mp hcmp
1180      exact SignedOrbit.cmp_eq_lt_of_lt
1181        ((SignedOrbit.lt_mul_right_iff_of_nonnegFlag_of_not_balanced_zero
1182          a z w hanonneg ha).mpr hlt)
1183  | eq =>
1184      have hbal : SignedOrbit.balanced z w :=
1185        (SignedOrbit.cmp_eq_eq_iff z w).mp hcmp
1186      exact SignedOrbit.cmp_eq_eq_of_balanced
1187        ((SignedOrbit.balanced_mul_right_iff_of_not_balanced_zero
1188          a z w ha).mpr hbal)
1189  | gt =>
1190      have hgt : SignedOrbit.lt w z :=
1191        (SignedOrbit.cmp_eq_gt_iff z w).mp hcmp
1192      exact SignedOrbit.cmp_eq_gt_of_gt
1193        ((SignedOrbit.lt_mul_right_iff_of_nonnegFlag_of_not_balanced_zero
1194          a w z hanonneg ha).mpr hgt)
1195
1196theorem cmp_mul_left_of_negativeFlag
1197    (a z w : SignedOrbit)
1198    (haneg : a.negativeFlag = true) :
1199    SignedOrbit.cmp (SignedOrbit.mul a z) (SignedOrbit.mul a w) =
1200      SignedOrbit.cmp w z := by
1201  have hanegInt : a.toInt < 0 :=
1202    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg a).mp haneg
1203  have ha : ¬ SignedOrbit.balanced a SignedOrbit.zero := by
1204    intro hzero
1205    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hzero
1206    omega
1207  cases hcmp : SignedOrbit.cmp w z with
1208  | lt =>
1209      have hlt : SignedOrbit.lt w z :=
1210        (SignedOrbit.cmp_eq_lt_iff w z).mp hcmp
1211      exact SignedOrbit.cmp_eq_lt_of_lt
1212        ((SignedOrbit.lt_mul_left_iff_of_negativeFlag a z w haneg).mpr hlt)
1213  | eq =>
1214      have hbal : SignedOrbit.balanced w z :=
1215        (SignedOrbit.cmp_eq_eq_iff w z).mp hcmp
1216      exact SignedOrbit.cmp_eq_eq_of_balanced
1217        ((SignedOrbit.balanced_mul_left_iff_of_not_balanced_zero
1218          a z w ha).mpr (SignedOrbit.balanced_symm hbal))
1219  | gt =>
1220      have hgt : SignedOrbit.lt z w :=
1221        (SignedOrbit.cmp_eq_gt_iff w z).mp hcmp
1222      exact SignedOrbit.cmp_eq_gt_of_gt
1223        ((SignedOrbit.lt_mul_left_iff_of_negativeFlag a w z haneg).mpr hgt)
1224
1225theorem cmp_mul_right_of_negativeFlag
1226    (a z w : SignedOrbit)
1227    (haneg : a.negativeFlag = true) :
1228    SignedOrbit.cmp (SignedOrbit.mul z a) (SignedOrbit.mul w a) =
1229      SignedOrbit.cmp w z := by
1230  have hanegInt : a.toInt < 0 :=
1231    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg a).mp haneg
1232  have ha : ¬ SignedOrbit.balanced a SignedOrbit.zero := by
1233    intro hzero
1234    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hzero
1235    omega
1236  cases hcmp : SignedOrbit.cmp w z with
1237  | lt =>
1238      have hlt : SignedOrbit.lt w z :=
1239        (SignedOrbit.cmp_eq_lt_iff w z).mp hcmp
1240      exact SignedOrbit.cmp_eq_lt_of_lt
1241        ((SignedOrbit.lt_mul_right_iff_of_negativeFlag a z w haneg).mpr hlt)
1242  | eq =>
1243      have hbal : SignedOrbit.balanced w z :=
1244        (SignedOrbit.cmp_eq_eq_iff w z).mp hcmp
1245      exact SignedOrbit.cmp_eq_eq_of_balanced
1246        ((SignedOrbit.balanced_mul_right_iff_of_not_balanced_zero
1247          a z w ha).mpr (SignedOrbit.balanced_symm hbal))
1248  | gt =>
1249      have hgt : SignedOrbit.lt z w :=
1250        (SignedOrbit.cmp_eq_gt_iff w z).mp hcmp
1251      exact SignedOrbit.cmp_eq_gt_of_gt
1252        ((SignedOrbit.lt_mul_right_iff_of_negativeFlag a w z haneg).mpr hgt)
1253
1254theorem nonnegFlag_mul_of_nonnegFlag_of_nonnegFlag
1255    (z w : SignedOrbit)
1256    (hz : z.nonnegFlag = true) (hw : w.nonnegFlag = true) :
1257    (SignedOrbit.mul z w).nonnegFlag = true := by
1258  rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.mul_toInt]
1259  have hznonneg : 0 ≤ z.toInt :=
1260    (SignedOrbit.nonnegFlag_eq_true_iff z).mp hz
1261  have hwnonneg : 0 ≤ w.toInt :=
1262    (SignedOrbit.nonnegFlag_eq_true_iff w).mp hw
1263  nlinarith
1264
1265theorem nonnegFlag_mul_of_negativeFlag_of_negativeFlag
1266    (z w : SignedOrbit)
1267    (hz : z.negativeFlag = true) (hw : w.negativeFlag = true) :
1268    (SignedOrbit.mul z w).nonnegFlag = true := by
1269  rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.mul_toInt]
1270  have hzneg : z.toInt < 0 :=
1271    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg z).mp hz
1272  have hwneg : w.toInt < 0 :=
1273    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg w).mp hw
1274  nlinarith
1275
1276theorem negativeFlag_mul_of_nonnegFlag_of_not_balanced_zero_of_negativeFlag
1277    (z w : SignedOrbit)
1278    (hz : z.nonnegFlag = true)
1279    (hznz : ¬ SignedOrbit.balanced z SignedOrbit.zero)
1280    (hw : w.negativeFlag = true) :
1281    (SignedOrbit.mul z w).negativeFlag = true := by
1282  rw [SignedOrbit.negativeFlag_eq_true_iff_toInt_neg, SignedOrbit.mul_toInt]
1283  have hznonneg : 0 ≤ z.toInt :=
1284    (SignedOrbit.nonnegFlag_eq_true_iff z).mp hz
1285  have hznzInt : z.toInt ≠ 0 := by
1286    intro hzero
1287    exact hznz (by
1288      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
1289      exact hzero)
1290  have hzpos : 0 < z.toInt := by omega
1291  have hwneg : w.toInt < 0 :=
1292    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg w).mp hw
1293  nlinarith
1294
1295theorem negativeFlag_mul_of_negativeFlag_of_nonnegFlag_of_not_balanced_zero
1296    (z w : SignedOrbit)
1297    (hz : z.negativeFlag = true)
1298    (hw : w.nonnegFlag = true)
1299    (hwnz : ¬ SignedOrbit.balanced w SignedOrbit.zero) :
1300    (SignedOrbit.mul z w).negativeFlag = true := by
1301  rw [SignedOrbit.negativeFlag_eq_true_iff_toInt_neg, SignedOrbit.mul_toInt]
1302  have hzneg : z.toInt < 0 :=
1303    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg z).mp hz
1304  have hwnonneg : 0 ≤ w.toInt :=
1305    (SignedOrbit.nonnegFlag_eq_true_iff w).mp hw
1306  have hwnzInt : w.toInt ≠ 0 := by
1307    intro hzero
1308    exact hwnz (by
1309      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
1310      exact hzero)
1311  have hwpos : 0 < w.toInt := by omega
1312  nlinarith
1313
1314theorem negativeFlag_mul_iff
1315    (z w : SignedOrbit) :
1316    (SignedOrbit.mul z w).negativeFlag = true ↔
1317      (z.nonnegFlag = true ∧
1318          ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
1319          w.negativeFlag = true) ∨
1320        (z.negativeFlag = true ∧
1321          w.nonnegFlag = true ∧
1322          ¬ SignedOrbit.balanced w SignedOrbit.zero) := by
1323  constructor
1324  · intro hprod
1325    have hprodInt : z.toInt * w.toInt < 0 := by
1326      rw [SignedOrbit.negativeFlag_eq_true_iff_toInt_neg,
1327        SignedOrbit.mul_toInt] at hprod
1328      exact hprod
1329    rcases SignedOrbit.signFlags_exhaustive z with hznonneg | hzneg
1330    · left
1331      have hzNonnegInt : 0 ≤ z.toInt :=
1332        (SignedOrbit.nonnegFlag_eq_true_iff z).mp hznonneg
1333      have hznz : ¬ SignedOrbit.balanced z SignedOrbit.zero := by
1334        intro hzero
1335        rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hzero
1336        rw [hzero] at hprodInt
1337        nlinarith
1338      have hwNegInt : w.toInt < 0 := by nlinarith
1339      have hwneg : w.negativeFlag = true :=
1340        (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg w).mpr hwNegInt
1341      exact ⟨hznonneg, hznz, hwneg⟩
1342    · right
1343      have hzNegInt : z.toInt < 0 :=
1344        (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg z).mp hzneg
1345      have hwPosInt : 0 < w.toInt := by nlinarith
1346      have hwnonneg : w.nonnegFlag = true :=
1347        (SignedOrbit.nonnegFlag_eq_true_iff w).mpr (le_of_lt hwPosInt)
1348      have hwnz : ¬ SignedOrbit.balanced w SignedOrbit.zero := by
1349        intro hzero
1350        rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hzero
1351        rw [hzero] at hprodInt
1352        nlinarith
1353      exact ⟨hzneg, hwnonneg, hwnz⟩
1354  · intro h
1355    rcases h with hleft | hright
1356    · exact SignedOrbit.negativeFlag_mul_of_nonnegFlag_of_not_balanced_zero_of_negativeFlag
1357        z w hleft.1 hleft.2.1 hleft.2.2
1358    · exact SignedOrbit.negativeFlag_mul_of_negativeFlag_of_nonnegFlag_of_not_balanced_zero
1359        z w hright.1 hright.2.1 hright.2.2
1360
1361theorem nonnegFlag_mul_iff_not_strict_opposite_sign
1362    (z w : SignedOrbit) :
1363    (SignedOrbit.mul z w).nonnegFlag = true ↔
1364      ¬ ((z.nonnegFlag = true ∧
1365              ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
1366              w.negativeFlag = true) ∨
1367            (z.negativeFlag = true ∧
1368              w.nonnegFlag = true ∧
1369              ¬ SignedOrbit.balanced w SignedOrbit.zero)) := by
1370  constructor
1371  · intro hnonneg hstrict
1372    have hneg : (SignedOrbit.mul z w).negativeFlag = true :=
1373      (SignedOrbit.negativeFlag_mul_iff z w).mpr hstrict
1374    have hnonnegFalse : (SignedOrbit.mul z w).nonnegFlag = false :=
1375      (SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false
1376        (SignedOrbit.mul z w)).mp hneg
1377    rw [hnonneg] at hnonnegFalse
1378    contradiction
1379  · intro hnot
1380    cases hnonneg : (SignedOrbit.mul z w).nonnegFlag with
1381    | false =>
1382        have hneg : (SignedOrbit.mul z w).negativeFlag = true := by
1383          rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
1384          exact hnonneg
1385        exact False.elim (hnot ((SignedOrbit.negativeFlag_mul_iff z w).mp hneg))
1386    | true =>
1387        rfl
1388
1389theorem nonnegFlag_mul_of_balanced_zero_left
1390    (z w : SignedOrbit)
1391    (hz : SignedOrbit.balanced z SignedOrbit.zero) :
1392    (SignedOrbit.mul z w).nonnegFlag = true := by
1393  rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.mul_toInt]
1394  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hz
1395  rw [hz]
1396  omega
1397
1398theorem nonnegFlag_mul_of_balanced_zero_right
1399    (z w : SignedOrbit)
1400    (hw : SignedOrbit.balanced w SignedOrbit.zero) :
1401    (SignedOrbit.mul z w).nonnegFlag = true := by
1402  rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.mul_toInt]
1403  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hw
1404  rw [hw]
1405  omega
1406
1407theorem negativeFlag_mul_eq_false_of_balanced_zero_left
1408    (z w : SignedOrbit)
1409    (hz : SignedOrbit.balanced z SignedOrbit.zero) :
1410    (SignedOrbit.mul z w).negativeFlag = false := by
1411  have hnonneg := SignedOrbit.nonnegFlag_mul_of_balanced_zero_left z w hz
1412  cases hneg : (SignedOrbit.mul z w).negativeFlag
1413  · rfl
1414  · have hnonnegFalse : (SignedOrbit.mul z w).nonnegFlag = false :=
1415      (SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false
1416        (SignedOrbit.mul z w)).mp hneg
1417    rw [hnonneg] at hnonnegFalse
1418    contradiction
1419
1420theorem negativeFlag_mul_eq_false_of_balanced_zero_right
1421    (z w : SignedOrbit)
1422    (hw : SignedOrbit.balanced w SignedOrbit.zero) :
1423    (SignedOrbit.mul z w).negativeFlag = false := by
1424  have hnonneg := SignedOrbit.nonnegFlag_mul_of_balanced_zero_right z w hw
1425  cases hneg : (SignedOrbit.mul z w).negativeFlag
1426  · rfl
1427  · have hnonnegFalse : (SignedOrbit.mul z w).nonnegFlag = false :=
1428      (SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false
1429        (SignedOrbit.mul z w)).mp hneg
1430    rw [hnonneg] at hnonnegFalse
1431    contradiction
1432
1433theorem mul_balanced_zero_of_balanced_zero_left
1434    (z w : SignedOrbit)
1435    (hz : SignedOrbit.balanced z SignedOrbit.zero) :
1436    SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero :=
1437  (SignedOrbit.mul_balanced_zero_iff z w).mpr (Or.inl hz)
1438
1439theorem mul_balanced_zero_of_balanced_zero_right
1440    (z w : SignedOrbit)
1441    (hw : SignedOrbit.balanced w SignedOrbit.zero) :
1442    SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero :=
1443  (SignedOrbit.mul_balanced_zero_iff z w).mpr (Or.inr hw)
1444
1445theorem abs_mul_eq_zero_of_balanced_zero_left
1446    (z w : SignedOrbit)
1447    (hz : SignedOrbit.balanced z SignedOrbit.zero) :
1448    (SignedOrbit.mul z w).abs = DistinctionNat.zero := by
1449  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero, SignedOrbit.mul_toInt]
1450  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hz
1451  rw [hz]
1452  ring
1453
1454theorem abs_mul_eq_zero_of_balanced_zero_right
1455    (z w : SignedOrbit)
1456    (hw : SignedOrbit.balanced w SignedOrbit.zero) :
1457    (SignedOrbit.mul z w).abs = DistinctionNat.zero := by
1458  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero, SignedOrbit.mul_toInt]
1459  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hw
1460  rw [hw]
1461  ring
1462
1463theorem mul_congr_of_balanced {a a' b b' : SignedOrbit}
1464    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1465    SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul a' b') := by
1466  rw [SignedOrbit.balanced_iff_toInt_eq] at *
1467  rw [SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, ha, hb]
1468
1469theorem mul_congr_of_balanced_left {a a' b : SignedOrbit}
1470    (ha : SignedOrbit.balanced a a') :
1471    SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul a' b) := by
1472  rw [SignedOrbit.balanced_iff_toInt_eq] at *
1473  rw [SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, ha]
1474
1475theorem mul_congr_of_balanced_right {a b b' : SignedOrbit}
1476    (hb : SignedOrbit.balanced b b') :
1477    SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul a b') := by
1478  rw [SignedOrbit.balanced_iff_toInt_eq] at *
1479  rw [SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, hb]
1480
1481theorem nonnegFlag_mul_eq_of_balanced {a a' b b' : SignedOrbit}
1482    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1483    (SignedOrbit.mul a b).nonnegFlag =
1484      (SignedOrbit.mul a' b').nonnegFlag :=
1485  SignedOrbit.nonnegFlag_eq_of_balanced
1486    (SignedOrbit.mul_congr_of_balanced ha hb)
1487
1488theorem nonnegFlag_mul_eq_of_balanced_left {a a' b : SignedOrbit}
1489    (ha : SignedOrbit.balanced a a') :
1490    (SignedOrbit.mul a b).nonnegFlag =
1491      (SignedOrbit.mul a' b).nonnegFlag :=
1492  SignedOrbit.nonnegFlag_eq_of_balanced
1493    (SignedOrbit.mul_congr_of_balanced_left ha)
1494
1495theorem nonnegFlag_mul_eq_of_balanced_right {a b b' : SignedOrbit}
1496    (hb : SignedOrbit.balanced b b') :
1497    (SignedOrbit.mul a b).nonnegFlag =
1498      (SignedOrbit.mul a b').nonnegFlag :=
1499  SignedOrbit.nonnegFlag_eq_of_balanced
1500    (SignedOrbit.mul_congr_of_balanced_right hb)
1501
1502theorem negativeFlag_mul_eq_of_balanced {a a' b b' : SignedOrbit}
1503    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1504    (SignedOrbit.mul a b).negativeFlag =
1505      (SignedOrbit.mul a' b').negativeFlag :=
1506  SignedOrbit.negativeFlag_eq_of_balanced
1507    (SignedOrbit.mul_congr_of_balanced ha hb)
1508
1509theorem negativeFlag_mul_eq_of_balanced_left {a a' b : SignedOrbit}
1510    (ha : SignedOrbit.balanced a a') :
1511    (SignedOrbit.mul a b).negativeFlag =
1512      (SignedOrbit.mul a' b).negativeFlag :=
1513  SignedOrbit.negativeFlag_eq_of_balanced
1514    (SignedOrbit.mul_congr_of_balanced_left ha)
1515
1516theorem negativeFlag_mul_eq_of_balanced_right {a b b' : SignedOrbit}
1517    (hb : SignedOrbit.balanced b b') :
1518    (SignedOrbit.mul a b).negativeFlag =
1519      (SignedOrbit.mul a b').negativeFlag :=
1520  SignedOrbit.negativeFlag_eq_of_balanced
1521    (SignedOrbit.mul_congr_of_balanced_right hb)
1522
1523theorem abs_mul_eq_of_balanced {a a' b b' : SignedOrbit}
1524    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1525    (SignedOrbit.mul a b).abs = (SignedOrbit.mul a' b').abs := by
1526  apply DistinctionNat.toNat_inj
1527  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat,
1528    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1529  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb
1530  rw [ha, hb]
1531
1532theorem abs_mul_eq_of_balanced_left {a a' b : SignedOrbit}
1533    (ha : SignedOrbit.balanced a a') :
1534    (SignedOrbit.mul a b).abs = (SignedOrbit.mul a' b).abs := by
1535  apply DistinctionNat.toNat_inj
1536  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat,
1537    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1538  rw [SignedOrbit.balanced_iff_toInt_eq] at ha
1539  rw [ha]
1540
1541theorem abs_mul_eq_of_balanced_right {a b b' : SignedOrbit}
1542    (hb : SignedOrbit.balanced b b') :
1543    (SignedOrbit.mul a b).abs = (SignedOrbit.mul a b').abs := by
1544  apply DistinctionNat.toNat_inj
1545  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat,
1546    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1547  rw [SignedOrbit.balanced_iff_toInt_eq] at hb
1548  rw [hb]
1549
1550theorem mul_balanced_zero_iff_of_balanced_left {a a' b : SignedOrbit}
1551    (ha : SignedOrbit.balanced a a') :
1552    SignedOrbit.balanced (SignedOrbit.mul a b) SignedOrbit.zero ↔
1553      SignedOrbit.balanced (SignedOrbit.mul a' b) SignedOrbit.zero := by
1554  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1555    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, SignedOrbit.zero_toInt]
1556  rw [SignedOrbit.balanced_iff_toInt_eq] at ha
1557  rw [ha]
1558
1559theorem mul_balanced_zero_iff_of_balanced_right {a b b' : SignedOrbit}
1560    (hb : SignedOrbit.balanced b b') :
1561    SignedOrbit.balanced (SignedOrbit.mul a b) SignedOrbit.zero ↔
1562      SignedOrbit.balanced (SignedOrbit.mul a b') SignedOrbit.zero := by
1563  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1564    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, SignedOrbit.zero_toInt]
1565  rw [SignedOrbit.balanced_iff_toInt_eq] at hb
1566  rw [hb]
1567
1568theorem abs_mul_eq_zero_iff_of_balanced_left {a a' b : SignedOrbit}
1569    (ha : SignedOrbit.balanced a a') :
1570    (SignedOrbit.mul a b).abs = DistinctionNat.zero ↔
1571      (SignedOrbit.mul a' b).abs = DistinctionNat.zero := by
1572  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
1573    SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
1574    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1575  rw [SignedOrbit.balanced_iff_toInt_eq] at ha
1576  rw [ha]
1577
1578theorem abs_mul_eq_zero_iff_of_balanced_right {a b b' : SignedOrbit}
1579    (hb : SignedOrbit.balanced b b') :
1580    (SignedOrbit.mul a b).abs = DistinctionNat.zero ↔
1581      (SignedOrbit.mul a b').abs = DistinctionNat.zero := by
1582  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
1583    SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
1584    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1585  rw [SignedOrbit.balanced_iff_toInt_eq] at hb
1586  rw [hb]
1587
1588theorem abs_mul_ne_zero_iff_of_balanced_left {a a' b : SignedOrbit}
1589    (ha : SignedOrbit.balanced a a') :
1590    (SignedOrbit.mul a b).abs ≠ DistinctionNat.zero ↔
1591      (SignedOrbit.mul a' b).abs ≠ DistinctionNat.zero := by
1592  have hzero := SignedOrbit.abs_mul_eq_zero_iff_of_balanced_left
1593    (a := a) (a' := a') (b := b) ha
1594  constructor
1595  · intro h hright
1596    exact h (hzero.mpr hright)
1597  · intro h hleft
1598    exact h (hzero.mp hleft)
1599
1600theorem abs_mul_ne_zero_iff_of_balanced_right {a b b' : SignedOrbit}
1601    (hb : SignedOrbit.balanced b b') :
1602    (SignedOrbit.mul a b).abs ≠ DistinctionNat.zero ↔
1603      (SignedOrbit.mul a b').abs ≠ DistinctionNat.zero := by
1604  have hzero := SignedOrbit.abs_mul_eq_zero_iff_of_balanced_right
1605    (a := a) (b := b) (b' := b') hb
1606  constructor
1607  · intro h hright
1608    exact h (hzero.mpr hright)
1609  · intro h hleft
1610    exact h (hzero.mp hleft)
1611
1612theorem mul_balanced_zero_iff_of_balanced {a a' b b' : SignedOrbit}
1613    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1614    SignedOrbit.balanced (SignedOrbit.mul a b) SignedOrbit.zero ↔
1615      SignedOrbit.balanced (SignedOrbit.mul a' b') SignedOrbit.zero := by
1616  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1617    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, SignedOrbit.zero_toInt]
1618  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb
1619  rw [ha, hb]
1620
1621theorem abs_mul_eq_zero_iff_of_balanced {a a' b b' : SignedOrbit}
1622    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1623    (SignedOrbit.mul a b).abs = DistinctionNat.zero ↔
1624      (SignedOrbit.mul a' b').abs = DistinctionNat.zero := by
1625  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
1626    SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
1627    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1628  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb
1629  rw [ha, hb]
1630
1631theorem abs_mul_ne_zero_iff_of_balanced {a a' b b' : SignedOrbit}
1632    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1633    (SignedOrbit.mul a b).abs ≠ DistinctionNat.zero ↔
1634      (SignedOrbit.mul a' b').abs ≠ DistinctionNat.zero := by
1635  have hzero := SignedOrbit.abs_mul_eq_zero_iff_of_balanced ha hb
1636  constructor
1637  · intro h hright
1638    exact h (hzero.mpr hright)
1639  · intro h hleft
1640    exact h (hzero.mp hleft)
1641
1642theorem le_product_left_factor_iff_of_balanced {a a' b c : SignedOrbit}
1643    (ha : SignedOrbit.balanced a a') :
1644    SignedOrbit.le (SignedOrbit.mul a b) c ↔
1645      SignedOrbit.le (SignedOrbit.mul a' b) c :=
1646  SignedOrbit.le_congr_left_of_balanced
1647    (SignedOrbit.mul_congr_of_balanced_left ha)
1648
1649theorem le_product_right_factor_iff_of_balanced {a b b' c : SignedOrbit}
1650    (hb : SignedOrbit.balanced b b') :
1651    SignedOrbit.le (SignedOrbit.mul a b) c ↔
1652      SignedOrbit.le (SignedOrbit.mul a b') c :=
1653  SignedOrbit.le_congr_left_of_balanced
1654    (SignedOrbit.mul_congr_of_balanced_right hb)
1655
1656theorem le_of_product_left_factor_iff_of_balanced {c a a' b : SignedOrbit}
1657    (ha : SignedOrbit.balanced a a') :
1658    SignedOrbit.le c (SignedOrbit.mul a b) ↔
1659      SignedOrbit.le c (SignedOrbit.mul a' b) :=
1660  SignedOrbit.le_congr_right_of_balanced
1661    (SignedOrbit.mul_congr_of_balanced_left ha)
1662
1663theorem le_of_product_right_factor_iff_of_balanced {c a b b' : SignedOrbit}
1664    (hb : SignedOrbit.balanced b b') :
1665    SignedOrbit.le c (SignedOrbit.mul a b) ↔
1666      SignedOrbit.le c (SignedOrbit.mul a b') :=
1667  SignedOrbit.le_congr_right_of_balanced
1668    (SignedOrbit.mul_congr_of_balanced_right hb)
1669
1670theorem lt_product_left_factor_iff_of_balanced {a a' b c : SignedOrbit}
1671    (ha : SignedOrbit.balanced a a') :
1672    SignedOrbit.lt (SignedOrbit.mul a b) c ↔
1673      SignedOrbit.lt (SignedOrbit.mul a' b) c :=
1674  SignedOrbit.lt_congr_left_of_balanced
1675    (SignedOrbit.mul_congr_of_balanced_left ha)
1676
1677theorem lt_product_right_factor_iff_of_balanced {a b b' c : SignedOrbit}
1678    (hb : SignedOrbit.balanced b b') :
1679    SignedOrbit.lt (SignedOrbit.mul a b) c ↔
1680      SignedOrbit.lt (SignedOrbit.mul a b') c :=
1681  SignedOrbit.lt_congr_left_of_balanced
1682    (SignedOrbit.mul_congr_of_balanced_right hb)
1683
1684theorem lt_of_product_left_factor_iff_of_balanced {c a a' b : SignedOrbit}
1685    (ha : SignedOrbit.balanced a a') :
1686    SignedOrbit.lt c (SignedOrbit.mul a b) ↔
1687      SignedOrbit.lt c (SignedOrbit.mul a' b) :=
1688  SignedOrbit.lt_congr_right_of_balanced
1689    (SignedOrbit.mul_congr_of_balanced_left ha)
1690
1691theorem lt_of_product_right_factor_iff_of_balanced {c a b b' : SignedOrbit}
1692    (hb : SignedOrbit.balanced b b') :
1693    SignedOrbit.lt c (SignedOrbit.mul a b) ↔
1694      SignedOrbit.lt c (SignedOrbit.mul a b') :=
1695  SignedOrbit.lt_congr_right_of_balanced
1696    (SignedOrbit.mul_congr_of_balanced_right hb)
1697
1698theorem cmp_product_left_factor_of_balanced {a a' b c : SignedOrbit}
1699    (ha : SignedOrbit.balanced a a') :
1700    SignedOrbit.cmp (SignedOrbit.mul a b) c =
1701      SignedOrbit.cmp (SignedOrbit.mul a' b) c := by
1702  have hc : SignedOrbit.balanced c c := by
1703    rw [SignedOrbit.balanced_iff_toInt_eq]
1704  exact SignedOrbit.cmp_congr_of_balanced
1705    (SignedOrbit.mul_congr_of_balanced_left ha) hc
1706
1707theorem cmp_product_right_factor_of_balanced {a b b' c : SignedOrbit}
1708    (hb : SignedOrbit.balanced b b') :
1709    SignedOrbit.cmp (SignedOrbit.mul a b) c =
1710      SignedOrbit.cmp (SignedOrbit.mul a b') c := by
1711  have hc : SignedOrbit.balanced c c := by
1712    rw [SignedOrbit.balanced_iff_toInt_eq]
1713  exact SignedOrbit.cmp_congr_of_balanced
1714    (SignedOrbit.mul_congr_of_balanced_right hb) hc
1715
1716theorem cmp_of_product_left_factor_of_balanced {c a a' b : SignedOrbit}
1717    (ha : SignedOrbit.balanced a a') :
1718    SignedOrbit.cmp c (SignedOrbit.mul a b) =
1719      SignedOrbit.cmp c (SignedOrbit.mul a' b) := by
1720  have hc : SignedOrbit.balanced c c := by
1721    rw [SignedOrbit.balanced_iff_toInt_eq]
1722  exact SignedOrbit.cmp_congr_of_balanced hc
1723    (SignedOrbit.mul_congr_of_balanced_left ha)
1724
1725theorem cmp_of_product_right_factor_of_balanced {c a b b' : SignedOrbit}
1726    (hb : SignedOrbit.balanced b b') :
1727    SignedOrbit.cmp c (SignedOrbit.mul a b) =
1728      SignedOrbit.cmp c (SignedOrbit.mul a b') := by
1729  have hc : SignedOrbit.balanced c c := by
1730    rw [SignedOrbit.balanced_iff_toInt_eq]
1731  exact SignedOrbit.cmp_congr_of_balanced hc
1732    (SignedOrbit.mul_congr_of_balanced_right hb)
1733
1734theorem le_product_factors_iff_of_balanced {a a' b b' c : SignedOrbit}
1735    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1736    SignedOrbit.le (SignedOrbit.mul a b) c ↔
1737      SignedOrbit.le (SignedOrbit.mul a' b') c :=
1738  SignedOrbit.le_congr_left_of_balanced
1739    (SignedOrbit.mul_congr_of_balanced ha hb)
1740
1741theorem le_of_product_factors_iff_of_balanced {c a a' b b' : SignedOrbit}
1742    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1743    SignedOrbit.le c (SignedOrbit.mul a b) ↔
1744      SignedOrbit.le c (SignedOrbit.mul a' b') :=
1745  SignedOrbit.le_congr_right_of_balanced
1746    (SignedOrbit.mul_congr_of_balanced ha hb)
1747
1748theorem lt_product_factors_iff_of_balanced {a a' b b' c : SignedOrbit}
1749    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1750    SignedOrbit.lt (SignedOrbit.mul a b) c ↔
1751      SignedOrbit.lt (SignedOrbit.mul a' b') c :=
1752  SignedOrbit.lt_congr_left_of_balanced
1753    (SignedOrbit.mul_congr_of_balanced ha hb)
1754
1755theorem lt_of_product_factors_iff_of_balanced {c a a' b b' : SignedOrbit}
1756    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1757    SignedOrbit.lt c (SignedOrbit.mul a b) ↔
1758      SignedOrbit.lt c (SignedOrbit.mul a' b') :=
1759  SignedOrbit.lt_congr_right_of_balanced
1760    (SignedOrbit.mul_congr_of_balanced ha hb)
1761
1762theorem cmp_product_factors_of_balanced {a a' b b' c : SignedOrbit}
1763    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1764    SignedOrbit.cmp (SignedOrbit.mul a b) c =
1765      SignedOrbit.cmp (SignedOrbit.mul a' b') c := by
1766  have hc : SignedOrbit.balanced c c := by
1767    rw [SignedOrbit.balanced_iff_toInt_eq]
1768  exact SignedOrbit.cmp_congr_of_balanced
1769    (SignedOrbit.mul_congr_of_balanced ha hb) hc
1770
1771theorem cmp_of_product_factors_of_balanced {c a a' b b' : SignedOrbit}
1772    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1773    SignedOrbit.cmp c (SignedOrbit.mul a b) =
1774      SignedOrbit.cmp c (SignedOrbit.mul a' b') := by
1775  have hc : SignedOrbit.balanced c c := by
1776    rw [SignedOrbit.balanced_iff_toInt_eq]
1777  exact SignedOrbit.cmp_congr_of_balanced hc
1778    (SignedOrbit.mul_congr_of_balanced ha hb)
1779
1780theorem le_products_iff_of_balanced
1781    {a a' b b' c c' d d' : SignedOrbit}
1782    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
1783    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
1784    SignedOrbit.le (SignedOrbit.mul a b) (SignedOrbit.mul c d) ↔
1785      SignedOrbit.le (SignedOrbit.mul a' b') (SignedOrbit.mul c' d') :=
1786  SignedOrbit.le_congr_of_balanced
1787    (SignedOrbit.mul_congr_of_balanced ha hb)
1788    (SignedOrbit.mul_congr_of_balanced hc hd)
1789
1790theorem lt_products_iff_of_balanced
1791    {a a' b b' c c' d d' : SignedOrbit}
1792    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
1793    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
1794    SignedOrbit.lt (SignedOrbit.mul a b) (SignedOrbit.mul c d) ↔
1795      SignedOrbit.lt (SignedOrbit.mul a' b') (SignedOrbit.mul c' d') :=
1796  SignedOrbit.lt_congr_of_balanced
1797    (SignedOrbit.mul_congr_of_balanced ha hb)
1798    (SignedOrbit.mul_congr_of_balanced hc hd)
1799
1800theorem cmp_products_of_balanced
1801    {a a' b b' c c' d d' : SignedOrbit}
1802    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
1803    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
1804    SignedOrbit.cmp (SignedOrbit.mul a b) (SignedOrbit.mul c d) =
1805      SignedOrbit.cmp (SignedOrbit.mul a' b') (SignedOrbit.mul c' d') :=
1806  SignedOrbit.cmp_congr_of_balanced
1807    (SignedOrbit.mul_congr_of_balanced ha hb)
1808    (SignedOrbit.mul_congr_of_balanced hc hd)
1809
1810theorem balanced_product_left_factor_iff_of_balanced
1811    {a a' b c : SignedOrbit} (ha : SignedOrbit.balanced a a') :
1812    SignedOrbit.balanced (SignedOrbit.mul a b) c ↔
1813      SignedOrbit.balanced (SignedOrbit.mul a' b) c := by
1814  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1815    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1816  rw [SignedOrbit.balanced_iff_toInt_eq] at ha
1817  rw [ha]
1818
1819theorem balanced_product_right_factor_iff_of_balanced
1820    {a b b' c : SignedOrbit} (hb : SignedOrbit.balanced b b') :
1821    SignedOrbit.balanced (SignedOrbit.mul a b) c ↔
1822      SignedOrbit.balanced (SignedOrbit.mul a b') c := by
1823  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1824    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1825  rw [SignedOrbit.balanced_iff_toInt_eq] at hb
1826  rw [hb]
1827
1828theorem balanced_product_factors_iff_of_balanced
1829    {a a' b b' c : SignedOrbit}
1830    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1831    SignedOrbit.balanced (SignedOrbit.mul a b) c ↔
1832      SignedOrbit.balanced (SignedOrbit.mul a' b') c := by
1833  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1834    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt]
1835  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb
1836  rw [ha, hb]
1837
1838theorem balanced_products_iff_of_balanced
1839    {a a' b b' c c' d d' : SignedOrbit}
1840    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
1841    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
1842    SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul c d) ↔
1843      SignedOrbit.balanced (SignedOrbit.mul a' b') (SignedOrbit.mul c' d') := by
1844  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
1845    SignedOrbit.mul_toInt, SignedOrbit.mul_toInt, SignedOrbit.mul_toInt,
1846    SignedOrbit.mul_toInt]
1847  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb hc hd
1848  rw [ha, hb, hc, hd]
1849
1850theorem le_sub_left_input_iff_of_balanced {a a' b c : SignedOrbit}
1851    (ha : SignedOrbit.balanced a a') :
1852    SignedOrbit.le (SignedOrbit.sub a b) c ↔
1853      SignedOrbit.le (SignedOrbit.sub a' b) c :=
1854  SignedOrbit.le_congr_left_of_balanced
1855    (SignedOrbit.sub_congr_of_balanced_left ha)
1856
1857theorem le_sub_right_input_iff_of_balanced {a b b' c : SignedOrbit}
1858    (hb : SignedOrbit.balanced b b') :
1859    SignedOrbit.le (SignedOrbit.sub a b) c ↔
1860      SignedOrbit.le (SignedOrbit.sub a b') c :=
1861  SignedOrbit.le_congr_left_of_balanced
1862    (SignedOrbit.sub_congr_of_balanced_right hb)
1863
1864theorem le_of_sub_left_input_iff_of_balanced {c a a' b : SignedOrbit}
1865    (ha : SignedOrbit.balanced a a') :
1866    SignedOrbit.le c (SignedOrbit.sub a b) ↔
1867      SignedOrbit.le c (SignedOrbit.sub a' b) :=
1868  SignedOrbit.le_congr_right_of_balanced
1869    (SignedOrbit.sub_congr_of_balanced_left ha)
1870
1871theorem le_of_sub_right_input_iff_of_balanced {c a b b' : SignedOrbit}
1872    (hb : SignedOrbit.balanced b b') :
1873    SignedOrbit.le c (SignedOrbit.sub a b) ↔
1874      SignedOrbit.le c (SignedOrbit.sub a b') :=
1875  SignedOrbit.le_congr_right_of_balanced
1876    (SignedOrbit.sub_congr_of_balanced_right hb)
1877
1878theorem lt_sub_left_input_iff_of_balanced {a a' b c : SignedOrbit}
1879    (ha : SignedOrbit.balanced a a') :
1880    SignedOrbit.lt (SignedOrbit.sub a b) c ↔
1881      SignedOrbit.lt (SignedOrbit.sub a' b) c :=
1882  SignedOrbit.lt_congr_left_of_balanced
1883    (SignedOrbit.sub_congr_of_balanced_left ha)
1884
1885theorem lt_sub_right_input_iff_of_balanced {a b b' c : SignedOrbit}
1886    (hb : SignedOrbit.balanced b b') :
1887    SignedOrbit.lt (SignedOrbit.sub a b) c ↔
1888      SignedOrbit.lt (SignedOrbit.sub a b') c :=
1889  SignedOrbit.lt_congr_left_of_balanced
1890    (SignedOrbit.sub_congr_of_balanced_right hb)
1891
1892theorem lt_of_sub_left_input_iff_of_balanced {c a a' b : SignedOrbit}
1893    (ha : SignedOrbit.balanced a a') :
1894    SignedOrbit.lt c (SignedOrbit.sub a b) ↔
1895      SignedOrbit.lt c (SignedOrbit.sub a' b) :=
1896  SignedOrbit.lt_congr_right_of_balanced
1897    (SignedOrbit.sub_congr_of_balanced_left ha)
1898
1899theorem lt_of_sub_right_input_iff_of_balanced {c a b b' : SignedOrbit}
1900    (hb : SignedOrbit.balanced b b') :
1901    SignedOrbit.lt c (SignedOrbit.sub a b) ↔
1902      SignedOrbit.lt c (SignedOrbit.sub a b') :=
1903  SignedOrbit.lt_congr_right_of_balanced
1904    (SignedOrbit.sub_congr_of_balanced_right hb)
1905
1906theorem cmp_sub_left_input_of_balanced {a a' b c : SignedOrbit}
1907    (ha : SignedOrbit.balanced a a') :
1908    SignedOrbit.cmp (SignedOrbit.sub a b) c =
1909      SignedOrbit.cmp (SignedOrbit.sub a' b) c := by
1910  have hc : SignedOrbit.balanced c c := by
1911    rw [SignedOrbit.balanced_iff_toInt_eq]
1912  exact SignedOrbit.cmp_congr_of_balanced
1913    (SignedOrbit.sub_congr_of_balanced_left ha) hc
1914
1915theorem cmp_sub_right_input_of_balanced {a b b' c : SignedOrbit}
1916    (hb : SignedOrbit.balanced b b') :
1917    SignedOrbit.cmp (SignedOrbit.sub a b) c =
1918      SignedOrbit.cmp (SignedOrbit.sub a b') c := by
1919  have hc : SignedOrbit.balanced c c := by
1920    rw [SignedOrbit.balanced_iff_toInt_eq]
1921  exact SignedOrbit.cmp_congr_of_balanced
1922    (SignedOrbit.sub_congr_of_balanced_right hb) hc
1923
1924theorem cmp_of_sub_left_input_of_balanced {c a a' b : SignedOrbit}
1925    (ha : SignedOrbit.balanced a a') :
1926    SignedOrbit.cmp c (SignedOrbit.sub a b) =
1927      SignedOrbit.cmp c (SignedOrbit.sub a' b) := by
1928  have hc : SignedOrbit.balanced c c := by
1929    rw [SignedOrbit.balanced_iff_toInt_eq]
1930  exact SignedOrbit.cmp_congr_of_balanced hc
1931    (SignedOrbit.sub_congr_of_balanced_left ha)
1932
1933theorem cmp_of_sub_right_input_of_balanced {c a b b' : SignedOrbit}
1934    (hb : SignedOrbit.balanced b b') :
1935    SignedOrbit.cmp c (SignedOrbit.sub a b) =
1936      SignedOrbit.cmp c (SignedOrbit.sub a b') := by
1937  have hc : SignedOrbit.balanced c c := by
1938    rw [SignedOrbit.balanced_iff_toInt_eq]
1939  exact SignedOrbit.cmp_congr_of_balanced hc
1940    (SignedOrbit.sub_congr_of_balanced_right hb)
1941
1942theorem le_sub_inputs_iff_of_balanced {a a' b b' c : SignedOrbit}
1943    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1944    SignedOrbit.le (SignedOrbit.sub a b) c ↔
1945      SignedOrbit.le (SignedOrbit.sub a' b') c :=
1946  SignedOrbit.le_congr_left_of_balanced
1947    (SignedOrbit.sub_congr_of_balanced ha hb)
1948
1949theorem le_of_sub_inputs_iff_of_balanced {c a a' b b' : SignedOrbit}
1950    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1951    SignedOrbit.le c (SignedOrbit.sub a b) ↔
1952      SignedOrbit.le c (SignedOrbit.sub a' b') :=
1953  SignedOrbit.le_congr_right_of_balanced
1954    (SignedOrbit.sub_congr_of_balanced ha hb)
1955
1956theorem lt_sub_inputs_iff_of_balanced {a a' b b' c : SignedOrbit}
1957    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1958    SignedOrbit.lt (SignedOrbit.sub a b) c ↔
1959      SignedOrbit.lt (SignedOrbit.sub a' b') c :=
1960  SignedOrbit.lt_congr_left_of_balanced
1961    (SignedOrbit.sub_congr_of_balanced ha hb)
1962
1963theorem lt_of_sub_inputs_iff_of_balanced {c a a' b b' : SignedOrbit}
1964    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1965    SignedOrbit.lt c (SignedOrbit.sub a b) ↔
1966      SignedOrbit.lt c (SignedOrbit.sub a' b') :=
1967  SignedOrbit.lt_congr_right_of_balanced
1968    (SignedOrbit.sub_congr_of_balanced ha hb)
1969
1970theorem cmp_sub_inputs_of_balanced {a a' b b' c : SignedOrbit}
1971    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1972    SignedOrbit.cmp (SignedOrbit.sub a b) c =
1973      SignedOrbit.cmp (SignedOrbit.sub a' b') c := by
1974  have hc : SignedOrbit.balanced c c := by
1975    rw [SignedOrbit.balanced_iff_toInt_eq]
1976  exact SignedOrbit.cmp_congr_of_balanced
1977    (SignedOrbit.sub_congr_of_balanced ha hb) hc
1978
1979theorem cmp_of_sub_inputs_of_balanced {c a a' b b' : SignedOrbit}
1980    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
1981    SignedOrbit.cmp c (SignedOrbit.sub a b) =
1982      SignedOrbit.cmp c (SignedOrbit.sub a' b') := by
1983  have hc : SignedOrbit.balanced c c := by
1984    rw [SignedOrbit.balanced_iff_toInt_eq]
1985  exact SignedOrbit.cmp_congr_of_balanced hc
1986    (SignedOrbit.sub_congr_of_balanced ha hb)
1987
1988theorem le_subtractions_iff_of_balanced
1989    {a a' b b' c c' d d' : SignedOrbit}
1990    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
1991    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
1992    SignedOrbit.le (SignedOrbit.sub a b) (SignedOrbit.sub c d) ↔
1993      SignedOrbit.le (SignedOrbit.sub a' b') (SignedOrbit.sub c' d') :=
1994  SignedOrbit.le_congr_of_balanced
1995    (SignedOrbit.sub_congr_of_balanced ha hb)
1996    (SignedOrbit.sub_congr_of_balanced hc hd)
1997
1998theorem lt_subtractions_iff_of_balanced
1999    {a a' b b' c c' d d' : SignedOrbit}
2000    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
2001    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
2002    SignedOrbit.lt (SignedOrbit.sub a b) (SignedOrbit.sub c d) ↔
2003      SignedOrbit.lt (SignedOrbit.sub a' b') (SignedOrbit.sub c' d') :=
2004  SignedOrbit.lt_congr_of_balanced
2005    (SignedOrbit.sub_congr_of_balanced ha hb)
2006    (SignedOrbit.sub_congr_of_balanced hc hd)
2007
2008theorem cmp_subtractions_of_balanced
2009    {a a' b b' c c' d d' : SignedOrbit}
2010    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
2011    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
2012    SignedOrbit.cmp (SignedOrbit.sub a b) (SignedOrbit.sub c d) =
2013      SignedOrbit.cmp (SignedOrbit.sub a' b') (SignedOrbit.sub c' d') :=
2014  SignedOrbit.cmp_congr_of_balanced
2015    (SignedOrbit.sub_congr_of_balanced ha hb)
2016    (SignedOrbit.sub_congr_of_balanced hc hd)
2017
2018theorem balanced_sub_left_input_iff_of_balanced
2019    {a a' b c : SignedOrbit} (ha : SignedOrbit.balanced a a') :
2020    SignedOrbit.balanced (SignedOrbit.sub a b) c ↔
2021      SignedOrbit.balanced (SignedOrbit.sub a' b) c := by
2022  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
2023    SignedOrbit.sub_toInt, SignedOrbit.sub_toInt]
2024  rw [SignedOrbit.balanced_iff_toInt_eq] at ha
2025  rw [ha]
2026
2027theorem balanced_sub_right_input_iff_of_balanced
2028    {a b b' c : SignedOrbit} (hb : SignedOrbit.balanced b b') :
2029    SignedOrbit.balanced (SignedOrbit.sub a b) c ↔
2030      SignedOrbit.balanced (SignedOrbit.sub a b') c := by
2031  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
2032    SignedOrbit.sub_toInt, SignedOrbit.sub_toInt]
2033  rw [SignedOrbit.balanced_iff_toInt_eq] at hb
2034  rw [hb]
2035
2036theorem balanced_sub_inputs_iff_of_balanced
2037    {a a' b b' c : SignedOrbit}
2038    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
2039    SignedOrbit.balanced (SignedOrbit.sub a b) c ↔
2040      SignedOrbit.balanced (SignedOrbit.sub a' b') c := by
2041  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
2042    SignedOrbit.sub_toInt, SignedOrbit.sub_toInt]
2043  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb
2044  rw [ha, hb]
2045
2046theorem balanced_subtractions_iff_of_balanced
2047    {a a' b b' c c' d d' : SignedOrbit}
2048    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b')
2049    (hc : SignedOrbit.balanced c c') (hd : SignedOrbit.balanced d d') :
2050    SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub c d) ↔
2051      SignedOrbit.balanced (SignedOrbit.sub a' b') (SignedOrbit.sub c' d') := by
2052  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq,
2053    SignedOrbit.sub_toInt, SignedOrbit.sub_toInt, SignedOrbit.sub_toInt,
2054    SignedOrbit.sub_toInt]
2055  rw [SignedOrbit.balanced_iff_toInt_eq] at ha hb hc hd
2056  rw [ha, hb, hc, hd]
2057
2058theorem sub_balanced_zero_iff_of_balanced_left
2059    {a a' b : SignedOrbit} (ha : SignedOrbit.balanced a a') :
2060    SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2061      SignedOrbit.balanced (SignedOrbit.sub a' b) SignedOrbit.zero :=
2062  SignedOrbit.balanced_sub_left_input_iff_of_balanced
2063    (c := SignedOrbit.zero) ha
2064
2065theorem sub_balanced_zero_iff_of_balanced_right
2066    {a b b' : SignedOrbit} (hb : SignedOrbit.balanced b b') :
2067    SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2068      SignedOrbit.balanced (SignedOrbit.sub a b') SignedOrbit.zero :=
2069  SignedOrbit.balanced_sub_right_input_iff_of_balanced
2070    (c := SignedOrbit.zero) hb
2071
2072theorem sub_balanced_zero_iff_of_balanced
2073    {a a' b b' : SignedOrbit}
2074    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
2075    SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2076      SignedOrbit.balanced (SignedOrbit.sub a' b') SignedOrbit.zero :=
2077  SignedOrbit.balanced_sub_inputs_iff_of_balanced
2078    (c := SignedOrbit.zero) ha hb
2079
2080theorem sub_not_balanced_zero_iff_of_balanced_left
2081    {a a' b : SignedOrbit} (ha : SignedOrbit.balanced a a') :
2082    ¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2083      ¬ SignedOrbit.balanced (SignedOrbit.sub a' b) SignedOrbit.zero := by
2084  rw [SignedOrbit.sub_balanced_zero_iff_of_balanced_left ha]
2085
2086theorem sub_not_balanced_zero_iff_of_balanced_right
2087    {a b b' : SignedOrbit} (hb : SignedOrbit.balanced b b') :
2088    ¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2089      ¬ SignedOrbit.balanced (SignedOrbit.sub a b') SignedOrbit.zero := by
2090  rw [SignedOrbit.sub_balanced_zero_iff_of_balanced_right hb]
2091
2092theorem sub_not_balanced_zero_iff_of_balanced
2093    {a a' b b' : SignedOrbit}
2094    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
2095    ¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2096      ¬ SignedOrbit.balanced (SignedOrbit.sub a' b') SignedOrbit.zero := by
2097  rw [SignedOrbit.sub_balanced_zero_iff_of_balanced ha hb]
2098
2099theorem sub_balanced_zero_iff_balanced (a b : SignedOrbit) :
2100    SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2101      SignedOrbit.balanced a b := by
2102  rw [SignedOrbit.balanced_iff_toInt_eq,
2103    SignedOrbit.sub_toInt, SignedOrbit.zero_toInt,
2104    SignedOrbit.balanced_iff_toInt_eq]
2105  omega
2106
2107theorem sub_not_balanced_zero_iff_not_balanced (a b : SignedOrbit) :
2108    ¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
2109      ¬ SignedOrbit.balanced a b := by
2110  rw [SignedOrbit.sub_balanced_zero_iff_balanced a b]
2111
2112theorem abs_sub_eq_zero_iff_balanced (a b : SignedOrbit) :
2113    (SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
2114      SignedOrbit.balanced a b := by
2115  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
2116    SignedOrbit.sub_toInt, SignedOrbit.balanced_iff_toInt_eq]
2117  omega
2118
2119theorem abs_sub_ne_zero_iff_not_balanced (a b : SignedOrbit) :
2120    (SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
2121      ¬ SignedOrbit.balanced a b := by
2122  rw [← SignedOrbit.abs_sub_eq_zero_iff_balanced a b]
2123
2124theorem sub_self_balanced_zero (a : SignedOrbit) :
2125    SignedOrbit.balanced (SignedOrbit.sub a a) SignedOrbit.zero :=
2126  (SignedOrbit.sub_balanced_zero_iff_balanced a a).mpr (by
2127    rw [SignedOrbit.balanced_iff_toInt_eq])
2128
2129theorem abs_sub_self_eq_zero (a : SignedOrbit) :
2130    (SignedOrbit.sub a a).abs = DistinctionNat.zero :=
2131  (SignedOrbit.abs_sub_eq_zero_iff_balanced a a).mpr (by
2132    rw [SignedOrbit.balanced_iff_toInt_eq])
2133
2134theorem sub_zero_balanced (a : SignedOrbit) :
2135    SignedOrbit.balanced (SignedOrbit.sub a SignedOrbit.zero) a := by
2136  rw [SignedOrbit.balanced_iff_toInt_eq,
2137    SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2138  omega
2139
2140theorem zero_sub_balanced_negate (a : SignedOrbit) :
2141    SignedOrbit.balanced (SignedOrbit.sub SignedOrbit.zero a)
2142      (SignedOrbit.negate a) := by
2143  rw [SignedOrbit.balanced_iff_toInt_eq,
2144    SignedOrbit.sub_toInt, SignedOrbit.zero_toInt,
2145    SignedOrbit.negate_toInt]
2146  omega
2147
2148theorem abs_sub_zero_eq (a : SignedOrbit) :
2149    (SignedOrbit.sub a SignedOrbit.zero).abs = a.abs := by
2150  apply DistinctionNat.toNat_inj
2151  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat,
2152    SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2153  simp
2154
2155theorem abs_zero_sub_eq (a : SignedOrbit) :
2156    (SignedOrbit.sub SignedOrbit.zero a).abs = a.abs := by
2157  apply DistinctionNat.toNat_inj
2158  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat,
2159    SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2160  have h : 0 - a.toInt = -a.toInt := by omega
2161  rw [h, Int.natAbs_neg]
2162
2163theorem le_sub_zero_left_iff (a b : SignedOrbit) :
2164    SignedOrbit.le (SignedOrbit.sub a SignedOrbit.zero) b ↔
2165      SignedOrbit.le a b :=
2166  SignedOrbit.le_congr_left_of_balanced
2167    (SignedOrbit.sub_zero_balanced a)
2168
2169theorem le_sub_zero_right_iff (a b : SignedOrbit) :
2170    SignedOrbit.le b (SignedOrbit.sub a SignedOrbit.zero) ↔
2171      SignedOrbit.le b a :=
2172  SignedOrbit.le_congr_right_of_balanced
2173    (SignedOrbit.sub_zero_balanced a)
2174
2175theorem lt_sub_zero_left_iff (a b : SignedOrbit) :
2176    SignedOrbit.lt (SignedOrbit.sub a SignedOrbit.zero) b ↔
2177      SignedOrbit.lt a b :=
2178  SignedOrbit.lt_congr_left_of_balanced
2179    (SignedOrbit.sub_zero_balanced a)
2180
2181theorem lt_sub_zero_right_iff (a b : SignedOrbit) :
2182    SignedOrbit.lt b (SignedOrbit.sub a SignedOrbit.zero) ↔
2183      SignedOrbit.lt b a :=
2184  SignedOrbit.lt_congr_right_of_balanced
2185    (SignedOrbit.sub_zero_balanced a)
2186
2187theorem cmp_sub_zero_left (a b : SignedOrbit) :
2188    SignedOrbit.cmp (SignedOrbit.sub a SignedOrbit.zero) b =
2189      SignedOrbit.cmp a b := by
2190  have hb : SignedOrbit.balanced b b := by
2191    rw [SignedOrbit.balanced_iff_toInt_eq]
2192  exact SignedOrbit.cmp_congr_of_balanced
2193    (SignedOrbit.sub_zero_balanced a) hb
2194
2195theorem cmp_sub_zero_right (a b : SignedOrbit) :
2196    SignedOrbit.cmp b (SignedOrbit.sub a SignedOrbit.zero) =
2197      SignedOrbit.cmp b a := by
2198  have hb : SignedOrbit.balanced b b := by
2199    rw [SignedOrbit.balanced_iff_toInt_eq]
2200  exact SignedOrbit.cmp_congr_of_balanced hb
2201    (SignedOrbit.sub_zero_balanced a)
2202
2203theorem le_zero_sub_left_iff (a b : SignedOrbit) :
2204    SignedOrbit.le (SignedOrbit.sub SignedOrbit.zero a) b ↔
2205      SignedOrbit.le (SignedOrbit.negate a) b :=
2206  SignedOrbit.le_congr_left_of_balanced
2207    (SignedOrbit.zero_sub_balanced_negate a)
2208
2209theorem le_zero_sub_right_iff (a b : SignedOrbit) :
2210    SignedOrbit.le b (SignedOrbit.sub SignedOrbit.zero a) ↔
2211      SignedOrbit.le b (SignedOrbit.negate a) :=
2212  SignedOrbit.le_congr_right_of_balanced
2213    (SignedOrbit.zero_sub_balanced_negate a)
2214
2215theorem lt_zero_sub_left_iff (a b : SignedOrbit) :
2216    SignedOrbit.lt (SignedOrbit.sub SignedOrbit.zero a) b ↔
2217      SignedOrbit.lt (SignedOrbit.negate a) b :=
2218  SignedOrbit.lt_congr_left_of_balanced
2219    (SignedOrbit.zero_sub_balanced_negate a)
2220
2221theorem lt_zero_sub_right_iff (a b : SignedOrbit) :
2222    SignedOrbit.lt b (SignedOrbit.sub SignedOrbit.zero a) ↔
2223      SignedOrbit.lt b (SignedOrbit.negate a) :=
2224  SignedOrbit.lt_congr_right_of_balanced
2225    (SignedOrbit.zero_sub_balanced_negate a)
2226
2227theorem cmp_zero_sub_left (a b : SignedOrbit) :
2228    SignedOrbit.cmp (SignedOrbit.sub SignedOrbit.zero a) b =
2229      SignedOrbit.cmp (SignedOrbit.negate a) b := by
2230  have hb : SignedOrbit.balanced b b := by
2231    rw [SignedOrbit.balanced_iff_toInt_eq]
2232  exact SignedOrbit.cmp_congr_of_balanced
2233    (SignedOrbit.zero_sub_balanced_negate a) hb
2234
2235theorem cmp_zero_sub_right (a b : SignedOrbit) :
2236    SignedOrbit.cmp b (SignedOrbit.sub SignedOrbit.zero a) =
2237      SignedOrbit.cmp b (SignedOrbit.negate a) := by
2238  have hb : SignedOrbit.balanced b b := by
2239    rw [SignedOrbit.balanced_iff_toInt_eq]
2240  exact SignedOrbit.cmp_congr_of_balanced hb
2241    (SignedOrbit.zero_sub_balanced_negate a)
2242
2243theorem le_sub_self_left_iff (a b : SignedOrbit) :
2244    SignedOrbit.le (SignedOrbit.sub a a) b ↔
2245      SignedOrbit.le SignedOrbit.zero b :=
2246  SignedOrbit.le_congr_left_of_balanced
2247    (SignedOrbit.sub_self_balanced_zero a)
2248
2249theorem le_sub_self_right_iff (a b : SignedOrbit) :
2250    SignedOrbit.le b (SignedOrbit.sub a a) ↔
2251      SignedOrbit.le b SignedOrbit.zero :=
2252  SignedOrbit.le_congr_right_of_balanced
2253    (SignedOrbit.sub_self_balanced_zero a)
2254
2255theorem lt_sub_self_left_iff (a b : SignedOrbit) :
2256    SignedOrbit.lt (SignedOrbit.sub a a) b ↔
2257      SignedOrbit.lt SignedOrbit.zero b :=
2258  SignedOrbit.lt_congr_left_of_balanced
2259    (SignedOrbit.sub_self_balanced_zero a)
2260
2261theorem lt_sub_self_right_iff (a b : SignedOrbit) :
2262    SignedOrbit.lt b (SignedOrbit.sub a a) ↔
2263      SignedOrbit.lt b SignedOrbit.zero :=
2264  SignedOrbit.lt_congr_right_of_balanced
2265    (SignedOrbit.sub_self_balanced_zero a)
2266
2267theorem cmp_sub_self_left (a b : SignedOrbit) :
2268    SignedOrbit.cmp (SignedOrbit.sub a a) b =
2269      SignedOrbit.cmp SignedOrbit.zero b := by
2270  have hb : SignedOrbit.balanced b b := by
2271    rw [SignedOrbit.balanced_iff_toInt_eq]
2272  exact SignedOrbit.cmp_congr_of_balanced
2273    (SignedOrbit.sub_self_balanced_zero a) hb
2274
2275theorem cmp_sub_self_right (a b : SignedOrbit) :
2276    SignedOrbit.cmp b (SignedOrbit.sub a a) =
2277      SignedOrbit.cmp b SignedOrbit.zero := by
2278  have hb : SignedOrbit.balanced b b := by
2279    rw [SignedOrbit.balanced_iff_toInt_eq]
2280  exact SignedOrbit.cmp_congr_of_balanced hb
2281    (SignedOrbit.sub_self_balanced_zero a)
2282
2283theorem nonnegFlag_sub_zero (a : SignedOrbit) :
2284    (SignedOrbit.sub a SignedOrbit.zero).nonnegFlag = a.nonnegFlag := by
2285  cases hflag : a.nonnegFlag
2286  · rw [SignedOrbit.nonnegFlag_eq_false_iff,
2287      SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2288    have hneg : a.toInt < 0 :=
2289      (SignedOrbit.nonnegFlag_eq_false_iff a).mp hflag
2290    omega
2291  · rw [SignedOrbit.nonnegFlag_eq_true_iff,
2292      SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2293    have hnonneg : 0 ≤ a.toInt :=
2294      (SignedOrbit.nonnegFlag_eq_true_iff a).mp hflag
2295    omega
2296
2297theorem negativeFlag_sub_zero (a : SignedOrbit) :
2298    (SignedOrbit.sub a SignedOrbit.zero).negativeFlag = a.negativeFlag := by
2299  unfold SignedOrbit.negativeFlag
2300  rw [SignedOrbit.nonnegFlag_sub_zero a]
2301
2302theorem nonnegFlag_zero_sub (a : SignedOrbit) :
2303    (SignedOrbit.sub SignedOrbit.zero a).nonnegFlag =
2304      (SignedOrbit.negate a).nonnegFlag := by
2305  cases hflag : (SignedOrbit.negate a).nonnegFlag
2306  · rw [SignedOrbit.nonnegFlag_eq_false_iff,
2307      SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2308    have hneg : (SignedOrbit.negate a).toInt < 0 :=
2309      (SignedOrbit.nonnegFlag_eq_false_iff (SignedOrbit.negate a)).mp hflag
2310    rw [SignedOrbit.negate_toInt] at hneg
2311    omega
2312  · rw [SignedOrbit.nonnegFlag_eq_true_iff,
2313      SignedOrbit.sub_toInt, SignedOrbit.zero_toInt]
2314    have hnonneg : 0 ≤ (SignedOrbit.negate a).toInt :=
2315      (SignedOrbit.nonnegFlag_eq_true_iff (SignedOrbit.negate a)).mp hflag
2316    rw [SignedOrbit.negate_toInt] at hnonneg
2317    omega
2318
2319theorem negativeFlag_zero_sub (a : SignedOrbit) :
2320    (SignedOrbit.sub SignedOrbit.zero a).negativeFlag =
2321      (SignedOrbit.negate a).negativeFlag := by
2322  unfold SignedOrbit.negativeFlag
2323  rw [SignedOrbit.nonnegFlag_zero_sub a]
2324
2325theorem nonnegFlag_sub_self (a : SignedOrbit) :
2326    (SignedOrbit.sub a a).nonnegFlag = true := by
2327  rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.sub_toInt]
2328  omega
2329
2330theorem negativeFlag_sub_self (a : SignedOrbit) :
2331    (SignedOrbit.sub a a).negativeFlag = false := by
2332  unfold SignedOrbit.negativeFlag
2333  rw [SignedOrbit.nonnegFlag_sub_self a]
2334  rfl
2335
2336theorem nonnegFlag_sub_iff_le (a b : SignedOrbit) :
2337    (SignedOrbit.sub a b).nonnegFlag = true ↔
2338      SignedOrbit.le b a := by
2339  rw [SignedOrbit.nonnegFlag_eq_true_iff,
2340    SignedOrbit.sub_toInt, SignedOrbit.le_iff_toInt_le]
2341  omega
2342
2343theorem nonnegFlag_sub_eq_false_iff_lt (a b : SignedOrbit) :
2344    (SignedOrbit.sub a b).nonnegFlag = false ↔
2345      SignedOrbit.lt a b := by
2346  rw [SignedOrbit.nonnegFlag_eq_false_iff,
2347    SignedOrbit.sub_toInt, SignedOrbit.lt_iff_toInt_lt]
2348  omega
2349
2350theorem negativeFlag_sub_iff_lt (a b : SignedOrbit) :
2351    (SignedOrbit.sub a b).negativeFlag = true ↔
2352      SignedOrbit.lt a b := by
2353  rw [SignedOrbit.negativeFlag_eq_true_iff_toInt_neg,
2354    SignedOrbit.sub_toInt, SignedOrbit.lt_iff_toInt_lt]
2355  omega
2356
2357theorem negativeFlag_sub_eq_false_iff_le (a b : SignedOrbit) :
2358    (SignedOrbit.sub a b).negativeFlag = false ↔
2359      SignedOrbit.le b a := by
2360  rw [SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true,
2361    SignedOrbit.nonnegFlag_sub_iff_le]
2362
2363theorem le_iff_nonnegFlag_sub (a b : SignedOrbit) :
2364    SignedOrbit.le a b ↔
2365      (SignedOrbit.sub b a).nonnegFlag = true :=
2366  (SignedOrbit.nonnegFlag_sub_iff_le b a).symm
2367
2368theorem lt_iff_nonnegFlag_sub_eq_false (a b : SignedOrbit) :
2369    SignedOrbit.lt a b ↔
2370      (SignedOrbit.sub a b).nonnegFlag = false :=
2371  (SignedOrbit.nonnegFlag_sub_eq_false_iff_lt a b).symm
2372
2373theorem lt_iff_negativeFlag_sub (a b : SignedOrbit) :
2374    SignedOrbit.lt a b ↔
2375      (SignedOrbit.sub a b).negativeFlag = true :=
2376  (SignedOrbit.negativeFlag_sub_iff_lt a b).symm
2377
2378theorem le_iff_negativeFlag_sub_eq_false (a b : SignedOrbit) :
2379    SignedOrbit.le a b ↔
2380      (SignedOrbit.sub b a).negativeFlag = false :=
2381  (SignedOrbit.negativeFlag_sub_eq_false_iff_le b a).symm
2382
2383theorem nonnegFlag_mul_ofOrbit_right_of_ne_zero
2384    (z : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
2385    (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).nonnegFlag =
2386      z.nonnegFlag :=
2387  (SignedOrbit.nonnegFlag_eq_of_balanced
2388    (SignedOrbit.mul_ofOrbit_balanced_scaleByNat z d)).trans
2389      (SignedOrbit.nonnegFlag_scaleByNat_of_ne_zero z d hd)
2390
2391theorem negativeFlag_mul_ofOrbit_right_of_ne_zero
2392    (z : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
2393    (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).negativeFlag =
2394      z.negativeFlag :=
2395  (SignedOrbit.negativeFlag_eq_of_balanced
2396    (SignedOrbit.mul_ofOrbit_balanced_scaleByNat z d)).trans
2397      (SignedOrbit.negativeFlag_scaleByNat_of_ne_zero z d hd)
2398
2399theorem nonnegFlag_mul_ofOrbit_left_of_ne_zero
2400    (d : DistinctionNat) (z : SignedOrbit) (hd : d ≠ DistinctionNat.zero) :
2401    (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).nonnegFlag =
2402      z.nonnegFlag :=
2403  (SignedOrbit.nonnegFlag_eq_of_balanced
2404    (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d z)).trans
2405      (SignedOrbit.nonnegFlag_scaleByNat_of_ne_zero z d hd)
2406
2407theorem negativeFlag_mul_ofOrbit_left_of_ne_zero
2408    (d : DistinctionNat) (z : SignedOrbit) (hd : d ≠ DistinctionNat.zero) :
2409    (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).negativeFlag =
2410      z.negativeFlag :=
2411  (SignedOrbit.negativeFlag_eq_of_balanced
2412    (SignedOrbit.ofOrbit_mul_balanced_scaleByNat d z)).trans
2413      (SignedOrbit.negativeFlag_scaleByNat_of_ne_zero z d hd)
2414
2415/-! ## Order transport through signed-orbit operations -/
2416
2417theorem balanced_add_left_iff (a b c : SignedOrbit) :
2418    SignedOrbit.balanced (SignedOrbit.add c a) (SignedOrbit.add c b) ↔
2419      SignedOrbit.balanced a b := by
2420  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq]
2421  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2422  omega
2423
2424theorem balanced_add_right_iff (a b c : SignedOrbit) :
2425    SignedOrbit.balanced (SignedOrbit.add a c) (SignedOrbit.add b c) ↔
2426      SignedOrbit.balanced a b := by
2427  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq]
2428  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2429  omega
2430
2431theorem balanced_negate_iff (a b : SignedOrbit) :
2432    SignedOrbit.balanced (SignedOrbit.negate a) (SignedOrbit.negate b) ↔
2433      SignedOrbit.balanced a b := by
2434  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.balanced_iff_toInt_eq]
2435  rw [SignedOrbit.negate_toInt, SignedOrbit.negate_toInt]
2436  omega
2437
2438theorem le_add_left_iff (a b c : SignedOrbit) :
2439    SignedOrbit.le (SignedOrbit.add c a) (SignedOrbit.add c b) ↔
2440      SignedOrbit.le a b := by
2441  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le]
2442  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2443  omega
2444
2445theorem le_add_right_iff (a b c : SignedOrbit) :
2446    SignedOrbit.le (SignedOrbit.add a c) (SignedOrbit.add b c) ↔
2447      SignedOrbit.le a b := by
2448  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le]
2449  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2450  omega
2451
2452theorem lt_add_left_iff (a b c : SignedOrbit) :
2453    SignedOrbit.lt (SignedOrbit.add c a) (SignedOrbit.add c b) ↔
2454      SignedOrbit.lt a b := by
2455  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt]
2456  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2457  omega
2458
2459theorem lt_add_right_iff (a b c : SignedOrbit) :
2460    SignedOrbit.lt (SignedOrbit.add a c) (SignedOrbit.add b c) ↔
2461      SignedOrbit.lt a b := by
2462  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt]
2463  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2464  omega
2465
2466theorem add_le_add {a b c d : SignedOrbit}
2467    (hab : SignedOrbit.le a b) (hcd : SignedOrbit.le c d) :
2468    SignedOrbit.le (SignedOrbit.add a c) (SignedOrbit.add b d) := by
2469  rw [SignedOrbit.le_iff_toInt_le] at *
2470  rw [SignedOrbit.add_toInt, SignedOrbit.add_toInt]
2471  omega
2472
2473theorem add_lt_add_left {a b c : SignedOrbit}
2474    (h : SignedOrbit.lt a b) :
2475    SignedOrbit.lt (SignedOrbit.add c a) (SignedOrbit.add c b) := by
2476  exact (SignedOrbit.lt_add_left_iff a b c).mpr h
2477
2478theorem add_lt_add_right {a b c : SignedOrbit}
2479    (h : SignedOrbit.lt a b) :
2480    SignedOrbit.lt (SignedOrbit.add a c) (SignedOrbit.add b c) := by
2481  exact (SignedOrbit.lt_add_right_iff a b c).mpr h
2482
2483theorem negate_le_negate_iff (a b : SignedOrbit) :
2484    SignedOrbit.le (SignedOrbit.negate b) (SignedOrbit.negate a) ↔
2485      SignedOrbit.le a b := by
2486  rw [SignedOrbit.le_iff_toInt_le, SignedOrbit.le_iff_toInt_le]
2487  rw [SignedOrbit.negate_toInt, SignedOrbit.negate_toInt]
2488  omega
2489
2490theorem negate_lt_negate_iff (a b : SignedOrbit) :
2491    SignedOrbit.lt (SignedOrbit.negate b) (SignedOrbit.negate a) ↔
2492      SignedOrbit.lt a b := by
2493  rw [SignedOrbit.lt_iff_toInt_lt, SignedOrbit.lt_iff_toInt_lt]
2494  rw [SignedOrbit.negate_toInt, SignedOrbit.negate_toInt]
2495  omega
2496
2497theorem cmp_add_left (a b c : SignedOrbit) :
2498    SignedOrbit.cmp (SignedOrbit.add c a) (SignedOrbit.add c b) =
2499      SignedOrbit.cmp a b := by
2500  cases hcmp : SignedOrbit.cmp a b with
2501  | lt =>
2502      have hlt : SignedOrbit.lt a b :=
2503        (SignedOrbit.cmp_eq_lt_iff a b).mp hcmp
2504      exact SignedOrbit.cmp_eq_lt_of_lt
2505        ((SignedOrbit.lt_add_left_iff a b c).mpr hlt)
2506  | eq =>
2507      have hbal : SignedOrbit.balanced a b :=
2508        (SignedOrbit.cmp_eq_eq_iff a b).mp hcmp
2509      exact SignedOrbit.cmp_eq_eq_of_balanced
2510        ((SignedOrbit.balanced_add_left_iff a b c).mpr hbal)
2511  | gt =>
2512      have hgt : SignedOrbit.lt b a :=
2513        (SignedOrbit.cmp_eq_gt_iff a b).mp hcmp
2514      exact SignedOrbit.cmp_eq_gt_of_gt
2515        ((SignedOrbit.lt_add_left_iff b a c).mpr hgt)
2516
2517theorem cmp_add_right (a b c : SignedOrbit) :
2518    SignedOrbit.cmp (SignedOrbit.add a c) (SignedOrbit.add b c) =
2519      SignedOrbit.cmp a b := by
2520  cases hcmp : SignedOrbit.cmp a b with
2521  | lt =>
2522      have hlt : SignedOrbit.lt a b :=
2523        (SignedOrbit.cmp_eq_lt_iff a b).mp hcmp
2524      exact SignedOrbit.cmp_eq_lt_of_lt
2525        ((SignedOrbit.lt_add_right_iff a b c).mpr hlt)
2526  | eq =>
2527      have hbal : SignedOrbit.balanced a b :=
2528        (SignedOrbit.cmp_eq_eq_iff a b).mp hcmp
2529      exact SignedOrbit.cmp_eq_eq_of_balanced
2530        ((SignedOrbit.balanced_add_right_iff a b c).mpr hbal)
2531  | gt =>
2532      have hgt : SignedOrbit.lt b a :=
2533        (SignedOrbit.cmp_eq_gt_iff a b).mp hcmp
2534      exact SignedOrbit.cmp_eq_gt_of_gt
2535        ((SignedOrbit.lt_add_right_iff b a c).mpr hgt)
2536
2537theorem cmp_negate_swap (a b : SignedOrbit) :
2538    SignedOrbit.cmp (SignedOrbit.negate b) (SignedOrbit.negate a) =
2539      SignedOrbit.cmp a b := by
2540  cases hcmp : SignedOrbit.cmp a b with
2541  | lt =>
2542      have hlt : SignedOrbit.lt a b :=
2543        (SignedOrbit.cmp_eq_lt_iff a b).mp hcmp
2544      exact SignedOrbit.cmp_eq_lt_of_lt
2545        ((SignedOrbit.negate_lt_negate_iff a b).mpr hlt)
2546  | eq =>
2547      have hbal : SignedOrbit.balanced a b :=
2548        (SignedOrbit.cmp_eq_eq_iff a b).mp hcmp
2549      have hbalNeg :
2550          SignedOrbit.balanced (SignedOrbit.negate b)
2551            (SignedOrbit.negate a) := by
2552        rw [SignedOrbit.balanced_negate_iff]
2553        exact SignedOrbit.balanced_symm hbal
2554      exact SignedOrbit.cmp_eq_eq_of_balanced hbalNeg
2555  | gt =>
2556      have hgt : SignedOrbit.lt b a :=
2557        (SignedOrbit.cmp_eq_gt_iff a b).mp hcmp
2558      exact SignedOrbit.cmp_eq_gt_of_gt
2559        ((SignedOrbit.negate_lt_negate_iff b a).mpr hgt)
2560
2561/-! ## Absolute-value branch transport -/
2562
2563theorem abs_eq_zero_iff_balanced_zero (z : SignedOrbit) :
2564    z.abs = DistinctionNat.zero ↔
2565      SignedOrbit.balanced z SignedOrbit.zero := by
2566  rw [SignedOrbit.abs_eq_zero_iff_toInt_eq_zero,
2567    SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
2568
2569theorem abs_toInt_of_nonnegFlag {z : SignedOrbit}
2570    (h : z.nonnegFlag = true) :
2571    (z.abs.toNat : ℤ) = z.toInt := by
2572  rw [SignedOrbit.abs_toNat]
2573  exact Int.ofNat_natAbs_of_nonneg
2574    ((SignedOrbit.nonnegFlag_eq_true_iff z).mp h)
2575
2576theorem abs_toInt_of_negativeFlag {z : SignedOrbit}
2577    (h : z.negativeFlag = true) :
2578    (z.abs.toNat : ℤ) = -z.toInt := by
2579  have hzneg : z.toInt < 0 :=
2580    (SignedOrbit.negativeFlag_eq_true_iff_toInt_neg z).mp h
2581  rw [SignedOrbit.abs_toNat]
2582  exact Int.ofNat_natAbs_of_nonpos (le_of_lt hzneg)
2583
2584theorem balanced_of_nonnegFlag {z : SignedOrbit}
2585    (h : z.nonnegFlag = true) :
2586    SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) := by
2587  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.ofOrbit_toInt]
2588  exact (SignedOrbit.abs_toInt_of_nonnegFlag h).symm
2589
2590theorem balanced_of_negativeFlag {z : SignedOrbit}
2591    (h : z.negativeFlag = true) :
2592    SignedOrbit.balanced z
2593      (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) := by
2594  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2595    SignedOrbit.ofOrbit_toInt]
2596  have habs := SignedOrbit.abs_toInt_of_negativeFlag h
2597  omega
2598
2599theorem balanced_sign_canonical (z : SignedOrbit) :
2600    (z.nonnegFlag = true ∧
2601      SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs)) ∨
2602      (z.negativeFlag = true ∧
2603        SignedOrbit.balanced z
2604          (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs))) := by
2605  by_cases h : z.nonnegFlag = true
2606  · exact Or.inl ⟨h, SignedOrbit.balanced_of_nonnegFlag h⟩
2607  · have hneg : z.negativeFlag = true := by
2608      unfold SignedOrbit.negativeFlag
2609      cases hflag : z.nonnegFlag with
2610      | false => rfl
2611      | true =>
2612          exfalso
2613          exact h hflag
2614    exact Or.inr ⟨hneg, SignedOrbit.balanced_of_negativeFlag hneg⟩
2615
2616theorem balanced_ofOrbit_abs_iff_nonnegFlag (z : SignedOrbit) :
2617    SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) ↔
2618      z.nonnegFlag = true := by
2619  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.ofOrbit_toInt]
2620  constructor
2621  · intro h
2622    rw [SignedOrbit.nonnegFlag_eq_true_iff]
2623    rw [h]
2624    exact Int.natCast_nonneg z.abs.toNat
2625  · intro h
2626    exact (SignedOrbit.abs_toInt_of_nonnegFlag h).symm
2627
2628theorem balanced_negate_ofOrbit_abs_iff_negate_nonnegFlag (z : SignedOrbit) :
2629    SignedOrbit.balanced z
2630      (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) ↔
2631        (SignedOrbit.negate z).nonnegFlag = true := by
2632  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2633    SignedOrbit.ofOrbit_toInt]
2634  constructor
2635  · intro h
2636    rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.negate_toInt]
2637    omega
2638  · intro h
2639    rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.negate_toInt] at h
2640    have hzle : z.toInt ≤ 0 := by omega
2641    have habs : ((Int.natAbs z.toInt : ℕ) : ℤ) = -z.toInt :=
2642      Int.ofNat_natAbs_of_nonpos hzle
2643    rw [← SignedOrbit.abs_toNat z] at habs
2644    omega
2645
2646theorem balanced_negate_ofOrbit_abs_iff_negativeFlag_or_balanced_zero
2647    (z : SignedOrbit) :
2648    SignedOrbit.balanced z
2649      (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) ↔
2650        z.negativeFlag = true ∨
2651          SignedOrbit.balanced z SignedOrbit.zero := by
2652  constructor
2653  · intro h
2654    by_cases hneg : z.negativeFlag = true
2655    · exact Or.inl hneg
2656    · right
2657      have hnonneg : z.nonnegFlag = true :=
2658        (SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true z).mp (by
2659          cases hflag : z.negativeFlag with
2660          | false => rfl
2661          | true =>
2662              exfalso
2663              exact hneg hflag)
2664      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2665        SignedOrbit.ofOrbit_toInt] at h
2666      have habs : ((z.abs.toNat : ℕ) : ℤ) = z.toInt :=
2667        SignedOrbit.abs_toInt_of_nonnegFlag hnonneg
2668      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
2669      omega
2670  · intro h
2671    rcases h with hneg | hzero
2672    · exact SignedOrbit.balanced_of_negativeFlag hneg
2673    · rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hzero
2674      rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2675        SignedOrbit.ofOrbit_toInt]
2676      have habs : ((z.abs.toNat : ℕ) : ℤ) = 0 := by
2677        rw [SignedOrbit.abs_toNat, hzero, Int.natAbs_zero]
2678        norm_num
2679      omega
2680
2681theorem balanced_both_abs_representatives_iff_balanced_zero
2682    (z : SignedOrbit) :
2683    (SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) ∧
2684      SignedOrbit.balanced z
2685        (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs))) ↔
2686        SignedOrbit.balanced z SignedOrbit.zero := by
2687  constructor
2688  · intro h
2689    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.ofOrbit_toInt] at h
2690    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2691      SignedOrbit.ofOrbit_toInt] at h
2692    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
2693    omega
2694  · intro hzero
2695    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt] at hzero
2696    constructor
2697    · rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.ofOrbit_toInt]
2698      have habs : ((z.abs.toNat : ℕ) : ℤ) = 0 := by
2699        rw [SignedOrbit.abs_toNat, hzero, Int.natAbs_zero]
2700        norm_num
2701      omega
2702    · rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2703        SignedOrbit.ofOrbit_toInt]
2704      have habs : ((z.abs.toNat : ℕ) : ℤ) = 0 := by
2705        rw [SignedOrbit.abs_toNat, hzero, Int.natAbs_zero]
2706        norm_num
2707      omega
2708
2709theorem balanced_zero_of_both_abs_representatives {z : SignedOrbit}
2710    (hpos : SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs))
2711    (hneg : SignedOrbit.balanced z
2712      (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs))) :
2713    SignedOrbit.balanced z SignedOrbit.zero :=
2714  (SignedOrbit.balanced_both_abs_representatives_iff_balanced_zero z).mp
2715    ⟨hpos, hneg⟩
2716
2717theorem not_both_abs_representatives_of_not_balanced_zero {z : SignedOrbit}
2718    (hzero : ¬ SignedOrbit.balanced z SignedOrbit.zero) :
2719    ¬ (SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) ∧
2720      SignedOrbit.balanced z
2721        (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs))) := by
2722  intro h
2723  exact hzero
2724    ((SignedOrbit.balanced_both_abs_representatives_iff_balanced_zero z).mp h)
2725
2726theorem not_balanced_ofOrbit_abs_of_negativeFlag {z : SignedOrbit}
2727    (hneg : z.negativeFlag = true) :
2728    ¬ SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) := by
2729  intro hbal
2730  have hnonneg : z.nonnegFlag = true :=
2731    (SignedOrbit.balanced_ofOrbit_abs_iff_nonnegFlag z).mp hbal
2732  exact SignedOrbit.signFlags_exclusive z ⟨hnonneg, hneg⟩
2733
2734theorem balanced_negate_ofOrbit_abs_iff_balanced_zero_of_nonnegFlag
2735    {z : SignedOrbit} (hnonneg : z.nonnegFlag = true) :
2736    SignedOrbit.balanced z
2737      (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) ↔
2738        SignedOrbit.balanced z SignedOrbit.zero := by
2739  rw [SignedOrbit.balanced_negate_ofOrbit_abs_iff_negativeFlag_or_balanced_zero]
2740  constructor
2741  · intro h
2742    rcases h with hneg | hzero
2743    · exfalso
2744      exact SignedOrbit.signFlags_exclusive z ⟨hnonneg, hneg⟩
2745    · exact hzero
2746  · intro hzero
2747    exact Or.inr hzero
2748
2749theorem abs_eq_of_balanced {z w : SignedOrbit}
2750    (h : SignedOrbit.balanced z w) :
2751    z.abs = w.abs := by
2752  apply DistinctionNat.toNat_inj
2753  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat]
2754  rw [(SignedOrbit.balanced_iff_toInt_eq z w).mp h]
2755
2756theorem abs_sub_eq_of_balanced_left {a a' b : SignedOrbit}
2757    (ha : SignedOrbit.balanced a a') :
2758    (SignedOrbit.sub a b).abs = (SignedOrbit.sub a' b).abs :=
2759  SignedOrbit.abs_eq_of_balanced
2760    (SignedOrbit.sub_congr_of_balanced_left ha)
2761
2762theorem abs_sub_eq_of_balanced_right {a b b' : SignedOrbit}
2763    (hb : SignedOrbit.balanced b b') :
2764    (SignedOrbit.sub a b).abs = (SignedOrbit.sub a b').abs :=
2765  SignedOrbit.abs_eq_of_balanced
2766    (SignedOrbit.sub_congr_of_balanced_right hb)
2767
2768theorem abs_sub_eq_of_balanced {a a' b b' : SignedOrbit}
2769    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
2770    (SignedOrbit.sub a b).abs = (SignedOrbit.sub a' b').abs :=
2771  SignedOrbit.abs_eq_of_balanced
2772    (SignedOrbit.sub_congr_of_balanced ha hb)
2773
2774theorem abs_sub_eq_zero_iff_of_balanced_left {a a' b : SignedOrbit}
2775    (ha : SignedOrbit.balanced a a') :
2776    (SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
2777      (SignedOrbit.sub a' b).abs = DistinctionNat.zero := by
2778  rw [SignedOrbit.abs_sub_eq_of_balanced_left ha]
2779
2780theorem abs_sub_eq_zero_iff_of_balanced_right {a b b' : SignedOrbit}
2781    (hb : SignedOrbit.balanced b b') :
2782    (SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
2783      (SignedOrbit.sub a b').abs = DistinctionNat.zero := by
2784  rw [SignedOrbit.abs_sub_eq_of_balanced_right hb]
2785
2786theorem abs_sub_eq_zero_iff_of_balanced {a a' b b' : SignedOrbit}
2787    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
2788    (SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
2789      (SignedOrbit.sub a' b').abs = DistinctionNat.zero := by
2790  rw [SignedOrbit.abs_sub_eq_of_balanced ha hb]
2791
2792theorem abs_sub_ne_zero_iff_of_balanced_left {a a' b : SignedOrbit}
2793    (ha : SignedOrbit.balanced a a') :
2794    (SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
2795      (SignedOrbit.sub a' b).abs ≠ DistinctionNat.zero := by
2796  rw [SignedOrbit.abs_sub_eq_of_balanced_left ha]
2797
2798theorem abs_sub_ne_zero_iff_of_balanced_right {a b b' : SignedOrbit}
2799    (hb : SignedOrbit.balanced b b') :
2800    (SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
2801      (SignedOrbit.sub a b').abs ≠ DistinctionNat.zero := by
2802  rw [SignedOrbit.abs_sub_eq_of_balanced_right hb]
2803
2804theorem abs_sub_ne_zero_iff_of_balanced {a a' b b' : SignedOrbit}
2805    (ha : SignedOrbit.balanced a a') (hb : SignedOrbit.balanced b b') :
2806    (SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
2807      (SignedOrbit.sub a' b').abs ≠ DistinctionNat.zero := by
2808  rw [SignedOrbit.abs_sub_eq_of_balanced ha hb]
2809
2810theorem abs_negate (z : SignedOrbit) :
2811    (SignedOrbit.negate z).abs = z.abs := by
2812  apply DistinctionNat.toNat_inj
2813  rw [SignedOrbit.abs_toNat, SignedOrbit.abs_toNat,
2814    SignedOrbit.negate_toInt, Int.natAbs_neg]
2815
2816theorem abs_ofOrbit (n : DistinctionNat) :
2817    (SignedOrbit.ofOrbit n).abs = n := by
2818  apply DistinctionNat.toNat_inj
2819  rw [SignedOrbit.abs_toNat, SignedOrbit.ofOrbit_toInt]
2820  simp
2821
2822theorem abs_negate_ofOrbit (n : DistinctionNat) :
2823    (SignedOrbit.negate (SignedOrbit.ofOrbit n)).abs = n := by
2824  rw [SignedOrbit.abs_negate, SignedOrbit.abs_ofOrbit]
2825
2826theorem nonnegFlag_ofOrbit (n : DistinctionNat) :
2827    (SignedOrbit.ofOrbit n).nonnegFlag = true := by
2828  rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.ofOrbit_toInt]
2829  exact Int.natCast_nonneg n.toNat
2830
2831theorem negativeFlag_ofOrbit (n : DistinctionNat) :
2832    (SignedOrbit.ofOrbit n).negativeFlag = false := by
2833  have hnonneg := SignedOrbit.nonnegFlag_ofOrbit n
2834  unfold SignedOrbit.negativeFlag
2835  rw [hnonneg]
2836  rfl
2837
2838theorem nonnegFlag_negate_ofOrbit_of_ne_zero
2839    (n : DistinctionNat) (hn : n ≠ DistinctionNat.zero) :
2840    (SignedOrbit.negate (SignedOrbit.ofOrbit n)).nonnegFlag = false := by
2841  rw [SignedOrbit.nonnegFlag_eq_false_iff, SignedOrbit.negate_toInt,
2842    SignedOrbit.ofOrbit_toInt]
2843  have hnNat : n.toNat ≠ 0 := by
2844    intro hzero
2845    apply hn
2846    apply DistinctionNat.toNat_inj
2847    rw [hzero, DistinctionNat.toNat_zero]
2848  omega
2849
2850theorem negativeFlag_negate_ofOrbit_of_ne_zero
2851    (n : DistinctionNat) (hn : n ≠ DistinctionNat.zero) :
2852    (SignedOrbit.negate (SignedOrbit.ofOrbit n)).negativeFlag = true := by
2853  rw [SignedOrbit.negativeFlag_eq_true_iff_toInt_neg,
2854    SignedOrbit.negate_toInt, SignedOrbit.ofOrbit_toInt]
2855  have hnNat : n.toNat ≠ 0 := by
2856    intro hzero
2857    apply hn
2858    apply DistinctionNat.toNat_inj
2859    rw [hzero, DistinctionNat.toNat_zero]
2860  omega
2861
2862theorem negate_ofOrbit_not_balanced_zero_of_ne_zero
2863    (n : DistinctionNat) (hn : n ≠ DistinctionNat.zero) :
2864    ¬ SignedOrbit.balanced
2865      (SignedOrbit.negate (SignedOrbit.ofOrbit n)) SignedOrbit.zero := by
2866  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2867    SignedOrbit.ofOrbit_toInt, SignedOrbit.zero_toInt]
2868  have hnNat : n.toNat ≠ 0 := by
2869    intro hzero
2870    apply hn
2871    apply DistinctionNat.toNat_inj
2872    rw [hzero, DistinctionNat.toNat_zero]
2873  omega
2874
2875theorem nonnegFlag_negate_ofOrbit_eq_true_iff_zero (n : DistinctionNat) :
2876    (SignedOrbit.negate (SignedOrbit.ofOrbit n)).nonnegFlag = true ↔
2877      n = DistinctionNat.zero := by
2878  constructor
2879  · intro h
2880    rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.negate_toInt,
2881      SignedOrbit.ofOrbit_toInt] at h
2882    apply DistinctionNat.toNat_inj
2883    rw [DistinctionNat.toNat_zero]
2884    omega
2885  · intro h
2886    rw [h]
2887    rw [SignedOrbit.nonnegFlag_eq_true_iff, SignedOrbit.negate_toInt,
2888      SignedOrbit.ofOrbit_toInt, DistinctionNat.toNat_zero]
2889    norm_num
2890
2891theorem negativeFlag_negate_ofOrbit_eq_true_iff_ne_zero (n : DistinctionNat) :
2892    (SignedOrbit.negate (SignedOrbit.ofOrbit n)).negativeFlag = true ↔
2893      n ≠ DistinctionNat.zero := by
2894  constructor
2895  · intro h hn
2896    rw [hn] at h
2897    rw [SignedOrbit.negativeFlag_eq_true_iff_toInt_neg,
2898      SignedOrbit.negate_toInt, SignedOrbit.ofOrbit_toInt,
2899      DistinctionNat.toNat_zero] at h
2900    norm_num at h
2901  · intro hn
2902    exact SignedOrbit.negativeFlag_negate_ofOrbit_of_ne_zero n hn
2903
2904theorem negate_ofOrbit_balanced_zero_iff (n : DistinctionNat) :
2905    SignedOrbit.balanced
2906      (SignedOrbit.negate (SignedOrbit.ofOrbit n)) SignedOrbit.zero ↔
2907        n = DistinctionNat.zero := by
2908  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.negate_toInt,
2909    SignedOrbit.ofOrbit_toInt, SignedOrbit.zero_toInt]
2910  constructor
2911  · intro h
2912    apply DistinctionNat.toNat_inj
2913    rw [DistinctionNat.toNat_zero]
2914    omega
2915  · intro h
2916    rw [h, DistinctionNat.toNat_zero]
2917    norm_num
2918
2919/-! ## Absolute-value order bounds -/
2920
2921theorem abs_add_le_add_abs (z w : SignedOrbit) :
2922    DistinctionNat.leq (SignedOrbit.add z w).abs (z.abs + w.abs) = true := by
2923  rw [DistinctionNat.leq_eq_true_iff]
2924  rw [SignedOrbit.abs_toNat, SignedOrbit.add_toInt, DistinctionNat.toNat_add,
2925    SignedOrbit.abs_toNat, SignedOrbit.abs_toNat]
2926  exact Int.natAbs_add_le z.toInt w.toInt
2927
2928theorem abs_sub_le_add_abs (z w : SignedOrbit) :
2929    DistinctionNat.leq (SignedOrbit.sub z w).abs (z.abs + w.abs) = true := by
2930  rw [DistinctionNat.leq_eq_true_iff]
2931  rw [SignedOrbit.abs_toNat, SignedOrbit.sub_toInt, DistinctionNat.toNat_add,
2932    SignedOrbit.abs_toNat, SignedOrbit.abs_toNat]
2933  simpa [sub_eq_add_neg, Int.natAbs_neg] using
2934    Int.natAbs_add_le z.toInt (-w.toInt)
2935
2936theorem abs_le_iff_between (z : SignedOrbit) (n : DistinctionNat) :
2937    DistinctionNat.leq z.abs n = true ↔
2938      SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z ∧
2939        SignedOrbit.le z (SignedOrbit.ofOrbit n) := by
2940  rw [DistinctionNat.leq_eq_true_iff, SignedOrbit.le_iff_toInt_le,
2941    SignedOrbit.le_iff_toInt_le]
2942  simp [SignedOrbit.negate_toInt, SignedOrbit.ofOrbit_toInt,
2943    SignedOrbit.abs_toNat]
2944  constructor
2945  · intro h
2946    have hInt : ((Int.natAbs z.toInt : ℕ) : ℤ) ≤ (n.toNat : ℤ) := by
2947      exact_mod_cast h
2948    constructor
2949    · by_cases hz : 0 ≤ z.toInt
2950      · omega
2951      · have hzle : z.toInt ≤ 0 := by omega
2952        have habs : ((Int.natAbs z.toInt : ℕ) : ℤ) = -z.toInt :=
2953          Int.ofNat_natAbs_of_nonpos hzle
2954        omega
2955    · by_cases hz : 0 ≤ z.toInt
2956      · have habs : ((Int.natAbs z.toInt : ℕ) : ℤ) = z.toInt :=
2957          Int.ofNat_natAbs_of_nonneg hz
2958        omega
2959      · omega
2960  · intro h
2961    rcases h with ⟨hlo, hhi⟩
2962    have hInt : ((Int.natAbs z.toInt : ℕ) : ℤ) ≤ (n.toNat : ℤ) := by
2963      by_cases hz : 0 ≤ z.toInt
2964      · have habs : ((Int.natAbs z.toInt : ℕ) : ℤ) = z.toInt :=
2965          Int.ofNat_natAbs_of_nonneg hz
2966        omega
2967      · have hzle : z.toInt ≤ 0 := by omega
2968        have habs : ((Int.natAbs z.toInt : ℕ) : ℤ) = -z.toInt :=
2969          Int.ofNat_natAbs_of_nonpos hzle
2970        omega
2971    exact_mod_cast hInt
2972
2973theorem between_of_abs_le {z : SignedOrbit} {n : DistinctionNat}
2974    (h : DistinctionNat.leq z.abs n = true) :
2975    SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z ∧
2976      SignedOrbit.le z (SignedOrbit.ofOrbit n) :=
2977  (SignedOrbit.abs_le_iff_between z n).mp h
2978
2979theorem abs_le_of_between {z : SignedOrbit} {n : DistinctionNat}
2980    (hlo : SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z)
2981    (hhi : SignedOrbit.le z (SignedOrbit.ofOrbit n)) :
2982    DistinctionNat.leq z.abs n = true :=
2983  (SignedOrbit.abs_le_iff_between z n).mpr ⟨hlo, hhi⟩
2984
2985theorem neg_abs_le_self (z : SignedOrbit) :
2986    SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) z :=
2987  ((SignedOrbit.abs_le_iff_between z z.abs).mp
2988    ((DistinctionNat.leq_eq_true_iff z.abs z.abs).mpr (Nat.le_refl _))).1
2989
2990theorem self_le_abs (z : SignedOrbit) :
2991    SignedOrbit.le z (SignedOrbit.ofOrbit z.abs) :=
2992  ((SignedOrbit.abs_le_iff_between z z.abs).mp
2993    ((DistinctionNat.leq_eq_true_iff z.abs z.abs).mpr (Nat.le_refl _))).2
2994
2995theorem abs_le_trans {z : SignedOrbit} {n m : DistinctionNat}
2996    (hzn : DistinctionNat.leq z.abs n = true)
2997    (hnm : DistinctionNat.leq n m = true) :
2998    DistinctionNat.leq z.abs m = true := by
2999  rw [DistinctionNat.leq_eq_true_iff] at *
3000  exact Nat.le_trans hzn hnm
3001
3002theorem between_mono {z : SignedOrbit} {n m : DistinctionNat}
3003    (hbetween :
3004      SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z ∧
3005        SignedOrbit.le z (SignedOrbit.ofOrbit n))
3006    (hnm : DistinctionNat.leq n m = true) :
3007    SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit m)) z ∧
3008      SignedOrbit.le z (SignedOrbit.ofOrbit m) := by
3009  apply SignedOrbit.between_of_abs_le
3010  exact SignedOrbit.abs_le_trans (SignedOrbit.abs_le_of_between hbetween.1 hbetween.2) hnm
3011
3012end SignedOrbit
3013
3014namespace RatioOrbit
3015
3016theorem recipNonzero_den_eq_abs (a : RatioOrbit)
3017    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3018    (RatioOrbit.recipNonzero a h).den = a.num.abs := by
3019  rfl
3020
3021theorem recipNonzero_num_eq_of_nonnegFlag {a : RatioOrbit}
3022    {h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero}
3023    (hflag : a.num.nonnegFlag = true) :
3024    (RatioOrbit.recipNonzero a h).num = SignedOrbit.ofOrbit a.den := by
3025  simp [RatioOrbit.recipNonzero, hflag]
3026
3027theorem recipNonzero_num_eq_of_negativeFlag {a : RatioOrbit}
3028    {h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero}
3029    (hflag : a.num.negativeFlag = true) :
3030    (RatioOrbit.recipNonzero a h).num =
3031      SignedOrbit.negate (SignedOrbit.ofOrbit a.den) := by
3032  have hnonnegFalse : a.num.nonnegFlag = false := by
3033    unfold SignedOrbit.negativeFlag at hflag
3034    cases hbranch : a.num.nonnegFlag with
3035    | false => rfl
3036    | true =>
3037        simp [hbranch] at hflag
3038  simp [RatioOrbit.recipNonzero, hnonnegFalse]
3039
3040theorem recipNonzero_num_abs_eq_den (a : RatioOrbit)
3041    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3042    (RatioOrbit.recipNonzero a h).num.abs = a.den := by
3043  by_cases hnonneg : a.num.nonnegFlag = true
3044  · rw [RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hnonneg,
3045      SignedOrbit.abs_ofOrbit]
3046  · have hneg : a.num.negativeFlag = true := by
3047      rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
3048      cases hflag : a.num.nonnegFlag with
3049      | false => rfl
3050      | true =>
3051          exfalso
3052          exact hnonneg hflag
3053    rw [RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hneg,
3054      SignedOrbit.abs_negate_ofOrbit]
3055
3056theorem recipNonzero_num_not_balanced_zero (a : RatioOrbit)
3057    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3058    ¬ SignedOrbit.balanced
3059      (RatioOrbit.recipNonzero a h).num SignedOrbit.zero := by
3060  intro hbal
3061  have habsZero :
3062      (RatioOrbit.recipNonzero a h).num.abs = DistinctionNat.zero :=
3063    (SignedOrbit.abs_eq_zero_iff_balanced_zero
3064      (RatioOrbit.recipNonzero a h).num).mpr hbal
3065  rw [RatioOrbit.recipNonzero_num_abs_eq_den a h] at habsZero
3066  exact a.den_ne_zero habsZero
3067
3068theorem recipNonzero_num_nonnegFlag_eq (a : RatioOrbit)
3069    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3070    (RatioOrbit.recipNonzero a h).num.nonnegFlag = a.num.nonnegFlag := by
3071  by_cases hnonneg : a.num.nonnegFlag = true
3072  · rw [RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hnonneg,
3073      SignedOrbit.nonnegFlag_ofOrbit, hnonneg]
3074  · have hnonnegFalse : a.num.nonnegFlag = false := by
3075      cases hflag : a.num.nonnegFlag with
3076      | false => rfl
3077      | true =>
3078          exfalso
3079          exact hnonneg hflag
3080    have hneg : a.num.negativeFlag = true := by
3081      rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
3082      exact hnonnegFalse
3083    rw [RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hneg,
3084      SignedOrbit.nonnegFlag_negate_ofOrbit_of_ne_zero a.den a.den_ne_zero,
3085      hnonnegFalse]
3086
3087theorem recipNonzero_num_negativeFlag_eq (a : RatioOrbit)
3088    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3089    (RatioOrbit.recipNonzero a h).num.negativeFlag = a.num.negativeFlag := by
3090  by_cases hneg : a.num.negativeFlag = true
3091  · rw [RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hneg,
3092      SignedOrbit.negativeFlag_negate_ofOrbit_of_ne_zero a.den a.den_ne_zero,
3093      hneg]
3094  · have hnegFalse : a.num.negativeFlag = false := by
3095      cases hflag : a.num.negativeFlag with
3096      | false => rfl
3097      | true =>
3098          exfalso
3099          exact hneg hflag
3100    have hnonneg : a.num.nonnegFlag = true :=
3101      (SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true a.num).mp hnegFalse
3102    rw [RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hnonneg,
3103      SignedOrbit.negativeFlag_ofOrbit, hnegFalse]
3104
3105theorem recipNonzero_num_zero_le_iff (a : RatioOrbit)
3106    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3107    SignedOrbit.le SignedOrbit.zero (RatioOrbit.recipNonzero a h).num ↔
3108      SignedOrbit.le SignedOrbit.zero a.num := by
3109  rw [SignedOrbit.zero_le_iff_nonnegFlag, SignedOrbit.zero_le_iff_nonnegFlag,
3110    RatioOrbit.recipNonzero_num_nonnegFlag_eq]
3111
3112theorem recipNonzero_num_lt_zero_iff (a : RatioOrbit)
3113    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3114    SignedOrbit.lt (RatioOrbit.recipNonzero a h).num SignedOrbit.zero ↔
3115      SignedOrbit.lt a.num SignedOrbit.zero := by
3116  rw [SignedOrbit.lt_zero_iff_negativeFlag, SignedOrbit.lt_zero_iff_negativeFlag,
3117    RatioOrbit.recipNonzero_num_negativeFlag_eq]
3118
3119theorem recipNonzero_num_zero_lt_iff (a : RatioOrbit)
3120    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3121    SignedOrbit.lt SignedOrbit.zero (RatioOrbit.recipNonzero a h).num ↔
3122      SignedOrbit.lt SignedOrbit.zero a.num := by
3123  rw [SignedOrbit.zero_lt_iff_nonnegFlag_and_not_balanced_zero,
3124    SignedOrbit.zero_lt_iff_nonnegFlag_and_not_balanced_zero,
3125    RatioOrbit.recipNonzero_num_nonnegFlag_eq]
3126  constructor
3127  · intro hrecip
3128    exact ⟨hrecip.1, h⟩
3129  · intro ha
3130    exact ⟨ha.1, RatioOrbit.recipNonzero_num_not_balanced_zero a h⟩
3131
3132theorem recipNonzero_num_cmp_zero (a : RatioOrbit)
3133    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3134    SignedOrbit.cmp (RatioOrbit.recipNonzero a h).num SignedOrbit.zero =
3135      SignedOrbit.cmp a.num SignedOrbit.zero := by
3136  cases hcmp : SignedOrbit.cmp a.num SignedOrbit.zero with
3137  | lt =>
3138      have ha : SignedOrbit.lt a.num SignedOrbit.zero :=
3139        (SignedOrbit.cmp_eq_lt_iff a.num SignedOrbit.zero).mp hcmp
3140      exact SignedOrbit.cmp_eq_lt_of_lt
3141        ((RatioOrbit.recipNonzero_num_lt_zero_iff a h).mpr ha)
3142  | eq =>
3143      have hbal : SignedOrbit.balanced a.num SignedOrbit.zero :=
3144        (SignedOrbit.cmp_eq_eq_iff a.num SignedOrbit.zero).mp hcmp
3145      exact False.elim (h hbal)
3146  | gt =>
3147      have ha : SignedOrbit.lt SignedOrbit.zero a.num :=
3148        (SignedOrbit.cmp_eq_gt_iff a.num SignedOrbit.zero).mp hcmp
3149      exact SignedOrbit.cmp_eq_gt_of_gt
3150        ((RatioOrbit.recipNonzero_num_zero_lt_iff a h).mpr ha)
3151
3152theorem recipNonzero_num_zero_cmp (a : RatioOrbit)
3153    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3154    SignedOrbit.cmp SignedOrbit.zero (RatioOrbit.recipNonzero a h).num =
3155      SignedOrbit.cmp SignedOrbit.zero a.num := by
3156  cases hcmp : SignedOrbit.cmp SignedOrbit.zero a.num with
3157  | lt =>
3158      have ha : SignedOrbit.lt SignedOrbit.zero a.num :=
3159        (SignedOrbit.cmp_eq_lt_iff SignedOrbit.zero a.num).mp hcmp
3160      exact SignedOrbit.cmp_eq_lt_of_lt
3161        ((RatioOrbit.recipNonzero_num_zero_lt_iff a h).mpr ha)
3162  | eq =>
3163      have hbal : SignedOrbit.balanced SignedOrbit.zero a.num :=
3164        (SignedOrbit.cmp_eq_eq_iff SignedOrbit.zero a.num).mp hcmp
3165      exact False.elim (h (SignedOrbit.balanced_symm hbal))
3166  | gt =>
3167      have ha : SignedOrbit.lt a.num SignedOrbit.zero :=
3168        (SignedOrbit.cmp_eq_gt_iff SignedOrbit.zero a.num).mp hcmp
3169      exact SignedOrbit.cmp_eq_gt_of_gt
3170        ((RatioOrbit.recipNonzero_num_lt_zero_iff a h).mpr ha)
3171
3172theorem recipNonzero_num_balanced_ofOrbit_den_iff_nonnegFlag
3173    (a : RatioOrbit)
3174    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3175    SignedOrbit.balanced
3176        (RatioOrbit.recipNonzero a h).num (SignedOrbit.ofOrbit a.den) ↔
3177      a.num.nonnegFlag = true := by
3178  by_cases hnonneg : a.num.nonnegFlag = true
3179  · rw [RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hnonneg]
3180    constructor
3181    · intro _
3182      exact hnonneg
3183    · intro _
3184      exact SignedOrbit.balanced_refl (SignedOrbit.ofOrbit a.den)
3185  · have hnonnegFalse : a.num.nonnegFlag = false := by
3186      cases hflag : a.num.nonnegFlag with
3187      | false => rfl
3188      | true =>
3189          exfalso
3190          exact hnonneg hflag
3191    have hneg : a.num.negativeFlag = true := by
3192      rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
3193      exact hnonnegFalse
3194    rw [RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hneg]
3195    constructor
3196    · intro hbal
3197      exfalso
3198      have hEq :=
3199        (SignedOrbit.balanced_iff_toInt_eq
3200          (SignedOrbit.negate (SignedOrbit.ofOrbit a.den))
3201          (SignedOrbit.ofOrbit a.den)).mp hbal
3202      rw [SignedOrbit.negate_toInt, SignedOrbit.ofOrbit_toInt] at hEq
3203      exact a.den_toNat_ne_zero (by omega)
3204    · intro htrue
3205      rw [hnonnegFalse] at htrue
3206      contradiction
3207
3208theorem recipNonzero_num_balanced_negate_ofOrbit_den_iff_negativeFlag
3209    (a : RatioOrbit)
3210    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3211    SignedOrbit.balanced
3212        (RatioOrbit.recipNonzero a h).num
3213        (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
3214      a.num.negativeFlag = true := by
3215  by_cases hneg : a.num.negativeFlag = true
3216  · rw [RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hneg]
3217    constructor
3218    · intro _
3219      exact hneg
3220    · intro _
3221      exact SignedOrbit.balanced_refl
3222        (SignedOrbit.negate (SignedOrbit.ofOrbit a.den))
3223  · have hnegFalse : a.num.negativeFlag = false := by
3224      cases hflag : a.num.negativeFlag with
3225      | false => rfl
3226      | true =>
3227          exfalso
3228          exact hneg hflag
3229    have hnonneg : a.num.nonnegFlag = true :=
3230      (SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true a.num).mp
3231        hnegFalse
3232    rw [RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hnonneg]
3233    constructor
3234    · intro hbal
3235      exfalso
3236      have hEq :=
3237        (SignedOrbit.balanced_iff_toInt_eq
3238          (SignedOrbit.ofOrbit a.den)
3239          (SignedOrbit.negate (SignedOrbit.ofOrbit a.den))).mp hbal
3240      rw [SignedOrbit.negate_toInt, SignedOrbit.ofOrbit_toInt] at hEq
3241      exact a.den_toNat_ne_zero (by omega)
3242    · intro htrue
3243      rw [hnegFalse] at htrue
3244      contradiction
3245
3246theorem recipNonzero_num_not_balanced_ofOrbit_den_iff_negativeFlag
3247    (a : RatioOrbit)
3248    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3249    ¬ SignedOrbit.balanced
3250        (RatioOrbit.recipNonzero a h).num (SignedOrbit.ofOrbit a.den) ↔
3251      a.num.negativeFlag = true := by
3252  rw [RatioOrbit.recipNonzero_num_balanced_ofOrbit_den_iff_nonnegFlag a h]
3253  constructor
3254  · intro hnot
3255    rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
3256    cases hflag : a.num.nonnegFlag with
3257    | false => rfl
3258    | true =>
3259        exfalso
3260        exact hnot hflag
3261  · intro hneg hnonneg
3262    have hfalse :
3263        a.num.nonnegFlag = false :=
3264      (SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false a.num).mp hneg
3265    rw [hnonneg] at hfalse
3266    contradiction
3267
3268theorem recipNonzero_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag
3269    (a : RatioOrbit)
3270    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3271    ¬ SignedOrbit.balanced
3272        (RatioOrbit.recipNonzero a h).num
3273        (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
3274      a.num.nonnegFlag = true := by
3275  rw [RatioOrbit.recipNonzero_num_balanced_negate_ofOrbit_den_iff_negativeFlag
3276    a h]
3277  constructor
3278  · intro hnot
3279    rw [← SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true]
3280    cases hflag : a.num.negativeFlag with
3281    | false => rfl
3282    | true =>
3283        exfalso
3284        exact hnot hflag
3285  · intro hnonneg hneg
3286    have hfalse :
3287        a.num.negativeFlag = false :=
3288      (SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true a.num).mpr
3289        hnonneg
3290    rw [hneg] at hfalse
3291    contradiction
3292
3293theorem num_mul_recipNonzero_num_balanced_ofOrbit_den_mul_abs
3294    (a : RatioOrbit)
3295    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3296    SignedOrbit.balanced
3297      (SignedOrbit.mul a.num (RatioOrbit.recipNonzero a h).num)
3298      (SignedOrbit.ofOrbit (a.den * a.num.abs)) := by
3299  by_cases hnonneg : a.num.nonnegFlag = true
3300  · have habs := SignedOrbit.abs_toInt_of_nonnegFlag (z := a.num) hnonneg
3301    rw [RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hnonneg]
3302    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
3303      SignedOrbit.ofOrbit_toInt, SignedOrbit.ofOrbit_toInt,
3304      DistinctionNat.toNat_mul]
3305    rw [Nat.cast_mul, habs]
3306    ring
3307  · have hnonnegFalse : a.num.nonnegFlag = false := by
3308      cases hflag : a.num.nonnegFlag with
3309      | false => rfl
3310      | true =>
3311          exfalso
3312          exact hnonneg hflag
3313    have hneg : a.num.negativeFlag = true := by
3314      rw [SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false]
3315      exact hnonnegFalse
3316    have habs := SignedOrbit.abs_toInt_of_negativeFlag (z := a.num) hneg
3317    rw [RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hneg]
3318    rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
3319      SignedOrbit.negate_toInt, SignedOrbit.ofOrbit_toInt,
3320      SignedOrbit.ofOrbit_toInt, DistinctionNat.toNat_mul]
3321    rw [Nat.cast_mul, habs]
3322    ring
3323
3324theorem mul_recipNonzero_crossEq_one
3325    (a : RatioOrbit)
3326    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3327    RatioOrbit.crossEq (RatioOrbit.mul a (RatioOrbit.recipNonzero a h))
3328      RatioOrbit.one := by
3329  have hprod :=
3330    (SignedOrbit.balanced_iff_toInt_eq
3331      (SignedOrbit.mul a.num (RatioOrbit.recipNonzero a h).num)
3332      (SignedOrbit.ofOrbit (a.den * a.num.abs))).mp
3333      (RatioOrbit.num_mul_recipNonzero_num_balanced_ofOrbit_den_mul_abs a h)
3334  unfold RatioOrbit.crossEq RatioOrbit.mul RatioOrbit.one
3335  rw [SignedOrbit.balanced_iff_toInt_eq]
3336  rw [SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt,
3337    DistinctionNat.toNat_mul] at hprod
3338  rw [SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt,
3339    SignedOrbit.mul_toInt, SignedOrbit.one_toInt, DistinctionNat.toNat_mul]
3340  simp [RatioOrbit.recipNonzero_den_eq_abs a h, hprod]
3341
3342theorem recipNonzero_num_mul_num_balanced_ofOrbit_den_mul_abs
3343    (a : RatioOrbit)
3344    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3345    SignedOrbit.balanced
3346      (SignedOrbit.mul (RatioOrbit.recipNonzero a h).num a.num)
3347      (SignedOrbit.ofOrbit (a.den * a.num.abs)) := by
3348  have hprod :=
3349    (SignedOrbit.balanced_iff_toInt_eq
3350      (SignedOrbit.mul a.num (RatioOrbit.recipNonzero a h).num)
3351      (SignedOrbit.ofOrbit (a.den * a.num.abs))).mp
3352      (RatioOrbit.num_mul_recipNonzero_num_balanced_ofOrbit_den_mul_abs a h)
3353  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.mul_toInt,
3354    SignedOrbit.ofOrbit_toInt, DistinctionNat.toNat_mul]
3355  rw [SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt,
3356    DistinctionNat.toNat_mul] at hprod
3357  rw [← hprod]
3358  ring
3359
3360theorem recipNonzero_mul_crossEq_one
3361    (a : RatioOrbit)
3362    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3363    RatioOrbit.crossEq (RatioOrbit.mul (RatioOrbit.recipNonzero a h) a)
3364      RatioOrbit.one := by
3365  have hprod :=
3366    (SignedOrbit.balanced_iff_toInt_eq
3367      (SignedOrbit.mul (RatioOrbit.recipNonzero a h).num a.num)
3368      (SignedOrbit.ofOrbit (a.den * a.num.abs))).mp
3369      (RatioOrbit.recipNonzero_num_mul_num_balanced_ofOrbit_den_mul_abs a h)
3370  unfold RatioOrbit.crossEq RatioOrbit.mul RatioOrbit.one
3371  rw [SignedOrbit.balanced_iff_toInt_eq]
3372  rw [SignedOrbit.mul_toInt, SignedOrbit.ofOrbit_toInt,
3373    DistinctionNat.toNat_mul] at hprod
3374  rw [SignedOrbit.scaleByNat_toInt, SignedOrbit.scaleByNat_toInt,
3375    SignedOrbit.mul_toInt, SignedOrbit.one_toInt, DistinctionNat.toNat_mul]
3376  simp [RatioOrbit.recipNonzero_den_eq_abs a h, hprod]
3377  ring
3378
3379theorem recip_eq_recipNonzero_of_not_balanced_zero
3380    (a : RatioOrbit)
3381    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3382    RatioOrbit.recip a = RatioOrbit.recipNonzero a h := by
3383  unfold RatioOrbit.recip
3384  simp [h]
3385
3386theorem mul_recip_crossEq_one_of_not_balanced_zero
3387    (a : RatioOrbit)
3388    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3389    RatioOrbit.crossEq (RatioOrbit.mul a (RatioOrbit.recip a))
3390      RatioOrbit.one := by
3391  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3392  exact RatioOrbit.mul_recipNonzero_crossEq_one a h
3393
3394theorem recip_mul_crossEq_one_of_not_balanced_zero
3395    (a : RatioOrbit)
3396    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3397    RatioOrbit.crossEq (RatioOrbit.mul (RatioOrbit.recip a) a)
3398      RatioOrbit.one := by
3399  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3400  exact RatioOrbit.recipNonzero_mul_crossEq_one a h
3401
3402theorem recip_den_eq_abs_of_not_balanced_zero
3403    (a : RatioOrbit)
3404    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3405    (RatioOrbit.recip a).den = a.num.abs := by
3406  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3407  exact RatioOrbit.recipNonzero_den_eq_abs a h
3408
3409theorem recip_num_abs_eq_den_of_not_balanced_zero
3410    (a : RatioOrbit)
3411    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3412    (RatioOrbit.recip a).num.abs = a.den := by
3413  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3414  exact RatioOrbit.recipNonzero_num_abs_eq_den a h
3415
3416theorem recip_num_not_balanced_zero_of_not_balanced_zero
3417    (a : RatioOrbit)
3418    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3419    ¬ SignedOrbit.balanced (RatioOrbit.recip a).num SignedOrbit.zero := by
3420  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3421  exact RatioOrbit.recipNonzero_num_not_balanced_zero a h
3422
3423theorem recip_num_nonnegFlag_eq_of_not_balanced_zero
3424    (a : RatioOrbit)
3425    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3426    (RatioOrbit.recip a).num.nonnegFlag = a.num.nonnegFlag := by
3427  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3428  exact RatioOrbit.recipNonzero_num_nonnegFlag_eq a h
3429
3430theorem recip_num_negativeFlag_eq_of_not_balanced_zero
3431    (a : RatioOrbit)
3432    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3433    (RatioOrbit.recip a).num.negativeFlag = a.num.negativeFlag := by
3434  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3435  exact RatioOrbit.recipNonzero_num_negativeFlag_eq a h
3436
3437theorem recip_num_zero_le_iff_of_not_balanced_zero
3438    (a : RatioOrbit)
3439    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3440    SignedOrbit.le SignedOrbit.zero (RatioOrbit.recip a).num ↔
3441      SignedOrbit.le SignedOrbit.zero a.num := by
3442  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3443  exact RatioOrbit.recipNonzero_num_zero_le_iff a h
3444
3445theorem recip_num_lt_zero_iff_of_not_balanced_zero
3446    (a : RatioOrbit)
3447    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3448    SignedOrbit.lt (RatioOrbit.recip a).num SignedOrbit.zero ↔
3449      SignedOrbit.lt a.num SignedOrbit.zero := by
3450  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3451  exact RatioOrbit.recipNonzero_num_lt_zero_iff a h
3452
3453theorem recip_num_zero_lt_iff_of_not_balanced_zero
3454    (a : RatioOrbit)
3455    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3456    SignedOrbit.lt SignedOrbit.zero (RatioOrbit.recip a).num ↔
3457      SignedOrbit.lt SignedOrbit.zero a.num := by
3458  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3459  exact RatioOrbit.recipNonzero_num_zero_lt_iff a h
3460
3461theorem recip_num_cmp_zero_of_not_balanced_zero
3462    (a : RatioOrbit)
3463    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3464    SignedOrbit.cmp (RatioOrbit.recip a).num SignedOrbit.zero =
3465      SignedOrbit.cmp a.num SignedOrbit.zero := by
3466  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3467  exact RatioOrbit.recipNonzero_num_cmp_zero a h
3468
3469theorem recip_num_zero_cmp_of_not_balanced_zero
3470    (a : RatioOrbit)
3471    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3472    SignedOrbit.cmp SignedOrbit.zero (RatioOrbit.recip a).num =
3473      SignedOrbit.cmp SignedOrbit.zero a.num := by
3474  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3475  exact RatioOrbit.recipNonzero_num_zero_cmp a h
3476
3477theorem recip_num_balanced_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero
3478    (a : RatioOrbit)
3479    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3480    SignedOrbit.balanced
3481        (RatioOrbit.recip a).num (SignedOrbit.ofOrbit a.den) ↔
3482      a.num.nonnegFlag = true := by
3483  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3484  exact RatioOrbit.recipNonzero_num_balanced_ofOrbit_den_iff_nonnegFlag a h
3485
3486theorem recip_num_balanced_negate_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero
3487    (a : RatioOrbit)
3488    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3489    SignedOrbit.balanced
3490        (RatioOrbit.recip a).num
3491        (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
3492      a.num.negativeFlag = true := by
3493  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3494  exact
3495    RatioOrbit.recipNonzero_num_balanced_negate_ofOrbit_den_iff_negativeFlag
3496      a h
3497
3498theorem recip_num_not_balanced_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero
3499    (a : RatioOrbit)
3500    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3501    ¬ SignedOrbit.balanced
3502        (RatioOrbit.recip a).num (SignedOrbit.ofOrbit a.den) ↔
3503      a.num.negativeFlag = true := by
3504  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3505  exact
3506    RatioOrbit.recipNonzero_num_not_balanced_ofOrbit_den_iff_negativeFlag
3507      a h
3508
3509theorem recip_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero
3510    (a : RatioOrbit)
3511    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3512    ¬ SignedOrbit.balanced
3513        (RatioOrbit.recip a).num
3514        (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
3515      a.num.nonnegFlag = true := by
3516  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3517  exact
3518    RatioOrbit.recipNonzero_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag
3519      a h
3520
3521theorem recip_num_eq_of_nonnegFlag_of_not_balanced_zero
3522    {a : RatioOrbit}
3523    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero)
3524    (hflag : a.num.nonnegFlag = true) :
3525    (RatioOrbit.recip a).num = SignedOrbit.ofOrbit a.den := by
3526  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3527  exact RatioOrbit.recipNonzero_num_eq_of_nonnegFlag (a := a) (h := h) hflag
3528
3529theorem recip_num_eq_of_negativeFlag_of_not_balanced_zero
3530    {a : RatioOrbit}
3531    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero)
3532    (hflag : a.num.negativeFlag = true) :
3533    (RatioOrbit.recip a).num =
3534      SignedOrbit.negate (SignedOrbit.ofOrbit a.den) := by
3535  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3536  exact RatioOrbit.recipNonzero_num_eq_of_negativeFlag (a := a) (h := h) hflag
3537
3538theorem num_mul_recip_num_balanced_ofOrbit_den_mul_abs_of_not_balanced_zero
3539    (a : RatioOrbit)
3540    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3541    SignedOrbit.balanced
3542      (SignedOrbit.mul a.num (RatioOrbit.recip a).num)
3543      (SignedOrbit.ofOrbit (a.den * a.num.abs)) := by
3544  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3545  exact RatioOrbit.num_mul_recipNonzero_num_balanced_ofOrbit_den_mul_abs a h
3546
3547theorem recip_num_mul_num_balanced_ofOrbit_den_mul_abs_of_not_balanced_zero
3548    (a : RatioOrbit)
3549    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3550    SignedOrbit.balanced
3551      (SignedOrbit.mul (RatioOrbit.recip a).num a.num)
3552      (SignedOrbit.ofOrbit (a.den * a.num.abs)) := by
3553  rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a h]
3554  exact RatioOrbit.recipNonzero_num_mul_num_balanced_ofOrbit_den_mul_abs a h
3555
3556theorem recip_num_balanced_zero_iff (a : RatioOrbit) :
3557    SignedOrbit.balanced (RatioOrbit.recip a).num SignedOrbit.zero ↔
3558      SignedOrbit.balanced a.num SignedOrbit.zero := by
3559  by_cases hzero : SignedOrbit.balanced a.num SignedOrbit.zero
3560  · unfold RatioOrbit.recip
3561    simp [hzero, RatioOrbit.zero, SignedOrbit.balanced_refl]
3562  · rw [RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero a hzero]
3563    constructor
3564    · intro hrec
3565      exfalso
3566      exact RatioOrbit.recipNonzero_num_not_balanced_zero a hzero hrec
3567    · intro ha
3568      exfalso
3569      exact hzero ha
3570
3571theorem recip_num_not_balanced_zero_iff (a : RatioOrbit) :
3572    ¬ SignedOrbit.balanced (RatioOrbit.recip a).num SignedOrbit.zero ↔
3573      ¬ SignedOrbit.balanced a.num SignedOrbit.zero := by
3574  rw [RatioOrbit.recip_num_balanced_zero_iff a]
3575
3576theorem crossEq_zero_iff_num_balanced_zero (a : RatioOrbit) :
3577    RatioOrbit.crossEq a RatioOrbit.zero ↔
3578      SignedOrbit.balanced a.num SignedOrbit.zero := by
3579  unfold RatioOrbit.crossEq RatioOrbit.zero
3580  rw [SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.scaleByNat_toInt,
3581    SignedOrbit.scaleByNat_toInt, SignedOrbit.zero_toInt,
3582    SignedOrbit.balanced_iff_toInt_eq, SignedOrbit.zero_toInt]
3583  simp
3584
3585theorem zero_crossEq_iff_num_balanced_zero (a : RatioOrbit) :
3586    RatioOrbit.crossEq RatioOrbit.zero a ↔
3587      SignedOrbit.balanced a.num SignedOrbit.zero := by
3588  constructor
3589  · intro h
3590    exact (RatioOrbit.crossEq_zero_iff_num_balanced_zero a).mp
3591      (RatioOrbit.crossEq_symm h)
3592  · intro h
3593    exact RatioOrbit.crossEq_symm
3594      ((RatioOrbit.crossEq_zero_iff_num_balanced_zero a).mpr h)
3595
3596theorem recip_crossEq_zero_iff_num_balanced_zero (a : RatioOrbit) :
3597    RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
3598      SignedOrbit.balanced a.num SignedOrbit.zero := by
3599  exact (RatioOrbit.crossEq_zero_iff_num_balanced_zero
3600      (RatioOrbit.recip a)).trans
3601    (RatioOrbit.recip_num_balanced_zero_iff a)
3602
3603theorem zero_crossEq_recip_iff_num_balanced_zero (a : RatioOrbit) :
3604    RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
3605      SignedOrbit.balanced a.num SignedOrbit.zero := by
3606  exact (RatioOrbit.zero_crossEq_iff_num_balanced_zero
3607      (RatioOrbit.recip a)).trans
3608    (RatioOrbit.recip_num_balanced_zero_iff a)
3609
3610theorem recip_crossEq_zero_iff_crossEq_zero (a : RatioOrbit) :
3611    RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
3612      RatioOrbit.crossEq a RatioOrbit.zero := by
3613  exact (RatioOrbit.recip_crossEq_zero_iff_num_balanced_zero a).trans
3614    (RatioOrbit.crossEq_zero_iff_num_balanced_zero a).symm
3615
3616theorem zero_crossEq_recip_iff_zero_crossEq (a : RatioOrbit) :
3617    RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
3618      RatioOrbit.crossEq RatioOrbit.zero a := by
3619  exact (RatioOrbit.zero_crossEq_recip_iff_num_balanced_zero a).trans
3620    (RatioOrbit.zero_crossEq_iff_num_balanced_zero a).symm
3621
3622theorem recip_crossEq_zero_iff_zero_crossEq (a : RatioOrbit) :
3623    RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
3624      RatioOrbit.crossEq RatioOrbit.zero a := by
3625  exact (RatioOrbit.recip_crossEq_zero_iff_num_balanced_zero a).trans
3626    (RatioOrbit.zero_crossEq_iff_num_balanced_zero a).symm
3627
3628theorem zero_crossEq_recip_iff_crossEq_zero (a : RatioOrbit) :
3629    RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
3630      RatioOrbit.crossEq a RatioOrbit.zero := by
3631  exact (RatioOrbit.zero_crossEq_recip_iff_num_balanced_zero a).trans
3632    (RatioOrbit.crossEq_zero_iff_num_balanced_zero a).symm
3633
3634theorem recip_not_crossEq_zero_iff_not_crossEq_zero (a : RatioOrbit) :
3635    ¬ RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
3636      ¬ RatioOrbit.crossEq a RatioOrbit.zero := by
3637  rw [RatioOrbit.recip_crossEq_zero_iff_crossEq_zero a]
3638
3639theorem zero_not_crossEq_recip_iff_zero_not_crossEq (a : RatioOrbit) :
3640    ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
3641      ¬ RatioOrbit.crossEq RatioOrbit.zero a := by
3642  rw [RatioOrbit.zero_crossEq_recip_iff_zero_crossEq a]
3643
3644theorem recip_not_crossEq_zero_iff_zero_not_crossEq (a : RatioOrbit) :
3645    ¬ RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
3646      ¬ RatioOrbit.crossEq RatioOrbit.zero a := by
3647  rw [RatioOrbit.recip_crossEq_zero_iff_zero_crossEq a]
3648
3649theorem zero_not_crossEq_recip_iff_not_crossEq_zero (a : RatioOrbit) :
3650    ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
3651      ¬ RatioOrbit.crossEq a RatioOrbit.zero := by
3652  rw [RatioOrbit.zero_crossEq_recip_iff_crossEq_zero a]
3653
3654theorem recip_recipNonzero_crossEq_self
3655    (a : RatioOrbit)
3656    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3657    RatioOrbit.crossEq (RatioOrbit.recip (RatioOrbit.recipNonzero a h)) a := by
3658  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.recip_toRat,
3659    RatioOrbit.recipNonzero_toRat]
3660  simp
3661
3662theorem self_crossEq_recip_recipNonzero
3663    (a : RatioOrbit)
3664    (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero) :
3665    RatioOrbit.crossEq a (RatioOrbit.recip (RatioOrbit.recipNonzero a h)) := by
3666  exact RatioOrbit.crossEq_symm
3667    (RatioOrbit.recip_recipNonzero_crossEq_self a h)
3668
3669theorem recip_recip_crossEq_self (a : RatioOrbit) :
3670    RatioOrbit.crossEq (RatioOrbit.recip (RatioOrbit.recip a)) a := by
3671  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.recip_toRat,
3672    RatioOrbit.recip_toRat]
3673  simp
3674
3675theorem self_crossEq_recip_recip (a : RatioOrbit) :
3676    RatioOrbit.crossEq a (RatioOrbit.recip (RatioOrbit.recip a)) := by
3677  exact RatioOrbit.crossEq_symm (RatioOrbit.recip_recip_crossEq_self a)
3678
3679theorem recip_crossEq_congr {a b : RatioOrbit}
3680    (h : RatioOrbit.crossEq a b) :
3681    RatioOrbit.crossEq (RatioOrbit.recip a) (RatioOrbit.recip b) := by
3682  rw [RatioOrbit.crossEq_iff_toRat_eq] at h ⊢
3683  rw [RatioOrbit.recip_toRat, RatioOrbit.recip_toRat, h]
3684
3685theorem recip_crossEq_iff (a b : RatioOrbit) :
3686    RatioOrbit.crossEq (RatioOrbit.recip a) (RatioOrbit.recip b) ↔
3687      RatioOrbit.crossEq a b := by
3688  constructor
3689  · intro h
3690    have hrec := RatioOrbit.recip_crossEq_congr h
3691    exact RatioOrbit.crossEq_trans
3692      (RatioOrbit.crossEq_symm (RatioOrbit.recip_recip_crossEq_self a))
3693      (RatioOrbit.crossEq_trans hrec (RatioOrbit.recip_recip_crossEq_self b))
3694  · intro h
3695    exact RatioOrbit.recip_crossEq_congr h
3696
3697theorem recip_crossEq_iff_crossEq_recip (a b : RatioOrbit) :
3698    RatioOrbit.crossEq (RatioOrbit.recip a) b ↔
3699      RatioOrbit.crossEq a (RatioOrbit.recip b) := by
3700  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.crossEq_iff_toRat_eq,
3701    RatioOrbit.recip_toRat, RatioOrbit.recip_toRat]
3702  constructor
3703  · intro h
3704    calc
3705      a.toRat = ((a.toRat)⁻¹)⁻¹ := by simp
3706      _ = (b.toRat)⁻¹ := by rw [h]
3707  · intro h
3708    calc
3709      (a.toRat)⁻¹ = ((b.toRat)⁻¹)⁻¹ := by rw [h]
3710      _ = b.toRat := by simp
3711
3712theorem crossEq_recip_iff_recip_crossEq (a b : RatioOrbit) :
3713    RatioOrbit.crossEq a (RatioOrbit.recip b) ↔
3714      RatioOrbit.crossEq (RatioOrbit.recip a) b := by
3715  exact (RatioOrbit.recip_crossEq_iff_crossEq_recip a b).symm
3716
3717theorem mul_crossEq_one_iff_crossEq_recip_of_right_not_crossEq_zero
3718    (a b : RatioOrbit)
3719    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
3720    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
3721      RatioOrbit.crossEq a (RatioOrbit.recip b) := by
3722  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3723    RatioOrbit.one_toRat, RatioOrbit.crossEq_iff_toRat_eq,
3724    RatioOrbit.recip_toRat]
3725  have hbq : b.toRat ≠ 0 := by
3726    intro hzero
3727    exact hb ((RatioOrbit.crossEq_iff_toRat_eq b RatioOrbit.zero).mpr (by
3728      rw [hzero, RatioOrbit.zero_toRat]))
3729  constructor
3730  · intro h
3731    have hunit : b.toRat * (b.toRat)⁻¹ = 1 := by
3732      field_simp [hbq]
3733    calc
3734      a.toRat = a.toRat * 1 := by ring
3735      _ = a.toRat * (b.toRat * (b.toRat)⁻¹) := by rw [hunit]
3736      _ = (a.toRat * b.toRat) * (b.toRat)⁻¹ := by ring
3737      _ = 1 * (b.toRat)⁻¹ := by rw [h]
3738      _ = (b.toRat)⁻¹ := by ring
3739  · intro h
3740    rw [h]
3741    field_simp [hbq]
3742
3743theorem mul_crossEq_one_iff_crossEq_recip_of_left_not_crossEq_zero
3744    (a b : RatioOrbit)
3745    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
3746    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
3747      RatioOrbit.crossEq b (RatioOrbit.recip a) := by
3748  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3749    RatioOrbit.one_toRat, RatioOrbit.crossEq_iff_toRat_eq,
3750    RatioOrbit.recip_toRat]
3751  have haq : a.toRat ≠ 0 := by
3752    intro hzero
3753    exact ha ((RatioOrbit.crossEq_iff_toRat_eq a RatioOrbit.zero).mpr (by
3754      rw [hzero, RatioOrbit.zero_toRat]))
3755  constructor
3756  · intro h
3757    have hunit : (a.toRat)⁻¹ * a.toRat = 1 := by
3758      field_simp [haq]
3759    calc
3760      b.toRat = 1 * b.toRat := by ring
3761      _ = ((a.toRat)⁻¹ * a.toRat) * b.toRat := by rw [hunit]
3762      _ = (a.toRat)⁻¹ * (a.toRat * b.toRat) := by ring
3763      _ = (a.toRat)⁻¹ * 1 := by rw [h]
3764      _ = (a.toRat)⁻¹ := by ring
3765  · intro h
3766    rw [h]
3767    field_simp [haq]
3768
3769theorem mul_recip_cancel_right_crossEq_self_of_right_not_crossEq_zero
3770    (a b : RatioOrbit)
3771    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
3772    RatioOrbit.crossEq
3773      (RatioOrbit.mul (RatioOrbit.mul a b) (RatioOrbit.recip b)) a := by
3774  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3775    RatioOrbit.mul_toRat, RatioOrbit.recip_toRat]
3776  have hbq : b.toRat ≠ 0 := by
3777    intro hzero
3778    exact hb ((RatioOrbit.crossEq_iff_toRat_eq b RatioOrbit.zero).mpr (by
3779      rw [hzero, RatioOrbit.zero_toRat]))
3780  have hunit : b.toRat * (b.toRat)⁻¹ = 1 := by
3781    field_simp [hbq]
3782  calc
3783    (a.toRat * b.toRat) * (b.toRat)⁻¹ =
3784        a.toRat * (b.toRat * (b.toRat)⁻¹) := by ring
3785    _ = a.toRat * 1 := by rw [hunit]
3786    _ = a.toRat := by ring
3787
3788theorem recip_mul_cancel_left_crossEq_self_of_left_not_crossEq_zero
3789    (a b : RatioOrbit)
3790    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
3791    RatioOrbit.crossEq
3792      (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.mul a b)) b := by
3793  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3794    RatioOrbit.mul_toRat, RatioOrbit.recip_toRat]
3795  have haq : a.toRat ≠ 0 := by
3796    intro hzero
3797    exact ha ((RatioOrbit.crossEq_iff_toRat_eq a RatioOrbit.zero).mpr (by
3798      rw [hzero, RatioOrbit.zero_toRat]))
3799  have hunit : (a.toRat)⁻¹ * a.toRat = 1 := by
3800    field_simp [haq]
3801  calc
3802    (a.toRat)⁻¹ * (a.toRat * b.toRat) =
3803        ((a.toRat)⁻¹ * a.toRat) * b.toRat := by ring
3804    _ = 1 * b.toRat := by rw [hunit]
3805    _ = b.toRat := by ring
3806
3807theorem mul_recip_cancel_right_assoc_crossEq_self_of_right_not_crossEq_zero
3808    (a b : RatioOrbit)
3809    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
3810    RatioOrbit.crossEq
3811      (RatioOrbit.mul (RatioOrbit.mul a (RatioOrbit.recip b)) b) a := by
3812  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3813    RatioOrbit.mul_toRat, RatioOrbit.recip_toRat]
3814  have hbq : b.toRat ≠ 0 := by
3815    intro hzero
3816    exact hb ((RatioOrbit.crossEq_iff_toRat_eq b RatioOrbit.zero).mpr (by
3817      rw [hzero, RatioOrbit.zero_toRat]))
3818  have hunit : (b.toRat)⁻¹ * b.toRat = 1 := by
3819    field_simp [hbq]
3820  calc
3821    (a.toRat * (b.toRat)⁻¹) * b.toRat =
3822        a.toRat * ((b.toRat)⁻¹ * b.toRat) := by ring
3823    _ = a.toRat * 1 := by rw [hunit]
3824    _ = a.toRat := by ring
3825
3826theorem recip_mul_cancel_left_assoc_crossEq_self_of_left_not_crossEq_zero
3827    (a b : RatioOrbit)
3828    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
3829    RatioOrbit.crossEq
3830      (RatioOrbit.mul a (RatioOrbit.mul (RatioOrbit.recip a) b)) b := by
3831  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3832    RatioOrbit.mul_toRat, RatioOrbit.recip_toRat]
3833  have haq : a.toRat ≠ 0 := by
3834    intro hzero
3835    exact ha ((RatioOrbit.crossEq_iff_toRat_eq a RatioOrbit.zero).mpr (by
3836      rw [hzero, RatioOrbit.zero_toRat]))
3837  have hunit : a.toRat * (a.toRat)⁻¹ = 1 := by
3838    field_simp [haq]
3839  calc
3840    a.toRat * ((a.toRat)⁻¹ * b.toRat) =
3841        (a.toRat * (a.toRat)⁻¹) * b.toRat := by ring
3842    _ = 1 * b.toRat := by rw [hunit]
3843    _ = b.toRat := by ring
3844
3845theorem mul_right_crossEq_iff_of_not_crossEq_zero
3846    (a b c : RatioOrbit)
3847    (hc : ¬ RatioOrbit.crossEq c RatioOrbit.zero) :
3848    RatioOrbit.crossEq (RatioOrbit.mul a c) (RatioOrbit.mul b c) ↔
3849      RatioOrbit.crossEq a b := by
3850  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3851    RatioOrbit.mul_toRat, RatioOrbit.crossEq_iff_toRat_eq]
3852  have hcq : c.toRat ≠ 0 := by
3853    intro hzero
3854    exact hc ((RatioOrbit.crossEq_iff_toRat_eq c RatioOrbit.zero).mpr (by
3855      rw [hzero, RatioOrbit.zero_toRat]))
3856  have hunit : c.toRat * (c.toRat)⁻¹ = 1 := by
3857    field_simp [hcq]
3858  constructor
3859  · intro h
3860    calc
3861      a.toRat = a.toRat * 1 := by ring
3862      _ = a.toRat * (c.toRat * (c.toRat)⁻¹) := by rw [hunit]
3863      _ = (a.toRat * c.toRat) * (c.toRat)⁻¹ := by ring
3864      _ = (b.toRat * c.toRat) * (c.toRat)⁻¹ := by rw [h]
3865      _ = b.toRat * (c.toRat * (c.toRat)⁻¹) := by ring
3866      _ = b.toRat * 1 := by rw [hunit]
3867      _ = b.toRat := by ring
3868  · intro h
3869    rw [h]
3870
3871theorem mul_left_crossEq_iff_of_not_crossEq_zero
3872    (a b c : RatioOrbit)
3873    (hc : ¬ RatioOrbit.crossEq c RatioOrbit.zero) :
3874    RatioOrbit.crossEq (RatioOrbit.mul c a) (RatioOrbit.mul c b) ↔
3875      RatioOrbit.crossEq a b := by
3876  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3877    RatioOrbit.mul_toRat, RatioOrbit.crossEq_iff_toRat_eq]
3878  have hcq : c.toRat ≠ 0 := by
3879    intro hzero
3880    exact hc ((RatioOrbit.crossEq_iff_toRat_eq c RatioOrbit.zero).mpr (by
3881      rw [hzero, RatioOrbit.zero_toRat]))
3882  have hunit : (c.toRat)⁻¹ * c.toRat = 1 := by
3883    field_simp [hcq]
3884  constructor
3885  · intro h
3886    calc
3887      a.toRat = 1 * a.toRat := by ring
3888      _ = ((c.toRat)⁻¹ * c.toRat) * a.toRat := by rw [hunit]
3889      _ = (c.toRat)⁻¹ * (c.toRat * a.toRat) := by ring
3890      _ = (c.toRat)⁻¹ * (c.toRat * b.toRat) := by rw [h]
3891      _ = ((c.toRat)⁻¹ * c.toRat) * b.toRat := by ring
3892      _ = 1 * b.toRat := by rw [hunit]
3893      _ = b.toRat := by ring
3894  · intro h
3895    rw [h]
3896
3897theorem mul_crossEq_zero_iff (a b : RatioOrbit) :
3898    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero ↔
3899      RatioOrbit.crossEq a RatioOrbit.zero ∨
3900        RatioOrbit.crossEq b RatioOrbit.zero := by
3901  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3902    RatioOrbit.zero_toRat, RatioOrbit.crossEq_iff_toRat_eq,
3903    RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.zero_toRat]
3904  exact mul_eq_zero
3905
3906theorem zero_crossEq_mul_iff (a b : RatioOrbit) :
3907    RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.mul a b) ↔
3908      RatioOrbit.crossEq a RatioOrbit.zero ∨
3909        RatioOrbit.crossEq b RatioOrbit.zero := by
3910  constructor
3911  · intro h
3912    exact (RatioOrbit.mul_crossEq_zero_iff a b).mp (RatioOrbit.crossEq_symm h)
3913  · intro h
3914    exact RatioOrbit.crossEq_symm ((RatioOrbit.mul_crossEq_zero_iff a b).mpr h)
3915
3916theorem mul_not_crossEq_zero_iff (a b : RatioOrbit) :
3917    ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero ↔
3918      ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
3919        ¬ RatioOrbit.crossEq b RatioOrbit.zero := by
3920  rw [RatioOrbit.mul_crossEq_zero_iff]
3921  constructor
3922  · intro h
3923    constructor
3924    · intro ha
3925      exact h (Or.inl ha)
3926    · intro hb
3927      exact h (Or.inr hb)
3928  · intro h hzero
3929    cases hzero with
3930    | inl ha => exact h.1 ha
3931    | inr hb => exact h.2 hb
3932
3933theorem zero_not_crossEq_mul_iff (a b : RatioOrbit) :
3934    ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.mul a b) ↔
3935      ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
3936        ¬ RatioOrbit.crossEq b RatioOrbit.zero := by
3937  rw [RatioOrbit.zero_crossEq_mul_iff]
3938  constructor
3939  · intro h
3940    constructor
3941    · intro ha
3942      exact h (Or.inl ha)
3943    · intro hb
3944      exact h (Or.inr hb)
3945  · intro h hzero
3946    cases hzero with
3947    | inl ha => exact h.1 ha
3948    | inr hb => exact h.2 hb
3949
3950theorem mul_not_crossEq_zero_of_not_crossEq_zero
3951    (a b : RatioOrbit)
3952    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
3953    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
3954    ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero :=
3955  (RatioOrbit.mul_not_crossEq_zero_iff a b).mpr ⟨ha, hb⟩
3956
3957theorem zero_not_crossEq_mul_of_not_crossEq_zero
3958    (a b : RatioOrbit)
3959    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
3960    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
3961    ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.mul a b) :=
3962  (RatioOrbit.zero_not_crossEq_mul_iff a b).mpr ⟨ha, hb⟩
3963
3964theorem left_not_crossEq_zero_of_mul_not_crossEq_zero
3965    (a b : RatioOrbit)
3966    (h : ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero) :
3967    ¬ RatioOrbit.crossEq a RatioOrbit.zero :=
3968  ((RatioOrbit.mul_not_crossEq_zero_iff a b).mp h).1
3969
3970theorem right_not_crossEq_zero_of_mul_not_crossEq_zero
3971    (a b : RatioOrbit)
3972    (h : ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero) :
3973    ¬ RatioOrbit.crossEq b RatioOrbit.zero :=
3974  ((RatioOrbit.mul_not_crossEq_zero_iff a b).mp h).2
3975
3976theorem mul_crossEq_congr {a₁ a₂ b₁ b₂ : RatioOrbit}
3977    (ha : RatioOrbit.crossEq a₁ a₂)
3978    (hb : RatioOrbit.crossEq b₁ b₂) :
3979    RatioOrbit.crossEq (RatioOrbit.mul a₁ b₁) (RatioOrbit.mul a₂ b₂) := by
3980  rw [RatioOrbit.crossEq_iff_toRat_eq] at ha hb ⊢
3981  rw [RatioOrbit.mul_toRat, RatioOrbit.mul_toRat, ha, hb]
3982
3983theorem mul_crossEq_congr_left {a₁ a₂ b : RatioOrbit}
3984    (ha : RatioOrbit.crossEq a₁ a₂) :
3985    RatioOrbit.crossEq (RatioOrbit.mul a₁ b) (RatioOrbit.mul a₂ b) := by
3986  exact RatioOrbit.mul_crossEq_congr ha (RatioOrbit.crossEq_refl b)
3987
3988theorem mul_crossEq_congr_right {a b₁ b₂ : RatioOrbit}
3989    (hb : RatioOrbit.crossEq b₁ b₂) :
3990    RatioOrbit.crossEq (RatioOrbit.mul a b₁) (RatioOrbit.mul a b₂) := by
3991  exact RatioOrbit.mul_crossEq_congr (RatioOrbit.crossEq_refl a) hb
3992
3993theorem mul_comm_crossEq (a b : RatioOrbit) :
3994    RatioOrbit.crossEq (RatioOrbit.mul a b) (RatioOrbit.mul b a) := by
3995  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
3996    RatioOrbit.mul_toRat]
3997  ring
3998
3999theorem mul_assoc_crossEq (a b c : RatioOrbit) :
4000    RatioOrbit.crossEq
4001      (RatioOrbit.mul (RatioOrbit.mul a b) c)
4002      (RatioOrbit.mul a (RatioOrbit.mul b c)) := by
4003  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4004    RatioOrbit.mul_toRat, RatioOrbit.mul_toRat, RatioOrbit.mul_toRat]
4005  ring
4006
4007theorem mul_one_crossEq (a : RatioOrbit) :
4008    RatioOrbit.crossEq (RatioOrbit.mul a RatioOrbit.one) a := by
4009  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4010    RatioOrbit.one_toRat]
4011  ring
4012
4013theorem one_mul_crossEq (a : RatioOrbit) :
4014    RatioOrbit.crossEq (RatioOrbit.mul RatioOrbit.one a) a := by
4015  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4016    RatioOrbit.one_toRat]
4017  ring
4018
4019theorem mul_zero_crossEq (a : RatioOrbit) :
4020    RatioOrbit.crossEq (RatioOrbit.mul a RatioOrbit.zero) RatioOrbit.zero := by
4021  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4022    RatioOrbit.zero_toRat]
4023  ring
4024
4025theorem zero_mul_crossEq (a : RatioOrbit) :
4026    RatioOrbit.crossEq (RatioOrbit.mul RatioOrbit.zero a) RatioOrbit.zero := by
4027  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4028    RatioOrbit.zero_toRat]
4029  ring
4030
4031theorem one_not_crossEq_zero :
4032    ¬ RatioOrbit.crossEq RatioOrbit.one RatioOrbit.zero := by
4033  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.one_toRat,
4034    RatioOrbit.zero_toRat]
4035  norm_num
4036
4037theorem zero_not_crossEq_one :
4038    ¬ RatioOrbit.crossEq RatioOrbit.zero RatioOrbit.one := by
4039  intro h
4040  exact RatioOrbit.one_not_crossEq_zero (RatioOrbit.crossEq_symm h)
4041
4042theorem recip_zero_crossEq_zero :
4043    RatioOrbit.crossEq (RatioOrbit.recip RatioOrbit.zero) RatioOrbit.zero := by
4044  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.recip_toRat,
4045    RatioOrbit.zero_toRat]
4046  norm_num
4047
4048theorem zero_crossEq_recip_zero :
4049    RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip RatioOrbit.zero) :=
4050  RatioOrbit.crossEq_symm RatioOrbit.recip_zero_crossEq_zero
4051
4052theorem recip_one_crossEq_one :
4053    RatioOrbit.crossEq (RatioOrbit.recip RatioOrbit.one) RatioOrbit.one := by
4054  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.recip_toRat,
4055    RatioOrbit.one_toRat]
4056  norm_num
4057
4058theorem one_crossEq_recip_one :
4059    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.recip RatioOrbit.one) :=
4060  RatioOrbit.crossEq_symm RatioOrbit.recip_one_crossEq_one
4061
4062theorem factors_not_crossEq_zero_of_mul_crossEq_one
4063    (a b : RatioOrbit)
4064    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4065    ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4066      ¬ RatioOrbit.crossEq b RatioOrbit.zero := by
4067  have hprod : ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero := by
4068    rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4069      RatioOrbit.zero_toRat]
4070    rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4071      RatioOrbit.one_toRat] at h
4072    intro hzero
4073    rw [h] at hzero
4074    norm_num at hzero
4075  exact (RatioOrbit.mul_not_crossEq_zero_iff a b).mp hprod
4076
4077theorem left_not_crossEq_zero_of_mul_crossEq_one
4078    (a b : RatioOrbit)
4079    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4080    ¬ RatioOrbit.crossEq a RatioOrbit.zero :=
4081  (RatioOrbit.factors_not_crossEq_zero_of_mul_crossEq_one a b h).1
4082
4083theorem right_not_crossEq_zero_of_mul_crossEq_one
4084    (a b : RatioOrbit)
4085    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4086    ¬ RatioOrbit.crossEq b RatioOrbit.zero :=
4087  (RatioOrbit.factors_not_crossEq_zero_of_mul_crossEq_one a b h).2
4088
4089theorem factors_not_crossEq_zero_of_one_crossEq_mul
4090    (a b : RatioOrbit)
4091    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4092    ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4093      ¬ RatioOrbit.crossEq b RatioOrbit.zero :=
4094  RatioOrbit.factors_not_crossEq_zero_of_mul_crossEq_one a b
4095    (RatioOrbit.crossEq_symm h)
4096
4097theorem left_not_crossEq_zero_of_one_crossEq_mul
4098    (a b : RatioOrbit)
4099    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4100    ¬ RatioOrbit.crossEq a RatioOrbit.zero :=
4101  (RatioOrbit.factors_not_crossEq_zero_of_one_crossEq_mul a b h).1
4102
4103theorem right_not_crossEq_zero_of_one_crossEq_mul
4104    (a b : RatioOrbit)
4105    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4106    ¬ RatioOrbit.crossEq b RatioOrbit.zero :=
4107  (RatioOrbit.factors_not_crossEq_zero_of_one_crossEq_mul a b h).2
4108
4109theorem crossEq_recip_right_of_mul_crossEq_one
4110    (a b : RatioOrbit)
4111    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4112    RatioOrbit.crossEq a (RatioOrbit.recip b) :=
4113  (RatioOrbit.mul_crossEq_one_iff_crossEq_recip_of_right_not_crossEq_zero
4114    a b (RatioOrbit.right_not_crossEq_zero_of_mul_crossEq_one a b h)).mp h
4115
4116theorem crossEq_recip_left_of_mul_crossEq_one
4117    (a b : RatioOrbit)
4118    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4119    RatioOrbit.crossEq b (RatioOrbit.recip a) :=
4120  (RatioOrbit.mul_crossEq_one_iff_crossEq_recip_of_left_not_crossEq_zero
4121    a b (RatioOrbit.left_not_crossEq_zero_of_mul_crossEq_one a b h)).mp h
4122
4123theorem crossEq_recip_right_of_one_crossEq_mul
4124    (a b : RatioOrbit)
4125    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4126    RatioOrbit.crossEq a (RatioOrbit.recip b) :=
4127  RatioOrbit.crossEq_recip_right_of_mul_crossEq_one a b
4128    (RatioOrbit.crossEq_symm h)
4129
4130theorem crossEq_recip_left_of_one_crossEq_mul
4131    (a b : RatioOrbit)
4132    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4133    RatioOrbit.crossEq b (RatioOrbit.recip a) :=
4134  RatioOrbit.crossEq_recip_left_of_mul_crossEq_one a b
4135    (RatioOrbit.crossEq_symm h)
4136
4137theorem recip_mul_crossEq_mul_recip_of_not_crossEq_zero
4138    (a b : RatioOrbit)
4139    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4140    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4141    RatioOrbit.crossEq
4142      (RatioOrbit.recip (RatioOrbit.mul a b))
4143      (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b)) := by
4144  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.recip_toRat,
4145    RatioOrbit.mul_toRat, RatioOrbit.mul_toRat, RatioOrbit.recip_toRat,
4146    RatioOrbit.recip_toRat]
4147  have haq : a.toRat ≠ 0 := by
4148    intro hzero
4149    exact ha ((RatioOrbit.crossEq_iff_toRat_eq a RatioOrbit.zero).mpr (by
4150      rw [RatioOrbit.zero_toRat]
4151      exact hzero))
4152  have hbq : b.toRat ≠ 0 := by
4153    intro hzero
4154    exact hb ((RatioOrbit.crossEq_iff_toRat_eq b RatioOrbit.zero).mpr (by
4155      rw [RatioOrbit.zero_toRat]
4156      exact hzero))
4157  have habq : a.toRat * b.toRat ≠ 0 := mul_ne_zero haq hbq
4158  field_simp [haq, hbq, habq]
4159
4160theorem mul_recip_crossEq_recip_mul_of_not_crossEq_zero
4161    (a b : RatioOrbit)
4162    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4163    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4164    RatioOrbit.crossEq
4165      (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
4166      (RatioOrbit.recip (RatioOrbit.mul a b)) :=
4167  RatioOrbit.crossEq_symm
4168    (RatioOrbit.recip_mul_crossEq_mul_recip_of_not_crossEq_zero a b ha hb)
4169
4170theorem recip_mul_crossEq_mul_recip_comm_of_not_crossEq_zero
4171    (a b : RatioOrbit)
4172    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4173    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4174    RatioOrbit.crossEq
4175      (RatioOrbit.recip (RatioOrbit.mul a b))
4176      (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a)) :=
4177  RatioOrbit.crossEq_trans
4178    (RatioOrbit.recip_mul_crossEq_mul_recip_of_not_crossEq_zero a b ha hb)
4179    (RatioOrbit.mul_comm_crossEq (RatioOrbit.recip a) (RatioOrbit.recip b))
4180
4181theorem mul_recip_comm_crossEq_recip_mul_of_not_crossEq_zero
4182    (a b : RatioOrbit)
4183    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4184    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4185    RatioOrbit.crossEq
4186      (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
4187      (RatioOrbit.recip (RatioOrbit.mul a b)) :=
4188  RatioOrbit.crossEq_symm
4189    (RatioOrbit.recip_mul_crossEq_mul_recip_comm_of_not_crossEq_zero
4190      a b ha hb)
4191
4192theorem mul_mul_recip_pair_crossEq_one_of_not_crossEq_zero
4193    (a b : RatioOrbit)
4194    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4195    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4196    RatioOrbit.crossEq
4197      (RatioOrbit.mul (RatioOrbit.mul a b)
4198        (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b)))
4199      RatioOrbit.one := by
4200  rw [RatioOrbit.crossEq_iff_toRat_eq, RatioOrbit.mul_toRat,
4201    RatioOrbit.mul_toRat, RatioOrbit.mul_toRat, RatioOrbit.recip_toRat,
4202    RatioOrbit.recip_toRat, RatioOrbit.one_toRat]
4203  have haq : a.toRat ≠ 0 := by
4204    intro hzero
4205    exact ha ((RatioOrbit.crossEq_iff_toRat_eq a RatioOrbit.zero).mpr (by
4206      rw [RatioOrbit.zero_toRat]
4207      exact hzero))
4208  have hbq : b.toRat ≠ 0 := by
4209    intro hzero
4210    exact hb ((RatioOrbit.crossEq_iff_toRat_eq b RatioOrbit.zero).mpr (by
4211      rw [RatioOrbit.zero_toRat]
4212      exact hzero))
4213  field_simp [haq, hbq]
4214
4215theorem recip_pair_mul_mul_crossEq_one_of_not_crossEq_zero
4216    (a b : RatioOrbit)
4217    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4218    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4219    RatioOrbit.crossEq
4220      (RatioOrbit.mul
4221        (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
4222        (RatioOrbit.mul a b))
4223      RatioOrbit.one := by
4224  exact RatioOrbit.crossEq_trans
4225    (RatioOrbit.mul_comm_crossEq
4226      (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
4227      (RatioOrbit.mul a b))
4228    (RatioOrbit.mul_mul_recip_pair_crossEq_one_of_not_crossEq_zero a b ha hb)
4229
4230theorem mul_mul_recip_pair_comm_crossEq_one_of_not_crossEq_zero
4231    (a b : RatioOrbit)
4232    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4233    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4234    RatioOrbit.crossEq
4235      (RatioOrbit.mul (RatioOrbit.mul a b)
4236        (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a)))
4237      RatioOrbit.one := by
4238  exact RatioOrbit.crossEq_trans
4239    (RatioOrbit.mul_crossEq_congr_right
4240      (RatioOrbit.mul_comm_crossEq (RatioOrbit.recip b) (RatioOrbit.recip a)))
4241    (RatioOrbit.mul_mul_recip_pair_crossEq_one_of_not_crossEq_zero a b ha hb)
4242
4243theorem recip_pair_comm_mul_mul_crossEq_one_of_not_crossEq_zero
4244    (a b : RatioOrbit)
4245    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4246    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4247    RatioOrbit.crossEq
4248      (RatioOrbit.mul
4249        (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
4250        (RatioOrbit.mul a b))
4251      RatioOrbit.one := by
4252  exact RatioOrbit.crossEq_trans
4253    (RatioOrbit.mul_comm_crossEq
4254      (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
4255      (RatioOrbit.mul a b))
4256    (RatioOrbit.mul_mul_recip_pair_comm_crossEq_one_of_not_crossEq_zero
4257      a b ha hb)
4258
4259theorem mul_recip_pair_not_crossEq_zero_of_not_crossEq_zero
4260    (a b : RatioOrbit)
4261    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4262    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4263    ¬ RatioOrbit.crossEq
4264      (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
4265      RatioOrbit.zero := by
4266  exact RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero
4267    (RatioOrbit.recip a) (RatioOrbit.recip b)
4268    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero a).mpr ha)
4269    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero b).mpr hb)
4270
4271theorem zero_not_crossEq_mul_recip_pair_of_not_crossEq_zero
4272    (a b : RatioOrbit)
4273    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4274    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4275    ¬ RatioOrbit.crossEq RatioOrbit.zero
4276      (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b)) := by
4277  exact RatioOrbit.zero_not_crossEq_mul_of_not_crossEq_zero
4278    (RatioOrbit.recip a) (RatioOrbit.recip b)
4279    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero a).mpr ha)
4280    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero b).mpr hb)
4281
4282theorem mul_recip_pair_comm_not_crossEq_zero_of_not_crossEq_zero
4283    (a b : RatioOrbit)
4284    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4285    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4286    ¬ RatioOrbit.crossEq
4287      (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
4288      RatioOrbit.zero := by
4289  exact RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero
4290    (RatioOrbit.recip b) (RatioOrbit.recip a)
4291    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero b).mpr hb)
4292    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero a).mpr ha)
4293
4294theorem zero_not_crossEq_mul_recip_pair_comm_of_not_crossEq_zero
4295    (a b : RatioOrbit)
4296    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4297    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4298    ¬ RatioOrbit.crossEq RatioOrbit.zero
4299      (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a)) := by
4300  exact RatioOrbit.zero_not_crossEq_mul_of_not_crossEq_zero
4301    (RatioOrbit.recip b) (RatioOrbit.recip a)
4302    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero b).mpr hb)
4303    ((RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero a).mpr ha)
4304
4305theorem mul_recip_crossEq_one_of_not_crossEq_zero
4306    (a : RatioOrbit)
4307    (h : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
4308    RatioOrbit.crossEq (RatioOrbit.mul a (RatioOrbit.recip a))
4309      RatioOrbit.one := by
4310  have hnum : ¬ SignedOrbit.balanced a.num SignedOrbit.zero := by
4311    intro hbal
4312    exact h ((RatioOrbit.crossEq_zero_iff_num_balanced_zero a).mpr hbal)
4313  exact RatioOrbit.mul_recip_crossEq_one_of_not_balanced_zero a hnum
4314
4315theorem recip_mul_crossEq_one_of_not_crossEq_zero
4316    (a : RatioOrbit)
4317    (h : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
4318    RatioOrbit.crossEq (RatioOrbit.mul (RatioOrbit.recip a) a)
4319      RatioOrbit.one := by
4320  have hnum : ¬ SignedOrbit.balanced a.num SignedOrbit.zero := by
4321    intro hbal
4322    exact h ((RatioOrbit.crossEq_zero_iff_num_balanced_zero a).mpr hbal)
4323  exact RatioOrbit.recip_mul_crossEq_one_of_not_balanced_zero a hnum
4324
4325theorem one_crossEq_mul_recip_of_not_crossEq_zero
4326    (a : RatioOrbit)
4327    (h : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
4328    RatioOrbit.crossEq RatioOrbit.one
4329      (RatioOrbit.mul a (RatioOrbit.recip a)) :=
4330  RatioOrbit.crossEq_symm
4331    (RatioOrbit.mul_recip_crossEq_one_of_not_crossEq_zero a h)
4332
4333theorem one_crossEq_recip_mul_of_not_crossEq_zero
4334    (a : RatioOrbit)
4335    (h : ¬ RatioOrbit.crossEq a RatioOrbit.zero) :
4336    RatioOrbit.crossEq RatioOrbit.one
4337      (RatioOrbit.mul (RatioOrbit.recip a) a) :=
4338  RatioOrbit.crossEq_symm
4339    (RatioOrbit.recip_mul_crossEq_one_of_not_crossEq_zero a h)
4340
4341theorem mul_product_recip_crossEq_one_of_not_crossEq_zero
4342    (a b : RatioOrbit)
4343    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4344    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4345    RatioOrbit.crossEq
4346      (RatioOrbit.mul (RatioOrbit.mul a b)
4347        (RatioOrbit.recip (RatioOrbit.mul a b)))
4348      RatioOrbit.one :=
4349  RatioOrbit.mul_recip_crossEq_one_of_not_crossEq_zero
4350    (RatioOrbit.mul a b)
4351    (RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero a b ha hb)
4352
4353theorem recip_product_mul_crossEq_one_of_not_crossEq_zero
4354    (a b : RatioOrbit)
4355    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4356    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4357    RatioOrbit.crossEq
4358      (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul a b))
4359        (RatioOrbit.mul a b))
4360      RatioOrbit.one :=
4361  RatioOrbit.recip_mul_crossEq_one_of_not_crossEq_zero
4362    (RatioOrbit.mul a b)
4363    (RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero a b ha hb)
4364
4365theorem one_crossEq_mul_product_recip_of_not_crossEq_zero
4366    (a b : RatioOrbit)
4367    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4368    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4369    RatioOrbit.crossEq RatioOrbit.one
4370      (RatioOrbit.mul (RatioOrbit.mul a b)
4371        (RatioOrbit.recip (RatioOrbit.mul a b))) :=
4372  RatioOrbit.crossEq_symm
4373    (RatioOrbit.mul_product_recip_crossEq_one_of_not_crossEq_zero a b ha hb)
4374
4375theorem one_crossEq_recip_product_mul_of_not_crossEq_zero
4376    (a b : RatioOrbit)
4377    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4378    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4379    RatioOrbit.crossEq RatioOrbit.one
4380      (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul a b))
4381        (RatioOrbit.mul a b)) :=
4382  RatioOrbit.crossEq_symm
4383    (RatioOrbit.recip_product_mul_crossEq_one_of_not_crossEq_zero a b ha hb)
4384
4385theorem recip_product_not_crossEq_zero_of_not_crossEq_zero
4386    (a b : RatioOrbit)
4387    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4388    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4389    ¬ RatioOrbit.crossEq
4390      (RatioOrbit.recip (RatioOrbit.mul a b)) RatioOrbit.zero :=
4391  (RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero
4392    (RatioOrbit.mul a b)).mpr
4393    (RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero a b ha hb)
4394
4395theorem zero_not_crossEq_recip_product_of_not_crossEq_zero
4396    (a b : RatioOrbit)
4397    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4398    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4399    ¬ RatioOrbit.crossEq RatioOrbit.zero
4400      (RatioOrbit.recip (RatioOrbit.mul a b)) :=
4401  (RatioOrbit.zero_not_crossEq_recip_iff_not_crossEq_zero
4402    (RatioOrbit.mul a b)).mpr
4403    (RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero a b ha hb)
4404
4405theorem recip_product_comm_not_crossEq_zero_of_not_crossEq_zero
4406    (a b : RatioOrbit)
4407    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4408    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4409    ¬ RatioOrbit.crossEq
4410      (RatioOrbit.recip (RatioOrbit.mul b a)) RatioOrbit.zero :=
4411  (RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero
4412    (RatioOrbit.mul b a)).mpr
4413    (RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero b a hb ha)
4414
4415theorem zero_not_crossEq_recip_product_comm_of_not_crossEq_zero
4416    (a b : RatioOrbit)
4417    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4418    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4419    ¬ RatioOrbit.crossEq RatioOrbit.zero
4420      (RatioOrbit.recip (RatioOrbit.mul b a)) :=
4421  (RatioOrbit.zero_not_crossEq_recip_iff_not_crossEq_zero
4422    (RatioOrbit.mul b a)).mpr
4423    (RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero b a hb ha)
4424
4425theorem recip_product_comm_crossEq_recip_product (a b : RatioOrbit) :
4426    RatioOrbit.crossEq
4427      (RatioOrbit.recip (RatioOrbit.mul a b))
4428      (RatioOrbit.recip (RatioOrbit.mul b a)) := by
4429  exact RatioOrbit.recip_crossEq_congr (RatioOrbit.mul_comm_crossEq a b)
4430
4431theorem recip_product_crossEq_recip_product_comm (a b : RatioOrbit) :
4432    RatioOrbit.crossEq
4433      (RatioOrbit.recip (RatioOrbit.mul b a))
4434      (RatioOrbit.recip (RatioOrbit.mul a b)) :=
4435  RatioOrbit.crossEq_symm
4436    (RatioOrbit.recip_product_comm_crossEq_recip_product a b)
4437
4438theorem mul_product_comm_recip_crossEq_one_of_not_crossEq_zero
4439    (a b : RatioOrbit)
4440    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4441    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4442    RatioOrbit.crossEq
4443      (RatioOrbit.mul (RatioOrbit.mul b a)
4444        (RatioOrbit.recip (RatioOrbit.mul b a)))
4445      RatioOrbit.one :=
4446  RatioOrbit.mul_product_recip_crossEq_one_of_not_crossEq_zero b a hb ha
4447
4448theorem recip_product_comm_mul_crossEq_one_of_not_crossEq_zero
4449    (a b : RatioOrbit)
4450    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4451    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4452    RatioOrbit.crossEq
4453      (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul b a))
4454        (RatioOrbit.mul b a))
4455      RatioOrbit.one :=
4456  RatioOrbit.recip_product_mul_crossEq_one_of_not_crossEq_zero b a hb ha
4457
4458theorem one_crossEq_mul_product_comm_recip_of_not_crossEq_zero
4459    (a b : RatioOrbit)
4460    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4461    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4462    RatioOrbit.crossEq RatioOrbit.one
4463      (RatioOrbit.mul (RatioOrbit.mul b a)
4464        (RatioOrbit.recip (RatioOrbit.mul b a))) :=
4465  RatioOrbit.crossEq_symm
4466    (RatioOrbit.mul_product_comm_recip_crossEq_one_of_not_crossEq_zero
4467      a b ha hb)
4468
4469theorem one_crossEq_recip_product_comm_mul_of_not_crossEq_zero
4470    (a b : RatioOrbit)
4471    (ha : ¬ RatioOrbit.crossEq a RatioOrbit.zero)
4472    (hb : ¬ RatioOrbit.crossEq b RatioOrbit.zero) :
4473    RatioOrbit.crossEq RatioOrbit.one
4474      (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul b a))
4475        (RatioOrbit.mul b a)) :=
4476  RatioOrbit.crossEq_symm
4477    (RatioOrbit.recip_product_comm_mul_crossEq_one_of_not_crossEq_zero
4478      a b ha hb)
4479
4480theorem recip_right_crossEq_of_mul_crossEq_one
4481    (a b : RatioOrbit)
4482    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4483    RatioOrbit.crossEq (RatioOrbit.recip b) a :=
4484  RatioOrbit.crossEq_symm
4485    (RatioOrbit.crossEq_recip_right_of_mul_crossEq_one a b h)
4486
4487theorem recip_left_crossEq_of_mul_crossEq_one
4488    (a b : RatioOrbit)
4489    (h : RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one) :
4490    RatioOrbit.crossEq (RatioOrbit.recip a) b :=
4491  RatioOrbit.crossEq_symm
4492    (RatioOrbit.crossEq_recip_left_of_mul_crossEq_one a b h)
4493
4494theorem recip_right_crossEq_of_one_crossEq_mul
4495    (a b : RatioOrbit)
4496    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4497    RatioOrbit.crossEq (RatioOrbit.recip b) a :=
4498  RatioOrbit.crossEq_symm
4499    (RatioOrbit.crossEq_recip_right_of_one_crossEq_mul a b h)
4500
4501theorem recip_left_crossEq_of_one_crossEq_mul
4502    (a b : RatioOrbit)
4503    (h : RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b)) :
4504    RatioOrbit.crossEq (RatioOrbit.recip a) b :=
4505  RatioOrbit.crossEq_symm
4506    (RatioOrbit.crossEq_recip_left_of_one_crossEq_mul a b h)
4507
4508theorem mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip
4509    (a b : RatioOrbit) :
4510    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
4511      ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
4512        RatioOrbit.crossEq a (RatioOrbit.recip b) := by
4513  constructor
4514  · intro h
4515    exact ⟨
4516      RatioOrbit.right_not_crossEq_zero_of_mul_crossEq_one a b h,
4517      RatioOrbit.crossEq_recip_right_of_mul_crossEq_one a b h⟩
4518  · intro h
4519    exact
4520      (RatioOrbit.mul_crossEq_one_iff_crossEq_recip_of_right_not_crossEq_zero
4521        a b h.1).mpr h.2
4522
4523theorem mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip
4524    (a b : RatioOrbit) :
4525    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
4526      ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4527        RatioOrbit.crossEq b (RatioOrbit.recip a) := by
4528  constructor
4529  · intro h
4530    exact ⟨
4531      RatioOrbit.left_not_crossEq_zero_of_mul_crossEq_one a b h,
4532      RatioOrbit.crossEq_recip_left_of_mul_crossEq_one a b h⟩
4533  · intro h
4534    exact
4535      (RatioOrbit.mul_crossEq_one_iff_crossEq_recip_of_left_not_crossEq_zero
4536        a b h.1).mpr h.2
4537
4538theorem one_crossEq_mul_iff_right_not_crossEq_zero_and_crossEq_recip
4539    (a b : RatioOrbit) :
4540    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
4541      ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
4542        RatioOrbit.crossEq a (RatioOrbit.recip b) := by
4543  constructor
4544  · intro h
4545    exact
4546      (RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip
4547        a b).mp (RatioOrbit.crossEq_symm h)
4548  · intro h
4549    exact RatioOrbit.crossEq_symm
4550      ((RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip
4551        a b).mpr h)
4552
4553theorem one_crossEq_mul_iff_left_not_crossEq_zero_and_crossEq_recip
4554    (a b : RatioOrbit) :
4555    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
4556      ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4557        RatioOrbit.crossEq b (RatioOrbit.recip a) := by
4558  constructor
4559  · intro h
4560    exact
4561      (RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip
4562        a b).mp (RatioOrbit.crossEq_symm h)
4563  · intro h
4564    exact RatioOrbit.crossEq_symm
4565      ((RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip
4566        a b).mpr h)
4567
4568theorem mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq
4569    (a b : RatioOrbit) :
4570    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
4571      ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
4572        RatioOrbit.crossEq (RatioOrbit.recip b) a := by
4573  constructor
4574  · intro h
4575    exact ⟨
4576      RatioOrbit.right_not_crossEq_zero_of_mul_crossEq_one a b h,
4577      RatioOrbit.recip_right_crossEq_of_mul_crossEq_one a b h⟩
4578  · intro h
4579    exact
4580      (RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip
4581        a b).mpr ⟨h.1, RatioOrbit.crossEq_symm h.2⟩
4582
4583theorem mul_crossEq_one_iff_left_not_crossEq_zero_and_recip_crossEq
4584    (a b : RatioOrbit) :
4585    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
4586      ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4587        RatioOrbit.crossEq (RatioOrbit.recip a) b := by
4588  constructor
4589  · intro h
4590    exact ⟨
4591      RatioOrbit.left_not_crossEq_zero_of_mul_crossEq_one a b h,
4592      RatioOrbit.recip_left_crossEq_of_mul_crossEq_one a b h⟩
4593  · intro h
4594    exact
4595      (RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip
4596        a b).mpr ⟨h.1, RatioOrbit.crossEq_symm h.2⟩
4597
4598theorem one_crossEq_mul_iff_right_not_crossEq_zero_and_recip_crossEq
4599    (a b : RatioOrbit) :
4600    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
4601      ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
4602        RatioOrbit.crossEq (RatioOrbit.recip b) a := by
4603  constructor
4604  · intro h
4605    exact
4606      (RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq
4607        a b).mp (RatioOrbit.crossEq_symm h)
4608  · intro h
4609    exact RatioOrbit.crossEq_symm
4610      ((RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq
4611        a b).mpr h)
4612
4613theorem one_crossEq_mul_iff_left_not_crossEq_zero_and_recip_crossEq
4614    (a b : RatioOrbit) :
4615    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
4616      ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4617        RatioOrbit.crossEq (RatioOrbit.recip a) b := by
4618  constructor
4619  · intro h
4620    exact
4621      (RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_recip_crossEq
4622        a b).mp (RatioOrbit.crossEq_symm h)
4623  · intro h
4624    exact RatioOrbit.crossEq_symm
4625      ((RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_recip_crossEq
4626        a b).mpr h)
4627
4628theorem mul_crossEq_one_iff_factors_not_crossEq_zero_and_crossEq_recip
4629    (a b : RatioOrbit) :
4630    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
4631      (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4632        ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
4633        RatioOrbit.crossEq a (RatioOrbit.recip b) ∧
4634          RatioOrbit.crossEq b (RatioOrbit.recip a) := by
4635  constructor
4636  · intro h
4637    exact ⟨
4638      RatioOrbit.factors_not_crossEq_zero_of_mul_crossEq_one a b h,
4639      RatioOrbit.crossEq_recip_right_of_mul_crossEq_one a b h,
4640      RatioOrbit.crossEq_recip_left_of_mul_crossEq_one a b h⟩
4641  · intro h
4642    exact
4643      (RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip
4644        a b).mpr ⟨h.1.2, h.2.1⟩
4645
4646theorem one_crossEq_mul_iff_factors_not_crossEq_zero_and_crossEq_recip
4647    (a b : RatioOrbit) :
4648    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
4649      (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4650        ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
4651        RatioOrbit.crossEq a (RatioOrbit.recip b) ∧
4652          RatioOrbit.crossEq b (RatioOrbit.recip a) := by
4653  constructor
4654  · intro h
4655    exact
4656      (RatioOrbit.mul_crossEq_one_iff_factors_not_crossEq_zero_and_crossEq_recip
4657        a b).mp (RatioOrbit.crossEq_symm h)
4658  · intro h
4659    exact RatioOrbit.crossEq_symm
4660      ((RatioOrbit.mul_crossEq_one_iff_factors_not_crossEq_zero_and_crossEq_recip
4661        a b).mpr h)
4662
4663theorem mul_crossEq_one_iff_factors_not_crossEq_zero_and_recip_crossEq
4664    (a b : RatioOrbit) :
4665    RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
4666      (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4667        ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
4668        RatioOrbit.crossEq (RatioOrbit.recip b) a ∧
4669          RatioOrbit.crossEq (RatioOrbit.recip a) b := by
4670  constructor
4671  · intro h
4672    exact ⟨
4673      RatioOrbit.factors_not_crossEq_zero_of_mul_crossEq_one a b h,
4674      RatioOrbit.recip_right_crossEq_of_mul_crossEq_one a b h,
4675      RatioOrbit.recip_left_crossEq_of_mul_crossEq_one a b h⟩
4676  · intro h
4677    exact
4678      (RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq
4679        a b).mpr ⟨h.1.2, h.2.1⟩
4680
4681theorem one_crossEq_mul_iff_factors_not_crossEq_zero_and_recip_crossEq
4682    (a b : RatioOrbit) :
4683    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
4684      (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
4685        ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
4686        RatioOrbit.crossEq (RatioOrbit.recip b) a ∧
4687          RatioOrbit.crossEq (RatioOrbit.recip a) b := by
4688  constructor
4689  · intro h
4690    exact
4691      (RatioOrbit.mul_crossEq_one_iff_factors_not_crossEq_zero_and_recip_crossEq
4692        a b).mp (RatioOrbit.crossEq_symm h)
4693  · intro h
4694    exact RatioOrbit.crossEq_symm
4695      ((RatioOrbit.mul_crossEq_one_iff_factors_not_crossEq_zero_and_recip_crossEq
4696        a b).mpr h)
4697
4698end RatioOrbit
4699
4700/-- Step-1 certificate for internal signed-orbit order and absolute value. -/
4701structure IntegerOrderCertificate : Prop where
4702  truncated_sub_display :
4703    ∀ a b : DistinctionNat,
4704      (DistinctionNat.truncatedSub a b).toNat = a.toNat - b.toNat
4705  leq_display :
4706    ∀ a b : DistinctionNat,
4707      DistinctionNat.leq a b = true ↔ a.toNat ≤ b.toNat
4708  absdiff_display :
4709    ∀ a b : DistinctionNat,
4710      (DistinctionNat.absDiff a b).toNat =
4711        Int.natAbs ((a.toNat : ℤ) - (b.toNat : ℤ))
4712  signed_nonneg_display :
4713    ∀ z : SignedOrbit, SignedOrbit.nonneg z ↔ 0 ≤ z.toInt
4714  signed_nonneg_flag_display :
4715    ∀ z : SignedOrbit, z.nonnegFlag = true ↔ 0 ≤ z.toInt
4716  signed_abs_display :
4717    ∀ z : SignedOrbit, z.abs.toNat = Int.natAbs z.toInt
4718  signed_le_display :
4719    ∀ a b : SignedOrbit, SignedOrbit.le a b ↔ a.toInt ≤ b.toInt
4720  signed_lt_display :
4721    ∀ a b : SignedOrbit, SignedOrbit.lt a b ↔ a.toInt < b.toInt
4722  abs_nonzero_internal :
4723    ∀ z : SignedOrbit,
4724      (¬ SignedOrbit.balanced z SignedOrbit.zero) →
4725        z.abs ≠ DistinctionNat.zero
4726  signed_le_reflexive :
4727    ∀ a : SignedOrbit, SignedOrbit.le a a
4728  signed_le_transitive :
4729    ∀ {a b c : SignedOrbit},
4730      SignedOrbit.le a b → SignedOrbit.le b c → SignedOrbit.le a c
4731  signed_le_antisymmetric_balanced :
4732    ∀ {a b : SignedOrbit},
4733      SignedOrbit.le a b → SignedOrbit.le b a → SignedOrbit.balanced a b
4734  signed_le_total :
4735    ∀ a b : SignedOrbit, SignedOrbit.le a b ∨ SignedOrbit.le b a
4736  signed_order_trichotomy :
4737    ∀ a b : SignedOrbit,
4738      SignedOrbit.lt a b ∨ SignedOrbit.balanced a b ∨ SignedOrbit.lt b a
4739  signed_negativeFlag_eq_true_iff_nonnegFlag_eq_false :
4740    ∀ z : SignedOrbit,
4741      z.negativeFlag = true ↔ z.nonnegFlag = false
4742  signed_negativeFlag_eq_false_iff_nonnegFlag_eq_true :
4743    ∀ z : SignedOrbit,
4744      z.negativeFlag = false ↔ z.nonnegFlag = true
4745  signed_flags_exclusive :
4746    ∀ z : SignedOrbit, ¬ (z.nonnegFlag = true ∧ z.negativeFlag = true)
4747  signed_flags_exhaustive :
4748    ∀ z : SignedOrbit, z.nonnegFlag = true ∨ z.negativeFlag = true
4749  signed_zero_le_iff_nonnegFlag :
4750    ∀ z : SignedOrbit,
4751      SignedOrbit.le SignedOrbit.zero z ↔ z.nonnegFlag = true
4752  signed_lt_zero_iff_negativeFlag :
4753    ∀ z : SignedOrbit,
4754      SignedOrbit.lt z SignedOrbit.zero ↔ z.negativeFlag = true
4755  signed_zero_lt_iff_nonnegFlag_and_not_balanced_zero :
4756    ∀ z : SignedOrbit,
4757      SignedOrbit.lt SignedOrbit.zero z ↔
4758        z.nonnegFlag = true ∧
4759          ¬ SignedOrbit.balanced z SignedOrbit.zero
4760  signed_nonnegFlag_eq_of_balanced :
4761    ∀ {z w : SignedOrbit}, SignedOrbit.balanced z w →
4762      z.nonnegFlag = w.nonnegFlag
4763  signed_negativeFlag_eq_of_balanced :
4764    ∀ {z w : SignedOrbit}, SignedOrbit.balanced z w →
4765      z.negativeFlag = w.negativeFlag
4766  signed_nonneg_iff_of_balanced :
4767    ∀ {z w : SignedOrbit}, SignedOrbit.balanced z w →
4768      (SignedOrbit.nonneg z ↔ SignedOrbit.nonneg w)
4769  signed_add_congr_of_balanced :
4770    ∀ {a a' b b' : SignedOrbit},
4771      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
4772        SignedOrbit.balanced (SignedOrbit.add a b) (SignedOrbit.add a' b')
4773  signed_negate_congr_of_balanced :
4774    ∀ {a a' : SignedOrbit}, SignedOrbit.balanced a a' →
4775      SignedOrbit.balanced (SignedOrbit.negate a) (SignedOrbit.negate a')
4776  signed_sub_congr_of_balanced :
4777    ∀ {a a' b b' : SignedOrbit},
4778      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
4779        SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub a' b')
4780  signed_sub_congr_of_balanced_left :
4781    ∀ {a a' b : SignedOrbit},
4782      SignedOrbit.balanced a a' →
4783        SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub a' b)
4784  signed_sub_congr_of_balanced_right :
4785    ∀ {a b b' : SignedOrbit},
4786      SignedOrbit.balanced b b' →
4787        SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub a b')
4788  signed_nonnegFlag_sub_eq_of_balanced_left :
4789    ∀ {a a' b : SignedOrbit},
4790      SignedOrbit.balanced a a' →
4791        (SignedOrbit.sub a b).nonnegFlag =
4792          (SignedOrbit.sub a' b).nonnegFlag
4793  signed_nonnegFlag_sub_eq_of_balanced_right :
4794    ∀ {a b b' : SignedOrbit},
4795      SignedOrbit.balanced b b' →
4796        (SignedOrbit.sub a b).nonnegFlag =
4797          (SignedOrbit.sub a b').nonnegFlag
4798  signed_negativeFlag_sub_eq_of_balanced_left :
4799    ∀ {a a' b : SignedOrbit},
4800      SignedOrbit.balanced a a' →
4801        (SignedOrbit.sub a b).negativeFlag =
4802          (SignedOrbit.sub a' b).negativeFlag
4803  signed_negativeFlag_sub_eq_of_balanced_right :
4804    ∀ {a b b' : SignedOrbit},
4805      SignedOrbit.balanced b b' →
4806        (SignedOrbit.sub a b).negativeFlag =
4807          (SignedOrbit.sub a b').negativeFlag
4808  signed_nonnegFlag_sub_eq_of_balanced :
4809    ∀ {a a' b b' : SignedOrbit},
4810      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
4811        (SignedOrbit.sub a b).nonnegFlag =
4812          (SignedOrbit.sub a' b').nonnegFlag
4813  signed_negativeFlag_sub_eq_of_balanced :
4814    ∀ {a a' b b' : SignedOrbit},
4815      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
4816        (SignedOrbit.sub a b).negativeFlag =
4817          (SignedOrbit.sub a' b').negativeFlag
4818  signed_scaleByNat_congr_of_balanced :
4819    ∀ {z w : SignedOrbit}, SignedOrbit.balanced z w →
4820      ∀ d : DistinctionNat,
4821        SignedOrbit.balanced (z.scaleByNat d) (w.scaleByNat d)
4822  signed_scaleByNat_balanced_zero_of_balanced_zero :
4823    ∀ {z : SignedOrbit}, SignedOrbit.balanced z SignedOrbit.zero →
4824      ∀ d : DistinctionNat,
4825        SignedOrbit.balanced (z.scaleByNat d) SignedOrbit.zero
4826  signed_mul_ofOrbit_balanced_scaleByNat :
4827    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4828      SignedOrbit.balanced
4829        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
4830        (z.scaleByNat d)
4831  signed_ofOrbit_mul_balanced_scaleByNat :
4832    ∀ d : DistinctionNat, ∀ z : SignedOrbit,
4833      SignedOrbit.balanced
4834        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
4835        (z.scaleByNat d)
4836  signed_abs_mul :
4837    ∀ z w : SignedOrbit,
4838      (SignedOrbit.mul z w).abs = z.abs * w.abs
4839  signed_mul_balanced_zero_iff :
4840    ∀ z w : SignedOrbit,
4841      SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero ↔
4842        SignedOrbit.balanced z SignedOrbit.zero ∨
4843          SignedOrbit.balanced w SignedOrbit.zero
4844  signed_mul_not_balanced_zero_iff :
4845    ∀ z w : SignedOrbit,
4846      ¬ SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero ↔
4847        ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
4848          ¬ SignedOrbit.balanced w SignedOrbit.zero
4849  signed_balanced_mul_left_iff_of_not_balanced_zero :
4850    ∀ a z w : SignedOrbit,
4851      ¬ SignedOrbit.balanced a SignedOrbit.zero →
4852        (SignedOrbit.balanced (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
4853          SignedOrbit.balanced z w)
4854  signed_balanced_mul_right_iff_of_not_balanced_zero :
4855    ∀ a z w : SignedOrbit,
4856      ¬ SignedOrbit.balanced a SignedOrbit.zero →
4857        (SignedOrbit.balanced (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
4858          SignedOrbit.balanced z w)
4859  signed_le_mul_left_iff_of_nonnegFlag_of_not_balanced_zero :
4860    ∀ a z w : SignedOrbit,
4861      a.nonnegFlag = true →
4862        ¬ SignedOrbit.balanced a SignedOrbit.zero →
4863          (SignedOrbit.le (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
4864            SignedOrbit.le z w)
4865  signed_lt_mul_left_iff_of_nonnegFlag_of_not_balanced_zero :
4866    ∀ a z w : SignedOrbit,
4867      a.nonnegFlag = true →
4868        ¬ SignedOrbit.balanced a SignedOrbit.zero →
4869          (SignedOrbit.lt (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
4870            SignedOrbit.lt z w)
4871  signed_le_mul_right_iff_of_nonnegFlag_of_not_balanced_zero :
4872    ∀ a z w : SignedOrbit,
4873      a.nonnegFlag = true →
4874        ¬ SignedOrbit.balanced a SignedOrbit.zero →
4875          (SignedOrbit.le (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
4876            SignedOrbit.le z w)
4877  signed_lt_mul_right_iff_of_nonnegFlag_of_not_balanced_zero :
4878    ∀ a z w : SignedOrbit,
4879      a.nonnegFlag = true →
4880        ¬ SignedOrbit.balanced a SignedOrbit.zero →
4881          (SignedOrbit.lt (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
4882            SignedOrbit.lt z w)
4883  signed_le_mul_left_iff_of_negativeFlag :
4884    ∀ a z w : SignedOrbit,
4885      a.negativeFlag = true →
4886        (SignedOrbit.le (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
4887          SignedOrbit.le w z)
4888  signed_lt_mul_left_iff_of_negativeFlag :
4889    ∀ a z w : SignedOrbit,
4890      a.negativeFlag = true →
4891        (SignedOrbit.lt (SignedOrbit.mul a z) (SignedOrbit.mul a w) ↔
4892          SignedOrbit.lt w z)
4893  signed_le_mul_right_iff_of_negativeFlag :
4894    ∀ a z w : SignedOrbit,
4895      a.negativeFlag = true →
4896        (SignedOrbit.le (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
4897          SignedOrbit.le w z)
4898  signed_lt_mul_right_iff_of_negativeFlag :
4899    ∀ a z w : SignedOrbit,
4900      a.negativeFlag = true →
4901        (SignedOrbit.lt (SignedOrbit.mul z a) (SignedOrbit.mul w a) ↔
4902          SignedOrbit.lt w z)
4903  signed_abs_mul_eq_zero_iff :
4904    ∀ z w : SignedOrbit,
4905      (SignedOrbit.mul z w).abs = DistinctionNat.zero ↔
4906        z.abs = DistinctionNat.zero ∨ w.abs = DistinctionNat.zero
4907  signed_abs_mul_ne_zero_iff :
4908    ∀ z w : SignedOrbit,
4909      (SignedOrbit.mul z w).abs ≠ DistinctionNat.zero ↔
4910        z.abs ≠ DistinctionNat.zero ∧ w.abs ≠ DistinctionNat.zero
4911  signed_abs_mul_eq_zero_iff_balanced_zero :
4912    ∀ z w : SignedOrbit,
4913      (SignedOrbit.mul z w).abs = DistinctionNat.zero ↔
4914        SignedOrbit.balanced z SignedOrbit.zero ∨
4915          SignedOrbit.balanced w SignedOrbit.zero
4916  signed_abs_mul_ne_zero_iff_not_balanced_zero :
4917    ∀ z w : SignedOrbit,
4918      (SignedOrbit.mul z w).abs ≠ DistinctionNat.zero ↔
4919        ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
4920          ¬ SignedOrbit.balanced w SignedOrbit.zero
4921  signed_abs_scaleByNat :
4922    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4923      (z.scaleByNat d).abs = z.abs * d
4924  signed_abs_mul_ofOrbit_right :
4925    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4926      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).abs = z.abs * d
4927  signed_abs_mul_ofOrbit_left :
4928    ∀ d : DistinctionNat, ∀ z : SignedOrbit,
4929      (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).abs = z.abs * d
4930  signed_mul_ofOrbit_right_balanced_zero_iff :
4931    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4932      SignedOrbit.balanced
4933        (SignedOrbit.mul z (SignedOrbit.ofOrbit d)) SignedOrbit.zero ↔
4934          SignedOrbit.balanced z SignedOrbit.zero ∨ d = DistinctionNat.zero
4935  signed_mul_ofOrbit_left_balanced_zero_iff :
4936    ∀ d : DistinctionNat, ∀ z : SignedOrbit,
4937      SignedOrbit.balanced
4938        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z) SignedOrbit.zero ↔
4939          SignedOrbit.balanced z SignedOrbit.zero ∨ d = DistinctionNat.zero
4940  signed_mul_ofOrbit_right_not_balanced_zero_iff :
4941    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4942      ¬ SignedOrbit.balanced
4943        (SignedOrbit.mul z (SignedOrbit.ofOrbit d)) SignedOrbit.zero ↔
4944          ¬ SignedOrbit.balanced z SignedOrbit.zero ∧ d ≠ DistinctionNat.zero
4945  signed_mul_ofOrbit_left_not_balanced_zero_iff :
4946    ∀ d : DistinctionNat, ∀ z : SignedOrbit,
4947      ¬ SignedOrbit.balanced
4948        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z) SignedOrbit.zero ↔
4949          ¬ SignedOrbit.balanced z SignedOrbit.zero ∧ d ≠ DistinctionNat.zero
4950  signed_nonnegFlag_scaleByNat_of_ne_zero :
4951    ∀ z : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
4952      (z.scaleByNat d).nonnegFlag = z.nonnegFlag
4953  signed_negativeFlag_scaleByNat_of_ne_zero :
4954    ∀ z : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
4955      (z.scaleByNat d).negativeFlag = z.negativeFlag
4956  signed_scaleByNat_balanced_zero_iff :
4957    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4958      SignedOrbit.balanced (z.scaleByNat d) SignedOrbit.zero ↔
4959        SignedOrbit.balanced z SignedOrbit.zero ∨ d = DistinctionNat.zero
4960  signed_scaleByNat_not_balanced_zero_iff :
4961    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4962      ¬ SignedOrbit.balanced (z.scaleByNat d) SignedOrbit.zero ↔
4963        ¬ SignedOrbit.balanced z SignedOrbit.zero ∧ d ≠ DistinctionNat.zero
4964  signed_abs_scaleByNat_eq_zero_iff :
4965    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4966      (z.scaleByNat d).abs = DistinctionNat.zero ↔
4967        z.abs = DistinctionNat.zero ∨ d = DistinctionNat.zero
4968  signed_abs_scaleByNat_ne_zero_iff :
4969    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4970      (z.scaleByNat d).abs ≠ DistinctionNat.zero ↔
4971        z.abs ≠ DistinctionNat.zero ∧ d ≠ DistinctionNat.zero
4972  signed_abs_mul_ofOrbit_right_eq_zero_iff :
4973    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4974      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).abs = DistinctionNat.zero ↔
4975        z.abs = DistinctionNat.zero ∨ d = DistinctionNat.zero
4976  signed_abs_mul_ofOrbit_left_eq_zero_iff :
4977    ∀ d : DistinctionNat, ∀ z : SignedOrbit,
4978      (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).abs = DistinctionNat.zero ↔
4979        z.abs = DistinctionNat.zero ∨ d = DistinctionNat.zero
4980  signed_abs_mul_ofOrbit_right_ne_zero_iff :
4981    ∀ z : SignedOrbit, ∀ d : DistinctionNat,
4982      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).abs ≠ DistinctionNat.zero ↔
4983        z.abs ≠ DistinctionNat.zero ∧ d ≠ DistinctionNat.zero
4984  signed_abs_mul_ofOrbit_left_ne_zero_iff :
4985    ∀ d : DistinctionNat, ∀ z : SignedOrbit,
4986      (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).abs ≠ DistinctionNat.zero ↔
4987        z.abs ≠ DistinctionNat.zero ∧ d ≠ DistinctionNat.zero
4988  signed_le_scaleByNat_of_le :
4989    ∀ {z w : SignedOrbit},
4990      SignedOrbit.le z w → ∀ d : DistinctionNat,
4991        SignedOrbit.le (z.scaleByNat d) (w.scaleByNat d)
4992  signed_le_scaleByNat_iff_of_ne_zero :
4993    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
4994      (SignedOrbit.le (z.scaleByNat d) (w.scaleByNat d) ↔
4995        SignedOrbit.le z w)
4996  signed_lt_scaleByNat_iff_of_ne_zero :
4997    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
4998      (SignedOrbit.lt (z.scaleByNat d) (w.scaleByNat d) ↔
4999        SignedOrbit.lt z w)
5000  signed_balanced_scaleByNat_iff_of_ne_zero :
5001    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5002      (SignedOrbit.balanced (z.scaleByNat d) (w.scaleByNat d) ↔
5003        SignedOrbit.balanced z w)
5004  signed_cmp_scaleByNat_of_ne_zero :
5005    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5006      SignedOrbit.cmp (z.scaleByNat d) (w.scaleByNat d) =
5007        SignedOrbit.cmp z w
5008  signed_le_mul_ofOrbit_right_iff_of_ne_zero :
5009    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5010      (SignedOrbit.le
5011        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
5012        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) ↔
5013          SignedOrbit.le z w)
5014  signed_lt_mul_ofOrbit_right_iff_of_ne_zero :
5015    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5016      (SignedOrbit.lt
5017        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
5018        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) ↔
5019          SignedOrbit.lt z w)
5020  signed_balanced_mul_ofOrbit_right_iff_of_ne_zero :
5021    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5022      (SignedOrbit.balanced
5023        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
5024        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) ↔
5025          SignedOrbit.balanced z w)
5026  signed_cmp_mul_ofOrbit_right_of_ne_zero :
5027    ∀ z w : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5028      SignedOrbit.cmp
5029        (SignedOrbit.mul z (SignedOrbit.ofOrbit d))
5030        (SignedOrbit.mul w (SignedOrbit.ofOrbit d)) =
5031          SignedOrbit.cmp z w
5032  signed_le_mul_ofOrbit_left_iff_of_ne_zero :
5033    ∀ d : DistinctionNat, ∀ z w : SignedOrbit, d ≠ DistinctionNat.zero →
5034      (SignedOrbit.le
5035        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
5036        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) ↔
5037          SignedOrbit.le z w)
5038  signed_lt_mul_ofOrbit_left_iff_of_ne_zero :
5039    ∀ d : DistinctionNat, ∀ z w : SignedOrbit, d ≠ DistinctionNat.zero →
5040      (SignedOrbit.lt
5041        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
5042        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) ↔
5043          SignedOrbit.lt z w)
5044  signed_balanced_mul_ofOrbit_left_iff_of_ne_zero :
5045    ∀ d : DistinctionNat, ∀ z w : SignedOrbit, d ≠ DistinctionNat.zero →
5046      (SignedOrbit.balanced
5047        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
5048        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) ↔
5049          SignedOrbit.balanced z w)
5050  signed_cmp_mul_ofOrbit_left_of_ne_zero :
5051    ∀ d : DistinctionNat, ∀ z w : SignedOrbit, d ≠ DistinctionNat.zero →
5052      SignedOrbit.cmp
5053        (SignedOrbit.mul (SignedOrbit.ofOrbit d) z)
5054        (SignedOrbit.mul (SignedOrbit.ofOrbit d) w) =
5055          SignedOrbit.cmp z w
5056  signed_cmp_mul_left_of_nonnegFlag_of_not_balanced_zero :
5057    ∀ a z w : SignedOrbit,
5058      a.nonnegFlag = true →
5059        ¬ SignedOrbit.balanced a SignedOrbit.zero →
5060          SignedOrbit.cmp (SignedOrbit.mul a z) (SignedOrbit.mul a w) =
5061            SignedOrbit.cmp z w
5062  signed_cmp_mul_right_of_nonnegFlag_of_not_balanced_zero :
5063    ∀ a z w : SignedOrbit,
5064      a.nonnegFlag = true →
5065        ¬ SignedOrbit.balanced a SignedOrbit.zero →
5066          SignedOrbit.cmp (SignedOrbit.mul z a) (SignedOrbit.mul w a) =
5067            SignedOrbit.cmp z w
5068  signed_cmp_mul_left_of_negativeFlag :
5069    ∀ a z w : SignedOrbit,
5070      a.negativeFlag = true →
5071        SignedOrbit.cmp (SignedOrbit.mul a z) (SignedOrbit.mul a w) =
5072          SignedOrbit.cmp w z
5073  signed_cmp_mul_right_of_negativeFlag :
5074    ∀ a z w : SignedOrbit,
5075      a.negativeFlag = true →
5076        SignedOrbit.cmp (SignedOrbit.mul z a) (SignedOrbit.mul w a) =
5077          SignedOrbit.cmp w z
5078  signed_nonnegFlag_mul_of_nonnegFlag_of_nonnegFlag :
5079    ∀ z w : SignedOrbit,
5080      z.nonnegFlag = true → w.nonnegFlag = true →
5081        (SignedOrbit.mul z w).nonnegFlag = true
5082  signed_nonnegFlag_mul_of_negativeFlag_of_negativeFlag :
5083    ∀ z w : SignedOrbit,
5084      z.negativeFlag = true → w.negativeFlag = true →
5085        (SignedOrbit.mul z w).nonnegFlag = true
5086  signed_negativeFlag_mul_of_nonnegFlag_of_not_balanced_zero_of_negativeFlag :
5087    ∀ z w : SignedOrbit,
5088      z.nonnegFlag = true →
5089        ¬ SignedOrbit.balanced z SignedOrbit.zero →
5090          w.negativeFlag = true →
5091            (SignedOrbit.mul z w).negativeFlag = true
5092  signed_negativeFlag_mul_of_negativeFlag_of_nonnegFlag_of_not_balanced_zero :
5093    ∀ z w : SignedOrbit,
5094      z.negativeFlag = true →
5095        w.nonnegFlag = true →
5096          ¬ SignedOrbit.balanced w SignedOrbit.zero →
5097            (SignedOrbit.mul z w).negativeFlag = true
5098  signed_negativeFlag_mul_iff :
5099    ∀ z w : SignedOrbit,
5100      (SignedOrbit.mul z w).negativeFlag = true ↔
5101        (z.nonnegFlag = true ∧
5102            ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
5103            w.negativeFlag = true) ∨
5104          (z.negativeFlag = true ∧
5105            w.nonnegFlag = true ∧
5106            ¬ SignedOrbit.balanced w SignedOrbit.zero)
5107  signed_nonnegFlag_mul_iff_not_strict_opposite_sign :
5108    ∀ z w : SignedOrbit,
5109      (SignedOrbit.mul z w).nonnegFlag = true ↔
5110        ¬ ((z.nonnegFlag = true ∧
5111                ¬ SignedOrbit.balanced z SignedOrbit.zero ∧
5112                w.negativeFlag = true) ∨
5113              (z.negativeFlag = true ∧
5114                w.nonnegFlag = true ∧
5115                ¬ SignedOrbit.balanced w SignedOrbit.zero))
5116  signed_nonnegFlag_mul_of_balanced_zero_left :
5117    ∀ z w : SignedOrbit,
5118      SignedOrbit.balanced z SignedOrbit.zero →
5119        (SignedOrbit.mul z w).nonnegFlag = true
5120  signed_nonnegFlag_mul_of_balanced_zero_right :
5121    ∀ z w : SignedOrbit,
5122      SignedOrbit.balanced w SignedOrbit.zero →
5123        (SignedOrbit.mul z w).nonnegFlag = true
5124  signed_negativeFlag_mul_eq_false_of_balanced_zero_left :
5125    ∀ z w : SignedOrbit,
5126      SignedOrbit.balanced z SignedOrbit.zero →
5127        (SignedOrbit.mul z w).negativeFlag = false
5128  signed_negativeFlag_mul_eq_false_of_balanced_zero_right :
5129    ∀ z w : SignedOrbit,
5130      SignedOrbit.balanced w SignedOrbit.zero →
5131        (SignedOrbit.mul z w).negativeFlag = false
5132  signed_mul_balanced_zero_of_balanced_zero_left :
5133    ∀ z w : SignedOrbit,
5134      SignedOrbit.balanced z SignedOrbit.zero →
5135        SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero
5136  signed_mul_balanced_zero_of_balanced_zero_right :
5137    ∀ z w : SignedOrbit,
5138      SignedOrbit.balanced w SignedOrbit.zero →
5139        SignedOrbit.balanced (SignedOrbit.mul z w) SignedOrbit.zero
5140  signed_abs_mul_eq_zero_of_balanced_zero_left :
5141    ∀ z w : SignedOrbit,
5142      SignedOrbit.balanced z SignedOrbit.zero →
5143        (SignedOrbit.mul z w).abs = DistinctionNat.zero
5144  signed_abs_mul_eq_zero_of_balanced_zero_right :
5145    ∀ z w : SignedOrbit,
5146      SignedOrbit.balanced w SignedOrbit.zero →
5147        (SignedOrbit.mul z w).abs = DistinctionNat.zero
5148  signed_mul_congr_of_balanced :
5149    ∀ {a a' b b' : SignedOrbit},
5150      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5151        SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul a' b')
5152  signed_mul_congr_of_balanced_left :
5153    ∀ {a a' b : SignedOrbit},
5154      SignedOrbit.balanced a a' →
5155        SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul a' b)
5156  signed_mul_congr_of_balanced_right :
5157    ∀ {a b b' : SignedOrbit},
5158      SignedOrbit.balanced b b' →
5159        SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul a b')
5160  signed_nonnegFlag_mul_eq_of_balanced :
5161    ∀ {a a' b b' : SignedOrbit},
5162      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5163        (SignedOrbit.mul a b).nonnegFlag =
5164          (SignedOrbit.mul a' b').nonnegFlag
5165  signed_nonnegFlag_mul_eq_of_balanced_left :
5166    ∀ {a a' b : SignedOrbit},
5167      SignedOrbit.balanced a a' →
5168        (SignedOrbit.mul a b).nonnegFlag =
5169          (SignedOrbit.mul a' b).nonnegFlag
5170  signed_nonnegFlag_mul_eq_of_balanced_right :
5171    ∀ {a b b' : SignedOrbit},
5172      SignedOrbit.balanced b b' →
5173        (SignedOrbit.mul a b).nonnegFlag =
5174          (SignedOrbit.mul a b').nonnegFlag
5175  signed_negativeFlag_mul_eq_of_balanced :
5176    ∀ {a a' b b' : SignedOrbit},
5177      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5178        (SignedOrbit.mul a b).negativeFlag =
5179          (SignedOrbit.mul a' b').negativeFlag
5180  signed_negativeFlag_mul_eq_of_balanced_left :
5181    ∀ {a a' b : SignedOrbit},
5182      SignedOrbit.balanced a a' →
5183        (SignedOrbit.mul a b).negativeFlag =
5184          (SignedOrbit.mul a' b).negativeFlag
5185  signed_negativeFlag_mul_eq_of_balanced_right :
5186    ∀ {a b b' : SignedOrbit},
5187      SignedOrbit.balanced b b' →
5188        (SignedOrbit.mul a b).negativeFlag =
5189          (SignedOrbit.mul a b').negativeFlag
5190  signed_abs_mul_eq_of_balanced :
5191    ∀ {a a' b b' : SignedOrbit},
5192      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5193        (SignedOrbit.mul a b).abs = (SignedOrbit.mul a' b').abs
5194  signed_abs_mul_eq_of_balanced_left :
5195    ∀ {a a' b : SignedOrbit},
5196      SignedOrbit.balanced a a' →
5197        (SignedOrbit.mul a b).abs = (SignedOrbit.mul a' b).abs
5198  signed_abs_mul_eq_of_balanced_right :
5199    ∀ {a b b' : SignedOrbit},
5200      SignedOrbit.balanced b b' →
5201        (SignedOrbit.mul a b).abs = (SignedOrbit.mul a b').abs
5202  signed_mul_balanced_zero_iff_of_balanced_left :
5203    ∀ {a a' b : SignedOrbit},
5204      SignedOrbit.balanced a a' →
5205        (SignedOrbit.balanced (SignedOrbit.mul a b) SignedOrbit.zero ↔
5206          SignedOrbit.balanced (SignedOrbit.mul a' b) SignedOrbit.zero)
5207  signed_mul_balanced_zero_iff_of_balanced_right :
5208    ∀ {a b b' : SignedOrbit},
5209      SignedOrbit.balanced b b' →
5210        (SignedOrbit.balanced (SignedOrbit.mul a b) SignedOrbit.zero ↔
5211          SignedOrbit.balanced (SignedOrbit.mul a b') SignedOrbit.zero)
5212  signed_abs_mul_eq_zero_iff_of_balanced_left :
5213    ∀ {a a' b : SignedOrbit},
5214      SignedOrbit.balanced a a' →
5215        ((SignedOrbit.mul a b).abs = DistinctionNat.zero ↔
5216          (SignedOrbit.mul a' b).abs = DistinctionNat.zero)
5217  signed_abs_mul_eq_zero_iff_of_balanced_right :
5218    ∀ {a b b' : SignedOrbit},
5219      SignedOrbit.balanced b b' →
5220        ((SignedOrbit.mul a b).abs = DistinctionNat.zero ↔
5221          (SignedOrbit.mul a b').abs = DistinctionNat.zero)
5222  signed_abs_mul_ne_zero_iff_of_balanced_left :
5223    ∀ {a a' b : SignedOrbit},
5224      SignedOrbit.balanced a a' →
5225        ((SignedOrbit.mul a b).abs ≠ DistinctionNat.zero ↔
5226          (SignedOrbit.mul a' b).abs ≠ DistinctionNat.zero)
5227  signed_abs_mul_ne_zero_iff_of_balanced_right :
5228    ∀ {a b b' : SignedOrbit},
5229      SignedOrbit.balanced b b' →
5230        ((SignedOrbit.mul a b).abs ≠ DistinctionNat.zero ↔
5231          (SignedOrbit.mul a b').abs ≠ DistinctionNat.zero)
5232  signed_mul_balanced_zero_iff_of_balanced :
5233    ∀ {a a' b b' : SignedOrbit},
5234      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5235        (SignedOrbit.balanced (SignedOrbit.mul a b) SignedOrbit.zero ↔
5236          SignedOrbit.balanced (SignedOrbit.mul a' b') SignedOrbit.zero)
5237  signed_abs_mul_eq_zero_iff_of_balanced :
5238    ∀ {a a' b b' : SignedOrbit},
5239      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5240        ((SignedOrbit.mul a b).abs = DistinctionNat.zero ↔
5241          (SignedOrbit.mul a' b').abs = DistinctionNat.zero)
5242  signed_abs_mul_ne_zero_iff_of_balanced :
5243    ∀ {a a' b b' : SignedOrbit},
5244      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5245        ((SignedOrbit.mul a b).abs ≠ DistinctionNat.zero ↔
5246          (SignedOrbit.mul a' b').abs ≠ DistinctionNat.zero)
5247  signed_le_product_left_factor_iff_of_balanced :
5248    ∀ {a a' b c : SignedOrbit},
5249      SignedOrbit.balanced a a' →
5250        (SignedOrbit.le (SignedOrbit.mul a b) c ↔
5251          SignedOrbit.le (SignedOrbit.mul a' b) c)
5252  signed_le_product_right_factor_iff_of_balanced :
5253    ∀ {a b b' c : SignedOrbit},
5254      SignedOrbit.balanced b b' →
5255        (SignedOrbit.le (SignedOrbit.mul a b) c ↔
5256          SignedOrbit.le (SignedOrbit.mul a b') c)
5257  signed_le_of_product_left_factor_iff_of_balanced :
5258    ∀ {c a a' b : SignedOrbit},
5259      SignedOrbit.balanced a a' →
5260        (SignedOrbit.le c (SignedOrbit.mul a b) ↔
5261          SignedOrbit.le c (SignedOrbit.mul a' b))
5262  signed_le_of_product_right_factor_iff_of_balanced :
5263    ∀ {c a b b' : SignedOrbit},
5264      SignedOrbit.balanced b b' →
5265        (SignedOrbit.le c (SignedOrbit.mul a b) ↔
5266          SignedOrbit.le c (SignedOrbit.mul a b'))
5267  signed_lt_product_left_factor_iff_of_balanced :
5268    ∀ {a a' b c : SignedOrbit},
5269      SignedOrbit.balanced a a' →
5270        (SignedOrbit.lt (SignedOrbit.mul a b) c ↔
5271          SignedOrbit.lt (SignedOrbit.mul a' b) c)
5272  signed_lt_product_right_factor_iff_of_balanced :
5273    ∀ {a b b' c : SignedOrbit},
5274      SignedOrbit.balanced b b' →
5275        (SignedOrbit.lt (SignedOrbit.mul a b) c ↔
5276          SignedOrbit.lt (SignedOrbit.mul a b') c)
5277  signed_lt_of_product_left_factor_iff_of_balanced :
5278    ∀ {c a a' b : SignedOrbit},
5279      SignedOrbit.balanced a a' →
5280        (SignedOrbit.lt c (SignedOrbit.mul a b) ↔
5281          SignedOrbit.lt c (SignedOrbit.mul a' b))
5282  signed_lt_of_product_right_factor_iff_of_balanced :
5283    ∀ {c a b b' : SignedOrbit},
5284      SignedOrbit.balanced b b' →
5285        (SignedOrbit.lt c (SignedOrbit.mul a b) ↔
5286          SignedOrbit.lt c (SignedOrbit.mul a b'))
5287  signed_cmp_product_left_factor_of_balanced :
5288    ∀ {a a' b c : SignedOrbit},
5289      SignedOrbit.balanced a a' →
5290        SignedOrbit.cmp (SignedOrbit.mul a b) c =
5291          SignedOrbit.cmp (SignedOrbit.mul a' b) c
5292  signed_cmp_product_right_factor_of_balanced :
5293    ∀ {a b b' c : SignedOrbit},
5294      SignedOrbit.balanced b b' →
5295        SignedOrbit.cmp (SignedOrbit.mul a b) c =
5296          SignedOrbit.cmp (SignedOrbit.mul a b') c
5297  signed_cmp_of_product_left_factor_of_balanced :
5298    ∀ {c a a' b : SignedOrbit},
5299      SignedOrbit.balanced a a' →
5300        SignedOrbit.cmp c (SignedOrbit.mul a b) =
5301          SignedOrbit.cmp c (SignedOrbit.mul a' b)
5302  signed_cmp_of_product_right_factor_of_balanced :
5303    ∀ {c a b b' : SignedOrbit},
5304      SignedOrbit.balanced b b' →
5305        SignedOrbit.cmp c (SignedOrbit.mul a b) =
5306          SignedOrbit.cmp c (SignedOrbit.mul a b')
5307  signed_le_product_factors_iff_of_balanced :
5308    ∀ {a a' b b' c : SignedOrbit},
5309      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5310        (SignedOrbit.le (SignedOrbit.mul a b) c ↔
5311          SignedOrbit.le (SignedOrbit.mul a' b') c)
5312  signed_le_of_product_factors_iff_of_balanced :
5313    ∀ {c a a' b b' : SignedOrbit},
5314      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5315        (SignedOrbit.le c (SignedOrbit.mul a b) ↔
5316          SignedOrbit.le c (SignedOrbit.mul a' b'))
5317  signed_lt_product_factors_iff_of_balanced :
5318    ∀ {a a' b b' c : SignedOrbit},
5319      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5320        (SignedOrbit.lt (SignedOrbit.mul a b) c ↔
5321          SignedOrbit.lt (SignedOrbit.mul a' b') c)
5322  signed_lt_of_product_factors_iff_of_balanced :
5323    ∀ {c a a' b b' : SignedOrbit},
5324      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5325        (SignedOrbit.lt c (SignedOrbit.mul a b) ↔
5326          SignedOrbit.lt c (SignedOrbit.mul a' b'))
5327  signed_cmp_product_factors_of_balanced :
5328    ∀ {a a' b b' c : SignedOrbit},
5329      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5330        SignedOrbit.cmp (SignedOrbit.mul a b) c =
5331          SignedOrbit.cmp (SignedOrbit.mul a' b') c
5332  signed_cmp_of_product_factors_of_balanced :
5333    ∀ {c a a' b b' : SignedOrbit},
5334      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5335        SignedOrbit.cmp c (SignedOrbit.mul a b) =
5336          SignedOrbit.cmp c (SignedOrbit.mul a' b')
5337  signed_le_products_iff_of_balanced :
5338    ∀ {a a' b b' c c' d d' : SignedOrbit},
5339      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5340        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5341          (SignedOrbit.le (SignedOrbit.mul a b) (SignedOrbit.mul c d) ↔
5342            SignedOrbit.le (SignedOrbit.mul a' b') (SignedOrbit.mul c' d'))
5343  signed_lt_products_iff_of_balanced :
5344    ∀ {a a' b b' c c' d d' : SignedOrbit},
5345      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5346        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5347          (SignedOrbit.lt (SignedOrbit.mul a b) (SignedOrbit.mul c d) ↔
5348            SignedOrbit.lt (SignedOrbit.mul a' b') (SignedOrbit.mul c' d'))
5349  signed_cmp_products_of_balanced :
5350    ∀ {a a' b b' c c' d d' : SignedOrbit},
5351      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5352        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5353          SignedOrbit.cmp (SignedOrbit.mul a b) (SignedOrbit.mul c d) =
5354            SignedOrbit.cmp (SignedOrbit.mul a' b') (SignedOrbit.mul c' d')
5355  signed_balanced_product_left_factor_iff_of_balanced :
5356    ∀ {a a' b c : SignedOrbit},
5357      SignedOrbit.balanced a a' →
5358        (SignedOrbit.balanced (SignedOrbit.mul a b) c ↔
5359          SignedOrbit.balanced (SignedOrbit.mul a' b) c)
5360  signed_balanced_product_right_factor_iff_of_balanced :
5361    ∀ {a b b' c : SignedOrbit},
5362      SignedOrbit.balanced b b' →
5363        (SignedOrbit.balanced (SignedOrbit.mul a b) c ↔
5364          SignedOrbit.balanced (SignedOrbit.mul a b') c)
5365  signed_balanced_product_factors_iff_of_balanced :
5366    ∀ {a a' b b' c : SignedOrbit},
5367      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5368        (SignedOrbit.balanced (SignedOrbit.mul a b) c ↔
5369          SignedOrbit.balanced (SignedOrbit.mul a' b') c)
5370  signed_balanced_products_iff_of_balanced :
5371    ∀ {a a' b b' c c' d d' : SignedOrbit},
5372      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5373        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5374          (SignedOrbit.balanced (SignedOrbit.mul a b) (SignedOrbit.mul c d) ↔
5375            SignedOrbit.balanced (SignedOrbit.mul a' b') (SignedOrbit.mul c' d'))
5376  signed_le_sub_left_input_iff_of_balanced :
5377    ∀ {a a' b c : SignedOrbit},
5378      SignedOrbit.balanced a a' →
5379        (SignedOrbit.le (SignedOrbit.sub a b) c ↔
5380          SignedOrbit.le (SignedOrbit.sub a' b) c)
5381  signed_le_sub_right_input_iff_of_balanced :
5382    ∀ {a b b' c : SignedOrbit},
5383      SignedOrbit.balanced b b' →
5384        (SignedOrbit.le (SignedOrbit.sub a b) c ↔
5385          SignedOrbit.le (SignedOrbit.sub a b') c)
5386  signed_le_of_sub_left_input_iff_of_balanced :
5387    ∀ {c a a' b : SignedOrbit},
5388      SignedOrbit.balanced a a' →
5389        (SignedOrbit.le c (SignedOrbit.sub a b) ↔
5390          SignedOrbit.le c (SignedOrbit.sub a' b))
5391  signed_le_of_sub_right_input_iff_of_balanced :
5392    ∀ {c a b b' : SignedOrbit},
5393      SignedOrbit.balanced b b' →
5394        (SignedOrbit.le c (SignedOrbit.sub a b) ↔
5395          SignedOrbit.le c (SignedOrbit.sub a b'))
5396  signed_lt_sub_left_input_iff_of_balanced :
5397    ∀ {a a' b c : SignedOrbit},
5398      SignedOrbit.balanced a a' →
5399        (SignedOrbit.lt (SignedOrbit.sub a b) c ↔
5400          SignedOrbit.lt (SignedOrbit.sub a' b) c)
5401  signed_lt_sub_right_input_iff_of_balanced :
5402    ∀ {a b b' c : SignedOrbit},
5403      SignedOrbit.balanced b b' →
5404        (SignedOrbit.lt (SignedOrbit.sub a b) c ↔
5405          SignedOrbit.lt (SignedOrbit.sub a b') c)
5406  signed_lt_of_sub_left_input_iff_of_balanced :
5407    ∀ {c a a' b : SignedOrbit},
5408      SignedOrbit.balanced a a' →
5409        (SignedOrbit.lt c (SignedOrbit.sub a b) ↔
5410          SignedOrbit.lt c (SignedOrbit.sub a' b))
5411  signed_lt_of_sub_right_input_iff_of_balanced :
5412    ∀ {c a b b' : SignedOrbit},
5413      SignedOrbit.balanced b b' →
5414        (SignedOrbit.lt c (SignedOrbit.sub a b) ↔
5415          SignedOrbit.lt c (SignedOrbit.sub a b'))
5416  signed_cmp_sub_left_input_of_balanced :
5417    ∀ {a a' b c : SignedOrbit},
5418      SignedOrbit.balanced a a' →
5419        SignedOrbit.cmp (SignedOrbit.sub a b) c =
5420          SignedOrbit.cmp (SignedOrbit.sub a' b) c
5421  signed_cmp_sub_right_input_of_balanced :
5422    ∀ {a b b' c : SignedOrbit},
5423      SignedOrbit.balanced b b' →
5424        SignedOrbit.cmp (SignedOrbit.sub a b) c =
5425          SignedOrbit.cmp (SignedOrbit.sub a b') c
5426  signed_cmp_of_sub_left_input_of_balanced :
5427    ∀ {c a a' b : SignedOrbit},
5428      SignedOrbit.balanced a a' →
5429        SignedOrbit.cmp c (SignedOrbit.sub a b) =
5430          SignedOrbit.cmp c (SignedOrbit.sub a' b)
5431  signed_cmp_of_sub_right_input_of_balanced :
5432    ∀ {c a b b' : SignedOrbit},
5433      SignedOrbit.balanced b b' →
5434        SignedOrbit.cmp c (SignedOrbit.sub a b) =
5435          SignedOrbit.cmp c (SignedOrbit.sub a b')
5436  signed_le_sub_inputs_iff_of_balanced :
5437    ∀ {a a' b b' c : SignedOrbit},
5438      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5439        (SignedOrbit.le (SignedOrbit.sub a b) c ↔
5440          SignedOrbit.le (SignedOrbit.sub a' b') c)
5441  signed_le_of_sub_inputs_iff_of_balanced :
5442    ∀ {c a a' b b' : SignedOrbit},
5443      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5444        (SignedOrbit.le c (SignedOrbit.sub a b) ↔
5445          SignedOrbit.le c (SignedOrbit.sub a' b'))
5446  signed_lt_sub_inputs_iff_of_balanced :
5447    ∀ {a a' b b' c : SignedOrbit},
5448      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5449        (SignedOrbit.lt (SignedOrbit.sub a b) c ↔
5450          SignedOrbit.lt (SignedOrbit.sub a' b') c)
5451  signed_lt_of_sub_inputs_iff_of_balanced :
5452    ∀ {c a a' b b' : SignedOrbit},
5453      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5454        (SignedOrbit.lt c (SignedOrbit.sub a b) ↔
5455          SignedOrbit.lt c (SignedOrbit.sub a' b'))
5456  signed_cmp_sub_inputs_of_balanced :
5457    ∀ {a a' b b' c : SignedOrbit},
5458      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5459        SignedOrbit.cmp (SignedOrbit.sub a b) c =
5460          SignedOrbit.cmp (SignedOrbit.sub a' b') c
5461  signed_cmp_of_sub_inputs_of_balanced :
5462    ∀ {c a a' b b' : SignedOrbit},
5463      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5464        SignedOrbit.cmp c (SignedOrbit.sub a b) =
5465          SignedOrbit.cmp c (SignedOrbit.sub a' b')
5466  signed_le_subtractions_iff_of_balanced :
5467    ∀ {a a' b b' c c' d d' : SignedOrbit},
5468      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5469        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5470          (SignedOrbit.le (SignedOrbit.sub a b) (SignedOrbit.sub c d) ↔
5471            SignedOrbit.le (SignedOrbit.sub a' b') (SignedOrbit.sub c' d'))
5472  signed_lt_subtractions_iff_of_balanced :
5473    ∀ {a a' b b' c c' d d' : SignedOrbit},
5474      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5475        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5476          (SignedOrbit.lt (SignedOrbit.sub a b) (SignedOrbit.sub c d) ↔
5477            SignedOrbit.lt (SignedOrbit.sub a' b') (SignedOrbit.sub c' d'))
5478  signed_cmp_subtractions_of_balanced :
5479    ∀ {a a' b b' c c' d d' : SignedOrbit},
5480      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5481        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5482          SignedOrbit.cmp (SignedOrbit.sub a b) (SignedOrbit.sub c d) =
5483            SignedOrbit.cmp (SignedOrbit.sub a' b') (SignedOrbit.sub c' d')
5484  signed_balanced_sub_left_input_iff_of_balanced :
5485    ∀ {a a' b c : SignedOrbit},
5486      SignedOrbit.balanced a a' →
5487        (SignedOrbit.balanced (SignedOrbit.sub a b) c ↔
5488          SignedOrbit.balanced (SignedOrbit.sub a' b) c)
5489  signed_balanced_sub_right_input_iff_of_balanced :
5490    ∀ {a b b' c : SignedOrbit},
5491      SignedOrbit.balanced b b' →
5492        (SignedOrbit.balanced (SignedOrbit.sub a b) c ↔
5493          SignedOrbit.balanced (SignedOrbit.sub a b') c)
5494  signed_balanced_sub_inputs_iff_of_balanced :
5495    ∀ {a a' b b' c : SignedOrbit},
5496      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5497        (SignedOrbit.balanced (SignedOrbit.sub a b) c ↔
5498          SignedOrbit.balanced (SignedOrbit.sub a' b') c)
5499  signed_balanced_subtractions_iff_of_balanced :
5500    ∀ {a a' b b' c c' d d' : SignedOrbit},
5501      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5502        SignedOrbit.balanced c c' → SignedOrbit.balanced d d' →
5503          (SignedOrbit.balanced (SignedOrbit.sub a b) (SignedOrbit.sub c d) ↔
5504            SignedOrbit.balanced (SignedOrbit.sub a' b') (SignedOrbit.sub c' d'))
5505  signed_sub_balanced_zero_iff_of_balanced_left :
5506    ∀ {a a' b : SignedOrbit},
5507      SignedOrbit.balanced a a' →
5508        (SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5509          SignedOrbit.balanced (SignedOrbit.sub a' b) SignedOrbit.zero)
5510  signed_sub_balanced_zero_iff_of_balanced_right :
5511    ∀ {a b b' : SignedOrbit},
5512      SignedOrbit.balanced b b' →
5513        (SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5514          SignedOrbit.balanced (SignedOrbit.sub a b') SignedOrbit.zero)
5515  signed_sub_balanced_zero_iff_of_balanced :
5516    ∀ {a a' b b' : SignedOrbit},
5517      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5518        (SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5519          SignedOrbit.balanced (SignedOrbit.sub a' b') SignedOrbit.zero)
5520  signed_sub_not_balanced_zero_iff_of_balanced_left :
5521    ∀ {a a' b : SignedOrbit},
5522      SignedOrbit.balanced a a' →
5523        (¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5524          ¬ SignedOrbit.balanced (SignedOrbit.sub a' b) SignedOrbit.zero)
5525  signed_sub_not_balanced_zero_iff_of_balanced_right :
5526    ∀ {a b b' : SignedOrbit},
5527      SignedOrbit.balanced b b' →
5528        (¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5529          ¬ SignedOrbit.balanced (SignedOrbit.sub a b') SignedOrbit.zero)
5530  signed_sub_not_balanced_zero_iff_of_balanced :
5531    ∀ {a a' b b' : SignedOrbit},
5532      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5533        (¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5534          ¬ SignedOrbit.balanced (SignedOrbit.sub a' b') SignedOrbit.zero)
5535  signed_sub_balanced_zero_iff_balanced :
5536    ∀ a b : SignedOrbit,
5537      SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5538        SignedOrbit.balanced a b
5539  signed_sub_not_balanced_zero_iff_not_balanced :
5540    ∀ a b : SignedOrbit,
5541      ¬ SignedOrbit.balanced (SignedOrbit.sub a b) SignedOrbit.zero ↔
5542        ¬ SignedOrbit.balanced a b
5543  signed_abs_sub_eq_zero_iff_balanced :
5544    ∀ a b : SignedOrbit,
5545      (SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
5546        SignedOrbit.balanced a b
5547  signed_abs_sub_ne_zero_iff_not_balanced :
5548    ∀ a b : SignedOrbit,
5549      (SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
5550        ¬ SignedOrbit.balanced a b
5551  signed_sub_self_balanced_zero :
5552    ∀ a : SignedOrbit,
5553      SignedOrbit.balanced (SignedOrbit.sub a a) SignedOrbit.zero
5554  signed_abs_sub_self_eq_zero :
5555    ∀ a : SignedOrbit,
5556      (SignedOrbit.sub a a).abs = DistinctionNat.zero
5557  signed_sub_zero_balanced :
5558    ∀ a : SignedOrbit,
5559      SignedOrbit.balanced (SignedOrbit.sub a SignedOrbit.zero) a
5560  signed_zero_sub_balanced_negate :
5561    ∀ a : SignedOrbit,
5562      SignedOrbit.balanced (SignedOrbit.sub SignedOrbit.zero a)
5563        (SignedOrbit.negate a)
5564  signed_abs_sub_zero_eq :
5565    ∀ a : SignedOrbit,
5566      (SignedOrbit.sub a SignedOrbit.zero).abs = a.abs
5567  signed_abs_zero_sub_eq :
5568    ∀ a : SignedOrbit,
5569      (SignedOrbit.sub SignedOrbit.zero a).abs = a.abs
5570  signed_le_sub_zero_left_iff :
5571    ∀ a b : SignedOrbit,
5572      SignedOrbit.le (SignedOrbit.sub a SignedOrbit.zero) b ↔
5573        SignedOrbit.le a b
5574  signed_le_sub_zero_right_iff :
5575    ∀ a b : SignedOrbit,
5576      SignedOrbit.le b (SignedOrbit.sub a SignedOrbit.zero) ↔
5577        SignedOrbit.le b a
5578  signed_lt_sub_zero_left_iff :
5579    ∀ a b : SignedOrbit,
5580      SignedOrbit.lt (SignedOrbit.sub a SignedOrbit.zero) b ↔
5581        SignedOrbit.lt a b
5582  signed_lt_sub_zero_right_iff :
5583    ∀ a b : SignedOrbit,
5584      SignedOrbit.lt b (SignedOrbit.sub a SignedOrbit.zero) ↔
5585        SignedOrbit.lt b a
5586  signed_cmp_sub_zero_left :
5587    ∀ a b : SignedOrbit,
5588      SignedOrbit.cmp (SignedOrbit.sub a SignedOrbit.zero) b =
5589        SignedOrbit.cmp a b
5590  signed_cmp_sub_zero_right :
5591    ∀ a b : SignedOrbit,
5592      SignedOrbit.cmp b (SignedOrbit.sub a SignedOrbit.zero) =
5593        SignedOrbit.cmp b a
5594  signed_le_zero_sub_left_iff :
5595    ∀ a b : SignedOrbit,
5596      SignedOrbit.le (SignedOrbit.sub SignedOrbit.zero a) b ↔
5597        SignedOrbit.le (SignedOrbit.negate a) b
5598  signed_le_zero_sub_right_iff :
5599    ∀ a b : SignedOrbit,
5600      SignedOrbit.le b (SignedOrbit.sub SignedOrbit.zero a) ↔
5601        SignedOrbit.le b (SignedOrbit.negate a)
5602  signed_lt_zero_sub_left_iff :
5603    ∀ a b : SignedOrbit,
5604      SignedOrbit.lt (SignedOrbit.sub SignedOrbit.zero a) b ↔
5605        SignedOrbit.lt (SignedOrbit.negate a) b
5606  signed_lt_zero_sub_right_iff :
5607    ∀ a b : SignedOrbit,
5608      SignedOrbit.lt b (SignedOrbit.sub SignedOrbit.zero a) ↔
5609        SignedOrbit.lt b (SignedOrbit.negate a)
5610  signed_cmp_zero_sub_left :
5611    ∀ a b : SignedOrbit,
5612      SignedOrbit.cmp (SignedOrbit.sub SignedOrbit.zero a) b =
5613        SignedOrbit.cmp (SignedOrbit.negate a) b
5614  signed_cmp_zero_sub_right :
5615    ∀ a b : SignedOrbit,
5616      SignedOrbit.cmp b (SignedOrbit.sub SignedOrbit.zero a) =
5617        SignedOrbit.cmp b (SignedOrbit.negate a)
5618  signed_le_sub_self_left_iff :
5619    ∀ a b : SignedOrbit,
5620      SignedOrbit.le (SignedOrbit.sub a a) b ↔
5621        SignedOrbit.le SignedOrbit.zero b
5622  signed_le_sub_self_right_iff :
5623    ∀ a b : SignedOrbit,
5624      SignedOrbit.le b (SignedOrbit.sub a a) ↔
5625        SignedOrbit.le b SignedOrbit.zero
5626  signed_lt_sub_self_left_iff :
5627    ∀ a b : SignedOrbit,
5628      SignedOrbit.lt (SignedOrbit.sub a a) b ↔
5629        SignedOrbit.lt SignedOrbit.zero b
5630  signed_lt_sub_self_right_iff :
5631    ∀ a b : SignedOrbit,
5632      SignedOrbit.lt b (SignedOrbit.sub a a) ↔
5633        SignedOrbit.lt b SignedOrbit.zero
5634  signed_cmp_sub_self_left :
5635    ∀ a b : SignedOrbit,
5636      SignedOrbit.cmp (SignedOrbit.sub a a) b =
5637        SignedOrbit.cmp SignedOrbit.zero b
5638  signed_cmp_sub_self_right :
5639    ∀ a b : SignedOrbit,
5640      SignedOrbit.cmp b (SignedOrbit.sub a a) =
5641        SignedOrbit.cmp b SignedOrbit.zero
5642  signed_nonnegFlag_sub_zero :
5643    ∀ a : SignedOrbit,
5644      (SignedOrbit.sub a SignedOrbit.zero).nonnegFlag = a.nonnegFlag
5645  signed_negativeFlag_sub_zero :
5646    ∀ a : SignedOrbit,
5647      (SignedOrbit.sub a SignedOrbit.zero).negativeFlag = a.negativeFlag
5648  signed_nonnegFlag_zero_sub :
5649    ∀ a : SignedOrbit,
5650      (SignedOrbit.sub SignedOrbit.zero a).nonnegFlag =
5651        (SignedOrbit.negate a).nonnegFlag
5652  signed_negativeFlag_zero_sub :
5653    ∀ a : SignedOrbit,
5654      (SignedOrbit.sub SignedOrbit.zero a).negativeFlag =
5655        (SignedOrbit.negate a).negativeFlag
5656  signed_nonnegFlag_sub_self :
5657    ∀ a : SignedOrbit,
5658      (SignedOrbit.sub a a).nonnegFlag = true
5659  signed_negativeFlag_sub_self :
5660    ∀ a : SignedOrbit,
5661      (SignedOrbit.sub a a).negativeFlag = false
5662  signed_nonnegFlag_sub_iff_le :
5663    ∀ a b : SignedOrbit,
5664      (SignedOrbit.sub a b).nonnegFlag = true ↔
5665        SignedOrbit.le b a
5666  signed_nonnegFlag_sub_eq_false_iff_lt :
5667    ∀ a b : SignedOrbit,
5668      (SignedOrbit.sub a b).nonnegFlag = false ↔
5669        SignedOrbit.lt a b
5670  signed_negativeFlag_sub_iff_lt :
5671    ∀ a b : SignedOrbit,
5672      (SignedOrbit.sub a b).negativeFlag = true ↔
5673        SignedOrbit.lt a b
5674  signed_negativeFlag_sub_eq_false_iff_le :
5675    ∀ a b : SignedOrbit,
5676      (SignedOrbit.sub a b).negativeFlag = false ↔
5677        SignedOrbit.le b a
5678  signed_le_iff_nonnegFlag_sub :
5679    ∀ a b : SignedOrbit,
5680      SignedOrbit.le a b ↔
5681        (SignedOrbit.sub b a).nonnegFlag = true
5682  signed_lt_iff_nonnegFlag_sub_eq_false :
5683    ∀ a b : SignedOrbit,
5684      SignedOrbit.lt a b ↔
5685        (SignedOrbit.sub a b).nonnegFlag = false
5686  signed_lt_iff_negativeFlag_sub :
5687    ∀ a b : SignedOrbit,
5688      SignedOrbit.lt a b ↔
5689        (SignedOrbit.sub a b).negativeFlag = true
5690  signed_le_iff_negativeFlag_sub_eq_false :
5691    ∀ a b : SignedOrbit,
5692      SignedOrbit.le a b ↔
5693        (SignedOrbit.sub b a).negativeFlag = false
5694  signed_nonnegFlag_mul_ofOrbit_right_of_ne_zero :
5695    ∀ z : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5696      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).nonnegFlag =
5697        z.nonnegFlag
5698  signed_negativeFlag_mul_ofOrbit_right_of_ne_zero :
5699    ∀ z : SignedOrbit, ∀ d : DistinctionNat, d ≠ DistinctionNat.zero →
5700      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).negativeFlag =
5701        z.negativeFlag
5702  signed_nonnegFlag_mul_ofOrbit_left_of_ne_zero :
5703    ∀ d : DistinctionNat, ∀ z : SignedOrbit, d ≠ DistinctionNat.zero →
5704      (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).nonnegFlag =
5705        z.nonnegFlag
5706  signed_negativeFlag_mul_ofOrbit_left_of_ne_zero :
5707    ∀ d : DistinctionNat, ∀ z : SignedOrbit, d ≠ DistinctionNat.zero →
5708      (SignedOrbit.mul (SignedOrbit.ofOrbit d) z).negativeFlag =
5709        z.negativeFlag
5710  signed_le_congr_left_of_balanced :
5711    ∀ {a a' b : SignedOrbit}, SignedOrbit.balanced a a' →
5712      (SignedOrbit.le a b ↔ SignedOrbit.le a' b)
5713  signed_le_congr_right_of_balanced :
5714    ∀ {a b b' : SignedOrbit}, SignedOrbit.balanced b b' →
5715      (SignedOrbit.le a b ↔ SignedOrbit.le a b')
5716  signed_lt_congr_left_of_balanced :
5717    ∀ {a a' b : SignedOrbit}, SignedOrbit.balanced a a' →
5718      (SignedOrbit.lt a b ↔ SignedOrbit.lt a' b)
5719  signed_lt_congr_right_of_balanced :
5720    ∀ {a b b' : SignedOrbit}, SignedOrbit.balanced b b' →
5721      (SignedOrbit.lt a b ↔ SignedOrbit.lt a b')
5722  signed_le_congr_of_balanced :
5723    ∀ {a a' b b' : SignedOrbit},
5724      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5725        (SignedOrbit.le a b ↔ SignedOrbit.le a' b')
5726  signed_lt_congr_of_balanced :
5727    ∀ {a a' b b' : SignedOrbit},
5728      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5729        (SignedOrbit.lt a b ↔ SignedOrbit.lt a' b')
5730  signed_cmp_lt :
5731    ∀ {a b : SignedOrbit},
5732      SignedOrbit.lt a b → SignedOrbit.cmp a b = Ordering.lt
5733  signed_cmp_eq :
5734    ∀ {a b : SignedOrbit},
5735      SignedOrbit.balanced a b → SignedOrbit.cmp a b = Ordering.eq
5736  signed_cmp_gt :
5737    ∀ {a b : SignedOrbit},
5738      SignedOrbit.lt b a → SignedOrbit.cmp a b = Ordering.gt
5739  signed_cmp_lt_iff :
5740    ∀ a b : SignedOrbit,
5741      SignedOrbit.cmp a b = Ordering.lt ↔ SignedOrbit.lt a b
5742  signed_cmp_eq_iff :
5743    ∀ a b : SignedOrbit,
5744      SignedOrbit.cmp a b = Ordering.eq ↔ SignedOrbit.balanced a b
5745  signed_cmp_gt_iff :
5746    ∀ a b : SignedOrbit,
5747      SignedOrbit.cmp a b = Ordering.gt ↔ SignedOrbit.lt b a
5748  signed_cmp_congr_of_balanced :
5749    ∀ {a a' b b' : SignedOrbit},
5750      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5751        SignedOrbit.cmp a b = SignedOrbit.cmp a' b'
5752  signed_balanced_add_left_iff :
5753    ∀ a b c : SignedOrbit,
5754      SignedOrbit.balanced (SignedOrbit.add c a) (SignedOrbit.add c b) ↔
5755        SignedOrbit.balanced a b
5756  signed_balanced_add_right_iff :
5757    ∀ a b c : SignedOrbit,
5758      SignedOrbit.balanced (SignedOrbit.add a c) (SignedOrbit.add b c) ↔
5759        SignedOrbit.balanced a b
5760  signed_balanced_negate_iff :
5761    ∀ a b : SignedOrbit,
5762      SignedOrbit.balanced (SignedOrbit.negate a) (SignedOrbit.negate b) ↔
5763        SignedOrbit.balanced a b
5764  signed_abs_zero_iff_balanced_zero :
5765    ∀ z : SignedOrbit,
5766      z.abs = DistinctionNat.zero ↔ SignedOrbit.balanced z SignedOrbit.zero
5767  signed_abs_nonnegative_branch :
5768    ∀ {z : SignedOrbit},
5769      z.nonnegFlag = true → (z.abs.toNat : ℤ) = z.toInt
5770  signed_abs_negative_branch :
5771    ∀ {z : SignedOrbit},
5772      z.negativeFlag = true → (z.abs.toNat : ℤ) = -z.toInt
5773  signed_balanced_of_nonnegFlag :
5774    ∀ {z : SignedOrbit},
5775      z.nonnegFlag = true →
5776        SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs)
5777  signed_balanced_of_negativeFlag :
5778    ∀ {z : SignedOrbit},
5779      z.negativeFlag = true →
5780        SignedOrbit.balanced z
5781          (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs))
5782  signed_balanced_sign_canonical :
5783    ∀ z : SignedOrbit,
5784      (z.nonnegFlag = true ∧
5785        SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs)) ∨
5786        (z.negativeFlag = true ∧
5787          SignedOrbit.balanced z
5788            (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)))
5789  signed_balanced_ofOrbit_abs_iff_nonnegFlag :
5790    ∀ z : SignedOrbit,
5791      SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) ↔
5792        z.nonnegFlag = true
5793  signed_balanced_negate_ofOrbit_abs_iff_negate_nonnegFlag :
5794    ∀ z : SignedOrbit,
5795      SignedOrbit.balanced z
5796        (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) ↔
5797          (SignedOrbit.negate z).nonnegFlag = true
5798  signed_balanced_negate_ofOrbit_abs_iff_negativeFlag_or_balanced_zero :
5799    ∀ z : SignedOrbit,
5800      SignedOrbit.balanced z
5801        (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) ↔
5802          z.negativeFlag = true ∨ SignedOrbit.balanced z SignedOrbit.zero
5803  signed_balanced_both_abs_representatives_iff_balanced_zero :
5804    ∀ z : SignedOrbit,
5805      (SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) ∧
5806        SignedOrbit.balanced z
5807          (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs))) ↔
5808            SignedOrbit.balanced z SignedOrbit.zero
5809  signed_balanced_zero_of_both_abs_representatives :
5810    ∀ {z : SignedOrbit},
5811      SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) →
5812        SignedOrbit.balanced z
5813          (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) →
5814            SignedOrbit.balanced z SignedOrbit.zero
5815  signed_not_both_abs_representatives_of_not_balanced_zero :
5816    ∀ {z : SignedOrbit},
5817      ¬ SignedOrbit.balanced z SignedOrbit.zero →
5818        ¬ (SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs) ∧
5819          SignedOrbit.balanced z
5820            (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)))
5821  signed_not_balanced_ofOrbit_abs_of_negativeFlag :
5822    ∀ {z : SignedOrbit},
5823      z.negativeFlag = true →
5824        ¬ SignedOrbit.balanced z (SignedOrbit.ofOrbit z.abs)
5825  signed_balanced_negate_ofOrbit_abs_iff_balanced_zero_of_nonnegFlag :
5826    ∀ {z : SignedOrbit},
5827      z.nonnegFlag = true →
5828        (SignedOrbit.balanced z
5829          (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) ↔
5830            SignedOrbit.balanced z SignedOrbit.zero)
5831  signed_abs_balanced_invariant :
5832    ∀ {z w : SignedOrbit},
5833      SignedOrbit.balanced z w → z.abs = w.abs
5834  signed_abs_sub_eq_of_balanced_left :
5835    ∀ {a a' b : SignedOrbit},
5836      SignedOrbit.balanced a a' →
5837        (SignedOrbit.sub a b).abs = (SignedOrbit.sub a' b).abs
5838  signed_abs_sub_eq_of_balanced_right :
5839    ∀ {a b b' : SignedOrbit},
5840      SignedOrbit.balanced b b' →
5841        (SignedOrbit.sub a b).abs = (SignedOrbit.sub a b').abs
5842  signed_abs_sub_eq_of_balanced :
5843    ∀ {a a' b b' : SignedOrbit},
5844      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5845        (SignedOrbit.sub a b).abs = (SignedOrbit.sub a' b').abs
5846  signed_abs_sub_eq_zero_iff_of_balanced_left :
5847    ∀ {a a' b : SignedOrbit},
5848      SignedOrbit.balanced a a' →
5849        ((SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
5850          (SignedOrbit.sub a' b).abs = DistinctionNat.zero)
5851  signed_abs_sub_eq_zero_iff_of_balanced_right :
5852    ∀ {a b b' : SignedOrbit},
5853      SignedOrbit.balanced b b' →
5854        ((SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
5855          (SignedOrbit.sub a b').abs = DistinctionNat.zero)
5856  signed_abs_sub_eq_zero_iff_of_balanced :
5857    ∀ {a a' b b' : SignedOrbit},
5858      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5859        ((SignedOrbit.sub a b).abs = DistinctionNat.zero ↔
5860          (SignedOrbit.sub a' b').abs = DistinctionNat.zero)
5861  signed_abs_sub_ne_zero_iff_of_balanced_left :
5862    ∀ {a a' b : SignedOrbit},
5863      SignedOrbit.balanced a a' →
5864        ((SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
5865          (SignedOrbit.sub a' b).abs ≠ DistinctionNat.zero)
5866  signed_abs_sub_ne_zero_iff_of_balanced_right :
5867    ∀ {a b b' : SignedOrbit},
5868      SignedOrbit.balanced b b' →
5869        ((SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
5870          (SignedOrbit.sub a b').abs ≠ DistinctionNat.zero)
5871  signed_abs_sub_ne_zero_iff_of_balanced :
5872    ∀ {a a' b b' : SignedOrbit},
5873      SignedOrbit.balanced a a' → SignedOrbit.balanced b b' →
5874        ((SignedOrbit.sub a b).abs ≠ DistinctionNat.zero ↔
5875          (SignedOrbit.sub a' b').abs ≠ DistinctionNat.zero)
5876  signed_le_add_left_iff :
5877    ∀ a b c : SignedOrbit,
5878      SignedOrbit.le (SignedOrbit.add c a) (SignedOrbit.add c b) ↔
5879        SignedOrbit.le a b
5880  signed_le_add_right_iff :
5881    ∀ a b c : SignedOrbit,
5882      SignedOrbit.le (SignedOrbit.add a c) (SignedOrbit.add b c) ↔
5883        SignedOrbit.le a b
5884  signed_lt_add_left_iff :
5885    ∀ a b c : SignedOrbit,
5886      SignedOrbit.lt (SignedOrbit.add c a) (SignedOrbit.add c b) ↔
5887        SignedOrbit.lt a b
5888  signed_lt_add_right_iff :
5889    ∀ a b c : SignedOrbit,
5890      SignedOrbit.lt (SignedOrbit.add a c) (SignedOrbit.add b c) ↔
5891        SignedOrbit.lt a b
5892  signed_add_le_add :
5893    ∀ {a b c d : SignedOrbit},
5894      SignedOrbit.le a b → SignedOrbit.le c d →
5895        SignedOrbit.le (SignedOrbit.add a c) (SignedOrbit.add b d)
5896  signed_add_lt_add_left :
5897    ∀ {a b c : SignedOrbit},
5898      SignedOrbit.lt a b →
5899        SignedOrbit.lt (SignedOrbit.add c a) (SignedOrbit.add c b)
5900  signed_add_lt_add_right :
5901    ∀ {a b c : SignedOrbit},
5902      SignedOrbit.lt a b →
5903        SignedOrbit.lt (SignedOrbit.add a c) (SignedOrbit.add b c)
5904  signed_negate_le_negate_iff :
5905    ∀ a b : SignedOrbit,
5906      SignedOrbit.le (SignedOrbit.negate b) (SignedOrbit.negate a) ↔
5907        SignedOrbit.le a b
5908  signed_negate_lt_negate_iff :
5909    ∀ a b : SignedOrbit,
5910      SignedOrbit.lt (SignedOrbit.negate b) (SignedOrbit.negate a) ↔
5911        SignedOrbit.lt a b
5912  signed_cmp_add_left :
5913    ∀ a b c : SignedOrbit,
5914      SignedOrbit.cmp (SignedOrbit.add c a) (SignedOrbit.add c b) =
5915        SignedOrbit.cmp a b
5916  signed_cmp_add_right :
5917    ∀ a b c : SignedOrbit,
5918      SignedOrbit.cmp (SignedOrbit.add a c) (SignedOrbit.add b c) =
5919        SignedOrbit.cmp a b
5920  signed_cmp_negate_swap :
5921    ∀ a b : SignedOrbit,
5922      SignedOrbit.cmp (SignedOrbit.negate b) (SignedOrbit.negate a) =
5923        SignedOrbit.cmp a b
5924  signed_abs_negate :
5925    ∀ z : SignedOrbit, (SignedOrbit.negate z).abs = z.abs
5926  signed_abs_ofOrbit :
5927    ∀ n : DistinctionNat, (SignedOrbit.ofOrbit n).abs = n
5928  signed_abs_negate_ofOrbit :
5929    ∀ n : DistinctionNat,
5930      (SignedOrbit.negate (SignedOrbit.ofOrbit n)).abs = n
5931  signed_nonnegFlag_ofOrbit :
5932    ∀ n : DistinctionNat, (SignedOrbit.ofOrbit n).nonnegFlag = true
5933  signed_negativeFlag_ofOrbit :
5934    ∀ n : DistinctionNat, (SignedOrbit.ofOrbit n).negativeFlag = false
5935  signed_nonnegFlag_negate_ofOrbit_of_ne_zero :
5936    ∀ n : DistinctionNat, n ≠ DistinctionNat.zero →
5937      (SignedOrbit.negate (SignedOrbit.ofOrbit n)).nonnegFlag = false
5938  signed_negativeFlag_negate_ofOrbit_of_ne_zero :
5939    ∀ n : DistinctionNat, n ≠ DistinctionNat.zero →
5940      (SignedOrbit.negate (SignedOrbit.ofOrbit n)).negativeFlag = true
5941  signed_negate_ofOrbit_not_balanced_zero_of_ne_zero :
5942    ∀ n : DistinctionNat, n ≠ DistinctionNat.zero →
5943      ¬ SignedOrbit.balanced
5944        (SignedOrbit.negate (SignedOrbit.ofOrbit n)) SignedOrbit.zero
5945  signed_nonnegFlag_negate_ofOrbit_eq_true_iff_zero :
5946    ∀ n : DistinctionNat,
5947      (SignedOrbit.negate (SignedOrbit.ofOrbit n)).nonnegFlag = true ↔
5948        n = DistinctionNat.zero
5949  signed_negativeFlag_negate_ofOrbit_eq_true_iff_ne_zero :
5950    ∀ n : DistinctionNat,
5951      (SignedOrbit.negate (SignedOrbit.ofOrbit n)).negativeFlag = true ↔
5952        n ≠ DistinctionNat.zero
5953  signed_negate_ofOrbit_balanced_zero_iff :
5954    ∀ n : DistinctionNat,
5955      SignedOrbit.balanced
5956        (SignedOrbit.negate (SignedOrbit.ofOrbit n)) SignedOrbit.zero ↔
5957          n = DistinctionNat.zero
5958  signed_abs_add_le_add_abs :
5959    ∀ z w : SignedOrbit,
5960      DistinctionNat.leq (SignedOrbit.add z w).abs (z.abs + w.abs) = true
5961  signed_abs_sub_le_add_abs :
5962    ∀ z w : SignedOrbit,
5963      DistinctionNat.leq (SignedOrbit.sub z w).abs (z.abs + w.abs) = true
5964  signed_abs_le_iff_between :
5965    ∀ z : SignedOrbit, ∀ n : DistinctionNat,
5966      DistinctionNat.leq z.abs n = true ↔
5967        SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z ∧
5968          SignedOrbit.le z (SignedOrbit.ofOrbit n)
5969  signed_between_of_abs_le :
5970    ∀ {z : SignedOrbit}, ∀ {n : DistinctionNat},
5971      DistinctionNat.leq z.abs n = true →
5972        SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z ∧
5973          SignedOrbit.le z (SignedOrbit.ofOrbit n)
5974  signed_abs_le_of_between :
5975    ∀ {z : SignedOrbit}, ∀ {n : DistinctionNat},
5976      SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z →
5977        SignedOrbit.le z (SignedOrbit.ofOrbit n) →
5978          DistinctionNat.leq z.abs n = true
5979  signed_neg_abs_le_self :
5980    ∀ z : SignedOrbit,
5981      SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit z.abs)) z
5982  signed_self_le_abs :
5983    ∀ z : SignedOrbit,
5984      SignedOrbit.le z (SignedOrbit.ofOrbit z.abs)
5985  signed_abs_le_trans :
5986    ∀ {z : SignedOrbit}, ∀ {n m : DistinctionNat},
5987      DistinctionNat.leq z.abs n = true →
5988        DistinctionNat.leq n m = true →
5989          DistinctionNat.leq z.abs m = true
5990  signed_between_mono :
5991    ∀ {z : SignedOrbit}, ∀ {n m : DistinctionNat},
5992      (SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit n)) z ∧
5993        SignedOrbit.le z (SignedOrbit.ofOrbit n)) →
5994          DistinctionNat.leq n m = true →
5995            SignedOrbit.le (SignedOrbit.negate (SignedOrbit.ofOrbit m)) z ∧
5996              SignedOrbit.le z (SignedOrbit.ofOrbit m)
5997  ratio_recip_den_internal :
5998    ∀ (a : RatioOrbit)
5999      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6000      (RatioOrbit.recipNonzero a h).den = a.num.abs
6001  ratio_recip_num_nonnegative_branch :
6002    ∀ {a : RatioOrbit}
6003      {h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero},
6004      a.num.nonnegFlag = true →
6005        (RatioOrbit.recipNonzero a h).num = SignedOrbit.ofOrbit a.den
6006  ratio_recip_num_negative_branch :
6007    ∀ {a : RatioOrbit}
6008      {h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero},
6009      a.num.negativeFlag = true →
6010        (RatioOrbit.recipNonzero a h).num =
6011          SignedOrbit.negate (SignedOrbit.ofOrbit a.den)
6012  ratio_recip_num_abs_eq_den :
6013    ∀ (a : RatioOrbit)
6014      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6015      (RatioOrbit.recipNonzero a h).num.abs = a.den
6016  ratio_recip_num_not_balanced_zero :
6017    ∀ (a : RatioOrbit)
6018      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6019      ¬ SignedOrbit.balanced
6020        (RatioOrbit.recipNonzero a h).num SignedOrbit.zero
6021  ratio_recip_num_nonnegFlag_eq :
6022    ∀ (a : RatioOrbit)
6023      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6024      (RatioOrbit.recipNonzero a h).num.nonnegFlag = a.num.nonnegFlag
6025  ratio_recip_num_negativeFlag_eq :
6026    ∀ (a : RatioOrbit)
6027      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6028      (RatioOrbit.recipNonzero a h).num.negativeFlag = a.num.negativeFlag
6029  ratio_recip_num_zero_le_iff :
6030    ∀ (a : RatioOrbit)
6031      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6032      SignedOrbit.le SignedOrbit.zero (RatioOrbit.recipNonzero a h).num ↔
6033        SignedOrbit.le SignedOrbit.zero a.num
6034  ratio_recip_num_lt_zero_iff :
6035    ∀ (a : RatioOrbit)
6036      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6037      SignedOrbit.lt (RatioOrbit.recipNonzero a h).num SignedOrbit.zero ↔
6038        SignedOrbit.lt a.num SignedOrbit.zero
6039  ratio_recip_num_zero_lt_iff :
6040    ∀ (a : RatioOrbit)
6041      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6042      SignedOrbit.lt SignedOrbit.zero (RatioOrbit.recipNonzero a h).num ↔
6043        SignedOrbit.lt SignedOrbit.zero a.num
6044  ratio_recip_num_cmp_zero :
6045    ∀ (a : RatioOrbit)
6046      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6047      SignedOrbit.cmp (RatioOrbit.recipNonzero a h).num SignedOrbit.zero =
6048        SignedOrbit.cmp a.num SignedOrbit.zero
6049  ratio_recip_num_zero_cmp :
6050    ∀ (a : RatioOrbit)
6051      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6052      SignedOrbit.cmp SignedOrbit.zero (RatioOrbit.recipNonzero a h).num =
6053        SignedOrbit.cmp SignedOrbit.zero a.num
6054  ratio_recip_num_balanced_ofOrbit_den_iff_nonnegFlag :
6055    ∀ (a : RatioOrbit)
6056      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6057      SignedOrbit.balanced
6058          (RatioOrbit.recipNonzero a h).num (SignedOrbit.ofOrbit a.den) ↔
6059        a.num.nonnegFlag = true
6060  ratio_recip_num_balanced_negate_ofOrbit_den_iff_negativeFlag :
6061    ∀ (a : RatioOrbit)
6062      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6063      SignedOrbit.balanced
6064          (RatioOrbit.recipNonzero a h).num
6065          (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
6066        a.num.negativeFlag = true
6067  ratio_recip_num_not_balanced_ofOrbit_den_iff_negativeFlag :
6068    ∀ (a : RatioOrbit)
6069      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6070      ¬ SignedOrbit.balanced
6071          (RatioOrbit.recipNonzero a h).num (SignedOrbit.ofOrbit a.den) ↔
6072        a.num.negativeFlag = true
6073  ratio_recip_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag :
6074    ∀ (a : RatioOrbit)
6075      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6076      ¬ SignedOrbit.balanced
6077          (RatioOrbit.recipNonzero a h).num
6078          (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
6079        a.num.nonnegFlag = true
6080  ratio_num_mul_recip_num_balanced_den_mul_abs :
6081    ∀ (a : RatioOrbit)
6082      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6083      SignedOrbit.balanced
6084        (SignedOrbit.mul a.num (RatioOrbit.recipNonzero a h).num)
6085        (SignedOrbit.ofOrbit (a.den * a.num.abs))
6086  ratio_mul_recipNonzero_crossEq_one :
6087    ∀ (a : RatioOrbit)
6088      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6089      RatioOrbit.crossEq (RatioOrbit.mul a (RatioOrbit.recipNonzero a h))
6090        RatioOrbit.one
6091  ratio_recip_num_mul_num_balanced_den_mul_abs :
6092    ∀ (a : RatioOrbit)
6093      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6094      SignedOrbit.balanced
6095        (SignedOrbit.mul (RatioOrbit.recipNonzero a h).num a.num)
6096        (SignedOrbit.ofOrbit (a.den * a.num.abs))
6097  ratio_recipNonzero_mul_crossEq_one :
6098    ∀ (a : RatioOrbit)
6099      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6100      RatioOrbit.crossEq (RatioOrbit.mul (RatioOrbit.recipNonzero a h) a)
6101        RatioOrbit.one
6102  ratio_recip_eq_recipNonzero_of_not_balanced_zero :
6103    ∀ (a : RatioOrbit)
6104      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6105      RatioOrbit.recip a = RatioOrbit.recipNonzero a h
6106  ratio_mul_recip_crossEq_one_of_not_balanced_zero :
6107    ∀ (a : RatioOrbit)
6108      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6109      RatioOrbit.crossEq (RatioOrbit.mul a (RatioOrbit.recip a))
6110        RatioOrbit.one
6111  ratio_recip_mul_crossEq_one_of_not_balanced_zero :
6112    ∀ (a : RatioOrbit)
6113      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6114      RatioOrbit.crossEq (RatioOrbit.mul (RatioOrbit.recip a) a)
6115        RatioOrbit.one
6116  ratio_recip_den_eq_abs_of_not_balanced_zero :
6117    ∀ (a : RatioOrbit)
6118      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6119      (RatioOrbit.recip a).den = a.num.abs
6120  ratio_recip_num_abs_eq_den_of_not_balanced_zero :
6121    ∀ (a : RatioOrbit)
6122      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6123      (RatioOrbit.recip a).num.abs = a.den
6124  ratio_recip_num_not_balanced_zero_of_not_balanced_zero :
6125    ∀ (a : RatioOrbit)
6126      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6127      ¬ SignedOrbit.balanced (RatioOrbit.recip a).num SignedOrbit.zero
6128  ratio_recip_num_nonnegFlag_eq_of_not_balanced_zero :
6129    ∀ (a : RatioOrbit)
6130      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6131      (RatioOrbit.recip a).num.nonnegFlag = a.num.nonnegFlag
6132  ratio_recip_num_negativeFlag_eq_of_not_balanced_zero :
6133    ∀ (a : RatioOrbit)
6134      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6135      (RatioOrbit.recip a).num.negativeFlag = a.num.negativeFlag
6136  ratio_recip_num_zero_le_iff_of_not_balanced_zero :
6137    ∀ (a : RatioOrbit)
6138      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6139      SignedOrbit.le SignedOrbit.zero (RatioOrbit.recip a).num ↔
6140        SignedOrbit.le SignedOrbit.zero a.num
6141  ratio_recip_num_lt_zero_iff_of_not_balanced_zero :
6142    ∀ (a : RatioOrbit)
6143      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6144      SignedOrbit.lt (RatioOrbit.recip a).num SignedOrbit.zero ↔
6145        SignedOrbit.lt a.num SignedOrbit.zero
6146  ratio_recip_num_zero_lt_iff_of_not_balanced_zero :
6147    ∀ (a : RatioOrbit)
6148      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6149      SignedOrbit.lt SignedOrbit.zero (RatioOrbit.recip a).num ↔
6150        SignedOrbit.lt SignedOrbit.zero a.num
6151  ratio_recip_num_cmp_zero_of_not_balanced_zero :
6152    ∀ (a : RatioOrbit)
6153      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6154      SignedOrbit.cmp (RatioOrbit.recip a).num SignedOrbit.zero =
6155        SignedOrbit.cmp a.num SignedOrbit.zero
6156  ratio_recip_num_zero_cmp_of_not_balanced_zero :
6157    ∀ (a : RatioOrbit)
6158      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6159      SignedOrbit.cmp SignedOrbit.zero (RatioOrbit.recip a).num =
6160        SignedOrbit.cmp SignedOrbit.zero a.num
6161  ratio_recip_num_balanced_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero :
6162    ∀ (a : RatioOrbit)
6163      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6164      SignedOrbit.balanced
6165          (RatioOrbit.recip a).num (SignedOrbit.ofOrbit a.den) ↔
6166        a.num.nonnegFlag = true
6167  ratio_recip_num_balanced_negate_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero :
6168    ∀ (a : RatioOrbit)
6169      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6170      SignedOrbit.balanced
6171          (RatioOrbit.recip a).num
6172          (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
6173        a.num.negativeFlag = true
6174  ratio_recip_num_not_balanced_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero :
6175    ∀ (a : RatioOrbit)
6176      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6177      ¬ SignedOrbit.balanced
6178          (RatioOrbit.recip a).num (SignedOrbit.ofOrbit a.den) ↔
6179        a.num.negativeFlag = true
6180  ratio_recip_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero :
6181    ∀ (a : RatioOrbit)
6182      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6183      ¬ SignedOrbit.balanced
6184          (RatioOrbit.recip a).num
6185          (SignedOrbit.negate (SignedOrbit.ofOrbit a.den)) ↔
6186        a.num.nonnegFlag = true
6187  ratio_recip_num_nonnegative_branch_of_not_balanced_zero :
6188    ∀ {a : RatioOrbit}
6189      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6190      a.num.nonnegFlag = true →
6191        (RatioOrbit.recip a).num = SignedOrbit.ofOrbit a.den
6192  ratio_recip_num_negative_branch_of_not_balanced_zero :
6193    ∀ {a : RatioOrbit}
6194      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6195      a.num.negativeFlag = true →
6196        (RatioOrbit.recip a).num =
6197          SignedOrbit.negate (SignedOrbit.ofOrbit a.den)
6198  ratio_num_mul_recip_num_balanced_den_mul_abs_of_not_balanced_zero :
6199    ∀ (a : RatioOrbit)
6200      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6201      SignedOrbit.balanced
6202        (SignedOrbit.mul a.num (RatioOrbit.recip a).num)
6203        (SignedOrbit.ofOrbit (a.den * a.num.abs))
6204  ratio_recip_num_mul_num_balanced_den_mul_abs_of_not_balanced_zero :
6205    ∀ (a : RatioOrbit)
6206      (_h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6207      SignedOrbit.balanced
6208        (SignedOrbit.mul (RatioOrbit.recip a).num a.num)
6209        (SignedOrbit.ofOrbit (a.den * a.num.abs))
6210  ratio_recip_num_balanced_zero_iff :
6211    ∀ a : RatioOrbit,
6212      SignedOrbit.balanced (RatioOrbit.recip a).num SignedOrbit.zero ↔
6213        SignedOrbit.balanced a.num SignedOrbit.zero
6214  ratio_recip_num_not_balanced_zero_iff :
6215    ∀ a : RatioOrbit,
6216      ¬ SignedOrbit.balanced (RatioOrbit.recip a).num SignedOrbit.zero ↔
6217        ¬ SignedOrbit.balanced a.num SignedOrbit.zero
6218  ratio_crossEq_zero_iff_num_balanced_zero :
6219    ∀ a : RatioOrbit,
6220      RatioOrbit.crossEq a RatioOrbit.zero ↔
6221        SignedOrbit.balanced a.num SignedOrbit.zero
6222  ratio_zero_crossEq_iff_num_balanced_zero :
6223    ∀ a : RatioOrbit,
6224      RatioOrbit.crossEq RatioOrbit.zero a ↔
6225        SignedOrbit.balanced a.num SignedOrbit.zero
6226  ratio_recip_crossEq_zero_iff_num_balanced_zero :
6227    ∀ a : RatioOrbit,
6228      RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
6229        SignedOrbit.balanced a.num SignedOrbit.zero
6230  ratio_zero_crossEq_recip_iff_num_balanced_zero :
6231    ∀ a : RatioOrbit,
6232      RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
6233        SignedOrbit.balanced a.num SignedOrbit.zero
6234  ratio_recip_crossEq_zero_iff_crossEq_zero :
6235    ∀ a : RatioOrbit,
6236      RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
6237        RatioOrbit.crossEq a RatioOrbit.zero
6238  ratio_zero_crossEq_recip_iff_zero_crossEq :
6239    ∀ a : RatioOrbit,
6240      RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
6241        RatioOrbit.crossEq RatioOrbit.zero a
6242  ratio_recip_crossEq_zero_iff_zero_crossEq :
6243    ∀ a : RatioOrbit,
6244      RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
6245        RatioOrbit.crossEq RatioOrbit.zero a
6246  ratio_zero_crossEq_recip_iff_crossEq_zero :
6247    ∀ a : RatioOrbit,
6248      RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
6249        RatioOrbit.crossEq a RatioOrbit.zero
6250  ratio_recip_not_crossEq_zero_iff_not_crossEq_zero :
6251    ∀ a : RatioOrbit,
6252      ¬ RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
6253        ¬ RatioOrbit.crossEq a RatioOrbit.zero
6254  ratio_zero_not_crossEq_recip_iff_zero_not_crossEq :
6255    ∀ a : RatioOrbit,
6256      ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
6257        ¬ RatioOrbit.crossEq RatioOrbit.zero a
6258  ratio_recip_not_crossEq_zero_iff_zero_not_crossEq :
6259    ∀ a : RatioOrbit,
6260      ¬ RatioOrbit.crossEq (RatioOrbit.recip a) RatioOrbit.zero ↔
6261        ¬ RatioOrbit.crossEq RatioOrbit.zero a
6262  ratio_zero_not_crossEq_recip_iff_not_crossEq_zero :
6263    ∀ a : RatioOrbit,
6264      ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip a) ↔
6265        ¬ RatioOrbit.crossEq a RatioOrbit.zero
6266  ratio_recip_recipNonzero_crossEq_self :
6267    ∀ (a : RatioOrbit)
6268      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6269      RatioOrbit.crossEq (RatioOrbit.recip (RatioOrbit.recipNonzero a h)) a
6270  ratio_self_crossEq_recip_recipNonzero :
6271    ∀ (a : RatioOrbit)
6272      (h : ¬ SignedOrbit.balanced a.num SignedOrbit.zero),
6273      RatioOrbit.crossEq a (RatioOrbit.recip (RatioOrbit.recipNonzero a h))
6274  ratio_recip_recip_crossEq_self :
6275    ∀ a : RatioOrbit,
6276      RatioOrbit.crossEq (RatioOrbit.recip (RatioOrbit.recip a)) a
6277  ratio_self_crossEq_recip_recip :
6278    ∀ a : RatioOrbit,
6279      RatioOrbit.crossEq a (RatioOrbit.recip (RatioOrbit.recip a))
6280  ratio_recip_crossEq_congr :
6281    ∀ {a b : RatioOrbit},
6282      RatioOrbit.crossEq a b →
6283        RatioOrbit.crossEq (RatioOrbit.recip a) (RatioOrbit.recip b)
6284  ratio_recip_crossEq_iff :
6285    ∀ a b : RatioOrbit,
6286      RatioOrbit.crossEq (RatioOrbit.recip a) (RatioOrbit.recip b) ↔
6287        RatioOrbit.crossEq a b
6288  ratio_recip_crossEq_iff_crossEq_recip :
6289    ∀ a b : RatioOrbit,
6290      RatioOrbit.crossEq (RatioOrbit.recip a) b ↔
6291        RatioOrbit.crossEq a (RatioOrbit.recip b)
6292  ratio_crossEq_recip_iff_recip_crossEq :
6293    ∀ a b : RatioOrbit,
6294      RatioOrbit.crossEq a (RatioOrbit.recip b) ↔
6295        RatioOrbit.crossEq (RatioOrbit.recip a) b
6296  ratio_mul_crossEq_one_iff_crossEq_recip_of_right_not_crossEq_zero :
6297    ∀ a b : RatioOrbit,
6298      ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6299        (
6300        RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6301          RatioOrbit.crossEq a (RatioOrbit.recip b))
6302  ratio_mul_crossEq_one_iff_crossEq_recip_of_left_not_crossEq_zero :
6303    ∀ a b : RatioOrbit,
6304      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6305        (
6306        RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6307          RatioOrbit.crossEq b (RatioOrbit.recip a))
6308  ratio_mul_recip_cancel_right_crossEq_self_of_right_not_crossEq_zero :
6309    ∀ a b : RatioOrbit,
6310      ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6311        RatioOrbit.crossEq
6312          (RatioOrbit.mul (RatioOrbit.mul a b) (RatioOrbit.recip b)) a
6313  ratio_recip_mul_cancel_left_crossEq_self_of_left_not_crossEq_zero :
6314    ∀ a b : RatioOrbit,
6315      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6316        RatioOrbit.crossEq
6317          (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.mul a b)) b
6318  ratio_mul_recip_cancel_right_assoc_crossEq_self_of_right_not_crossEq_zero :
6319    ∀ a b : RatioOrbit,
6320      ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6321        RatioOrbit.crossEq
6322          (RatioOrbit.mul (RatioOrbit.mul a (RatioOrbit.recip b)) b) a
6323  ratio_recip_mul_cancel_left_assoc_crossEq_self_of_left_not_crossEq_zero :
6324    ∀ a b : RatioOrbit,
6325      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6326        RatioOrbit.crossEq
6327          (RatioOrbit.mul a (RatioOrbit.mul (RatioOrbit.recip a) b)) b
6328  ratio_mul_right_crossEq_iff_of_not_crossEq_zero :
6329    ∀ a b c : RatioOrbit,
6330      ¬ RatioOrbit.crossEq c RatioOrbit.zero →
6331        (
6332        RatioOrbit.crossEq (RatioOrbit.mul a c) (RatioOrbit.mul b c) ↔
6333          RatioOrbit.crossEq a b)
6334  ratio_mul_left_crossEq_iff_of_not_crossEq_zero :
6335    ∀ a b c : RatioOrbit,
6336      ¬ RatioOrbit.crossEq c RatioOrbit.zero →
6337        (
6338        RatioOrbit.crossEq (RatioOrbit.mul c a) (RatioOrbit.mul c b) ↔
6339          RatioOrbit.crossEq a b)
6340  ratio_mul_crossEq_zero_iff :
6341    ∀ a b : RatioOrbit,
6342      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero ↔
6343        RatioOrbit.crossEq a RatioOrbit.zero ∨
6344          RatioOrbit.crossEq b RatioOrbit.zero
6345  ratio_zero_crossEq_mul_iff :
6346    ∀ a b : RatioOrbit,
6347      RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.mul a b) ↔
6348        RatioOrbit.crossEq a RatioOrbit.zero ∨
6349          RatioOrbit.crossEq b RatioOrbit.zero
6350  ratio_mul_not_crossEq_zero_iff :
6351    ∀ a b : RatioOrbit,
6352      ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero ↔
6353        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6354          ¬ RatioOrbit.crossEq b RatioOrbit.zero
6355  ratio_zero_not_crossEq_mul_iff :
6356    ∀ a b : RatioOrbit,
6357      ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.mul a b) ↔
6358        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6359          ¬ RatioOrbit.crossEq b RatioOrbit.zero
6360  ratio_mul_not_crossEq_zero_of_not_crossEq_zero :
6361    ∀ a b : RatioOrbit,
6362      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6363        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6364          ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero
6365  ratio_zero_not_crossEq_mul_of_not_crossEq_zero :
6366    ∀ a b : RatioOrbit,
6367      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6368        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6369          ¬ RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.mul a b)
6370  ratio_left_not_crossEq_zero_of_mul_not_crossEq_zero :
6371    ∀ a b : RatioOrbit,
6372      ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero →
6373        ¬ RatioOrbit.crossEq a RatioOrbit.zero
6374  ratio_right_not_crossEq_zero_of_mul_not_crossEq_zero :
6375    ∀ a b : RatioOrbit,
6376      ¬ RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.zero →
6377        ¬ RatioOrbit.crossEq b RatioOrbit.zero
6378  ratio_mul_crossEq_congr :
6379    ∀ {a₁ a₂ b₁ b₂ : RatioOrbit},
6380      RatioOrbit.crossEq a₁ a₂ →
6381        RatioOrbit.crossEq b₁ b₂ →
6382          RatioOrbit.crossEq (RatioOrbit.mul a₁ b₁) (RatioOrbit.mul a₂ b₂)
6383  ratio_mul_crossEq_congr_left :
6384    ∀ {a₁ a₂ b : RatioOrbit},
6385      RatioOrbit.crossEq a₁ a₂ →
6386        RatioOrbit.crossEq (RatioOrbit.mul a₁ b) (RatioOrbit.mul a₂ b)
6387  ratio_mul_crossEq_congr_right :
6388    ∀ {a b₁ b₂ : RatioOrbit},
6389      RatioOrbit.crossEq b₁ b₂ →
6390        RatioOrbit.crossEq (RatioOrbit.mul a b₁) (RatioOrbit.mul a b₂)
6391  ratio_mul_comm_crossEq :
6392    ∀ a b : RatioOrbit,
6393      RatioOrbit.crossEq (RatioOrbit.mul a b) (RatioOrbit.mul b a)
6394  ratio_mul_assoc_crossEq :
6395    ∀ a b c : RatioOrbit,
6396      RatioOrbit.crossEq
6397        (RatioOrbit.mul (RatioOrbit.mul a b) c)
6398        (RatioOrbit.mul a (RatioOrbit.mul b c))
6399  ratio_mul_one_crossEq :
6400    ∀ a : RatioOrbit,
6401      RatioOrbit.crossEq (RatioOrbit.mul a RatioOrbit.one) a
6402  ratio_one_mul_crossEq :
6403    ∀ a : RatioOrbit,
6404      RatioOrbit.crossEq (RatioOrbit.mul RatioOrbit.one a) a
6405  ratio_mul_zero_crossEq :
6406    ∀ a : RatioOrbit,
6407      RatioOrbit.crossEq (RatioOrbit.mul a RatioOrbit.zero) RatioOrbit.zero
6408  ratio_zero_mul_crossEq :
6409    ∀ a : RatioOrbit,
6410      RatioOrbit.crossEq (RatioOrbit.mul RatioOrbit.zero a) RatioOrbit.zero
6411  ratio_one_not_crossEq_zero :
6412    ¬ RatioOrbit.crossEq RatioOrbit.one RatioOrbit.zero
6413  ratio_zero_not_crossEq_one :
6414    ¬ RatioOrbit.crossEq RatioOrbit.zero RatioOrbit.one
6415  ratio_recip_zero_crossEq_zero :
6416    RatioOrbit.crossEq (RatioOrbit.recip RatioOrbit.zero) RatioOrbit.zero
6417  ratio_zero_crossEq_recip_zero :
6418    RatioOrbit.crossEq RatioOrbit.zero (RatioOrbit.recip RatioOrbit.zero)
6419  ratio_recip_one_crossEq_one :
6420    RatioOrbit.crossEq (RatioOrbit.recip RatioOrbit.one) RatioOrbit.one
6421  ratio_one_crossEq_recip_one :
6422    RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.recip RatioOrbit.one)
6423  ratio_factors_not_crossEq_zero_of_mul_crossEq_one :
6424    ∀ a b : RatioOrbit,
6425      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6426        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6427          ¬ RatioOrbit.crossEq b RatioOrbit.zero
6428  ratio_left_not_crossEq_zero_of_mul_crossEq_one :
6429    ∀ a b : RatioOrbit,
6430      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6431        ¬ RatioOrbit.crossEq a RatioOrbit.zero
6432  ratio_right_not_crossEq_zero_of_mul_crossEq_one :
6433    ∀ a b : RatioOrbit,
6434      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6435        ¬ RatioOrbit.crossEq b RatioOrbit.zero
6436  ratio_factors_not_crossEq_zero_of_one_crossEq_mul :
6437    ∀ a b : RatioOrbit,
6438      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6439        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6440          ¬ RatioOrbit.crossEq b RatioOrbit.zero
6441  ratio_left_not_crossEq_zero_of_one_crossEq_mul :
6442    ∀ a b : RatioOrbit,
6443      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6444        ¬ RatioOrbit.crossEq a RatioOrbit.zero
6445  ratio_right_not_crossEq_zero_of_one_crossEq_mul :
6446    ∀ a b : RatioOrbit,
6447      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6448        ¬ RatioOrbit.crossEq b RatioOrbit.zero
6449  ratio_crossEq_recip_right_of_mul_crossEq_one :
6450    ∀ a b : RatioOrbit,
6451      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6452        RatioOrbit.crossEq a (RatioOrbit.recip b)
6453  ratio_crossEq_recip_left_of_mul_crossEq_one :
6454    ∀ a b : RatioOrbit,
6455      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6456        RatioOrbit.crossEq b (RatioOrbit.recip a)
6457  ratio_crossEq_recip_right_of_one_crossEq_mul :
6458    ∀ a b : RatioOrbit,
6459      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6460        RatioOrbit.crossEq a (RatioOrbit.recip b)
6461  ratio_crossEq_recip_left_of_one_crossEq_mul :
6462    ∀ a b : RatioOrbit,
6463      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6464        RatioOrbit.crossEq b (RatioOrbit.recip a)
6465  ratio_recip_mul_crossEq_mul_recip_of_not_crossEq_zero :
6466    ∀ a b : RatioOrbit,
6467      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6468        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6469          RatioOrbit.crossEq
6470            (RatioOrbit.recip (RatioOrbit.mul a b))
6471            (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
6472  ratio_mul_recip_crossEq_recip_mul_of_not_crossEq_zero :
6473    ∀ a b : RatioOrbit,
6474      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6475        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6476          RatioOrbit.crossEq
6477            (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
6478            (RatioOrbit.recip (RatioOrbit.mul a b))
6479  ratio_recip_mul_crossEq_mul_recip_comm_of_not_crossEq_zero :
6480    ∀ a b : RatioOrbit,
6481      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6482        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6483          RatioOrbit.crossEq
6484            (RatioOrbit.recip (RatioOrbit.mul a b))
6485            (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
6486  ratio_mul_recip_comm_crossEq_recip_mul_of_not_crossEq_zero :
6487    ∀ a b : RatioOrbit,
6488      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6489        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6490          RatioOrbit.crossEq
6491            (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
6492            (RatioOrbit.recip (RatioOrbit.mul a b))
6493  ratio_mul_mul_recip_pair_crossEq_one_of_not_crossEq_zero :
6494    ∀ a b : RatioOrbit,
6495      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6496        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6497          RatioOrbit.crossEq
6498            (RatioOrbit.mul (RatioOrbit.mul a b)
6499              (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b)))
6500            RatioOrbit.one
6501  ratio_recip_pair_mul_mul_crossEq_one_of_not_crossEq_zero :
6502    ∀ a b : RatioOrbit,
6503      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6504        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6505          RatioOrbit.crossEq
6506            (RatioOrbit.mul
6507              (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
6508              (RatioOrbit.mul a b))
6509            RatioOrbit.one
6510  ratio_mul_mul_recip_pair_comm_crossEq_one_of_not_crossEq_zero :
6511    ∀ a b : RatioOrbit,
6512      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6513        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6514          RatioOrbit.crossEq
6515            (RatioOrbit.mul (RatioOrbit.mul a b)
6516              (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a)))
6517            RatioOrbit.one
6518  ratio_recip_pair_comm_mul_mul_crossEq_one_of_not_crossEq_zero :
6519    ∀ a b : RatioOrbit,
6520      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6521        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6522          RatioOrbit.crossEq
6523            (RatioOrbit.mul
6524              (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
6525              (RatioOrbit.mul a b))
6526            RatioOrbit.one
6527  ratio_mul_recip_pair_not_crossEq_zero_of_not_crossEq_zero :
6528    ∀ a b : RatioOrbit,
6529      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6530        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6531          ¬ RatioOrbit.crossEq
6532            (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
6533            RatioOrbit.zero
6534  ratio_zero_not_crossEq_mul_recip_pair_of_not_crossEq_zero :
6535    ∀ a b : RatioOrbit,
6536      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6537        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6538          ¬ RatioOrbit.crossEq RatioOrbit.zero
6539            (RatioOrbit.mul (RatioOrbit.recip a) (RatioOrbit.recip b))
6540  ratio_mul_recip_pair_comm_not_crossEq_zero_of_not_crossEq_zero :
6541    ∀ a b : RatioOrbit,
6542      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6543        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6544          ¬ RatioOrbit.crossEq
6545            (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
6546            RatioOrbit.zero
6547  ratio_zero_not_crossEq_mul_recip_pair_comm_of_not_crossEq_zero :
6548    ∀ a b : RatioOrbit,
6549      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6550        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6551          ¬ RatioOrbit.crossEq RatioOrbit.zero
6552            (RatioOrbit.mul (RatioOrbit.recip b) (RatioOrbit.recip a))
6553  ratio_mul_recip_crossEq_one_of_not_crossEq_zero :
6554    ∀ a : RatioOrbit,
6555      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6556        RatioOrbit.crossEq (RatioOrbit.mul a (RatioOrbit.recip a))
6557          RatioOrbit.one
6558  ratio_recip_mul_crossEq_one_of_not_crossEq_zero :
6559    ∀ a : RatioOrbit,
6560      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6561        RatioOrbit.crossEq (RatioOrbit.mul (RatioOrbit.recip a) a)
6562          RatioOrbit.one
6563  ratio_one_crossEq_mul_recip_of_not_crossEq_zero :
6564    ∀ a : RatioOrbit,
6565      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6566        RatioOrbit.crossEq RatioOrbit.one
6567          (RatioOrbit.mul a (RatioOrbit.recip a))
6568  ratio_one_crossEq_recip_mul_of_not_crossEq_zero :
6569    ∀ a : RatioOrbit,
6570      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6571        RatioOrbit.crossEq RatioOrbit.one
6572          (RatioOrbit.mul (RatioOrbit.recip a) a)
6573  ratio_mul_product_recip_crossEq_one_of_not_crossEq_zero :
6574    ∀ a b : RatioOrbit,
6575      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6576        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6577          RatioOrbit.crossEq
6578            (RatioOrbit.mul (RatioOrbit.mul a b)
6579              (RatioOrbit.recip (RatioOrbit.mul a b)))
6580            RatioOrbit.one
6581  ratio_recip_product_mul_crossEq_one_of_not_crossEq_zero :
6582    ∀ a b : RatioOrbit,
6583      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6584        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6585          RatioOrbit.crossEq
6586            (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul a b))
6587              (RatioOrbit.mul a b))
6588            RatioOrbit.one
6589  ratio_one_crossEq_mul_product_recip_of_not_crossEq_zero :
6590    ∀ a b : RatioOrbit,
6591      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6592        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6593          RatioOrbit.crossEq RatioOrbit.one
6594            (RatioOrbit.mul (RatioOrbit.mul a b)
6595              (RatioOrbit.recip (RatioOrbit.mul a b)))
6596  ratio_one_crossEq_recip_product_mul_of_not_crossEq_zero :
6597    ∀ a b : RatioOrbit,
6598      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6599        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6600          RatioOrbit.crossEq RatioOrbit.one
6601            (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul a b))
6602              (RatioOrbit.mul a b))
6603  ratio_recip_product_not_crossEq_zero_of_not_crossEq_zero :
6604    ∀ a b : RatioOrbit,
6605      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6606        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6607          ¬ RatioOrbit.crossEq
6608            (RatioOrbit.recip (RatioOrbit.mul a b)) RatioOrbit.zero
6609  ratio_zero_not_crossEq_recip_product_of_not_crossEq_zero :
6610    ∀ a b : RatioOrbit,
6611      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6612        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6613          ¬ RatioOrbit.crossEq RatioOrbit.zero
6614            (RatioOrbit.recip (RatioOrbit.mul a b))
6615  ratio_recip_product_comm_not_crossEq_zero_of_not_crossEq_zero :
6616    ∀ a b : RatioOrbit,
6617      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6618        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6619          ¬ RatioOrbit.crossEq
6620            (RatioOrbit.recip (RatioOrbit.mul b a)) RatioOrbit.zero
6621  ratio_zero_not_crossEq_recip_product_comm_of_not_crossEq_zero :
6622    ∀ a b : RatioOrbit,
6623      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6624        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6625          ¬ RatioOrbit.crossEq RatioOrbit.zero
6626            (RatioOrbit.recip (RatioOrbit.mul b a))
6627  ratio_recip_product_comm_crossEq_recip_product :
6628    ∀ a b : RatioOrbit,
6629      RatioOrbit.crossEq
6630        (RatioOrbit.recip (RatioOrbit.mul a b))
6631        (RatioOrbit.recip (RatioOrbit.mul b a))
6632  ratio_recip_product_crossEq_recip_product_comm :
6633    ∀ a b : RatioOrbit,
6634      RatioOrbit.crossEq
6635        (RatioOrbit.recip (RatioOrbit.mul b a))
6636        (RatioOrbit.recip (RatioOrbit.mul a b))
6637  ratio_mul_product_comm_recip_crossEq_one_of_not_crossEq_zero :
6638    ∀ a b : RatioOrbit,
6639      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6640        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6641          RatioOrbit.crossEq
6642            (RatioOrbit.mul (RatioOrbit.mul b a)
6643              (RatioOrbit.recip (RatioOrbit.mul b a)))
6644            RatioOrbit.one
6645  ratio_recip_product_comm_mul_crossEq_one_of_not_crossEq_zero :
6646    ∀ a b : RatioOrbit,
6647      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6648        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6649          RatioOrbit.crossEq
6650            (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul b a))
6651              (RatioOrbit.mul b a))
6652            RatioOrbit.one
6653  ratio_one_crossEq_mul_product_comm_recip_of_not_crossEq_zero :
6654    ∀ a b : RatioOrbit,
6655      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6656        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6657          RatioOrbit.crossEq RatioOrbit.one
6658            (RatioOrbit.mul (RatioOrbit.mul b a)
6659              (RatioOrbit.recip (RatioOrbit.mul b a)))
6660  ratio_one_crossEq_recip_product_comm_mul_of_not_crossEq_zero :
6661    ∀ a b : RatioOrbit,
6662      ¬ RatioOrbit.crossEq a RatioOrbit.zero →
6663        ¬ RatioOrbit.crossEq b RatioOrbit.zero →
6664          RatioOrbit.crossEq RatioOrbit.one
6665            (RatioOrbit.mul (RatioOrbit.recip (RatioOrbit.mul b a))
6666              (RatioOrbit.mul b a))
6667  ratio_recip_right_crossEq_of_mul_crossEq_one :
6668    ∀ a b : RatioOrbit,
6669      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6670        RatioOrbit.crossEq (RatioOrbit.recip b) a
6671  ratio_recip_left_crossEq_of_mul_crossEq_one :
6672    ∀ a b : RatioOrbit,
6673      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one →
6674        RatioOrbit.crossEq (RatioOrbit.recip a) b
6675  ratio_recip_right_crossEq_of_one_crossEq_mul :
6676    ∀ a b : RatioOrbit,
6677      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6678        RatioOrbit.crossEq (RatioOrbit.recip b) a
6679  ratio_recip_left_crossEq_of_one_crossEq_mul :
6680    ∀ a b : RatioOrbit,
6681      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) →
6682        RatioOrbit.crossEq (RatioOrbit.recip a) b
6683  ratio_mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip :
6684    ∀ a b : RatioOrbit,
6685      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6686        ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
6687          RatioOrbit.crossEq a (RatioOrbit.recip b)
6688  ratio_mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip :
6689    ∀ a b : RatioOrbit,
6690      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6691        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6692          RatioOrbit.crossEq b (RatioOrbit.recip a)
6693  ratio_one_crossEq_mul_iff_right_not_crossEq_zero_and_crossEq_recip :
6694    ∀ a b : RatioOrbit,
6695      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
6696        ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
6697          RatioOrbit.crossEq a (RatioOrbit.recip b)
6698  ratio_one_crossEq_mul_iff_left_not_crossEq_zero_and_crossEq_recip :
6699    ∀ a b : RatioOrbit,
6700      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
6701        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6702          RatioOrbit.crossEq b (RatioOrbit.recip a)
6703  ratio_mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq :
6704    ∀ a b : RatioOrbit,
6705      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6706        ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
6707          RatioOrbit.crossEq (RatioOrbit.recip b) a
6708  ratio_mul_crossEq_one_iff_left_not_crossEq_zero_and_recip_crossEq :
6709    ∀ a b : RatioOrbit,
6710      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6711        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6712          RatioOrbit.crossEq (RatioOrbit.recip a) b
6713  ratio_one_crossEq_mul_iff_right_not_crossEq_zero_and_recip_crossEq :
6714    ∀ a b : RatioOrbit,
6715      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
6716        ¬ RatioOrbit.crossEq b RatioOrbit.zero ∧
6717          RatioOrbit.crossEq (RatioOrbit.recip b) a
6718  ratio_one_crossEq_mul_iff_left_not_crossEq_zero_and_recip_crossEq :
6719    ∀ a b : RatioOrbit,
6720      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
6721        ¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6722          RatioOrbit.crossEq (RatioOrbit.recip a) b
6723  ratio_mul_crossEq_one_iff_factors_not_crossEq_zero_and_crossEq_recip :
6724    ∀ a b : RatioOrbit,
6725      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6726        (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6727          ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
6728          RatioOrbit.crossEq a (RatioOrbit.recip b) ∧
6729            RatioOrbit.crossEq b (RatioOrbit.recip a)
6730  ratio_one_crossEq_mul_iff_factors_not_crossEq_zero_and_crossEq_recip :
6731    ∀ a b : RatioOrbit,
6732      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
6733        (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6734          ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
6735          RatioOrbit.crossEq a (RatioOrbit.recip b) ∧
6736            RatioOrbit.crossEq b (RatioOrbit.recip a)
6737  ratio_mul_crossEq_one_iff_factors_not_crossEq_zero_and_recip_crossEq :
6738    ∀ a b : RatioOrbit,
6739      RatioOrbit.crossEq (RatioOrbit.mul a b) RatioOrbit.one ↔
6740        (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6741          ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
6742          RatioOrbit.crossEq (RatioOrbit.recip b) a ∧
6743            RatioOrbit.crossEq (RatioOrbit.recip a) b
6744  ratio_one_crossEq_mul_iff_factors_not_crossEq_zero_and_recip_crossEq :
6745    ∀ a b : RatioOrbit,
6746      RatioOrbit.crossEq RatioOrbit.one (RatioOrbit.mul a b) ↔
6747        (¬ RatioOrbit.crossEq a RatioOrbit.zero ∧
6748          ¬ RatioOrbit.crossEq b RatioOrbit.zero) ∧
6749          RatioOrbit.crossEq (RatioOrbit.recip b) a ∧
6750            RatioOrbit.crossEq (RatioOrbit.recip a) b
6751
6752/-- The internal signed-orbit order surface is closed. -/
6753theorem integer_order_certificate : IntegerOrderCertificate where
6754  truncated_sub_display := DistinctionNat.toNat_truncatedSub
6755  leq_display := DistinctionNat.leq_eq_true_iff
6756  absdiff_display := DistinctionNat.toNat_absDiff
6757  signed_nonneg_display := SignedOrbit.nonneg_iff_toInt_nonneg
6758  signed_nonneg_flag_display := SignedOrbit.nonnegFlag_eq_true_iff
6759  signed_abs_display := SignedOrbit.abs_toNat
6760  signed_le_display := SignedOrbit.le_iff_toInt_le
6761  signed_lt_display := SignedOrbit.lt_iff_toInt_lt
6762  abs_nonzero_internal := by
6763    intro z h
6764    exact SignedOrbit.abs_ne_zero_of_not_balanced_zero h
6765  signed_le_reflexive := SignedOrbit.le_refl
6766  signed_le_transitive := by
6767    intro a b c
6768    exact SignedOrbit.le_trans
6769  signed_le_antisymmetric_balanced := by
6770    intro a b
6771    exact SignedOrbit.le_antisymm_balanced
6772  signed_le_total := SignedOrbit.le_total
6773  signed_order_trichotomy := SignedOrbit.trichotomy
6774  signed_negativeFlag_eq_true_iff_nonnegFlag_eq_false :=
6775    SignedOrbit.negativeFlag_eq_true_iff_nonnegFlag_eq_false
6776  signed_negativeFlag_eq_false_iff_nonnegFlag_eq_true :=
6777    SignedOrbit.negativeFlag_eq_false_iff_nonnegFlag_eq_true
6778  signed_flags_exclusive := SignedOrbit.signFlags_exclusive
6779  signed_flags_exhaustive := SignedOrbit.signFlags_exhaustive
6780  signed_zero_le_iff_nonnegFlag := SignedOrbit.zero_le_iff_nonnegFlag
6781  signed_lt_zero_iff_negativeFlag := SignedOrbit.lt_zero_iff_negativeFlag
6782  signed_zero_lt_iff_nonnegFlag_and_not_balanced_zero :=
6783    SignedOrbit.zero_lt_iff_nonnegFlag_and_not_balanced_zero
6784  signed_nonnegFlag_eq_of_balanced := by
6785    intro z w
6786    exact SignedOrbit.nonnegFlag_eq_of_balanced
6787  signed_negativeFlag_eq_of_balanced := by
6788    intro z w
6789    exact SignedOrbit.negativeFlag_eq_of_balanced
6790  signed_nonneg_iff_of_balanced := by
6791    intro z w
6792    exact SignedOrbit.nonneg_iff_of_balanced
6793  signed_add_congr_of_balanced := by
6794    intro a a' b b'
6795    exact SignedOrbit.add_congr_of_balanced
6796  signed_negate_congr_of_balanced := by
6797    intro a a'
6798    exact SignedOrbit.negate_congr_of_balanced
6799  signed_sub_congr_of_balanced := by
6800    intro a a' b b'
6801    exact SignedOrbit.sub_congr_of_balanced
6802  signed_sub_congr_of_balanced_left := by
6803    intro a a' b
6804    exact SignedOrbit.sub_congr_of_balanced_left
6805  signed_sub_congr_of_balanced_right := by
6806    intro a b b'
6807    exact SignedOrbit.sub_congr_of_balanced_right
6808  signed_nonnegFlag_sub_eq_of_balanced_left := by
6809    intro a a' b
6810    exact SignedOrbit.nonnegFlag_sub_eq_of_balanced_left
6811  signed_nonnegFlag_sub_eq_of_balanced_right := by
6812    intro a b b'
6813    exact SignedOrbit.nonnegFlag_sub_eq_of_balanced_right
6814  signed_negativeFlag_sub_eq_of_balanced_left := by
6815    intro a a' b
6816    exact SignedOrbit.negativeFlag_sub_eq_of_balanced_left
6817  signed_negativeFlag_sub_eq_of_balanced_right := by
6818    intro a b b'
6819    exact SignedOrbit.negativeFlag_sub_eq_of_balanced_right
6820  signed_nonnegFlag_sub_eq_of_balanced := by
6821    intro a a' b b'
6822    exact SignedOrbit.nonnegFlag_sub_eq_of_balanced
6823  signed_negativeFlag_sub_eq_of_balanced := by
6824    intro a a' b b'
6825    exact SignedOrbit.negativeFlag_sub_eq_of_balanced
6826  signed_scaleByNat_congr_of_balanced := by
6827    intro z w
6828    exact SignedOrbit.scaleByNat_congr_of_balanced
6829  signed_scaleByNat_balanced_zero_of_balanced_zero := by
6830    intro z
6831    exact SignedOrbit.scaleByNat_balanced_zero_of_balanced_zero
6832  signed_mul_ofOrbit_balanced_scaleByNat :=
6833    SignedOrbit.mul_ofOrbit_balanced_scaleByNat
6834  signed_ofOrbit_mul_balanced_scaleByNat :=
6835    SignedOrbit.ofOrbit_mul_balanced_scaleByNat
6836  signed_abs_mul := SignedOrbit.abs_mul
6837  signed_mul_balanced_zero_iff := SignedOrbit.mul_balanced_zero_iff
6838  signed_mul_not_balanced_zero_iff := SignedOrbit.mul_not_balanced_zero_iff
6839  signed_balanced_mul_left_iff_of_not_balanced_zero :=
6840    SignedOrbit.balanced_mul_left_iff_of_not_balanced_zero
6841  signed_balanced_mul_right_iff_of_not_balanced_zero :=
6842    SignedOrbit.balanced_mul_right_iff_of_not_balanced_zero
6843  signed_le_mul_left_iff_of_nonnegFlag_of_not_balanced_zero :=
6844    SignedOrbit.le_mul_left_iff_of_nonnegFlag_of_not_balanced_zero
6845  signed_lt_mul_left_iff_of_nonnegFlag_of_not_balanced_zero :=
6846    SignedOrbit.lt_mul_left_iff_of_nonnegFlag_of_not_balanced_zero
6847  signed_le_mul_right_iff_of_nonnegFlag_of_not_balanced_zero :=
6848    SignedOrbit.le_mul_right_iff_of_nonnegFlag_of_not_balanced_zero
6849  signed_lt_mul_right_iff_of_nonnegFlag_of_not_balanced_zero :=
6850    SignedOrbit.lt_mul_right_iff_of_nonnegFlag_of_not_balanced_zero
6851  signed_le_mul_left_iff_of_negativeFlag :=
6852    SignedOrbit.le_mul_left_iff_of_negativeFlag
6853  signed_lt_mul_left_iff_of_negativeFlag :=
6854    SignedOrbit.lt_mul_left_iff_of_negativeFlag
6855  signed_le_mul_right_iff_of_negativeFlag :=
6856    SignedOrbit.le_mul_right_iff_of_negativeFlag
6857  signed_lt_mul_right_iff_of_negativeFlag :=
6858    SignedOrbit.lt_mul_right_iff_of_negativeFlag
6859  signed_abs_mul_eq_zero_iff := SignedOrbit.abs_mul_eq_zero_iff
6860  signed_abs_mul_ne_zero_iff := SignedOrbit.abs_mul_ne_zero_iff
6861  signed_abs_mul_eq_zero_iff_balanced_zero :=
6862    SignedOrbit.abs_mul_eq_zero_iff_balanced_zero
6863  signed_abs_mul_ne_zero_iff_not_balanced_zero :=
6864    SignedOrbit.abs_mul_ne_zero_iff_not_balanced_zero
6865  signed_abs_scaleByNat := SignedOrbit.abs_scaleByNat
6866  signed_abs_mul_ofOrbit_right := SignedOrbit.abs_mul_ofOrbit_right
6867  signed_abs_mul_ofOrbit_left := SignedOrbit.abs_mul_ofOrbit_left
6868  signed_mul_ofOrbit_right_balanced_zero_iff :=
6869    SignedOrbit.mul_ofOrbit_right_balanced_zero_iff
6870  signed_mul_ofOrbit_left_balanced_zero_iff :=
6871    SignedOrbit.mul_ofOrbit_left_balanced_zero_iff
6872  signed_mul_ofOrbit_right_not_balanced_zero_iff :=
6873    SignedOrbit.mul_ofOrbit_right_not_balanced_zero_iff
6874  signed_mul_ofOrbit_left_not_balanced_zero_iff :=
6875    SignedOrbit.mul_ofOrbit_left_not_balanced_zero_iff
6876  signed_nonnegFlag_scaleByNat_of_ne_zero :=
6877    SignedOrbit.nonnegFlag_scaleByNat_of_ne_zero
6878  signed_negativeFlag_scaleByNat_of_ne_zero :=
6879    SignedOrbit.negativeFlag_scaleByNat_of_ne_zero
6880  signed_scaleByNat_balanced_zero_iff := SignedOrbit.scaleByNat_balanced_zero_iff
6881  signed_scaleByNat_not_balanced_zero_iff :=
6882    SignedOrbit.scaleByNat_not_balanced_zero_iff
6883  signed_abs_scaleByNat_eq_zero_iff := SignedOrbit.abs_scaleByNat_eq_zero_iff
6884  signed_abs_scaleByNat_ne_zero_iff := SignedOrbit.abs_scaleByNat_ne_zero_iff
6885  signed_abs_mul_ofOrbit_right_eq_zero_iff :=
6886    SignedOrbit.abs_mul_ofOrbit_right_eq_zero_iff
6887  signed_abs_mul_ofOrbit_left_eq_zero_iff :=
6888    SignedOrbit.abs_mul_ofOrbit_left_eq_zero_iff
6889  signed_abs_mul_ofOrbit_right_ne_zero_iff :=
6890    SignedOrbit.abs_mul_ofOrbit_right_ne_zero_iff
6891  signed_abs_mul_ofOrbit_left_ne_zero_iff :=
6892    SignedOrbit.abs_mul_ofOrbit_left_ne_zero_iff
6893  signed_le_scaleByNat_of_le := by
6894    intro z w
6895    exact SignedOrbit.le_scaleByNat_of_le
6896  signed_le_scaleByNat_iff_of_ne_zero :=
6897    SignedOrbit.le_scaleByNat_iff_of_ne_zero
6898  signed_lt_scaleByNat_iff_of_ne_zero :=
6899    SignedOrbit.lt_scaleByNat_iff_of_ne_zero
6900  signed_balanced_scaleByNat_iff_of_ne_zero :=
6901    SignedOrbit.balanced_scaleByNat_iff_of_ne_zero
6902  signed_cmp_scaleByNat_of_ne_zero :=
6903    SignedOrbit.cmp_scaleByNat_of_ne_zero
6904  signed_le_mul_ofOrbit_right_iff_of_ne_zero :=
6905    SignedOrbit.le_mul_ofOrbit_right_iff_of_ne_zero
6906  signed_lt_mul_ofOrbit_right_iff_of_ne_zero :=
6907    SignedOrbit.lt_mul_ofOrbit_right_iff_of_ne_zero
6908  signed_balanced_mul_ofOrbit_right_iff_of_ne_zero :=
6909    SignedOrbit.balanced_mul_ofOrbit_right_iff_of_ne_zero
6910  signed_cmp_mul_ofOrbit_right_of_ne_zero :=
6911    SignedOrbit.cmp_mul_ofOrbit_right_of_ne_zero
6912  signed_le_mul_ofOrbit_left_iff_of_ne_zero :=
6913    SignedOrbit.le_mul_ofOrbit_left_iff_of_ne_zero
6914  signed_lt_mul_ofOrbit_left_iff_of_ne_zero :=
6915    SignedOrbit.lt_mul_ofOrbit_left_iff_of_ne_zero
6916  signed_balanced_mul_ofOrbit_left_iff_of_ne_zero :=
6917    SignedOrbit.balanced_mul_ofOrbit_left_iff_of_ne_zero
6918  signed_cmp_mul_ofOrbit_left_of_ne_zero :=
6919    SignedOrbit.cmp_mul_ofOrbit_left_of_ne_zero
6920  signed_cmp_mul_left_of_nonnegFlag_of_not_balanced_zero :=
6921    SignedOrbit.cmp_mul_left_of_nonnegFlag_of_not_balanced_zero
6922  signed_cmp_mul_right_of_nonnegFlag_of_not_balanced_zero :=
6923    SignedOrbit.cmp_mul_right_of_nonnegFlag_of_not_balanced_zero
6924  signed_cmp_mul_left_of_negativeFlag :=
6925    SignedOrbit.cmp_mul_left_of_negativeFlag
6926  signed_cmp_mul_right_of_negativeFlag :=
6927    SignedOrbit.cmp_mul_right_of_negativeFlag
6928  signed_nonnegFlag_mul_of_nonnegFlag_of_nonnegFlag :=
6929    SignedOrbit.nonnegFlag_mul_of_nonnegFlag_of_nonnegFlag
6930  signed_nonnegFlag_mul_of_negativeFlag_of_negativeFlag :=
6931    SignedOrbit.nonnegFlag_mul_of_negativeFlag_of_negativeFlag
6932  signed_negativeFlag_mul_of_nonnegFlag_of_not_balanced_zero_of_negativeFlag :=
6933    SignedOrbit.negativeFlag_mul_of_nonnegFlag_of_not_balanced_zero_of_negativeFlag
6934  signed_negativeFlag_mul_of_negativeFlag_of_nonnegFlag_of_not_balanced_zero :=
6935    SignedOrbit.negativeFlag_mul_of_negativeFlag_of_nonnegFlag_of_not_balanced_zero
6936  signed_negativeFlag_mul_iff := SignedOrbit.negativeFlag_mul_iff
6937  signed_nonnegFlag_mul_iff_not_strict_opposite_sign :=
6938    SignedOrbit.nonnegFlag_mul_iff_not_strict_opposite_sign
6939  signed_nonnegFlag_mul_of_balanced_zero_left :=
6940    SignedOrbit.nonnegFlag_mul_of_balanced_zero_left
6941  signed_nonnegFlag_mul_of_balanced_zero_right :=
6942    SignedOrbit.nonnegFlag_mul_of_balanced_zero_right
6943  signed_negativeFlag_mul_eq_false_of_balanced_zero_left :=
6944    SignedOrbit.negativeFlag_mul_eq_false_of_balanced_zero_left
6945  signed_negativeFlag_mul_eq_false_of_balanced_zero_right :=
6946    SignedOrbit.negativeFlag_mul_eq_false_of_balanced_zero_right
6947  signed_mul_balanced_zero_of_balanced_zero_left :=
6948    SignedOrbit.mul_balanced_zero_of_balanced_zero_left
6949  signed_mul_balanced_zero_of_balanced_zero_right :=
6950    SignedOrbit.mul_balanced_zero_of_balanced_zero_right
6951  signed_abs_mul_eq_zero_of_balanced_zero_left :=
6952    SignedOrbit.abs_mul_eq_zero_of_balanced_zero_left
6953  signed_abs_mul_eq_zero_of_balanced_zero_right :=
6954    SignedOrbit.abs_mul_eq_zero_of_balanced_zero_right
6955  signed_mul_congr_of_balanced := by
6956    intro a a' b b'
6957    exact SignedOrbit.mul_congr_of_balanced
6958  signed_mul_congr_of_balanced_left := by
6959    intro a a' b
6960    exact SignedOrbit.mul_congr_of_balanced_left
6961  signed_mul_congr_of_balanced_right := by
6962    intro a b b'
6963    exact SignedOrbit.mul_congr_of_balanced_right
6964  signed_nonnegFlag_mul_eq_of_balanced := by
6965    intro a a' b b'
6966    exact SignedOrbit.nonnegFlag_mul_eq_of_balanced
6967  signed_nonnegFlag_mul_eq_of_balanced_left := by
6968    intro a a' b
6969    exact SignedOrbit.nonnegFlag_mul_eq_of_balanced_left
6970  signed_nonnegFlag_mul_eq_of_balanced_right := by
6971    intro a b b'
6972    exact SignedOrbit.nonnegFlag_mul_eq_of_balanced_right
6973  signed_negativeFlag_mul_eq_of_balanced := by
6974    intro a a' b b'
6975    exact SignedOrbit.negativeFlag_mul_eq_of_balanced
6976  signed_negativeFlag_mul_eq_of_balanced_left := by
6977    intro a a' b
6978    exact SignedOrbit.negativeFlag_mul_eq_of_balanced_left
6979  signed_negativeFlag_mul_eq_of_balanced_right := by
6980    intro a b b'
6981    exact SignedOrbit.negativeFlag_mul_eq_of_balanced_right
6982  signed_abs_mul_eq_of_balanced := by
6983    intro a a' b b'
6984    exact SignedOrbit.abs_mul_eq_of_balanced
6985  signed_abs_mul_eq_of_balanced_left := by
6986    intro a a' b
6987    exact SignedOrbit.abs_mul_eq_of_balanced_left
6988  signed_abs_mul_eq_of_balanced_right := by
6989    intro a b b'
6990    exact SignedOrbit.abs_mul_eq_of_balanced_right
6991  signed_mul_balanced_zero_iff_of_balanced_left := by
6992    intro a a' b
6993    exact SignedOrbit.mul_balanced_zero_iff_of_balanced_left
6994  signed_mul_balanced_zero_iff_of_balanced_right := by
6995    intro a b b'
6996    exact SignedOrbit.mul_balanced_zero_iff_of_balanced_right
6997  signed_abs_mul_eq_zero_iff_of_balanced_left := by
6998    intro a a' b
6999    exact SignedOrbit.abs_mul_eq_zero_iff_of_balanced_left
7000  signed_abs_mul_eq_zero_iff_of_balanced_right := by
7001    intro a b b'
7002    exact SignedOrbit.abs_mul_eq_zero_iff_of_balanced_right
7003  signed_abs_mul_ne_zero_iff_of_balanced_left := by
7004    intro a a' b
7005    exact SignedOrbit.abs_mul_ne_zero_iff_of_balanced_left
7006  signed_abs_mul_ne_zero_iff_of_balanced_right := by
7007    intro a b b'
7008    exact SignedOrbit.abs_mul_ne_zero_iff_of_balanced_right
7009  signed_mul_balanced_zero_iff_of_balanced := by
7010    intro a a' b b'
7011    exact SignedOrbit.mul_balanced_zero_iff_of_balanced
7012  signed_abs_mul_eq_zero_iff_of_balanced := by
7013    intro a a' b b'
7014    exact SignedOrbit.abs_mul_eq_zero_iff_of_balanced
7015  signed_abs_mul_ne_zero_iff_of_balanced := by
7016    intro a a' b b'
7017    exact SignedOrbit.abs_mul_ne_zero_iff_of_balanced
7018  signed_le_product_left_factor_iff_of_balanced := by
7019    intro a a' b c
7020    exact SignedOrbit.le_product_left_factor_iff_of_balanced
7021  signed_le_product_right_factor_iff_of_balanced := by
7022    intro a b b' c
7023    exact SignedOrbit.le_product_right_factor_iff_of_balanced
7024  signed_le_of_product_left_factor_iff_of_balanced := by
7025    intro c a a' b
7026    exact SignedOrbit.le_of_product_left_factor_iff_of_balanced
7027  signed_le_of_product_right_factor_iff_of_balanced := by
7028    intro c a b b'
7029    exact SignedOrbit.le_of_product_right_factor_iff_of_balanced
7030  signed_lt_product_left_factor_iff_of_balanced := by
7031    intro a a' b c
7032    exact SignedOrbit.lt_product_left_factor_iff_of_balanced
7033  signed_lt_product_right_factor_iff_of_balanced := by
7034    intro a b b' c
7035    exact SignedOrbit.lt_product_right_factor_iff_of_balanced
7036  signed_lt_of_product_left_factor_iff_of_balanced := by
7037    intro c a a' b
7038    exact SignedOrbit.lt_of_product_left_factor_iff_of_balanced
7039  signed_lt_of_product_right_factor_iff_of_balanced := by
7040    intro c a b b'
7041    exact SignedOrbit.lt_of_product_right_factor_iff_of_balanced
7042  signed_cmp_product_left_factor_of_balanced := by
7043    intro a a' b c
7044    exact SignedOrbit.cmp_product_left_factor_of_balanced
7045  signed_cmp_product_right_factor_of_balanced := by
7046    intro a b b' c
7047    exact SignedOrbit.cmp_product_right_factor_of_balanced
7048  signed_cmp_of_product_left_factor_of_balanced := by
7049    intro c a a' b
7050    exact SignedOrbit.cmp_of_product_left_factor_of_balanced
7051  signed_cmp_of_product_right_factor_of_balanced := by
7052    intro c a b b'
7053    exact SignedOrbit.cmp_of_product_right_factor_of_balanced
7054  signed_le_product_factors_iff_of_balanced := by
7055    intro a a' b b' c
7056    exact SignedOrbit.le_product_factors_iff_of_balanced
7057  signed_le_of_product_factors_iff_of_balanced := by
7058    intro c a a' b b'
7059    exact SignedOrbit.le_of_product_factors_iff_of_balanced
7060  signed_lt_product_factors_iff_of_balanced := by
7061    intro a a' b b' c
7062    exact SignedOrbit.lt_product_factors_iff_of_balanced
7063  signed_lt_of_product_factors_iff_of_balanced := by
7064    intro c a a' b b'
7065    exact SignedOrbit.lt_of_product_factors_iff_of_balanced
7066  signed_cmp_product_factors_of_balanced := by
7067    intro a a' b b' c
7068    exact SignedOrbit.cmp_product_factors_of_balanced
7069  signed_cmp_of_product_factors_of_balanced := by
7070    intro c a a' b b'
7071    exact SignedOrbit.cmp_of_product_factors_of_balanced
7072  signed_le_products_iff_of_balanced := by
7073    intro a a' b b' c c' d d'
7074    exact SignedOrbit.le_products_iff_of_balanced
7075  signed_lt_products_iff_of_balanced := by
7076    intro a a' b b' c c' d d'
7077    exact SignedOrbit.lt_products_iff_of_balanced
7078  signed_cmp_products_of_balanced := by
7079    intro a a' b b' c c' d d'
7080    exact SignedOrbit.cmp_products_of_balanced
7081  signed_balanced_product_left_factor_iff_of_balanced := by
7082    intro a a' b c
7083    exact SignedOrbit.balanced_product_left_factor_iff_of_balanced
7084  signed_balanced_product_right_factor_iff_of_balanced := by
7085    intro a b b' c
7086    exact SignedOrbit.balanced_product_right_factor_iff_of_balanced
7087  signed_balanced_product_factors_iff_of_balanced := by
7088    intro a a' b b' c
7089    exact SignedOrbit.balanced_product_factors_iff_of_balanced
7090  signed_balanced_products_iff_of_balanced := by
7091    intro a a' b b' c c' d d'
7092    exact SignedOrbit.balanced_products_iff_of_balanced
7093  signed_le_sub_left_input_iff_of_balanced := by
7094    intro a a' b c
7095    exact SignedOrbit.le_sub_left_input_iff_of_balanced
7096  signed_le_sub_right_input_iff_of_balanced := by
7097    intro a b b' c
7098    exact SignedOrbit.le_sub_right_input_iff_of_balanced
7099  signed_le_of_sub_left_input_iff_of_balanced := by
7100    intro c a a' b
7101    exact SignedOrbit.le_of_sub_left_input_iff_of_balanced
7102  signed_le_of_sub_right_input_iff_of_balanced := by
7103    intro c a b b'
7104    exact SignedOrbit.le_of_sub_right_input_iff_of_balanced
7105  signed_lt_sub_left_input_iff_of_balanced := by
7106    intro a a' b c
7107    exact SignedOrbit.lt_sub_left_input_iff_of_balanced
7108  signed_lt_sub_right_input_iff_of_balanced := by
7109    intro a b b' c
7110    exact SignedOrbit.lt_sub_right_input_iff_of_balanced
7111  signed_lt_of_sub_left_input_iff_of_balanced := by
7112    intro c a a' b
7113    exact SignedOrbit.lt_of_sub_left_input_iff_of_balanced
7114  signed_lt_of_sub_right_input_iff_of_balanced := by
7115    intro c a b b'
7116    exact SignedOrbit.lt_of_sub_right_input_iff_of_balanced
7117  signed_cmp_sub_left_input_of_balanced := by
7118    intro a a' b c
7119    exact SignedOrbit.cmp_sub_left_input_of_balanced
7120  signed_cmp_sub_right_input_of_balanced := by
7121    intro a b b' c
7122    exact SignedOrbit.cmp_sub_right_input_of_balanced
7123  signed_cmp_of_sub_left_input_of_balanced := by
7124    intro c a a' b
7125    exact SignedOrbit.cmp_of_sub_left_input_of_balanced
7126  signed_cmp_of_sub_right_input_of_balanced := by
7127    intro c a b b'
7128    exact SignedOrbit.cmp_of_sub_right_input_of_balanced
7129  signed_le_sub_inputs_iff_of_balanced := by
7130    intro a a' b b' c
7131    exact SignedOrbit.le_sub_inputs_iff_of_balanced
7132  signed_le_of_sub_inputs_iff_of_balanced := by
7133    intro c a a' b b'
7134    exact SignedOrbit.le_of_sub_inputs_iff_of_balanced
7135  signed_lt_sub_inputs_iff_of_balanced := by
7136    intro a a' b b' c
7137    exact SignedOrbit.lt_sub_inputs_iff_of_balanced
7138  signed_lt_of_sub_inputs_iff_of_balanced := by
7139    intro c a a' b b'
7140    exact SignedOrbit.lt_of_sub_inputs_iff_of_balanced
7141  signed_cmp_sub_inputs_of_balanced := by
7142    intro a a' b b' c
7143    exact SignedOrbit.cmp_sub_inputs_of_balanced
7144  signed_cmp_of_sub_inputs_of_balanced := by
7145    intro c a a' b b'
7146    exact SignedOrbit.cmp_of_sub_inputs_of_balanced
7147  signed_le_subtractions_iff_of_balanced := by
7148    intro a a' b b' c c' d d'
7149    exact SignedOrbit.le_subtractions_iff_of_balanced
7150  signed_lt_subtractions_iff_of_balanced := by
7151    intro a a' b b' c c' d d'
7152    exact SignedOrbit.lt_subtractions_iff_of_balanced
7153  signed_cmp_subtractions_of_balanced := by
7154    intro a a' b b' c c' d d'
7155    exact SignedOrbit.cmp_subtractions_of_balanced
7156  signed_balanced_sub_left_input_iff_of_balanced := by
7157    intro a a' b c
7158    exact SignedOrbit.balanced_sub_left_input_iff_of_balanced
7159  signed_balanced_sub_right_input_iff_of_balanced := by
7160    intro a b b' c
7161    exact SignedOrbit.balanced_sub_right_input_iff_of_balanced
7162  signed_balanced_sub_inputs_iff_of_balanced := by
7163    intro a a' b b' c
7164    exact SignedOrbit.balanced_sub_inputs_iff_of_balanced
7165  signed_balanced_subtractions_iff_of_balanced := by
7166    intro a a' b b' c c' d d'
7167    exact SignedOrbit.balanced_subtractions_iff_of_balanced
7168  signed_sub_balanced_zero_iff_of_balanced_left := by
7169    intro a a' b
7170    exact SignedOrbit.sub_balanced_zero_iff_of_balanced_left
7171  signed_sub_balanced_zero_iff_of_balanced_right := by
7172    intro a b b'
7173    exact SignedOrbit.sub_balanced_zero_iff_of_balanced_right
7174  signed_sub_balanced_zero_iff_of_balanced := by
7175    intro a a' b b'
7176    exact SignedOrbit.sub_balanced_zero_iff_of_balanced
7177  signed_sub_not_balanced_zero_iff_of_balanced_left := by
7178    intro a a' b
7179    exact SignedOrbit.sub_not_balanced_zero_iff_of_balanced_left
7180  signed_sub_not_balanced_zero_iff_of_balanced_right := by
7181    intro a b b'
7182    exact SignedOrbit.sub_not_balanced_zero_iff_of_balanced_right
7183  signed_sub_not_balanced_zero_iff_of_balanced := by
7184    intro a a' b b'
7185    exact SignedOrbit.sub_not_balanced_zero_iff_of_balanced
7186  signed_sub_balanced_zero_iff_balanced := SignedOrbit.sub_balanced_zero_iff_balanced
7187  signed_sub_not_balanced_zero_iff_not_balanced :=
7188    SignedOrbit.sub_not_balanced_zero_iff_not_balanced
7189  signed_abs_sub_eq_zero_iff_balanced := SignedOrbit.abs_sub_eq_zero_iff_balanced
7190  signed_abs_sub_ne_zero_iff_not_balanced :=
7191    SignedOrbit.abs_sub_ne_zero_iff_not_balanced
7192  signed_sub_self_balanced_zero := SignedOrbit.sub_self_balanced_zero
7193  signed_abs_sub_self_eq_zero := SignedOrbit.abs_sub_self_eq_zero
7194  signed_sub_zero_balanced := SignedOrbit.sub_zero_balanced
7195  signed_zero_sub_balanced_negate := SignedOrbit.zero_sub_balanced_negate
7196  signed_abs_sub_zero_eq := SignedOrbit.abs_sub_zero_eq
7197  signed_abs_zero_sub_eq := SignedOrbit.abs_zero_sub_eq
7198  signed_le_sub_zero_left_iff := SignedOrbit.le_sub_zero_left_iff
7199  signed_le_sub_zero_right_iff := SignedOrbit.le_sub_zero_right_iff
7200  signed_lt_sub_zero_left_iff := SignedOrbit.lt_sub_zero_left_iff
7201  signed_lt_sub_zero_right_iff := SignedOrbit.lt_sub_zero_right_iff
7202  signed_cmp_sub_zero_left := SignedOrbit.cmp_sub_zero_left
7203  signed_cmp_sub_zero_right := SignedOrbit.cmp_sub_zero_right
7204  signed_le_zero_sub_left_iff := SignedOrbit.le_zero_sub_left_iff
7205  signed_le_zero_sub_right_iff := SignedOrbit.le_zero_sub_right_iff
7206  signed_lt_zero_sub_left_iff := SignedOrbit.lt_zero_sub_left_iff
7207  signed_lt_zero_sub_right_iff := SignedOrbit.lt_zero_sub_right_iff
7208  signed_cmp_zero_sub_left := SignedOrbit.cmp_zero_sub_left
7209  signed_cmp_zero_sub_right := SignedOrbit.cmp_zero_sub_right
7210  signed_le_sub_self_left_iff := SignedOrbit.le_sub_self_left_iff
7211  signed_le_sub_self_right_iff := SignedOrbit.le_sub_self_right_iff
7212  signed_lt_sub_self_left_iff := SignedOrbit.lt_sub_self_left_iff
7213  signed_lt_sub_self_right_iff := SignedOrbit.lt_sub_self_right_iff
7214  signed_cmp_sub_self_left := SignedOrbit.cmp_sub_self_left
7215  signed_cmp_sub_self_right := SignedOrbit.cmp_sub_self_right
7216  signed_nonnegFlag_sub_zero := SignedOrbit.nonnegFlag_sub_zero
7217  signed_negativeFlag_sub_zero := SignedOrbit.negativeFlag_sub_zero
7218  signed_nonnegFlag_zero_sub := SignedOrbit.nonnegFlag_zero_sub
7219  signed_negativeFlag_zero_sub := SignedOrbit.negativeFlag_zero_sub
7220  signed_nonnegFlag_sub_self := SignedOrbit.nonnegFlag_sub_self
7221  signed_negativeFlag_sub_self := SignedOrbit.negativeFlag_sub_self
7222  signed_nonnegFlag_sub_iff_le := SignedOrbit.nonnegFlag_sub_iff_le
7223  signed_nonnegFlag_sub_eq_false_iff_lt :=
7224    SignedOrbit.nonnegFlag_sub_eq_false_iff_lt
7225  signed_negativeFlag_sub_iff_lt := SignedOrbit.negativeFlag_sub_iff_lt
7226  signed_negativeFlag_sub_eq_false_iff_le :=
7227    SignedOrbit.negativeFlag_sub_eq_false_iff_le
7228  signed_le_iff_nonnegFlag_sub := SignedOrbit.le_iff_nonnegFlag_sub
7229  signed_lt_iff_nonnegFlag_sub_eq_false :=
7230    SignedOrbit.lt_iff_nonnegFlag_sub_eq_false
7231  signed_lt_iff_negativeFlag_sub := SignedOrbit.lt_iff_negativeFlag_sub
7232  signed_le_iff_negativeFlag_sub_eq_false :=
7233    SignedOrbit.le_iff_negativeFlag_sub_eq_false
7234  signed_nonnegFlag_mul_ofOrbit_right_of_ne_zero :=
7235    SignedOrbit.nonnegFlag_mul_ofOrbit_right_of_ne_zero
7236  signed_negativeFlag_mul_ofOrbit_right_of_ne_zero :=
7237    SignedOrbit.negativeFlag_mul_ofOrbit_right_of_ne_zero
7238  signed_nonnegFlag_mul_ofOrbit_left_of_ne_zero :=
7239    SignedOrbit.nonnegFlag_mul_ofOrbit_left_of_ne_zero
7240  signed_negativeFlag_mul_ofOrbit_left_of_ne_zero :=
7241    SignedOrbit.negativeFlag_mul_ofOrbit_left_of_ne_zero
7242  signed_le_congr_left_of_balanced := by
7243    intro a a' b
7244    exact SignedOrbit.le_congr_left_of_balanced
7245  signed_le_congr_right_of_balanced := by
7246    intro a b b'
7247    exact SignedOrbit.le_congr_right_of_balanced
7248  signed_lt_congr_left_of_balanced := by
7249    intro a a' b
7250    exact SignedOrbit.lt_congr_left_of_balanced
7251  signed_lt_congr_right_of_balanced := by
7252    intro a b b'
7253    exact SignedOrbit.lt_congr_right_of_balanced
7254  signed_le_congr_of_balanced := by
7255    intro a a' b b'
7256    exact SignedOrbit.le_congr_of_balanced
7257  signed_lt_congr_of_balanced := by
7258    intro a a' b b'
7259    exact SignedOrbit.lt_congr_of_balanced
7260  signed_cmp_lt := by
7261    intro a b
7262    exact SignedOrbit.cmp_eq_lt_of_lt
7263  signed_cmp_eq := by
7264    intro a b
7265    exact SignedOrbit.cmp_eq_eq_of_balanced
7266  signed_cmp_gt := by
7267    intro a b
7268    exact SignedOrbit.cmp_eq_gt_of_gt
7269  signed_cmp_lt_iff := SignedOrbit.cmp_eq_lt_iff
7270  signed_cmp_eq_iff := SignedOrbit.cmp_eq_eq_iff
7271  signed_cmp_gt_iff := SignedOrbit.cmp_eq_gt_iff
7272  signed_cmp_congr_of_balanced := by
7273    intro a a' b b'
7274    exact SignedOrbit.cmp_congr_of_balanced
7275  signed_balanced_add_left_iff := SignedOrbit.balanced_add_left_iff
7276  signed_balanced_add_right_iff := SignedOrbit.balanced_add_right_iff
7277  signed_balanced_negate_iff := SignedOrbit.balanced_negate_iff
7278  signed_abs_zero_iff_balanced_zero := SignedOrbit.abs_eq_zero_iff_balanced_zero
7279  signed_abs_nonnegative_branch := by
7280    intro z
7281    exact SignedOrbit.abs_toInt_of_nonnegFlag
7282  signed_abs_negative_branch := by
7283    intro z
7284    exact SignedOrbit.abs_toInt_of_negativeFlag
7285  signed_balanced_of_nonnegFlag := by
7286    intro z
7287    exact SignedOrbit.balanced_of_nonnegFlag
7288  signed_balanced_of_negativeFlag := by
7289    intro z
7290    exact SignedOrbit.balanced_of_negativeFlag
7291  signed_balanced_sign_canonical := SignedOrbit.balanced_sign_canonical
7292  signed_balanced_ofOrbit_abs_iff_nonnegFlag :=
7293    SignedOrbit.balanced_ofOrbit_abs_iff_nonnegFlag
7294  signed_balanced_negate_ofOrbit_abs_iff_negate_nonnegFlag :=
7295    SignedOrbit.balanced_negate_ofOrbit_abs_iff_negate_nonnegFlag
7296  signed_balanced_negate_ofOrbit_abs_iff_negativeFlag_or_balanced_zero :=
7297    SignedOrbit.balanced_negate_ofOrbit_abs_iff_negativeFlag_or_balanced_zero
7298  signed_balanced_both_abs_representatives_iff_balanced_zero :=
7299    SignedOrbit.balanced_both_abs_representatives_iff_balanced_zero
7300  signed_balanced_zero_of_both_abs_representatives := by
7301    intro z
7302    exact SignedOrbit.balanced_zero_of_both_abs_representatives
7303  signed_not_both_abs_representatives_of_not_balanced_zero := by
7304    intro z
7305    exact SignedOrbit.not_both_abs_representatives_of_not_balanced_zero
7306  signed_not_balanced_ofOrbit_abs_of_negativeFlag := by
7307    intro z
7308    exact SignedOrbit.not_balanced_ofOrbit_abs_of_negativeFlag
7309  signed_balanced_negate_ofOrbit_abs_iff_balanced_zero_of_nonnegFlag := by
7310    intro z
7311    exact SignedOrbit.balanced_negate_ofOrbit_abs_iff_balanced_zero_of_nonnegFlag
7312  signed_abs_balanced_invariant := by
7313    intro z w
7314    exact SignedOrbit.abs_eq_of_balanced
7315  signed_abs_sub_eq_of_balanced_left := by
7316    intro a a' b
7317    exact SignedOrbit.abs_sub_eq_of_balanced_left
7318  signed_abs_sub_eq_of_balanced_right := by
7319    intro a b b'
7320    exact SignedOrbit.abs_sub_eq_of_balanced_right
7321  signed_abs_sub_eq_of_balanced := by
7322    intro a a' b b'
7323    exact SignedOrbit.abs_sub_eq_of_balanced
7324  signed_abs_sub_eq_zero_iff_of_balanced_left := by
7325    intro a a' b
7326    exact SignedOrbit.abs_sub_eq_zero_iff_of_balanced_left
7327  signed_abs_sub_eq_zero_iff_of_balanced_right := by
7328    intro a b b'
7329    exact SignedOrbit.abs_sub_eq_zero_iff_of_balanced_right
7330  signed_abs_sub_eq_zero_iff_of_balanced := by
7331    intro a a' b b'
7332    exact SignedOrbit.abs_sub_eq_zero_iff_of_balanced
7333  signed_abs_sub_ne_zero_iff_of_balanced_left := by
7334    intro a a' b
7335    exact SignedOrbit.abs_sub_ne_zero_iff_of_balanced_left
7336  signed_abs_sub_ne_zero_iff_of_balanced_right := by
7337    intro a b b'
7338    exact SignedOrbit.abs_sub_ne_zero_iff_of_balanced_right
7339  signed_abs_sub_ne_zero_iff_of_balanced := by
7340    intro a a' b b'
7341    exact SignedOrbit.abs_sub_ne_zero_iff_of_balanced
7342  signed_le_add_left_iff := SignedOrbit.le_add_left_iff
7343  signed_le_add_right_iff := SignedOrbit.le_add_right_iff
7344  signed_lt_add_left_iff := SignedOrbit.lt_add_left_iff
7345  signed_lt_add_right_iff := SignedOrbit.lt_add_right_iff
7346  signed_add_le_add := by
7347    intro a b c d
7348    exact SignedOrbit.add_le_add
7349  signed_add_lt_add_left := by
7350    intro a b c
7351    exact SignedOrbit.add_lt_add_left
7352  signed_add_lt_add_right := by
7353    intro a b c
7354    exact SignedOrbit.add_lt_add_right
7355  signed_negate_le_negate_iff := SignedOrbit.negate_le_negate_iff
7356  signed_negate_lt_negate_iff := SignedOrbit.negate_lt_negate_iff
7357  signed_cmp_add_left := SignedOrbit.cmp_add_left
7358  signed_cmp_add_right := SignedOrbit.cmp_add_right
7359  signed_cmp_negate_swap := SignedOrbit.cmp_negate_swap
7360  signed_abs_negate := SignedOrbit.abs_negate
7361  signed_abs_ofOrbit := SignedOrbit.abs_ofOrbit
7362  signed_abs_negate_ofOrbit := SignedOrbit.abs_negate_ofOrbit
7363  signed_nonnegFlag_ofOrbit := SignedOrbit.nonnegFlag_ofOrbit
7364  signed_negativeFlag_ofOrbit := SignedOrbit.negativeFlag_ofOrbit
7365  signed_nonnegFlag_negate_ofOrbit_of_ne_zero :=
7366    SignedOrbit.nonnegFlag_negate_ofOrbit_of_ne_zero
7367  signed_negativeFlag_negate_ofOrbit_of_ne_zero :=
7368    SignedOrbit.negativeFlag_negate_ofOrbit_of_ne_zero
7369  signed_negate_ofOrbit_not_balanced_zero_of_ne_zero :=
7370    SignedOrbit.negate_ofOrbit_not_balanced_zero_of_ne_zero
7371  signed_nonnegFlag_negate_ofOrbit_eq_true_iff_zero :=
7372    SignedOrbit.nonnegFlag_negate_ofOrbit_eq_true_iff_zero
7373  signed_negativeFlag_negate_ofOrbit_eq_true_iff_ne_zero :=
7374    SignedOrbit.negativeFlag_negate_ofOrbit_eq_true_iff_ne_zero
7375  signed_negate_ofOrbit_balanced_zero_iff :=
7376    SignedOrbit.negate_ofOrbit_balanced_zero_iff
7377  signed_abs_add_le_add_abs := SignedOrbit.abs_add_le_add_abs
7378  signed_abs_sub_le_add_abs := SignedOrbit.abs_sub_le_add_abs
7379  signed_abs_le_iff_between := SignedOrbit.abs_le_iff_between
7380  signed_between_of_abs_le := by
7381    intro z n
7382    exact SignedOrbit.between_of_abs_le
7383  signed_abs_le_of_between := by
7384    intro z n
7385    exact SignedOrbit.abs_le_of_between
7386  signed_neg_abs_le_self := SignedOrbit.neg_abs_le_self
7387  signed_self_le_abs := SignedOrbit.self_le_abs
7388  signed_abs_le_trans := by
7389    intro z n m
7390    exact SignedOrbit.abs_le_trans
7391  signed_between_mono := by
7392    intro z n m
7393    exact SignedOrbit.between_mono
7394  ratio_recip_den_internal := RatioOrbit.recipNonzero_den_eq_abs
7395  ratio_recip_num_nonnegative_branch := by
7396    intro a h
7397    exact RatioOrbit.recipNonzero_num_eq_of_nonnegFlag
7398  ratio_recip_num_negative_branch := by
7399    intro a h
7400    exact RatioOrbit.recipNonzero_num_eq_of_negativeFlag
7401  ratio_recip_num_abs_eq_den := RatioOrbit.recipNonzero_num_abs_eq_den
7402  ratio_recip_num_not_balanced_zero := RatioOrbit.recipNonzero_num_not_balanced_zero
7403  ratio_recip_num_nonnegFlag_eq := RatioOrbit.recipNonzero_num_nonnegFlag_eq
7404  ratio_recip_num_negativeFlag_eq := RatioOrbit.recipNonzero_num_negativeFlag_eq
7405  ratio_recip_num_zero_le_iff := RatioOrbit.recipNonzero_num_zero_le_iff
7406  ratio_recip_num_lt_zero_iff := RatioOrbit.recipNonzero_num_lt_zero_iff
7407  ratio_recip_num_zero_lt_iff := RatioOrbit.recipNonzero_num_zero_lt_iff
7408  ratio_recip_num_cmp_zero := RatioOrbit.recipNonzero_num_cmp_zero
7409  ratio_recip_num_zero_cmp := RatioOrbit.recipNonzero_num_zero_cmp
7410  ratio_recip_num_balanced_ofOrbit_den_iff_nonnegFlag :=
7411    RatioOrbit.recipNonzero_num_balanced_ofOrbit_den_iff_nonnegFlag
7412  ratio_recip_num_balanced_negate_ofOrbit_den_iff_negativeFlag :=
7413    RatioOrbit.recipNonzero_num_balanced_negate_ofOrbit_den_iff_negativeFlag
7414  ratio_recip_num_not_balanced_ofOrbit_den_iff_negativeFlag :=
7415    RatioOrbit.recipNonzero_num_not_balanced_ofOrbit_den_iff_negativeFlag
7416  ratio_recip_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag :=
7417    RatioOrbit.recipNonzero_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag
7418  ratio_num_mul_recip_num_balanced_den_mul_abs :=
7419    RatioOrbit.num_mul_recipNonzero_num_balanced_ofOrbit_den_mul_abs
7420  ratio_mul_recipNonzero_crossEq_one :=
7421    RatioOrbit.mul_recipNonzero_crossEq_one
7422  ratio_recip_num_mul_num_balanced_den_mul_abs :=
7423    RatioOrbit.recipNonzero_num_mul_num_balanced_ofOrbit_den_mul_abs
7424  ratio_recipNonzero_mul_crossEq_one :=
7425    RatioOrbit.recipNonzero_mul_crossEq_one
7426  ratio_recip_eq_recipNonzero_of_not_balanced_zero :=
7427    RatioOrbit.recip_eq_recipNonzero_of_not_balanced_zero
7428  ratio_mul_recip_crossEq_one_of_not_balanced_zero :=
7429    RatioOrbit.mul_recip_crossEq_one_of_not_balanced_zero
7430  ratio_recip_mul_crossEq_one_of_not_balanced_zero :=
7431    RatioOrbit.recip_mul_crossEq_one_of_not_balanced_zero
7432  ratio_recip_den_eq_abs_of_not_balanced_zero :=
7433    RatioOrbit.recip_den_eq_abs_of_not_balanced_zero
7434  ratio_recip_num_abs_eq_den_of_not_balanced_zero :=
7435    RatioOrbit.recip_num_abs_eq_den_of_not_balanced_zero
7436  ratio_recip_num_not_balanced_zero_of_not_balanced_zero :=
7437    RatioOrbit.recip_num_not_balanced_zero_of_not_balanced_zero
7438  ratio_recip_num_nonnegFlag_eq_of_not_balanced_zero :=
7439    RatioOrbit.recip_num_nonnegFlag_eq_of_not_balanced_zero
7440  ratio_recip_num_negativeFlag_eq_of_not_balanced_zero :=
7441    RatioOrbit.recip_num_negativeFlag_eq_of_not_balanced_zero
7442  ratio_recip_num_zero_le_iff_of_not_balanced_zero :=
7443    RatioOrbit.recip_num_zero_le_iff_of_not_balanced_zero
7444  ratio_recip_num_lt_zero_iff_of_not_balanced_zero :=
7445    RatioOrbit.recip_num_lt_zero_iff_of_not_balanced_zero
7446  ratio_recip_num_zero_lt_iff_of_not_balanced_zero :=
7447    RatioOrbit.recip_num_zero_lt_iff_of_not_balanced_zero
7448  ratio_recip_num_cmp_zero_of_not_balanced_zero :=
7449    RatioOrbit.recip_num_cmp_zero_of_not_balanced_zero
7450  ratio_recip_num_zero_cmp_of_not_balanced_zero :=
7451    RatioOrbit.recip_num_zero_cmp_of_not_balanced_zero
7452  ratio_recip_num_balanced_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero :=
7453    RatioOrbit.recip_num_balanced_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero
7454  ratio_recip_num_balanced_negate_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero :=
7455    RatioOrbit.recip_num_balanced_negate_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero
7456  ratio_recip_num_not_balanced_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero :=
7457    RatioOrbit.recip_num_not_balanced_ofOrbit_den_iff_negativeFlag_of_not_balanced_zero
7458  ratio_recip_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero :=
7459    RatioOrbit.recip_num_not_balanced_negate_ofOrbit_den_iff_nonnegFlag_of_not_balanced_zero
7460  ratio_recip_num_nonnegative_branch_of_not_balanced_zero := by
7461    intro a h
7462    exact RatioOrbit.recip_num_eq_of_nonnegFlag_of_not_balanced_zero h
7463  ratio_recip_num_negative_branch_of_not_balanced_zero := by
7464    intro a h
7465    exact RatioOrbit.recip_num_eq_of_negativeFlag_of_not_balanced_zero h
7466  ratio_num_mul_recip_num_balanced_den_mul_abs_of_not_balanced_zero :=
7467    RatioOrbit.num_mul_recip_num_balanced_ofOrbit_den_mul_abs_of_not_balanced_zero
7468  ratio_recip_num_mul_num_balanced_den_mul_abs_of_not_balanced_zero :=
7469    RatioOrbit.recip_num_mul_num_balanced_ofOrbit_den_mul_abs_of_not_balanced_zero
7470  ratio_recip_num_balanced_zero_iff :=
7471    RatioOrbit.recip_num_balanced_zero_iff
7472  ratio_recip_num_not_balanced_zero_iff :=
7473    RatioOrbit.recip_num_not_balanced_zero_iff
7474  ratio_crossEq_zero_iff_num_balanced_zero :=
7475    RatioOrbit.crossEq_zero_iff_num_balanced_zero
7476  ratio_zero_crossEq_iff_num_balanced_zero :=
7477    RatioOrbit.zero_crossEq_iff_num_balanced_zero
7478  ratio_recip_crossEq_zero_iff_num_balanced_zero :=
7479    RatioOrbit.recip_crossEq_zero_iff_num_balanced_zero
7480  ratio_zero_crossEq_recip_iff_num_balanced_zero :=
7481    RatioOrbit.zero_crossEq_recip_iff_num_balanced_zero
7482  ratio_recip_crossEq_zero_iff_crossEq_zero :=
7483    RatioOrbit.recip_crossEq_zero_iff_crossEq_zero
7484  ratio_zero_crossEq_recip_iff_zero_crossEq :=
7485    RatioOrbit.zero_crossEq_recip_iff_zero_crossEq
7486  ratio_recip_crossEq_zero_iff_zero_crossEq :=
7487    RatioOrbit.recip_crossEq_zero_iff_zero_crossEq
7488  ratio_zero_crossEq_recip_iff_crossEq_zero :=
7489    RatioOrbit.zero_crossEq_recip_iff_crossEq_zero
7490  ratio_recip_not_crossEq_zero_iff_not_crossEq_zero :=
7491    RatioOrbit.recip_not_crossEq_zero_iff_not_crossEq_zero
7492  ratio_zero_not_crossEq_recip_iff_zero_not_crossEq :=
7493    RatioOrbit.zero_not_crossEq_recip_iff_zero_not_crossEq
7494  ratio_recip_not_crossEq_zero_iff_zero_not_crossEq :=
7495    RatioOrbit.recip_not_crossEq_zero_iff_zero_not_crossEq
7496  ratio_zero_not_crossEq_recip_iff_not_crossEq_zero :=
7497    RatioOrbit.zero_not_crossEq_recip_iff_not_crossEq_zero
7498  ratio_recip_recipNonzero_crossEq_self :=
7499    RatioOrbit.recip_recipNonzero_crossEq_self
7500  ratio_self_crossEq_recip_recipNonzero :=
7501    RatioOrbit.self_crossEq_recip_recipNonzero
7502  ratio_recip_recip_crossEq_self :=
7503    RatioOrbit.recip_recip_crossEq_self
7504  ratio_self_crossEq_recip_recip :=
7505    RatioOrbit.self_crossEq_recip_recip
7506  ratio_recip_crossEq_congr :=
7507    @RatioOrbit.recip_crossEq_congr
7508  ratio_recip_crossEq_iff :=
7509    RatioOrbit.recip_crossEq_iff
7510  ratio_recip_crossEq_iff_crossEq_recip :=
7511    RatioOrbit.recip_crossEq_iff_crossEq_recip
7512  ratio_crossEq_recip_iff_recip_crossEq :=
7513    RatioOrbit.crossEq_recip_iff_recip_crossEq
7514  ratio_mul_crossEq_one_iff_crossEq_recip_of_right_not_crossEq_zero :=
7515    RatioOrbit.mul_crossEq_one_iff_crossEq_recip_of_right_not_crossEq_zero
7516  ratio_mul_crossEq_one_iff_crossEq_recip_of_left_not_crossEq_zero :=
7517    RatioOrbit.mul_crossEq_one_iff_crossEq_recip_of_left_not_crossEq_zero
7518  ratio_mul_recip_cancel_right_crossEq_self_of_right_not_crossEq_zero :=
7519    RatioOrbit.mul_recip_cancel_right_crossEq_self_of_right_not_crossEq_zero
7520  ratio_recip_mul_cancel_left_crossEq_self_of_left_not_crossEq_zero :=
7521    RatioOrbit.recip_mul_cancel_left_crossEq_self_of_left_not_crossEq_zero
7522  ratio_mul_recip_cancel_right_assoc_crossEq_self_of_right_not_crossEq_zero :=
7523    RatioOrbit.mul_recip_cancel_right_assoc_crossEq_self_of_right_not_crossEq_zero
7524  ratio_recip_mul_cancel_left_assoc_crossEq_self_of_left_not_crossEq_zero :=
7525    RatioOrbit.recip_mul_cancel_left_assoc_crossEq_self_of_left_not_crossEq_zero
7526  ratio_mul_right_crossEq_iff_of_not_crossEq_zero :=
7527    RatioOrbit.mul_right_crossEq_iff_of_not_crossEq_zero
7528  ratio_mul_left_crossEq_iff_of_not_crossEq_zero :=
7529    RatioOrbit.mul_left_crossEq_iff_of_not_crossEq_zero
7530  ratio_mul_crossEq_zero_iff :=
7531    RatioOrbit.mul_crossEq_zero_iff
7532  ratio_zero_crossEq_mul_iff :=
7533    RatioOrbit.zero_crossEq_mul_iff
7534  ratio_mul_not_crossEq_zero_iff :=
7535    RatioOrbit.mul_not_crossEq_zero_iff
7536  ratio_zero_not_crossEq_mul_iff :=
7537    RatioOrbit.zero_not_crossEq_mul_iff
7538  ratio_mul_not_crossEq_zero_of_not_crossEq_zero :=
7539    RatioOrbit.mul_not_crossEq_zero_of_not_crossEq_zero
7540  ratio_zero_not_crossEq_mul_of_not_crossEq_zero :=
7541    RatioOrbit.zero_not_crossEq_mul_of_not_crossEq_zero
7542  ratio_left_not_crossEq_zero_of_mul_not_crossEq_zero :=
7543    RatioOrbit.left_not_crossEq_zero_of_mul_not_crossEq_zero
7544  ratio_right_not_crossEq_zero_of_mul_not_crossEq_zero :=
7545    RatioOrbit.right_not_crossEq_zero_of_mul_not_crossEq_zero
7546  ratio_mul_crossEq_congr :=
7547    @RatioOrbit.mul_crossEq_congr
7548  ratio_mul_crossEq_congr_left :=
7549    @RatioOrbit.mul_crossEq_congr_left
7550  ratio_mul_crossEq_congr_right :=
7551    @RatioOrbit.mul_crossEq_congr_right
7552  ratio_mul_comm_crossEq :=
7553    RatioOrbit.mul_comm_crossEq
7554  ratio_mul_assoc_crossEq :=
7555    RatioOrbit.mul_assoc_crossEq
7556  ratio_mul_one_crossEq :=
7557    RatioOrbit.mul_one_crossEq
7558  ratio_one_mul_crossEq :=
7559    RatioOrbit.one_mul_crossEq
7560  ratio_mul_zero_crossEq :=
7561    RatioOrbit.mul_zero_crossEq
7562  ratio_zero_mul_crossEq :=
7563    RatioOrbit.zero_mul_crossEq
7564  ratio_one_not_crossEq_zero :=
7565    RatioOrbit.one_not_crossEq_zero
7566  ratio_zero_not_crossEq_one :=
7567    RatioOrbit.zero_not_crossEq_one
7568  ratio_recip_zero_crossEq_zero :=
7569    RatioOrbit.recip_zero_crossEq_zero
7570  ratio_zero_crossEq_recip_zero :=
7571    RatioOrbit.zero_crossEq_recip_zero
7572  ratio_recip_one_crossEq_one :=
7573    RatioOrbit.recip_one_crossEq_one
7574  ratio_one_crossEq_recip_one :=
7575    RatioOrbit.one_crossEq_recip_one
7576  ratio_factors_not_crossEq_zero_of_mul_crossEq_one :=
7577    RatioOrbit.factors_not_crossEq_zero_of_mul_crossEq_one
7578  ratio_left_not_crossEq_zero_of_mul_crossEq_one :=
7579    RatioOrbit.left_not_crossEq_zero_of_mul_crossEq_one
7580  ratio_right_not_crossEq_zero_of_mul_crossEq_one :=
7581    RatioOrbit.right_not_crossEq_zero_of_mul_crossEq_one
7582  ratio_factors_not_crossEq_zero_of_one_crossEq_mul :=
7583    RatioOrbit.factors_not_crossEq_zero_of_one_crossEq_mul
7584  ratio_left_not_crossEq_zero_of_one_crossEq_mul :=
7585    RatioOrbit.left_not_crossEq_zero_of_one_crossEq_mul
7586  ratio_right_not_crossEq_zero_of_one_crossEq_mul :=
7587    RatioOrbit.right_not_crossEq_zero_of_one_crossEq_mul
7588  ratio_crossEq_recip_right_of_mul_crossEq_one :=
7589    RatioOrbit.crossEq_recip_right_of_mul_crossEq_one
7590  ratio_crossEq_recip_left_of_mul_crossEq_one :=
7591    RatioOrbit.crossEq_recip_left_of_mul_crossEq_one
7592  ratio_crossEq_recip_right_of_one_crossEq_mul :=
7593    RatioOrbit.crossEq_recip_right_of_one_crossEq_mul
7594  ratio_crossEq_recip_left_of_one_crossEq_mul :=
7595    RatioOrbit.crossEq_recip_left_of_one_crossEq_mul
7596  ratio_recip_mul_crossEq_mul_recip_of_not_crossEq_zero :=
7597    RatioOrbit.recip_mul_crossEq_mul_recip_of_not_crossEq_zero
7598  ratio_mul_recip_crossEq_recip_mul_of_not_crossEq_zero :=
7599    RatioOrbit.mul_recip_crossEq_recip_mul_of_not_crossEq_zero
7600  ratio_recip_mul_crossEq_mul_recip_comm_of_not_crossEq_zero :=
7601    RatioOrbit.recip_mul_crossEq_mul_recip_comm_of_not_crossEq_zero
7602  ratio_mul_recip_comm_crossEq_recip_mul_of_not_crossEq_zero :=
7603    RatioOrbit.mul_recip_comm_crossEq_recip_mul_of_not_crossEq_zero
7604  ratio_mul_mul_recip_pair_crossEq_one_of_not_crossEq_zero :=
7605    RatioOrbit.mul_mul_recip_pair_crossEq_one_of_not_crossEq_zero
7606  ratio_recip_pair_mul_mul_crossEq_one_of_not_crossEq_zero :=
7607    RatioOrbit.recip_pair_mul_mul_crossEq_one_of_not_crossEq_zero
7608  ratio_mul_mul_recip_pair_comm_crossEq_one_of_not_crossEq_zero :=
7609    RatioOrbit.mul_mul_recip_pair_comm_crossEq_one_of_not_crossEq_zero
7610  ratio_recip_pair_comm_mul_mul_crossEq_one_of_not_crossEq_zero :=
7611    RatioOrbit.recip_pair_comm_mul_mul_crossEq_one_of_not_crossEq_zero
7612  ratio_mul_recip_pair_not_crossEq_zero_of_not_crossEq_zero :=
7613    RatioOrbit.mul_recip_pair_not_crossEq_zero_of_not_crossEq_zero
7614  ratio_zero_not_crossEq_mul_recip_pair_of_not_crossEq_zero :=
7615    RatioOrbit.zero_not_crossEq_mul_recip_pair_of_not_crossEq_zero
7616  ratio_mul_recip_pair_comm_not_crossEq_zero_of_not_crossEq_zero :=
7617    RatioOrbit.mul_recip_pair_comm_not_crossEq_zero_of_not_crossEq_zero
7618  ratio_zero_not_crossEq_mul_recip_pair_comm_of_not_crossEq_zero :=
7619    RatioOrbit.zero_not_crossEq_mul_recip_pair_comm_of_not_crossEq_zero
7620  ratio_mul_recip_crossEq_one_of_not_crossEq_zero :=
7621    RatioOrbit.mul_recip_crossEq_one_of_not_crossEq_zero
7622  ratio_recip_mul_crossEq_one_of_not_crossEq_zero :=
7623    RatioOrbit.recip_mul_crossEq_one_of_not_crossEq_zero
7624  ratio_one_crossEq_mul_recip_of_not_crossEq_zero :=
7625    RatioOrbit.one_crossEq_mul_recip_of_not_crossEq_zero
7626  ratio_one_crossEq_recip_mul_of_not_crossEq_zero :=
7627    RatioOrbit.one_crossEq_recip_mul_of_not_crossEq_zero
7628  ratio_mul_product_recip_crossEq_one_of_not_crossEq_zero :=
7629    RatioOrbit.mul_product_recip_crossEq_one_of_not_crossEq_zero
7630  ratio_recip_product_mul_crossEq_one_of_not_crossEq_zero :=
7631    RatioOrbit.recip_product_mul_crossEq_one_of_not_crossEq_zero
7632  ratio_one_crossEq_mul_product_recip_of_not_crossEq_zero :=
7633    RatioOrbit.one_crossEq_mul_product_recip_of_not_crossEq_zero
7634  ratio_one_crossEq_recip_product_mul_of_not_crossEq_zero :=
7635    RatioOrbit.one_crossEq_recip_product_mul_of_not_crossEq_zero
7636  ratio_recip_product_not_crossEq_zero_of_not_crossEq_zero :=
7637    RatioOrbit.recip_product_not_crossEq_zero_of_not_crossEq_zero
7638  ratio_zero_not_crossEq_recip_product_of_not_crossEq_zero :=
7639    RatioOrbit.zero_not_crossEq_recip_product_of_not_crossEq_zero
7640  ratio_recip_product_comm_not_crossEq_zero_of_not_crossEq_zero :=
7641    RatioOrbit.recip_product_comm_not_crossEq_zero_of_not_crossEq_zero
7642  ratio_zero_not_crossEq_recip_product_comm_of_not_crossEq_zero :=
7643    RatioOrbit.zero_not_crossEq_recip_product_comm_of_not_crossEq_zero
7644  ratio_recip_product_comm_crossEq_recip_product :=
7645    RatioOrbit.recip_product_comm_crossEq_recip_product
7646  ratio_recip_product_crossEq_recip_product_comm :=
7647    RatioOrbit.recip_product_crossEq_recip_product_comm
7648  ratio_mul_product_comm_recip_crossEq_one_of_not_crossEq_zero :=
7649    RatioOrbit.mul_product_comm_recip_crossEq_one_of_not_crossEq_zero
7650  ratio_recip_product_comm_mul_crossEq_one_of_not_crossEq_zero :=
7651    RatioOrbit.recip_product_comm_mul_crossEq_one_of_not_crossEq_zero
7652  ratio_one_crossEq_mul_product_comm_recip_of_not_crossEq_zero :=
7653    RatioOrbit.one_crossEq_mul_product_comm_recip_of_not_crossEq_zero
7654  ratio_one_crossEq_recip_product_comm_mul_of_not_crossEq_zero :=
7655    RatioOrbit.one_crossEq_recip_product_comm_mul_of_not_crossEq_zero
7656  ratio_recip_right_crossEq_of_mul_crossEq_one :=
7657    RatioOrbit.recip_right_crossEq_of_mul_crossEq_one
7658  ratio_recip_left_crossEq_of_mul_crossEq_one :=
7659    RatioOrbit.recip_left_crossEq_of_mul_crossEq_one
7660  ratio_recip_right_crossEq_of_one_crossEq_mul :=
7661    RatioOrbit.recip_right_crossEq_of_one_crossEq_mul
7662  ratio_recip_left_crossEq_of_one_crossEq_mul :=
7663    RatioOrbit.recip_left_crossEq_of_one_crossEq_mul
7664  ratio_mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip :=
7665    RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_crossEq_recip
7666  ratio_mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip :=
7667    RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_crossEq_recip
7668  ratio_one_crossEq_mul_iff_right_not_crossEq_zero_and_crossEq_recip :=
7669    RatioOrbit.one_crossEq_mul_iff_right_not_crossEq_zero_and_crossEq_recip
7670  ratio_one_crossEq_mul_iff_left_not_crossEq_zero_and_crossEq_recip :=
7671    RatioOrbit.one_crossEq_mul_iff_left_not_crossEq_zero_and_crossEq_recip
7672  ratio_mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq :=
7673    RatioOrbit.mul_crossEq_one_iff_right_not_crossEq_zero_and_recip_crossEq
7674  ratio_mul_crossEq_one_iff_left_not_crossEq_zero_and_recip_crossEq :=
7675    RatioOrbit.mul_crossEq_one_iff_left_not_crossEq_zero_and_recip_crossEq
7676  ratio_one_crossEq_mul_iff_right_not_crossEq_zero_and_recip_crossEq :=
7677    RatioOrbit.one_crossEq_mul_iff_right_not_crossEq_zero_and_recip_crossEq
7678  ratio_one_crossEq_mul_iff_left_not_crossEq_zero_and_recip_crossEq :=
7679    RatioOrbit.one_crossEq_mul_iff_left_not_crossEq_zero_and_recip_crossEq
7680  ratio_mul_crossEq_one_iff_factors_not_crossEq_zero_and_crossEq_recip :=
7681    RatioOrbit.mul_crossEq_one_iff_factors_not_crossEq_zero_and_crossEq_recip
7682  ratio_one_crossEq_mul_iff_factors_not_crossEq_zero_and_crossEq_recip :=
7683    RatioOrbit.one_crossEq_mul_iff_factors_not_crossEq_zero_and_crossEq_recip
7684  ratio_mul_crossEq_one_iff_factors_not_crossEq_zero_and_recip_crossEq :=
7685    RatioOrbit.mul_crossEq_one_iff_factors_not_crossEq_zero_and_recip_crossEq
7686  ratio_one_crossEq_mul_iff_factors_not_crossEq_zero_and_recip_crossEq :=
7687    RatioOrbit.one_crossEq_mul_iff_factors_not_crossEq_zero_and_recip_crossEq
7688
7689end PrimitiveRecognitionCalculus
7690end Foundation
7691end IndisputableMonolith
7692

source mirrored from github.com/jonwashburn/shape-of-logic