Basics for the Rational Numbers #
Rational numbers, implemented as a pair of integers num / den
such that the
denominator is positive and the numerator and denominator are coprime.
- mk' :: (
- num : Int
The numerator of the rational number is an integer.
- den : Nat
The denominator of the rational number is a natural number.
- den_nz : self.den ≠ 0
The denominator is nonzero.
- reduced : self.num.natAbs.Coprime self.den
The numerator and denominator are coprime: it is in "reduced form".
- )
Instances For
- Linarith.SimplexAlgorithm.instGetElemProdNatRatAndLtFstSndOfUsableInSimplexAlgorithm
- NNRat.canLift
- Rat.addCommGroup
- Rat.addCommMonoid
- Rat.addCommSemigroup
- Rat.addGroup
- Rat.addLeftCancelSemigroup
- Rat.addMonoid
- Rat.addRightCancelSemigroup
- Rat.addSemigroup
- Rat.canLift
- Rat.commGroupWithZero
- Rat.commMonoid
- Rat.commRing
- Rat.commSemigroup
- Rat.commSemiring
- Rat.instAdd
- Rat.instAddLeftMono
- Rat.instCharZero
- Rat.instDistribLattice
- Rat.instDistribSMul
- Rat.instDiv
- Rat.instDivisionRing
- Rat.instField
- Rat.instInf
- Rat.instIntCast
- Rat.instInv
- Rat.instIsScalarTowerRight
- Rat.instLE
- Rat.instLT
- Rat.instLattice
- Rat.instLinearOrderedAddCommGroup
- Rat.instLinearOrderedCommRing
- Rat.instLinearOrderedField
- Rat.instLinearOrderedRing
- Rat.instLinearOrderedSemiring
- Rat.instMul
- Rat.instNNRatCast
- Rat.instNatCast
- Rat.instNeg
- Rat.instOfNat
- Rat.instOfScientific
- Rat.instOrderedAddCommGroup
- Rat.instOrderedAddCommMonoid
- Rat.instOrderedCancelAddCommMonoid
- Rat.instOrderedRing
- Rat.instOrderedSemiring
- Rat.instPartialOrder
- Rat.instPosMulMono
- Rat.instPowNat
- Rat.instPreorder
- Rat.instSemilatticeInf
- Rat.instSemilatticeSup
- Rat.instSub
- Rat.instSup
- Rat.instZeroLEOneClass
- Rat.isDomain
- Rat.linearOrder
- Rat.monoid
- Rat.nontrivial
- Rat.semigroup
- Rat.semiring
- Rat.smulDivisionRing
- instCoeHTCTRatOfRatCast
- instCoeTailRatOfRatCast
- instInhabitedRat
- instRatCastRat
- instReprRat
- instToStringRat
Equations
- instInhabitedRat = { default := { num := 0, den := 1, den_nz := instInhabitedRat.proof_1, reduced := instInhabitedRat.proof_2 } }
Equations
- One or more equations did not get rendered due to their size.
Auxiliary definition for Rat.normalize
. Constructs num / den
as a rational number,
dividing both num
and den
by g
(which is the gcd of the two) if it is not 1.
Equations
- One or more equations did not get rendered due to their size.
Construct a normalized Rat
from a numerator and nonzero denominator.
This is a "smart constructor" that divides the numerator and denominator by
the gcd to ensure that the resulting rational number is normalized.
Equations
- Rat.normalize num den den_nz = Rat.maybeNormalize num den (num.natAbs.gcd den) ⋯ ⋯
Construct a rational number from a numerator and denominator.
This is a "smart constructor" that divides the numerator and denominator by
the gcd to ensure that the resulting rational number is normalized, and returns
zero if den
is zero.
Equations
- mkRat num den = if den_nz : den = 0 then { num := 0, den := 1, den_nz := mkRat.proof_1, reduced := mkRat.proof_2 } else Rat.normalize num den den_nz
Equations
- Rat.instNatCast = { natCast := fun (n : Nat) => Rat.ofInt ↑n }
Form the quotient n / d
where n d : Int
.
Equations
- Rat.divInt x✝ (Int.ofNat d) = inline (mkRat x✝ d)
- Rat.divInt x✝ (Int.negSucc d) = Rat.normalize (-x✝) d.succ ⋯
Form the quotient n / d
where n d : Int
.
Equations
- Rat.«term_/._» = Lean.ParserDescr.trailingNode `Rat.«term_/._» 70 70 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " /. ") (Lean.ParserDescr.cat `term 71))
Implements "scientific notation" 123.4e-5
for rational numbers. (This definition is
@[irreducible]
because you don't want to unfold it. Use Rat.ofScientific_def
,
Rat.ofScientific_true_def
, or Rat.ofScientific_false_def
instead.)
Equations
- Rat.ofScientific m s e = if s = true then Rat.normalize (↑m) (10 ^ e) ⋯ else ↑(m * 10 ^ e)
Equations
- Rat.instOfScientific = { ofScientific := fun (m : Nat) (s : Bool) (e : Nat) => Rat.ofScientific (OfNat.ofNat m) s (OfNat.ofNat e) }
Equations
- Rat.instLT = { lt := fun (x1 x2 : Rat) => x1.blt x2 = true }
Equations
- a.instDecidableLt b = inferInstanceAs (Decidable (a.blt b = true))
Equations
- a.instDecidableLe b = inferInstanceAs (Decidable (b.blt a = false))
Division of rational numbers. Note: div a 0 = 0
. Written with a separate function Rat.div
as a wrapper so that the definition is not unfolded at .instance
transparency.
Equations
- Rat.instDiv = { div := Rat.div }