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 Cmdinstead 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 ?u.3198
α
:
Type _: Type (?u.3373+1)
Type _
} [
LinearOrderedField: Type ?u.5 → Type ?u.5
LinearOrderedField
α: Type ?u.897
α
] [
FloorRing: (α : Type ?u.3012) → [inst : LinearOrderedRing α] → Type ?u.3012
FloorRing
α: Type ?u.2
α
] protected theorem
floor_def': ∀ (a : ), Rat.floor a = a.num / a.den
floor_def'
(
a:
a
:
: Type
) :
a:
a
.
floor:
floor
=
a:
a
.
num:
num
/
a:
a
.
den:
den
:=

Goals accomplished! 🐙
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


Rat.floor a = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


Rat.floor a = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


(if a.den = 1 then a.num else a.num / a.den) = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


(if a.den = 1 then a.num else a.num / a.den) = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


Rat.floor a = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: a.den = 1


inl
a.num = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: ¬a.den = 1


inr
a.num / a.den = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


Rat.floor a = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: a.den = 1


inl
a.num = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: a.den = 1


inl
a.num = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: ¬a.den = 1


inr
a.num / a.den = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: a.den = 1


inl
a.num = a.num / a.den

Goals accomplished! 🐙
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:


Rat.floor a = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: ¬a.den = 1


inr
a.num / a.den = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: ¬a.den = 1


inr
a.num / a.den = a.num / a.den
α: Type ?u.26

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

a:

h✝: ¬a.den = 1


inr
a.num / a.den = a.num / a.den

Goals accomplished! 🐙
protected theorem
le_floor: ∀ {z : } {r : }, z Rat.floor r z r
le_floor
{
z:
z
:
: Type
} : ∀ {
r:
r
:
: Type
},
z:
z
Rat.floor:
Rat.floor
r:
r
↔ (
z:
z
:
: Type
) ≤
r:
r
| ⟨
n:
n
,
d:
d
,
h: d 0
h
, c⟩ =>

Goals accomplished! 🐙
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z Rat.floor (mk' n d) z mk' n d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z n / d z mk' n d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z Rat.floor (mk' n d) z mk' n d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z n / d z mk' n d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z n / d z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z n / d z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z Rat.floor (mk' n d) z mk' n d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n / d z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z Rat.floor (mk' n d) z mk' n d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z * d n
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n / d z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n / d z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z /. 1 n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z * d n * 1
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z n /. d
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z * d n
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d

h': 0 < d


z * d n
α: Type ?u.897

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

z, n:

d:

h: d 0

c: Nat.coprime (natAbs n) d


z Rat.floor (mk' n d) z mk' n d

Goals accomplished! 🐙
#align rat.le_floor
Rat.le_floor: ∀ {z : } {r : }, z Rat.floor r z r
Rat.le_floor
instance: FloorRing
instance
:
FloorRing: (α : Type ?u.3030) → [inst : LinearOrderedRing α] → Type ?u.3030
FloorRing
: Type
:= (
FloorRing.ofFloor: (α : Type ?u.3036) → [inst : LinearOrderedRing α] → (floor : α) → GaloisConnection Int.cast floorFloorRing α
FloorRing.ofFloor
: Type
Rat.floor:
Rat.floor
) fun
_: ?m.3041
_
_: ?m.3044
_
=>
Rat.le_floor: ∀ {z : } {r : }, z Rat.floor r z r
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
:
: Type
} : ⌊
q:
q
⌋ =
q:
q
.
num:
num
/
q:
q
.
den:
den
:=
Rat.floor_def': ∀ (a : ), Rat.floor a = a.num / a.den
Rat.floor_def'
q:
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:
n
:
: Type
} {
d:
d
:
: Type
} : ⌊(↑
n:
n
:
: Type
) / (↑
d:
d
:
: Type
)⌋ =
n:
n
/ (↑
d:
d
:
: Type
) :=

Goals accomplished! 🐙
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


(n / d).num / (n / d).den = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


(n / d).num / (n / d).den = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:


inl
(n / 0).num / (n / 0).den = n / 0
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d


inr
(n / d).num / (n / d).den = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:


inl
(n / 0).num / (n / 0).den = n / 0
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:


inl
(n / 0).num / (n / 0).den = n / 0
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d


inr
(n / d).num / (n / d).den = n / d

Goals accomplished! 🐙
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


inr
q.num / q.den = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


inr
q.num / q.den = n / d

Goals accomplished! 🐙
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


c, n = c * q.num d = c * q.den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


c, n = c * q.num d = c * q.den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


c, n = c * (n / d).num d = c * (n / d).den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


c, n = c * (n / d).num d = c * (n / d).den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


c, n = c * q.num d = c * q.den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


c, n = c * (n / d).num d = c * (n / d).den

Goals accomplished! 🐙
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d


d 0

Goals accomplished! 🐙

Goals accomplished! 🐙
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
q.num / q.den = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
q.num / q.den = c * q.num / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
q.num / q.den = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
q.num / q.den = c * q.num / (c * q.den)
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
q.num / q.den = c * q.num / (c * q.den)
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
0 < c * q.den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:


n / d = n / d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
0 < c * q.den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
0 < d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
0 < c * q.den
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
0 < d
α: Type ?u.3373

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

n:

d:

hd: 0 < d

q:= n / d:

q_eq: q = n / d

c:

n_eq_c_mul_num: n = c * q.num

d_eq_c_mul_denom: d = c * q.den


inr.intro.intro
0 < d
#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: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), x = x
floor_cast
(
x:
x
:
: Type
) : ⌊(
x:
x
:
α: Type ?u.9242
α
)⌋ = ⌊
x:
x
⌋ :=
floor_eq_iff: ∀ {α : Type ?u.9347} [inst : LinearOrderedRing α] [inst_1 : FloorRing α] {z : } {a : α}, a = z z a a < z + 1
floor_eq_iff
.
2: ∀ {a b : Prop}, (a b) → ba
2
(

Goals accomplished! 🐙
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


x x x < x + 1

Goals accomplished! 🐙
) #align rat.floor_cast
Rat.floor_cast: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), x = x
Rat.floor_cast
@[simp, norm_cast] theorem
ceil_cast: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), x = x
ceil_cast
(
x:
x
:
: Type
) : ⌈(
x:
x
:
α: Type ?u.13509
α
)⌉ = ⌈
x:
x
⌉ :=

Goals accomplished! 🐙
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:



Goals accomplished! 🐙
#align rat.ceil_cast
Rat.ceil_cast: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), x = x
Rat.ceil_cast
@[simp, norm_cast] theorem
round_cast: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), round x = round x
round_cast
(
x:
x
:
: Type
) :
round: {α : Type ?u.13951} → [inst : LinearOrderedRing α] → [inst : FloorRing α] → α
round
(
x:
x
:
α: Type ?u.13924
α
) =
round: {α : Type ?u.14014} → [inst : LinearOrderedRing α] → [inst : FloorRing α] → α
round
x:
x
:=

Goals accomplished! 🐙
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2


round x = round x

Goals accomplished! 🐙
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2


↑(x + 1 / 2) = x + 1 / 2

Goals accomplished! 🐙
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


x + 1 / 2 = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


x + 1 / 2 = x + 1 / 2
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


↑(x + 1 / 2) = x + 1 / 2
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


round x = round x
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:

H: 2 = 2

this: ↑(x + 1 / 2) = x + 1 / 2


x + 1 / 2 = x + 1 / 2

Goals accomplished! 🐙
#align rat.round_cast
Rat.round_cast: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), round x = round x
Rat.round_cast
@[simp, norm_cast] theorem
cast_fract: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), ↑(fract x) = fract x
cast_fract
(
x:
x
:
: Type
) : (↑(
fract: {α : Type ?u.15416} → [inst : LinearOrderedRing α] → [inst : FloorRing α] → αα
fract
x:
x
) :
α: Type ?u.15388
α
) =
fract: {α : Type ?u.15470} → [inst : LinearOrderedRing α] → [inst : FloorRing α] → αα
fract
(
x:
x
:
α: Type ?u.15388
α
) :=

Goals accomplished! 🐙
α: Type u_1

inst✝¹: LinearOrderedField α

inst✝: FloorRing α

x:


↑(fract x) = fract x

Goals accomplished! 🐙
#align rat.cast_fract
Rat.cast_fract: ∀ {α : Type u_1} [inst : LinearOrderedField α] [inst_1 : FloorRing α] (x : ), ↑(fract x) = fract x
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:
n
:
: Type
} {
d:
d
:
: Type
} :
n:
n
%
d:
d
=
n:
n
-
d:
d
* ⌊(
n:
n
:
: Type
) /
d:
d
⌋ :=

Goals accomplished! 🐙
n:

d:


n % d = n - d * n / d
n:

d:


n % d = n - d * n / d
n:

d:


n - d * (n / d) = n - d * n / d
n:

d:


n % d = n - d * n / d
n:

d:


n - d * (n / d) = n - d * (n / d)

Goals accomplished! 🐙
#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 : }, coprime n dcoprime (natAbs (n - d * n / d)) d
Nat.coprime_sub_mul_floor_rat_div_of_coprime
{
n:
n
d:
d
:
: Type
} (
n_coprime_d: coprime n d
n_coprime_d
:
n:
n
.
coprime: Prop
coprime
d:
d
) : ((
n:
n
:
: Type
) -
d:
d
* ⌊(
n:
n
:
: Type
) /
d:
d
⌋).
natAbs:
natAbs
.
coprime: Prop
coprime
d:
d
:=

Goals accomplished! 🐙
n, d:

n_coprime_d: coprime n d


coprime (natAbs (n - d * n / d)) d
n, d:

n_coprime_d: coprime n d

this: n % d = n - d * n / d


coprime (natAbs (n - d * n / d)) d
n, d:

n_coprime_d: coprime n d


coprime (natAbs (n - d * n / d)) d
n, d:

n_coprime_d: coprime n d

this: n % d = n - d * n / d


coprime (natAbs (n - d * n / d)) d
n, d:

n_coprime_d: coprime n d

this: n % d = n - d * n / d


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d

this: n % d = n - d * n / d


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d


coprime (natAbs (n - d * n / d)) d
n, d:

n_coprime_d: coprime n d

this✝: n % d = n - d * n / d

this: coprime d n


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d


coprime (natAbs (n - d * n / d)) d
n, d:

n_coprime_d: coprime n d

this✝: n % d = n - d * n / d

this: coprime d n


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d

this✝: n % d = n - d * n / d

this: gcd d n = 1


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d

this✝: n % d = n - d * n / d

this: coprime d n


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d

this✝: n % d = n - d * n / d

this: gcd (n % d) d = 1


coprime (natAbs (n % d)) d
n, d:

n_coprime_d: coprime n d

this✝: n % d = n - d * n / d

this: gcd (n % d) d = 1


coprime (natAbs (n % d)) d

Goals accomplished! 🐙
#align nat.coprime_sub_mul_floor_rat_div_of_coprime
Nat.coprime_sub_mul_floor_rat_div_of_coprime: ∀ {n d : }, Nat.coprime n dNat.coprime (natAbs (n - d * n / d)) d
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
:
: Type
) :
q:
q
.
num:
num
< (⌊
q:
q
⌋ +
1: ?m.17534
1
) *
q:
q
.
den:
den
:=

Goals accomplished! 🐙
q:


q.num < (q + 1) * q.den
q:


q.num < (q + 1) * q.den

Goals accomplished! 🐙
q:


q.num < (q + 1) * q.den
q:


q.num < (q + 1) * q.den
q:

this✝: q.num < (q - fract q + 1) * q.den

this: q = q - fract q


q.num < (q + 1) * q.den
q:

this: q.num < (q - fract q + 1) * q.den


q.num < (q + 1) * q.den
q:

this✝: q.num < (q - fract q + 1) * q.den

this: q = q - fract q


q.num < (q + 1) * q.den
q:

this✝: q.num < (q - fract q + 1) * q.den

this: q = q - fract q


q.num < (q - fract q + 1) * q.den
q:

this✝: q.num < (q - fract q + 1) * q.den

this: q = q - fract q


q.num < (q - fract q + 1) * q.den
q:


q.num < (q + 1) * q.den
q:


q.num < (q - fract q + 1) * q.den
q:

this: q.num < q.num + (1 - fract q) * q.den


this
(q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den
q:

this: q.num < q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den
q:

this: q.num < q.num + (1 - fract q) * q.den


this
(q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den

Goals accomplished! 🐙
q:

this: q.num < q.num + (1 - fract q) * q.den


(q - fract q + 1) * q.den = (q + (1 - fract q)) * q.den

Goals accomplished! 🐙
q:

this: q.num < q.num + (1 - fract q) * q.den


this
(q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den

Goals accomplished! 🐙
q:

this: q.num < q.num + (1 - fract q) * q.den


(q + (1 - fract q)) * q.den = q * q.den + (1 - fract q) * q.den
q:

this: q.num < q.num + (1 - fract q) * q.den


(q + (1 - fract q)) * q.den = q * q.den + (1 - fract q) * q.den
q:

this: q.num < q.num + (1 - fract q) * q.den


q * q.den + (1 - fract q) * q.den = q * q.den + (1 - fract q) * q.den

Goals accomplished! 🐙
q:

this: q.num < q.num + (1 - fract q) * q.den


this
(q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den

Goals accomplished! 🐙
q:

this: q.num < q.num + (1 - fract q) * q.den


q * q.den + (1 - fract q) * q.den = q.num + (1 - fract q) * q.den

Goals accomplished! 🐙
q:

this: q.num < q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < (q - fract q + 1) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < q.num + (1 - fract q) * q.den
q:

this✝: q.num < q.num + (1 - fract q) * q.den

this: (q - fract q + 1) * q.den = q.num + (1 - fract q) * q.den


q.num < q.num + (1 - fract q) * q.den
q:


q.num < (q + 1) * q.den
q:


q.num < q.num + (1 - fract q) * q.den
q:

this: 0 < (1 - fract q) * q.den


q.num < q.num + (1 - fract q) * q.den
q:

this: 0 < (1 - fract q) * q.den


q.num - q.num < (1 - fract q) * q.den
q:

this: 0 < (1 - fract q) * q.den


q.num - q.num < (1 - fract q) * q.den
q:

this: 0 < (1 - fract q) * q.den


q.num < q.num + (1 - fract q) * q.den

Goals accomplished! 🐙
q:


q.num < (q + 1) * q.den
q:


0 < (1 - fract q) * q.den

Goals accomplished! 🐙
q:


0 < 1 - fract q
q:

this: fract q < 1


0 < 1 - fract q
q:


0 < 1 - fract q
q:

this: fract q < 1


0 < 1 - fract q

Goals accomplished! 🐙
q:

this: fract q < 1


0 + fract q < 1

Goals accomplished! 🐙
q:


0 < 1 - fract q
q:

this✝: fract q < 1

this: 0 + fract q < 1


0 < 1 - fract q
q:

this✝: fract q < 1

this: 0 + fract q < 1


0 + fract q < 1
q:

this✝: fract q < 1

this: 0 + fract q < 1


0 + fract q < 1
q:


q.num < (q + 1) * q.den
q:

this: 0 < 1 - fract q


0 < (1 - fract q) * q.den

Goals accomplished! 🐙
q:

this: 0 < 1 - fract q


0 < q.den

Goals accomplished! 🐙

Goals accomplished! 🐙
#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
:
: Type
} (
q_pos: 0 < q
q_pos
:
0: ?m.28058
0
<
q:
q
) : (
fract: {α : Type ?u.28094} → [inst : LinearOrderedRing α] → [inst : FloorRing α] → αα
fract
q:
q
⁻¹).
num:
num
<
q:
q
.
num:
num
:=

Goals accomplished! 🐙
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_inv:= q.den / q.num:

q_inv_def: q_inv = q.den / q.num


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_inv:= q.den / q.num:

q_inv_def: q_inv = q.den / q.num

q_inv_eq: q⁻¹ = q_inv


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_inv:= q.den / q.num:

q_inv_def: q_inv = q.den / q.num

q_inv_eq: q⁻¹ = q_inv


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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


(fract q_inv).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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


(fract q_inv).num < q.num
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.num

Goals accomplished! 🐙
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.num

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

tmp: Nat.coprime (natAbs (q.den - ↑(natAbs q.num) * q.den / ↑(natAbs q.num))) (natAbs q.num)


Nat.coprime (natAbs (q.den - q.num * q_inv)) (natAbs q.num)
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

this: ((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.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

this: ((q.den - q.num * q_inv) / q.num).num = q.den - q.num * q_inv


q.den - q.num * q_inv < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

this: ((q.den - q.num * q_inv) / q.num).num = q.den - q.num * q_inv


q.den - q.num * q_inv < q.num
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_inv:= q.den / q.num:

q_inv_def: q_inv = q.den / q.num

q_inv_eq: q⁻¹ = q_inv


q⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_inv:= q.den / q.num:

q_inv_def: q_inv = q.den / q.num

q_inv_eq: q⁻¹ = q_inv


q⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num < q⁻¹ * q⁻¹.den + q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num < q⁻¹ * q⁻¹.den + q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num < q⁻¹ * q⁻¹.den + q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num < q⁻¹ * q⁻¹.den + q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num < q⁻¹ * q⁻¹.den + q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num < q⁻¹ * q⁻¹.den + q⁻¹.den

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_inv:= q.den / q.num:

q_inv_def: q_inv = q.den / q.num

q_inv_eq: q⁻¹ = q_inv


q⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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⁻¹.num - q⁻¹ * q⁻¹.den < q⁻¹.den

Goals accomplished! 🐙
q:

q_pos: 0 < q


(fract q⁻¹).num < q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.den - q.num * q_inv < q.num

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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)


natAbs q.den = q.den

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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.den


q_inv.num = q.den q_inv.den = natAbs q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


q_inv.num = q.den q_inv.den = natAbs q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


q_inv.num = q.den q_inv.den = natAbs q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


q_inv.num = q.den q_inv.den = natAbs q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


q_inv.num = q.den q_inv.den = natAbs q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


(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.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


(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.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


left
(q.den / q.num).num = q.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


right
(q.den / q.num).den = natAbs q.num
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


left
(q.den / q.num).num = q.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


left
(q.den / q.num).num = q.den
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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 (natAbs q.den) (natAbs q.num)

this: natAbs q.den = q.den


right
(q.den / q.num).den = natAbs q.num

Goals accomplished! 🐙
q:

q_pos: 0 < q

q_num_pos: 0 < q.num

q_num_abs_eq_q_num: ↑(natAbs q.num) = q.num

q_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