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) 2019 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Kevin Kappelmann
! This file was ported from Lean 3 source module data.rat.floor
! leanprover-community/mathlib commit e1bccd6e40ae78370f01659715d3c948716e3b7e
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Order.Floor
import Mathlib.Algebra.EuclideanDomain.Instances
import Mathlib.Data.Rat.Cast
import Mathlib.Tactic.FieldSimp
/-!
# Floor Function for Rational Numbers
## Summary
We define the `FloorRing` instance on `ℚ`. Some technical lemmas relating `floor` to integer
division and modulo arithmetic are derived as well as some simple inequalities.
## Tags
rat, rationals, ℚ, floor
-/
open Int
namespace Rat
variable { α : Type _ } [ LinearOrderedField : Type ?u.5 → Type ?u.5 LinearOrderedField α ] [ FloorRing α ]
protected theorem floor_def' ( a : ℚ ) : a . floor = a . num / a . den := by
rw [ Rat.floor (if a .den = 1 then a .num else a .num / ↑a .den ) = a .num / ↑a .den ] (if a .den = 1 then a .num else a .num / ↑a .den ) = a .num / ↑a .den
split inl inr a .num / ↑a .den = a .num / ↑a .den
. inl inr a .num / ↑a .den = a .num / ↑a .den next h => simp [ h ]
. inr a .num / ↑a .den = a .num / ↑a .den inr a .num / ↑a .den = a .num / ↑a .den next => inr a .num / ↑a .den = a .num / ↑a .den rfl
protected theorem le_floor { z : ℤ } : ∀ { r : ℚ }, z ≤ Rat.floor r ↔ ( z : ℚ ) ≤ r
| ⟨ n , d , h , c ⟩ => by
simp [ Rat.floor_def' ]
rw [ num_den' ]
have h' := Int.ofNat_lt : ∀ {n m : ℕ }, ↑n < ↑m ↔ n < m Int.ofNat_lt. 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 ( Nat.pos_of_ne_zero : ∀ {n : ℕ }, n ≠ 0 → 0 < n Nat.pos_of_ne_zero h )
conv =>
rhs
rw [ coe_int_eq_divInt : ∀ (z : ℤ ), ↑z = z /. 1 coe_int_eq_divInt, Rat.le_def : ∀ {a b c d : ℤ }, 0 < b → 0 < d → (a /. b ≤ c /. d ↔ a * d ≤ c * b ) Rat.le_def zero_lt_one h' , mul_one ]
exact Int.le_ediv_iff_mul_le : ∀ {a b c : ℤ }, 0 < c → (a ≤ b / c ↔ a * c ≤ b ) Int.le_ediv_iff_mul_le h'
#align rat.le_floor Rat.le_floor
instance : FloorRing ℚ :=
( FloorRing.ofFloor ℚ Rat.floor ) fun _ _ => Rat.le_floor . symm : ∀ {a b : Prop }, (a ↔ b ) → (b ↔ a ) symm
protected theorem floor_def : ∀ {q : ℚ }, ⌊ q ⌋ = q .num / ↑q .den floor_def { q : ℚ } : ⌊ q ⌋ = q . num / q . den := Rat.floor_def' q
#align rat.floor_def Rat.floor_def : ∀ {q : ℚ }, ⌊ q ⌋ = q .num / ↑q .den Rat.floor_def
theorem floor_int_div_nat_eq_div : ∀ {n : ℤ } {d : ℕ }, ⌊ ↑n / ↑d ⌋ = n / ↑d floor_int_div_nat_eq_div { n : ℤ } { d : ℕ } : ⌊(↑ n : ℚ ) / (↑ d : ℚ )⌋ = n / (↑ d : ℤ ) := by
rw [ Rat.floor_def : ∀ {q : ℚ }, ⌊ q ⌋ = q .num / ↑q .den Rat.floor_def(↑n / ↑d ).num / ↑(↑n / ↑d ).den = n / ↑d ] (↑n / ↑d ).num / ↑(↑n / ↑d ).den = n / ↑d
obtain rfl rfl | hd : d = 0 ∨ 0 < d | hd := @ eq_zero_or_pos _ _ d inl (↑n / ↑0 ).num / ↑(↑n / ↑0 ).den = n / ↑0 inr (↑n / ↑d ).num / ↑(↑n / ↑d ).den = n / ↑d
· inl (↑n / ↑0 ).num / ↑(↑n / ↑0 ).den = n / ↑0 inl (↑n / ↑0 ).num / ↑(↑n / ↑0 ).den = n / ↑0 inr (↑n / ↑d ).num / ↑(↑n / ↑d ).den = n / ↑d simp
set q := ( n : ℚ ) / d with q_eq
obtain : ∃ c , n = c * q .num ∧ ↑d = c * ↑q .den obtain ⟨c, n_eq_c_mul_num, d_eq_c_mul_denom⟩ : ?m✝
⟨c ⟨c, n_eq_c_mul_num, d_eq_c_mul_denom⟩ : ?m✝
, n_eq_c_mul_num : n = c * q .numn_eq_c_mul_num ⟨c, n_eq_c_mul_num, d_eq_c_mul_denom⟩ : ?m✝
, d_eq_c_mul_denom : ↑d = c * ↑q .den d_eq_c_mul_denom ⟨c, n_eq_c_mul_num, d_eq_c_mul_denom⟩ : ?m✝
⟩ : ∃ c , n = c * q . num ∧ ( d : ℤ ) = c * q . den := by
∃ c , n = c * q .num ∧ ↑d = c * ↑q .den rw [ ∃ c , n = c * q .num ∧ ↑d = c * ↑q .den q_eq ∃ c , n = c * (↑n / ↑d ).num ∧ ↑d = c * ↑(↑n / ↑d ).den ] ∃ c , n = c * (↑n / ↑d ).num ∧ ↑d = c * ↑(↑n / ↑d ).den
∃ c , n = c * q .num ∧ ↑d = c * ↑q .den exact_mod_cast @ Rat.exists_eq_mul_div_num_and_eq_mul_div_den : ∀ (n : ℤ ) {d : ℤ }, d ≠ 0 → ∃ c , n = c * (↑n / ↑d ).num ∧ d = c * ↑(↑n / ↑d ).den Rat.exists_eq_mul_div_num_and_eq_mul_div_den n d ( ∃ c , n = c * (↑n / ↑d ).num ∧ ↑d = c * ↑(↑n / ↑d ).den by exact_mod_cast hd . ne' )
rw [ n_eq_c_mul_num : n = c * q .numn_eq_c_mul_num , inr.intro.intro q .num / ↑q .den = c * q .num / ↑d d_eq_c_mul_denom : ↑d = c * ↑q .den d_eq_c_mul_denom inr.intro.intro q .num / ↑q .den = c * q .num / (c * ↑q .den )] inr.intro.intro q .num / ↑q .den = c * q .num / (c * ↑q .den )
refine' ( Int.mul_ediv_mul_of_pos : ∀ {a : ℤ } (b c : ℤ ), 0 < a → a * b / (a * c ) = b / c Int.mul_ediv_mul_of_pos _ _ <| pos_of_mul_pos_left _ : 0 < ?m.8397 * ?m.8398 _ <| Int.coe_nat_nonneg : ∀ (n : ℕ ), 0 ≤ ↑n Int.coe_nat_nonneg q . den ). symm : ∀ {α : Sort ?u.8682} {a b : α }, a = b → b = a symm
rwa [ ← d_eq_c_mul_denom : ↑d = c * ↑q .den d_eq_c_mul_denom , Int.coe_nat_pos : ∀ {n : ℕ }, 0 < ↑n ↔ 0 < n Int.coe_nat_pos]
#align rat.floor_int_div_nat_eq_div Rat.floor_int_div_nat_eq_div : ∀ {n : ℤ } {d : ℕ }, ⌊ ↑n / ↑d ⌋ = n / ↑d Rat.floor_int_div_nat_eq_div
@[ simp , norm_cast ]
theorem floor_cast ( x : ℚ ) : ⌊( x : α )⌋ = ⌊ x ⌋ :=
floor_eq_iff . 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 ( by exact_mod_cast floor_eq_iff . 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 ( Eq.refl : ∀ {α : Sort ?u.13181} (a : α ), a = a Eq.refl ⌊ x ⌋) )
#align rat.floor_cast Rat.floor_cast
@[ simp , norm_cast ]
theorem ceil_cast ( x : ℚ ) : ⌈( x : α )⌉ = ⌈ x ⌉ := by
rw [ ← neg_inj , ← floor_neg , ← floor_neg , ← Rat.cast_neg , Rat.floor_cast ]
#align rat.ceil_cast Rat.ceil_cast
@[ simp , norm_cast ]
theorem round_cast ( x : ℚ ) : round ( x : α ) = round x := by
-- Porting note: `simp` worked rather than `simp [H]` in mathlib3
have H : (( 2 : ℚ ) : α ) = ( 2 : α ) := Rat.cast_coe_nat 2
have : (( x + 1 / 2 : ℚ ) : α ) = x + 1 / 2 := by ↑(x + 1 / 2 ) = ↑x + 1 / 2 simp [ H ]
rw [ round_eq , round_eq , ← this : ↑(x + 1 / 2 ) = ↑x + 1 / 2 this , floor_cast ]
#align rat.round_cast Rat.round_cast
@[ simp , norm_cast ]
theorem cast_fract ( x : ℚ ) : (↑( fract x ) : α ) = fract ( x : α ) := by
simp only [ fract , cast_sub , cast_coe_int , floor_cast ]
#align rat.cast_fract Rat.cast_fract
end Rat
theorem Int.mod_nat_eq_sub_mul_floor_rat_div : ∀ {n : ℤ } {d : ℕ }, n % ↑d = n - ↑d * ⌊ ↑n / ↑d ⌋ Int.mod_nat_eq_sub_mul_floor_rat_div { n : ℤ } { d : ℕ } : n % d = n - d * ⌊( n : ℚ ) / d ⌋ := by
rw [ eq_sub_of_add_eq : ∀ {G : Type ?u.16411} [inst : AddGroup G ] {a b c : G }, a + c = b → a = b - c eq_sub_of_add_eq <| Int.emod_add_ediv : ∀ (a b : ℤ ), a % b + b * (a / b ) = a Int.emod_add_ediv n d , Rat.floor_int_div_nat_eq_div : ∀ {n : ℤ } {d : ℕ }, ⌊ ↑n / ↑d ⌋ = n / ↑d Rat.floor_int_div_nat_eq_divn - ↑d * (n / ↑d ) = n - ↑d * (n / ↑d )]
#align int.mod_nat_eq_sub_mul_floor_rat_div Int.mod_nat_eq_sub_mul_floor_rat_div : ∀ {n : ℤ } {d : ℕ }, n % ↑d = n - ↑d * ⌊ ↑n / ↑d ⌋ Int.mod_nat_eq_sub_mul_floor_rat_div
theorem Nat.coprime_sub_mul_floor_rat_div_of_coprime { n d : ℕ } ( n_coprime_d : n . coprime d ) :
(( n : ℤ ) - d * ⌊( n : ℚ ) / d ⌋). natAbs . coprime d := by
have : ( n : ℤ ) % d = n - d * ⌊( n : ℚ ) / d ⌋ := Int.mod_nat_eq_sub_mul_floor_rat_div : ∀ {n : ℤ } {d : ℕ }, n % ↑d = n - ↑d * ⌊ ↑n / ↑d ⌋ Int.mod_nat_eq_sub_mul_floor_rat_div
rw [ ← this : ↑n % ↑d = ↑n - ↑d * ⌊ ↑n / ↑d ⌋ this ]
have : d . coprime n := n_coprime_d . symm
rwa [ Nat.coprime , Nat.gcd_rec : ∀ (m n : ℕ ), gcd m n = gcd (n % m ) m Nat.gcd_rec] at this
#align nat.coprime_sub_mul_floor_rat_div_of_coprime Nat.coprime_sub_mul_floor_rat_div_of_coprime
namespace Rat
theorem num_lt_succ_floor_mul_den : ∀ (q : ℚ ), q .num < (⌊ q ⌋ + 1 ) * ↑q .den num_lt_succ_floor_mul_den ( q : ℚ ) : q . num < (⌊ q ⌋ + 1 ) * q . den := by
suffices ( q . num : ℚ ) < (⌊ q ⌋ + 1 ) * q . den by exact_mod_cast this : ↑q .num < (↑⌊ q ⌋ + 1 ) * ↑q .den this
suffices ( q . num : ℚ ) < ( q - fract q + 1 ) * q . den by
have : (⌊ q ⌋ : ℚ ) = q - fract q := eq_sub_of_add_eq : ∀ {G : Type ?u.21436} [inst : AddGroup G ] {a b c : G }, a + c = b → a = b - c eq_sub_of_add_eq <| floor_add_fract q
rwa [ this ]
suffices ( q . num : ℚ ) < q . num + ( 1 - fract q ) * q . den by
have : ( q - fract q + 1 ) * q . den = q . num + ( 1 - fract q ) * q . den
calc
( q - fract q + 1 ) * q . den = ( q + ( 1 - fract q )) * q . den := by ring
_ = q * q . den + ( 1 - fract q ) * q . den := by rw [ add_mul ]
_ = q . num + ( 1 - fract q ) * q . den := by simp
rwa [ this ]
suffices 0 < ( 1 - fract q ) * q . den by
rw [ ← sub_lt_iff_lt_add' ]
simpa
have : 0 < 1 - fract q := by
have : fract q < 1 := fract_lt_one q
have : 0 + fract q < 1 := by simp [ this ]
rwa [ lt_sub_iff_add_lt ]
exact mul_pos this ( by exact_mod_cast q . pos : ∀ (a : ℚ ), 0 < a .den pos)
#align rat.num_lt_succ_floor_mul_denom Rat.num_lt_succ_floor_mul_den : ∀ (q : ℚ ), q .num < (⌊ q ⌋ + 1 ) * ↑q .den Rat.num_lt_succ_floor_mul_den
theorem fract_inv_num_lt_num_of_pos : ∀ {q : ℚ }, 0 < q → (fract q ⁻¹ ).num < q .num fract_inv_num_lt_num_of_pos { q : ℚ } ( q_pos : 0 < q ) : ( fract q ⁻¹). num < q . num := by
-- we know that the numerator must be positive
have q_num_pos : 0 < q . num := Rat.num_pos_iff_pos : ∀ {a : ℚ }, 0 < a .num ↔ 0 < a Rat.num_pos_iff_pos. mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr q_pos q : ℚ q_pos : 0 < q q_num_pos : 0 < q .num
-- we will work with the absolute value of the numerator, which is equal to the numerator
have q_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_num_abs_eq_q_num : ( q . num . natAbs : ℤ ) = q . num := Int.natAbs_of_nonneg : ∀ {a : ℤ }, 0 ≤ a → ↑(natAbs a ) = a Int.natAbs_of_nonneg q_num_pos . le q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .num
set q_inv := ( q . den : ℚ ) / q . num with q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_def q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num
have q_inv_eq : q ⁻¹ = q_inv := Rat.inv_def'' : ∀ {q : ℚ }, q ⁻¹ = ↑q .den / ↑q .num Rat.inv_def''q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv
suffices ( q_inv - ⌊ q_inv ⌋). num < q . num by q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv rwa [ q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : (q_inv - ↑⌊ q_inv ⌋ ).num < q .numq_inv_eq q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : (q_inv - ↑⌊ q_inv ⌋ ).num < q .num] q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : (q_inv - ↑⌊ q_inv ⌋ ).num < q .num
suffices (( q . den - q . num * ⌊ q_inv ⌋ : ℚ ) / q . num ). num < q . num by
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv (q_inv - ↑⌊ q_inv ⌋ ).num < q .numfield_simp [ this : ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num < q .numthis , ne_of_gt q_num_pos ]
suffices ( q . den : ℤ ) - q . num * ⌊ q_inv ⌋ < q . num by
-- use that `q.num` and `q.den` are coprime to show that the numerator stays unreduced
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num < q .numhave : (( q . den - q . num * ⌊ q_inv ⌋ : ℚ ) / q . num ). num = q . den - q . num * ⌊ q_inv ⌋ := q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : ↑q .den - q .num * ⌊ q_inv ⌋ < q .num((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num < q .numby
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : ↑q .den - q .num * ⌊ q_inv ⌋ < q .num((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ suffices (( q . den : ℤ ) - q . num * ⌊ q_inv ⌋). natAbs . coprime q . num . natAbs by
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : ↑q .den - q .num * ⌊ q_inv ⌋ < q .num((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ exact_mod_cast Rat.num_div_eq_of_coprime q_num_pos this
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : ↑q .den - q .num * ⌊ q_inv ⌋ < q .num((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ have tmp := Nat.coprime_sub_mul_floor_rat_div_of_coprime q . reduced . symm
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : ↑q .den - q .num * ⌊ q_inv ⌋ < q .num((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ simpa only [ Nat.cast_natAbs , abs_of_nonneg q_num_pos . le ] using tmp
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : ↑q .den - q .num * ⌊ q_inv ⌋ < q .num((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num < q .numrwa [ q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this✝ : ↑q .den - q .num * ⌊ q_inv ⌋ < q .numthis : ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num < q .numthis : ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ this q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this✝ : ↑q .den - q .num * ⌊ q_inv ⌋ < q .numthis : ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋ ] q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this✝ : ↑q .den - q .num * ⌊ q_inv ⌋ < q .numthis : ((↑q .den - ↑q .num * ↑⌊ q_inv ⌋ ) / ↑q .num ).num = ↑q .den - q .num * ⌊ q_inv ⌋
-- to show the claim, start with the following inequality
have q_inv_num_denom_ineq : q ⁻¹. num - ⌊ q ⁻¹⌋ * q ⁻¹. den < q ⁻¹. den := q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv by
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv have : q ⁻¹. num < (⌊ q ⁻¹⌋ + 1 ) * q ⁻¹. den := Rat.num_lt_succ_floor_mul_den : ∀ (q : ℚ ), q .num < (⌊ q ⌋ + 1 ) * ↑q .den Rat.num_lt_succ_floor_mul_den q ⁻¹ q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv have : q ⁻¹. num < ⌊ q ⁻¹⌋ * q ⁻¹. den + q ⁻¹. den := q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den by q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den rwa [ q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den right_distrib , q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den + 1 * ↑q ⁻¹ .den q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den one_mul q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den + ↑q ⁻¹ .den ] q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this : q ⁻¹ .num < ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den + ↑q ⁻¹ .den at this
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv rwa [ q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this✝ : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den this : q ⁻¹ .num < ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den + ↑q ⁻¹ .den ← sub_lt_iff_lt_add' q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this✝ : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den this : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den ] q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv this✝ : q ⁻¹ .num < (⌊ q ⁻¹ ⌋ + 1 ) * ↑q ⁻¹ .den this : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den at this
-- use that `q.num` and `q.den` are coprime to show that q_inv is the unreduced reciprocal
-- of `q`
have : q_inv . num = q . den ∧ q_inv . den = q . num . natAbs := q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den by
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numhave coprime_q_denom_q_num : q . den . coprime q . num . natAbs := q . reduced . symm q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den coprime_q_denom_q_num : Nat.coprime q .den (natAbs q .num )q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .num
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numhave : Int.natAbs q . den = q . den := q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den coprime_q_denom_q_num : Nat.coprime q .den (natAbs q .num )q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numby q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den coprime_q_denom_q_num : Nat.coprime q .den (natAbs q .num )simp
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numrw [ q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den coprime_q_denom_q_num : Nat.coprime q .den (natAbs q .num )this : natAbs ↑q .den = q .denq_inv .num = ↑q .den ∧ q_inv .den = natAbs q .num← this q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .num] q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .num at coprime_q_denom_q_num q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .num
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numrw [ q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numq_inv_def : q_inv = ↑q .den / ↑q .num q_inv_def (↑q .den / ↑q .num ).num = ↑q .den ∧ (↑q .den / ↑q .num ).den = natAbs q .num] (↑q .den / ↑q .num ).num = ↑q .den ∧ (↑q .den / ↑q .num ).den = natAbs q .num
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .numconstructor left (↑q .den / ↑q .num ).num = ↑q .den right
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q ⁻¹ .den < ↑q ⁻¹ .den q_inv .num = ↑q .den ∧ q_inv .den = natAbs q .num· left (↑q .den / ↑q .num ).num = ↑q .den left (↑q .den / ↑q .num ).num = ↑q .den right exact_mod_cast Rat.num_div_eq_of_coprime q_num_pos coprime_q_denom_q_num
q : ℚ q_pos : 0 < q q_num_pos : 0 < q .numq_num_abs_eq_q_num : ↑(natAbs q .num ) = q .numq_inv := ↑q .den / ↑q .num : ℚ q_inv_def : q_inv = ↑q .den / ↑q .num q_inv_eq : q ⁻¹ = q_inv q_inv_num_denom_ineq : q ⁻¹ .num - ⌊ q ⁻¹ ⌋ * ↑q