Theorem: Int.fract_div_intCast_eq_div_intCast_mod
File: Mathlib/Algebra/Order/Floor.lean

tactic: rcases n.eq_zero_or_pos with (rfl | hn)
state_before: F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
⊢ fract (↑m / ↑n) = ↑(m % ↑n) / ↑n

tactic: replace hn : 0 < (n : k)
state_before: case inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : n > 0
⊢ fract (↑m / ↑n) = ↑(m % ↑n) / ↑n

tactic: obtain ⟨m₀, rfl | rfl⟩ := m.eq_nat_or_neg
state_before: case inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
⊢ fract (↑m / ↑n) = ↑(m % ↑n) / ↑n

tactic: let q := ⌈↑m₀ / (n : k)⌉
state_before: case inr.intro.inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
⊢ fract (↑(-↑m₀) / ↑n) = ↑(-↑m₀ % ↑n) / ↑n

tactic: let m₁ := q * ↑n - (↑m₀ : ℤ)
state_before: case inr.intro.inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
⊢ fract (↑(-↑m₀) / ↑n) = ↑(-↑m₀ % ↑n) / ↑n

tactic: have hm₁ : 0 ≤ m₁ := by
  simpa [← @cast_le k, ← div_le_iff hn] using FloorRing.gc_ceil_coe.le_u_l _
state_before: case inr.intro.inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
⊢ fract (↑(-↑m₀) / ↑n) = ↑(-↑m₀ % ↑n) / ↑n

tactic: calc
  fract ((Int.cast (-(m₀ : ℤ)) : k) / (n : k))
    = fract (-(m₀ : k) / n) := by rw [cast_neg, cast_ofNat]
  _ = fract ((m₁ : k) / n) := ?_
  _ = Int.cast (m₁ % (n : ℤ)) / Nat.cast n := this hm₁
  _ = Int.cast (-(↑m₀ : ℤ) % ↑n) / Nat.cast n := ?_
state_before: case inr.intro.inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ fract (↑(-↑m₀) / ↑n) = ↑(-↑m₀ % ↑n) / ↑n

tactic: simp
state_before: case inl
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
⊢ fract (↑m / ↑0) = ↑(m % ↑0) / ↑0

tactic: norm_cast
state_before: case hn
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : n > 0
⊢ 0 < ↑n

tactic: intros l hl
state_before: F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : 0 < ↑n
⊢ ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n

tactic: obtain ⟨l₀, rfl | rfl⟩ := l.eq_nat_or_neg
state_before: F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : 0 < ↑n
l : ℤ
hl : 0 ≤ l
⊢ fract (↑l / ↑n) = ↑(l % ↑n) / ↑n

tactic: rw [cast_ofNat, ← coe_nat_mod, cast_ofNat, fract_div_natCast_eq_div_natCast_mod]
state_before: case intro.inl
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : 0 < ↑n
l₀ : ℕ
hl : 0 ≤ ↑l₀
⊢ fract (↑↑l₀ / ↑n) = ↑(↑l₀ % ↑n) / ↑n

tactic: rw [Right.nonneg_neg_iff, coe_nat_nonpos_iff] at hl
state_before: case intro.inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : 0 < ↑n
l₀ : ℕ
hl : 0 ≤ -↑l₀
⊢ fract (↑(-↑l₀) / ↑n) = ↑(-↑l₀ % ↑n) / ↑n

tactic: simp [hl, zero_mod]
state_before: case intro.inr
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
m : ℤ
n : ℕ
hn : 0 < ↑n
l₀ : ℕ
hl : l₀ = 0
⊢ fract (↑(-↑l₀) / ↑n) = ↑(-↑l₀ % ↑n) / ↑n

tactic: exact this (ofNat_nonneg m₀)
state_before: case inr.intro.inl
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
⊢ fract (↑↑m₀ / ↑n) = ↑(↑m₀ % ↑n) / ↑n

tactic: simpa [← @cast_le k, ← div_le_iff hn] using FloorRing.gc_ceil_coe.le_u_l _
state_before: F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
⊢ 0 ≤ m₁

tactic: rw [cast_neg, cast_ofNat]
state_before: F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ fract (↑(-↑m₀) / ↑n) = fract (-↑m₀ / ↑n)

tactic: rw [← fract_int_add q, ← mul_div_cancel (q : k) (ne_of_gt hn), ← add_div, ← sub_eq_add_neg]
state_before: case inr.intro.inr.calc_1
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ fract (-↑m₀ / ↑n) = fract (↑m₁ / ↑n)

tactic: simp
state_before: case inr.intro.inr.calc_1
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ fract ((↑q * ↑n - ↑m₀) / ↑n) = fract (↑m₁ / ↑n)

tactic: congr 2
state_before: case inr.intro.inr.calc_2
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ ↑(m₁ % ↑n) / ↑n = ↑(-↑m₀ % ↑n) / ↑n

tactic: change (q * ↑n - (↑m₀ : ℤ)) % ↑n = _
state_before: case inr.intro.inr.calc_2.e_a.e_a
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ m₁ % ↑n = -↑m₀ % ↑n

tactic: rw [sub_eq_add_neg, add_comm (q * ↑n), add_mul_emod_self]
state_before: case inr.intro.inr.calc_2.e_a.e_a
F : Type ?u.196930
α : Type ?u.196933
β : Type ?u.196936
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
z : ℤ
a : α
k : Type u_1
inst✝¹ : LinearOrderedField k
inst✝ : FloorRing k
b : k
n : ℕ
hn : 0 < ↑n
this : ∀ {l : ℤ}, 0 ≤ l → fract (↑l / ↑n) = ↑(l % ↑n) / ↑n
m₀ : ℕ
q : ℤ := ⌈↑m₀ / ↑n⌉
m₁ : ℤ := q * ↑n - ↑m₀
hm₁ : 0 ≤ m₁
⊢ (q * ↑n - ↑m₀) % ↑n = -↑m₀ % ↑n