IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.IntegerOrder
IndisputableMonolith/Foundation/PrimitiveRecognitionCalculus/IntegerOrder.lean · 7692 lines · 443 declarations
show as:
view math explainer →
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