Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2016 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad, Mario Carneiro
-/
import Std.Data.Int.Lemmas
/-!
# Lemmas about integer division
-/
open Nat
namespace Int
/-! ### `/` -/
theorem ofNat_div : ∀ (m n : Nat ), ↑(m / n ) = div ↑m ↑n ofNat_div ( m n : Nat ) : ↑( m / n ) = div ↑ m ↑ n := rfl : ∀ {α : Sort ?u.133} {a : α }, a = a rfl
theorem ofNat_fdiv : ∀ (m n : Nat ), ↑(m / n ) = fdiv ↑m ↑n ofNat_fdiv : ∀ m n : Nat , ↑( m / n ) = fdiv ↑ m ↑ n
| 0 , _ => by simp [ fdiv ]
| succ _, _ => rfl : ∀ {α : Sort ?u.330} {a : α }, a = a rfl
@[ simp , norm_cast ] theorem ofNat_ediv : ∀ (m n : Nat ), ↑(m / n ) = ↑m / ↑n ofNat_ediv ( m n : Nat ) : (↑( m / n ) : Int ) = ↑ m / ↑ n := rfl : ∀ {α : Sort ?u.673} {a : α }, a = a rfl
theorem negSucc_ediv ( m : Nat ) { b : Int } ( H : 0 < b ) : -[ m +1] / b = -( div m b + 1 ) :=
match b , eq_succ_of_zero_lt : ∀ {a : Int }, 0 < a → ∃ n , a = ↑(succ n ) eq_succ_of_zero_lt H with
| _, ⟨ _ , rfl : ∀ {α : Sort ?u.964} {a : α }, a = a rfl⟩ => rfl : ∀ {α : Sort ?u.1024} {a : α }, a = a rfl
@[ simp ] protected theorem zero_div : ∀ b : Int , div 0 b = 0
| ofNat _ => show ofNat _ = _ by simp
| -[_+1] => show - ofNat _ = _ by simp
@[ local simp ] theorem zero_ediv : ∀ (b : Int ), 0 / b = 0 zero_ediv : ∀ b : Int , 0 / b = 0
| ofNat _ => show ofNat _ = _ by simp
| -[_+1] => show - ofNat _ = _ by simp
@[ simp ] theorem zero_fdiv ( b : Int ) : fdiv 0 b = 0 := by cases b <;> rfl
@[ simp ] protected theorem div_zero : ∀ a : Int , div a 0 = 0
| ofNat _ => show ofNat _ = _ by simp
| -[_+1] => rfl : ∀ {α : Sort ?u.2925} {a : α }, a = a rfl
-- Will be generalized to Euclidean domains.
@[ local simp ] protected theorem ediv_zero : ∀ (a : Int ), a / 0 = 0 ediv_zero : ∀ a : Int , a / 0 = 0
| ofNat _ => show ofNat _ = _ by simp
| -[_+1] => rfl : ∀ {α : Sort ?u.3242} {a : α }, a = a rfl
@[ simp ] protected theorem fdiv_zero : ∀ a : Int , fdiv a 0 = 0
| 0 => rfl : ∀ {α : Sort ?u.3423} {a : α }, a = a rfl
| succ _ => rfl : ∀ {α : Sort ?u.3496} {a : α }, a = a rfl
| -[_+1] => rfl : ∀ {α : Sort ?u.3545} {a : α }, a = a rfl
theorem fdiv_eq_ediv : ∀ ( a : Int ) { b : Int }, 0 ≤ b → fdiv a b = a / b
| 0 , _, _ | -[_+1], 0 , _ => by simp
| succ _, ofNat _, _ | -[_+1], succ _, _ => rfl : ∀ {α : Sort ?u.3951} {a : α }, a = a rfl
theorem div_eq_ediv : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → div a b = a / b div_eq_ediv : ∀ { a b : Int }, 0 ≤ a → 0 ≤ b → a . div b = a / b
| 0 , _, _, _ | _, 0 , _, _ => by x✝² : Int x✝¹ : 0 ≤ x✝² x✝ : 0 ≤ 0 simp
| succ _, succ _, _, _ => rfl : ∀ {α : Sort ?u.4884} {a : α }, a = a rfl
theorem fdiv_eq_div { a b : Int } ( Ha : 0 ≤ a ) ( Hb : 0 ≤ b ) : fdiv a b = div a b :=
div_eq_ediv : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → div a b = a / b div_eq_ediv Ha Hb ▸ fdiv_eq_ediv _ Hb
@[ simp ] protected theorem div_neg : ∀ a b : Int , a . div (- b ) = -( a . div b )
| ofNat m , 0 => show ofNat ( m / 0 ) = -↑( m / 0 ) by rw [ Nat.div_zero : ∀ (n : Nat ), n / 0 = 0 Nat.div_zero] ; rfl
| ofNat m , -[ n +1] | -[ m +1], succ n => ( Int.neg_neg : ∀ (a : Int ), - - a = a Int.neg_neg _ ). symm : ∀ {α : Sort ?u.6519} {a b : α }, a = b → b = a symm
| ofNat m , succ n | -[ m +1], 0 | -[ m +1], -[ n +1] => rfl : ∀ {α : Sort ?u.6731} {a : α }, a = a rfl
@[ simp ] protected theorem ediv_neg : ∀ (a b : Int ), a / - b = - (a / b ) ediv_neg : ∀ a b : Int , a / (- b ) = -( a / b )
| ofNat m , 0 => show ofNat ( m / 0 ) = -↑( m / 0 ) by rw [ Nat.div_zero : ∀ (n : Nat ), n / 0 = 0 Nat.div_zero] ; rfl
| ofNat m , -[ n +1] => ( Int.neg_neg : ∀ (a : Int ), - - a = a Int.neg_neg _ ). symm : ∀ {α : Sort ?u.7352} {a b : α }, a = b → b = a symm
| ofNat m , succ n | -[ m +1], 0 | -[ m +1], succ n | -[ m +1], -[ n +1] => rfl : ∀ {α : Sort ?u.7707} {a : α }, a = a rfl
protected theorem div_def ( a b : Int ) : a / b = Int.ediv a b := rfl : ∀ {α : Sort ?u.8063} {a : α }, a = a rfl
-- Lean 4 core provides an instance for `Div Int` using `Int.div`.
-- Even though we provide a higher priority instance in `Std.Data.Int.Basic`,
-- we provide a `simp` lemma here to unfold usages of that instance back to `Int.div`.
@[ simp ] theorem div_def' : ∀ (a b : Int ), a / b = div a b div_def' ( a b : Int ) :
@ HDiv.hDiv Int Int Int (@ instHDiv : {α : Type ?u.8080} → [inst : Div α ] → HDiv α α α instHDiv Int Int.instDivInt ) a b = Int.div a b := rfl : ∀ {α : Sort ?u.8089} {a : α }, a = a rfl
@[ simp ] protected theorem neg_div : ∀ a b : Int , (- a ). div b = -( a . div b )
| 0 , n => by simp [ Int.neg_zero ]
| succ m , (n:Nat) | -[ m +1], 0 | -[ m +1], -[ n +1] => rfl : ∀ {α : Sort ?u.8303} {a : α }, a = a rfl
| succ m , -[ n +1] | -[ m +1], succ n => ( Int.neg_neg : ∀ (a : Int ), - - a = a Int.neg_neg _ ). symm : ∀ {α : Sort ?u.8546} {a b : α }, a = b → b = a symm
protected theorem neg_div_neg ( a b : Int ) : (- a ). div (- b ) = a . div b := by
simp [ Int.div_neg , Int.neg_div , Int.neg_neg : ∀ (a : Int ), - - a = a Int.neg_neg]
protected theorem div_nonneg : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → 0 ≤ div a b div_nonneg { a b : Int } ( Ha : 0 ≤ a ) ( Hb : 0 ≤ b ) : 0 ≤ a . div b :=
match a , b , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le Ha , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le Hb with
| _, _, ⟨ _ , rfl : ∀ {α : Sort ?u.9393} {a : α }, a = a rfl⟩, ⟨ _ , rfl : ∀ {α : Sort ?u.9397} {a : α }, a = a rfl⟩ => ofNat_zero_le : ∀ (n : Nat ), 0 ≤ ↑n ofNat_zero_le _
theorem fdiv_nonneg : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → 0 ≤ fdiv a b fdiv_nonneg { a b : Int } ( Ha : 0 ≤ a ) ( Hb : 0 ≤ b ) : 0 ≤ a . fdiv b :=
match a , b , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le Ha , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le Hb with
| _, _, ⟨ _ , rfl : ∀ {α : Sort ?u.10023} {a : α }, a = a rfl⟩, ⟨ _ , rfl : ∀ {α : Sort ?u.10027} {a : α }, a = a rfl⟩ => ofNat_fdiv : ∀ (m n : Nat ), ↑(m / n ) = fdiv ↑m ↑n ofNat_fdiv .. ▸ ofNat_zero_le : ∀ (n : Nat ), 0 ≤ ↑n ofNat_zero_le _
theorem ediv_nonneg : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → 0 ≤ a / b ediv_nonneg { a b : Int } ( Ha : 0 ≤ a ) ( Hb : 0 ≤ b ) : 0 ≤ a / b :=
match a , b , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le Ha , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le Hb with
| _, _, ⟨ _ , rfl : ∀ {α : Sort ?u.10648} {a : α }, a = a rfl⟩, ⟨ _ , rfl : ∀ {α : Sort ?u.10652} {a : α }, a = a rfl⟩ => ofNat_zero_le : ∀ (n : Nat ), 0 ≤ ↑n ofNat_zero_le _
protected theorem div_nonpos : ∀ {a b : Int }, 0 ≤ a → b ≤ 0 → div a b ≤ 0 div_nonpos { a b : Int } ( Ha : 0 ≤ a ) ( Hb : b ≤ 0 ) : a . div b ≤ 0 :=
Int.nonpos_of_neg_nonneg : ∀ {a : Int }, 0 ≤ - a → a ≤ 0 Int.nonpos_of_neg_nonneg <| Int.div_neg .. ▸ Int.div_nonneg : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → 0 ≤ div a b Int.div_nonneg Ha ( Int.neg_nonneg_of_nonpos : ∀ {a : Int }, a ≤ 0 → 0 ≤ - a Int.neg_nonneg_of_nonpos Hb )
theorem fdiv_nonpos : ∀ {a b : Int }, 0 ≤ a → b ≤ 0 → fdiv a b ≤ 0 fdiv_nonpos : ∀ { a b : Int }, 0 ≤ a → b ≤ 0 → a . fdiv b ≤ 0
| 0 , 0 , _, _ | 0 , -[_+1], _, _ | succ _, 0 , _, _ | succ _, -[_+1], _, _ => ⟨ _ ⟩
theorem ediv_nonpos : ∀ {a b : Int }, 0 ≤ a → b ≤ 0 → a / b ≤ 0 ediv_nonpos { a b : Int } ( Ha : 0 ≤ a ) ( Hb : b ≤ 0 ) : a / b ≤ 0 :=
Int.nonpos_of_neg_nonneg : ∀ {a : Int }, 0 ≤ - a → a ≤ 0 Int.nonpos_of_neg_nonneg <| Int.ediv_neg : ∀ (a b : Int ), a / - b = - (a / b ) Int.ediv_neg .. ▸ Int.ediv_nonneg : ∀ {a b : Int }, 0 ≤ a → 0 ≤ b → 0 ≤ a / b Int.ediv_nonneg Ha ( Int.neg_nonneg_of_nonpos : ∀ {a : Int }, a ≤ 0 → 0 ≤ - a Int.neg_nonneg_of_nonpos Hb )
theorem fdiv_neg' : ∀ { a b : Int }, a < 0 → 0 < b → a . fdiv b < 0
| -[_+1], succ _, _, _ => negSucc_lt_zero _
theorem ediv_neg' { a b : Int } ( Ha : a < 0 ) ( Hb : 0 < b ) : a / b < 0 :=
match a , b , eq_negSucc_of_lt_zero : ∀ {a : Int }, a < 0 → ∃ n , a = -[ n +1] eq_negSucc_of_lt_zero Ha , eq_succ_of_zero_lt : ∀ {a : Int }, 0 < a → ∃ n , a = ↑(succ n ) eq_succ_of_zero_lt Hb with
| _, _, ⟨ _ , rfl : ∀ {α : Sort ?u.14653} {a : α }, a = a rfl⟩, ⟨ _ , rfl : ∀ {α : Sort ?u.14657} {a : α }, a = a rfl⟩ => negSucc_lt_zero _
@[ simp ] protected theorem div_one : ∀ a : Int , a . div 1 = a
| (n:Nat) => congrArg : ∀ {α : Sort ?u.15243} {β : Sort ?u.15242} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg ofNat ( Nat.div_one : ∀ (n : Nat ), n / 1 = n Nat.div_one _ )
| -[ n +1] => by simp [ Int.div , neg_ofNat_succ ]
@[ simp ] theorem fdiv_one : ∀ a : Int , a . fdiv 1 = a
| 0 => rfl : ∀ {α : Sort ?u.15533} {a : α }, a = a rfl
| succ _ => congrArg : ∀ {α : Sort ?u.15607} {β : Sort ?u.15606} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg Nat.cast ( Nat.div_one : ∀ (n : Nat ), n / 1 = n Nat.div_one _ )
| -[_+1] => congrArg : ∀ {α : Sort ?u.15663} {β : Sort ?u.15662} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg negSucc ( Nat.div_one : ∀ (n : Nat ), n / 1 = n Nat.div_one _ )
@[ simp ] theorem ediv_one : ∀ (a : Int ), a / 1 = a ediv_one : ∀ a : Int , a / 1 = a
| (_:Nat) => congrArg : ∀ {α : Sort ?u.15900} {β : Sort ?u.15899} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg Nat.cast ( Nat.div_one : ∀ (n : Nat ), n / 1 = n Nat.div_one _ )
| -[_+1] => congrArg : ∀ {α : Sort ?u.15964} {β : Sort ?u.15963} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg negSucc ( Nat.div_one : ∀ (n : Nat ), n / 1 = n Nat.div_one _ )
theorem div_eq_zero_of_lt : ∀ {a b : Int }, 0 ≤ a → a < b → div a b = 0 div_eq_zero_of_lt { a b : Int } ( H1 : 0 ≤ a ) ( H2 : a < b ) : a . div b = 0 :=
match a , b , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le H1 , eq_succ_of_zero_lt : ∀ {a : Int }, 0 < a → ∃ n , a = ↑(succ n ) eq_succ_of_zero_lt ( Int.lt_of_le_of_lt : ∀ {a b c : Int }, a ≤ b → b < c → a < c Int.lt_of_le_of_lt H1 H2 ) with
| _, _, ⟨ _ , rfl : ∀ {α : Sort ?u.16151} {a : α }, a = a rfl⟩, ⟨ _ , rfl : ∀ {α : Sort ?u.16163} {a : α }, a = a rfl⟩ => congrArg : ∀ {α : Sort ?u.16261} {β : Sort ?u.16260} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg Nat.cast <| Nat.div_eq_of_lt : ∀ {a b : Nat }, a < b → a / b = 0 Nat.div_eq_of_lt <| ofNat_lt . 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 H2
theorem ediv_eq_zero_of_lt : ∀ {a b : Int }, 0 ≤ a → a < b → a / b = 0 ediv_eq_zero_of_lt { a b : Int } ( H1 : 0 ≤ a ) ( H2 : a < b ) : a / b = 0 :=
match a , b , eq_ofNat_of_zero_le : ∀ {a : Int }, 0 ≤ a → ∃ n , a = ↑n eq_ofNat_of_zero_le H1 , eq_succ_of_zero_lt : ∀ {a : Int }, 0 < a → ∃ n , a = ↑(succ n ) eq_succ_of_zero_lt ( Int.lt_of_le_of_lt : ∀ {a b c : Int }, a ≤ b → b < c → a < c Int.lt_of_le_of_lt H1 H2 ) with
| _, _, ⟨ _ , rfl : ∀ {α : Sort ?u.16838} {a : α }, a = a rfl⟩, ⟨ _ , rfl : ∀ {α : Sort ?u.16842} {a : α }, a = a rfl⟩ => congrArg : ∀ {α : Sort ?u.16940} {β : Sort ?u.16939} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg Nat.cast <| Nat.div_eq_of_lt : ∀ {a b : Nat }, a < b → a / b = 0 Nat.div_eq_of_lt <| ofNat_lt . 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 H2
theorem add_mul_ediv_right : ∀ (a b : Int ) {c : Int }, c ≠ 0 → (a + b * c ) / c = a / c + b add_mul_ediv_right ( a b : Int ) { c : Int } ( H : c ≠ 0 ) : ( a + b * c ) / c = a / c + b :=
suffices ∀ {{ a b c : Int }}, 0 < c → ( a + b * c ). ediv c = a . ediv c + b from
match Int.lt_trichotomy c 0 with
| Or.inl : ∀ {a b : Prop }, a → a ∨ b Or.inl hlt => by
rw [ ← Int.neg_inj : ∀ {a b : Int }, - a = - b ↔ a = b Int.neg_inj, ← Int.ediv_neg : ∀ (a b : Int ), a / - b = - (a / b ) Int.ediv_neg, Int.neg_add : ∀ {a b : Int }, - (a + b ) = - a + - b Int.neg_add, ← Int.ediv_neg : ∀ (a b : Int ), a / - b = - (a / b ) Int.ediv_neg, ← Int.neg_mul_neg : ∀ (a b : Int ), - a * - b = a * b Int.neg_mul_neg]
exact this ( Int.neg_pos_of_neg : ∀ {a : Int }, a < 0 → 0 < - a Int.neg_pos_of_neg hlt )
| Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr ( Or.inl : ∀ {a b : Prop }, a → a ∨ b Or.inl HEq ) => absurd : ∀ {a : Prop } {b : Sort ?u.19344}, a → ¬ a → b absurd HEq H
| Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr ( Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr hgt ) => this hgt
suffices ∀ { k n : Nat } { a : Int }, ( a + n * k . succ ). ediv k . succ = a . ediv k . succ + n from
fun a b c H => match c , eq_succ_of_zero_lt : ∀ {a : Int }, 0 < a → ∃ n , a = ↑(succ n ) eq_succ_of_zero_lt H , b with
| _, ⟨ _ , rfl : ∀ {α : Sort ?u.18106} {a : α }, a = a rfl⟩, ofNat _ => this
| _, ⟨ k , rfl : ∀ {α : Sort ?u.18181} {a : α }, a = a rfl⟩, -[ n +1] => show ( a - n . succ * k . succ ). ediv k . succ = a . ediv k . succ - n . succ by
rw [ ← Int.add_sub_cancel : ∀ (a b : Int ), a + b - b = a Int.add_sub_cancel ( ediv ..), ← this , Int.sub_add_cancel : ∀ (a b : Int ), a - b + b = a Int.sub_add_cancel]
fun { k n } => @ fun
| ofNat m => congrArg : ∀ {α : Sort ?u.17877} {β : Sort ?u.17876} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg ofNat <| Nat.add_mul_div_right : ∀ (x y : Nat ) {z : Nat }, 0 < z → (x + y * z ) / z = x / z + y Nat.add_mul_div_right _ _ k . succ_pos
| -[ m +1] => by
show (( n * k . succ : Nat ) - m . succ : Int ). ediv k . succ = n - ( m / k . succ + 1 : Nat )
if h : m < n * k . succ then
rw [ ← Int.ofNat_sub : ∀ {m n : Nat }, m ≤ n → ↑(n - m ) = ↑n - ↑m Int.ofNat_sub h , ← Int.ofNat_sub : ∀ {m n : Nat }, m ≤ n → ↑(n - m ) = ↑n - ↑m Int.ofNat_sub (( Nat.div_lt_iff_lt_mul : ∀ {k x y : Nat }, 0 < k → (x / k < y ↔ x < y * k ) Nat.div_lt_iff_lt_mul k . succ_pos ). 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 h ) ]
apply congrArg : ∀ {α : Sort ?u.20781} {β : Sort ?u.20780} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg ofNat
rw [ Nat.mul_comm : ∀ (n m : Nat ), n * m = m * n Nat.mul_comm, Nat.mul_sub_div ] ; rwa [ Nat.mul_comm : ∀ (n m : Nat ), n * m = m * n Nat.mul_comm]
else
have h := Nat.not_lt . 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 h
have H { a b : Nat } ( h : a ≤ b ) : ( a : Int ) + -(( b : Int ) + 1 ) = -[ b - a +1] := by
rw [ negSucc_eq , Int.ofNat_sub : ∀ {m n : Nat }, m ≤ n → ↑(n - m ) = ↑n - ↑m Int.ofNat_sub h ]
simp only [ Int.sub_eq_add_neg : ∀ {a b : Int }, a - b = a + - b Int.sub_eq_add_neg, Int.neg_add : ∀ {a b : Int }, - (a + b ) = - a + - b Int.neg_add, Int.neg_neg : ∀ (a : Int ), - - a = a Int.neg_neg, Int.add_left_comm : ∀ (a b c : Int ), a + (b + c ) = b + (a + c ) Int.add_left_comm, Int.add_assoc : ∀ (a b c : Int ), a + b + c = a + (b + c ) Int.add_assoc]
show ediv (↑( n * succ k ) + -(( m : Int ) + 1 )) ( succ k ) = n + -(↑( m / succ k ) + 1 : Int )
rw [ H h , H (( Nat.le_div_iff_mul_le : ∀ {k x y : Nat }, 0 < k → (x ≤ y / k ↔ x * k ≤ y ) Nat.le_div_iff_mul_le k . succ_pos ). 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 h ) ]
apply congrArg : ∀ {α : Sort ?u.22422} {β : Sort ?u.22421} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg negSucc
rw [ Nat.mul_comm : ∀ (n m : Nat ), n * m = m * n Nat.mul_comm, Nat.sub_mul_div : ∀ (x n p : Nat ), n * p ≤ x → (x - n * p ) / n = x / n - p Nat.sub_mul_div] ; rwa [ Nat.mul_comm : ∀ (n m : Nat ), n * m = m * n Nat.mul_comm]
theorem add_mul_ediv_left : ∀ (a : Int ) {b : Int } (c : Int ), b ≠ 0 → (a + b * c ) / b = a / b + c add_mul_ediv_left ( a : Int ) { b : Int }
( c : Int ) ( H : b ≠ 0 ) : ( a + b * c ) / b = a / b + c :=
Int.mul_comm : ∀ (a b : Int ), a * b = b * a Int.mul_comm .. ▸ Int.add_mul_ediv_right : ∀ (a b : Int ) {c : Int }, c ≠ 0 → (a + b * c ) / c = a / c + b Int.add_mul_ediv_right _ _ H
theorem add_ediv_of_dvd_right : ∀ {a b c : Int }, c ∣ b → (a + b ) / c = a / c + b / c add_ediv_of_dvd_right { a b c : Int } ( H : c ∣ b ) : ( a + b ) / c = a / c + b / c :=
if h : c = 0 then by a, b, c : Int H : c ∣ b h : c = 0 simp [ h ] else by
let ⟨ k , hk ⟩ := H
rw [ hk , Int.mul_comm : ∀ (a b : Int ), a * b = b * a Int.mul_comm c k , Int.add_mul_ediv_right : ∀ (a b : Int ) {c : Int }, c ≠ 0 → (a + b * c ) / c = a / c + b Int.add_mul_ediv_right _ _ h ,
← Int.zero_add : ∀ (a : Int ), 0 + a = a Int.zero_add ( k * c ), Int.add_mul_ediv_right : ∀ (a b : Int ) {c : Int }, c ≠ 0 → (a + b * c ) / c = a / c + b Int.add_mul_ediv_right _ _ h , Int.zero_ediv : ∀ (b : Int ), 0 / b = 0 Int.zero_ediv, Int.zero_add : ∀ (a : Int ), 0 + a = a Int.zero_add]
theorem add_ediv_of_dvd_left : ∀ {a b c : Int }, c ∣ a → (a + b ) / c = a / c + b / c add_ediv_of_dvd_left { a b c : Int } ( H : c ∣ a ) : ( a + b ) / c = a / c + b / c := by
rw [ Int.add_comm : ∀ (a b : Int ), a + b = b + a Int.add_comm, Int.add_ediv_of_dvd_right : ∀ {a b c : Int }, c ∣ b → (a + b ) / c = a / c + b / c Int.add_ediv_of_dvd_right H , Int.add_comm : ∀ (a b : Int ), a + b = b + a Int.add_comm]
@[ simp ] theorem mul_ediv_cancel : ∀ (a : Int ) {b : Int }, b ≠ 0 → a * b / b = a mul_ediv_cancel ( a : Int ) { b : Int } ( H : b ≠ 0 ) : ( a * b ) / b = a := by
have := Int.add_mul_ediv_right : ∀ (a b : Int ) {c : Int }, c ≠ 0 → (a + b * c ) / c = a / c + b Int.add_mul_ediv_right 0 a H a, b : Int H : b ≠ 0 this : (0 + a * b ) / b = 0 / b + a
rwa [ a, b : Int H : b ≠ 0 this : (0 + a * b ) / b = 0 / b + a Int.zero_add : ∀ (a : Int ), 0 + a = a Int.zero_add, a, b : Int H : b ≠ 0 this : (0 + a * b ) / b = 0 / b + a Int.zero_ediv : ∀ (b : Int ), 0 / b = 0 Int.zero_ediv, a, b : Int H : b ≠ 0 this : a * b / b = 0 + a a, b : Int H : b ≠ 0 this : (0 + a * b ) / b = 0 / b + a Int.zero_add : ∀ (a : Int ), 0 + a = a Int.zero_adda, b : Int H : b ≠ 0 this : a * b / b = a ] a, b : Int H : b ≠ 0 this : a * b / b = a at this : a * b / b = 0 / b + a this
@[ simp ] theorem mul_fdiv_cancel : ∀ (a : Int ) {b : Int }, b ≠ 0 → fdiv (a * b ) b = a mul_fdiv_cancel ( a : Int ) { b : Int } ( H : b ≠ 0 ) : fdiv ( a * b ) b = a :=
if b0 : 0 ≤ b then by
a, b : Int H : b ≠ 0 b0 : 0 ≤ b rw [ a, b : Int H : b ≠ 0 b0 : 0 ≤ b fdiv_eq_ediv _ b0 , a, b : Int H : b ≠ 0 b0 : 0 ≤ b a, b : Int H : b ≠ 0 b0 : 0 ≤ b mul_ediv_cancel : ∀ (a : Int ) {b : Int }, b ≠ 0 → a * b / b = a mul_ediv_cancel _ H a, b : Int H : b ≠ 0 b0 : 0 ≤ b ]
else
match a , b , Int.not_le . 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 b0 with
| 0 , _, _ => by a, b, x✝¹ : Int x✝ : x✝¹ < 0 H : x✝¹ ≠ 0 b0 : ¬ 0 ≤ x✝¹ simp [ Int.zero_mul : ∀ (a : Int ), 0 * a = 0 Int.zero_mul]
| succ a , -[ b +1], _ => congrArg : ∀ {α : Sort ?u.24313} {β : Sort ?u.24312} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg ofNat <| Nat.mul_div_cancel : ∀ (m : Nat ) {n : Nat }, 0 < n → m * n / n = m Nat.mul_div_cancel ( succ a ) b . succ_pos
| -[ a +1], -[ b +1], _ => congrArg : ∀ {α : Sort ?u.24622} {β : Sort ?u.24621} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congrArg negSucc <| Nat.div_eq_of_lt_le : ∀ {k n m : Nat }, k * n ≤ m → m < succ k * n → m / n = k Nat.div_eq_of_lt_le
( le_of_lt_succ <| Nat.mul_lt_mul_of_pos_right : ∀ {n m k : Nat }, n < m → k > 0 → n * k < m * k Nat.mul_lt_mul_of_pos_right a . lt_succ_self b . succ_pos )
( lt_succ_self _ )
@[ simp ] protected theorem mul_div_cancel : ∀ (a : Int ) {b : Int }, b ≠ 0 → div (a * b ) b = a mul_div_cancel ( a : Int ) { b : Int } ( H : b ≠ 0 ) : ( a * b ). div b = a :=
have : ∀ { a b : Nat }, ( b : Int ) ≠ 0 → ( div ( a * b ) b : Int ) = a := fun H => by
div (↑a✝ * ↑b✝ ) ↑b✝ = ↑a✝ rw [ div (↑a✝ * ↑b✝ ) ↑b✝ = ↑a✝ ← ofNat_mul : ∀ (n m : Nat ), ↑(n * m ) = ↑n * ↑m ofNat_mul, div (↑a✝ * ↑b✝ ) ↑b✝ = ↑a✝ ← ofNat_div : ∀ (m n : Nat ), ↑(m / n ) = div ↑m ↑n ofNat_div,
div (↑a✝ * ↑b✝ ) ↑b✝ = ↑a✝ Nat.mul_div_cancel : ∀ (m : Nat ) {n : Nat }, 0 < n → m * n / n = m Nat.mul_div_cancel _ <| Nat.pos_of_ne_zero : ∀ {n : Nat }, n ≠ 0 → 0 < n Nat.pos_of_ne_zero <| Int.ofNat_ne_zero : ∀ {n : Nat }, ↑n ≠ 0 ↔ n ≠ 0 Int.ofNat_ne_zero. 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 H ]
match a , b , a . eq_nat_or_neg : ∀ (a : Int ), ∃ n , a = ↑n ∨ a = - ↑n eq_nat_or_neg, b . eq_nat_or_neg : ∀ (a : Int ), ∃ n , a = ↑n ∨ a = - ↑n eq_nat_or_neg with
| _, _, ⟨ a , .inl : ∀ {a b : Prop }, a → a ∨ b .inl rfl : ∀ {α : Sort ?u.25840} {a : α }, a = a rfl⟩, ⟨ b , .inl : ∀ {a b : Prop }, a → a ∨ b .inl rfl : ∀ {α : Sort ?u.25844} {a : α }, a = a rfl⟩ => this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a this H
| _, _, ⟨ a , .inl : ∀ {a b : Prop }, a → a ∨ b .inl rfl : ∀ {α : Sort ?u.25983} {a : α }, a = a rfl⟩, ⟨ b , .inr : ∀ {a b : Prop }, b → a ∨ b .inr rfl : ∀ {α : Sort ?u.25987} {a : α }, a = a rfl⟩ => by
rw [ Int.mul_neg : ∀ (a b : Int ), a * - b = - (a * b ) Int.mul_neg, Int.neg_div , Int.div_neg , Int.neg_neg : ∀ (a : Int ), - - a = a Int.neg_neg,
this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a this ( Int.neg_ne_zero : ∀ {a : Int }, - a ≠ 0 ↔ a ≠ 0 Int.neg_ne_zero. 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 H ) ]
| _, _, ⟨ a , .inr : ∀ {a b : Prop }, b → a ∨ b .inr rfl : ∀ {α : Sort ?u.26066} {a : α }, a = a rfl⟩, ⟨ b , .inl : ∀ {a b : Prop }, a → a ∨ b .inl rfl : ∀ {α : Sort ?u.26070} {a : α }, a = a rfl⟩ => by a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 rw [ a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 Int.neg_mul : ∀ (a b : Int ), - a * b = - (a * b ) Int.neg_mul, a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 Int.neg_div , a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a this H a✝, b✝ : Int this : ∀ {a b : Nat }, ↑b ≠ 0 → div (↑a * ↑b ) ↑b = ↑a a, b : Nat H : ↑b ≠ 0 ]
| _, _, ⟨ a , .inr : ∀ {a b : Prop }, b → a ∨ b .inr rfl : ∀ {α : Sort ?u.26149} {a : α }, a = a rfl⟩, ⟨ b , .inr : ∀ {a b : Prop }, b → a ∨ b .inr rfl : ∀ {α : Sort ?u.26153} {a : α }, a = a rfl⟩ => by
rw [ Int.neg_mul_neg : ∀ (a b : Int ), - a * - b = a * b Int.neg_mul_neg, Int.div_neg ,