{-# OPTIONS --safe --warning=error --without-K --guardedness #-} open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import Setoids.Setoids open import Rings.Definition open import Rings.Lemmas open import Rings.Orders.Definition open import Groups.Definition open import Groups.Groups open import Fields.Fields open import Sets.EquivalenceRelations open import Sequences open import Setoids.Orders open import Functions open import LogicalFormulae open import Numbers.Naturals.Naturals module Fields.CauchyCompletion.EquivalentMonotone {m n o : _} {A : Set m} {S : Setoid {m} {n} A} {_+_ : A → A → A} {_*_ : A → A → A} {_<_ : Rel {m} {o} A} {pOrder : SetoidPartialOrder S _<_} {tOrder : SetoidTotalOrder {_<_ = _<_} pOrder} {R : Ring S _+_ _*_} (order : OrderedRing R tOrder) (F : Field R) (charNot2 : Setoid._∼_ S ((Ring.1R R) + (Ring.1R R)) (Ring.0R R) → False) where open Setoid S open SetoidTotalOrder tOrder open SetoidPartialOrder pOrder open Equivalence eq open OrderedRing order open Field F open Group (Ring.additiveGroup R) open Ring R open import Fields.Lemmas F open import Fields.Orders.Lemmas {F = F} record { oRing = order } open import Rings.Orders.Lemmas(order) open import Fields.CauchyCompletion.Definition order F open import Fields.CauchyCompletion.Multiplication order F charNot2 open import Fields.CauchyCompletion.Addition order F charNot2 open import Fields.CauchyCompletion.Setoid order F charNot2 open import Fields.CauchyCompletion.Group order F charNot2 open import Fields.CauchyCompletion.Ring order F charNot2 open import Fields.CauchyCompletion.Comparison order F charNot2 open import Fields.CauchyCompletion.Approximation order F charNot2 halvingSequence : (start : A) → Sequence A Sequence.head (halvingSequence start) = start Sequence.tail (halvingSequence start) with halve charNot2 start Sequence.tail (halvingSequence start) | start/2 , _ = halvingSequence start/2 halvingSequenceMultiple : (start : A) → {n : ℕ} → index (halvingSequence start) n ∼ index (map (start *_) (halvingSequence (Ring.1R R))) n halvingSequenceMultiple start {zero} = Equivalence.symmetric eq (Equivalence.transitive eq *Commutative identIsIdent) halvingSequenceMultiple start {succ n} with halve charNot2 start ... | start/2 , _ with allInvertible (1R + 1R) charNot2 halvingSequenceMultiple start {succ n} | start/2 , b | 1/2 , pr1/2 rewrite equalityCommutative (mapAndIndex (halvingSequence (1R * 1/2)) (_*_ start) n) = Equivalence.transitive eq (halvingSequenceMultiple start/2 {n}) f where g : (start * (1/2 * index (halvingSequence 1R) n)) ∼ (start * index (map (_*_ (1R * 1/2)) (halvingSequence 1R)) n) g rewrite equalityCommutative (mapAndIndex (halvingSequence 1R) (_*_ (1R * 1/2)) n) = *WellDefined (Equivalence.reflexive eq) (*WellDefined (Equivalence.symmetric eq identIsIdent) (Equivalence.reflexive eq)) f : index (map (_*_ start/2) (halvingSequence 1R)) n ∼ (start * index (halvingSequence (1R * 1/2)) n) f rewrite equalityCommutative (mapAndIndex (halvingSequence 1R) (_*_ start/2) n) = Equivalence.transitive eq (Equivalence.transitive eq (Equivalence.transitive eq (*WellDefined (Equivalence.symmetric eq (Equivalence.transitive eq (*WellDefined (Equivalence.symmetric eq b) (Equivalence.reflexive eq)) (halfHalves 1/2 (Equivalence.transitive eq (Equivalence.transitive eq (+WellDefined (Equivalence.symmetric eq (Equivalence.transitive eq *Commutative identIsIdent)) (Equivalence.symmetric eq (Equivalence.transitive eq *Commutative identIsIdent))) (Equivalence.symmetric eq *DistributesOver+)) pr1/2)))) (Equivalence.reflexive eq)) (Equivalence.symmetric eq *Associative)) g) (Equivalence.symmetric eq (*WellDefined (Equivalence.reflexive eq) (halvingSequenceMultiple (1R * 1/2) {n}))) Decreasing : Sequence A → Set o Decreasing seq = ∀ (N : ℕ) → (index seq (succ N)) < (index seq N) halvingSequencePositive : (n : ℕ) → 0G < index (halvingSequence 1R) n halvingSequencePositive zero = 0<1 (charNot2ImpliesNontrivial charNot2) halvingSequencePositive (succ n) with halve charNot2 1R halvingSequencePositive (succ n) | 1/2 , pr1/2 =