Documentation

CombinatorialGames.Surreal.Pow

Surreal exponentiation #

We define here the ω-map on games and on surreal numbers, representing exponentials with base ω.

Among other things, we prove that every non-zero surreal number is commensurate to some unique ω^ x. We express this using ArchimedeanClass. There's two important things to note:

Todo #

For Mathlib #

theorem Set.image2_eq_range {α : Type u_1} {β : Type u_2} {γ : Type u_3} (f : αβγ) (s : Set α) (t : Set β) :
image2 f s t = range fun (x : s × t) => f x.1 x.2
theorem ArchimedeanClass.mk_dyadic {r : Dyadic'} (h : r 0) :
mk r = 0
@[simp]
theorem ArchimedeanClass.mk_realCast {r : } (h : r 0) :
mk r = 0
theorem ArchimedeanClass.mk_le_mk_iff_dyadic {x y : Surreal} :
mk x mk y ∃ (q : Dyadic'), 0 < q q * |y| |x|

ω-map on IGame #

theorem IGame.wpow_def (x : IGame) :
ω^ x = !{insert 0 (Set.image2 (fun (r : Dyadic') (y : IGame) => r * ω^ y) (Set.Ioi 0) (moves left x)) | Set.image2 (fun (r : Dyadic') (y : IGame) => r * ω^ y) (Set.Ioi 0) (moves right x)}
theorem IGame.leftMoves_wpow (x : IGame) :
moves left (ω^ x) = insert 0 (Set.image2 (fun (r : Dyadic') (y : IGame) => r * ω^ y) (Set.Ioi 0) (moves left x))
theorem IGame.rightMoves_wpow (x : IGame) :
moves right (ω^ x) = Set.image2 (fun (r : Dyadic') (y : IGame) => r * ω^ y) (Set.Ioi 0) (moves right x)
@[simp]
theorem IGame.forall_leftMoves_wpow {x : IGame} {P : IGameProp} :
(∀ ymoves left (ω^ x), P y) P 0 ∀ (r : Dyadic'), 0 < rymoves left x, P (r * ω^ y)
@[simp]
theorem IGame.forall_rightMoves_wpow {x : IGame} {P : IGameProp} :
(∀ ymoves right (ω^ x), P y) ∀ (r : Dyadic'), 0 < rymoves right x, P (r * ω^ y)
@[simp]
theorem IGame.exists_leftMoves_wpow {x : IGame} {P : IGameProp} :
(∃ ymoves left (ω^ x), P y) P 0 ∃ (r : Dyadic'), 0 < r ymoves left x, P (r * ω^ y)
@[simp]
theorem IGame.exists_rightMoves_wpow {x : IGame} {P : IGameProp} :
(∃ ymoves right (ω^ x), P y) ∃ (r : Dyadic'), 0 < r ymoves right x, P (r * ω^ y)
theorem IGame.mul_wpow_mem_leftMoves_wpow {x y : IGame} {r : Dyadic'} (hr : 0 r) (hy : y moves left x) :
r * ω^ y moves left (ω^ x)
theorem IGame.mul_wpow_mem_rightMoves_wpow {x y : IGame} {r : Dyadic'} (hr : 0 < r) (hy : y moves right x) :
r * ω^ y moves right (ω^ x)
theorem IGame.natCast_mul_wpow_mem_rightMoves_wpow {x y : IGame} {n : } (hn : 0 < n) (hy : y moves right x) :
n * ω^ y moves right (ω^ x)
@[simp]
theorem IGame.wpow_zero :
ω^ 0 = 1
@[irreducible]
instance IGame.Numeric.wpow (x : IGame) [x.Numeric] :
@[simp]
theorem IGame.Numeric.wpow_pos (x : IGame) [x.Numeric] :
0 < ω^ x
theorem IGame.Numeric.mul_wpow_lt_wpow {x y : IGame} [x.Numeric] [y.Numeric] (r : ) (h : x < y) :
r * ω^ x < ω^ y
theorem IGame.Numeric.mul_wpow_lt_wpow' {x y : IGame} [x.Numeric] [y.Numeric] (r : Dyadic') (h : x < y) :
r * ω^ x < ω^ y

A version of mul_wpow_lt_wpow stated using dyadic rationals.

theorem IGame.Numeric.wpow_lt_mul_wpow {x y : IGame} [x.Numeric] [y.Numeric] {r : } (hr : 0 < r) (h : x < y) :
ω^ x < r * ω^ y
theorem IGame.Numeric.wpow_lt_mul_wpow' {x y : IGame} [x.Numeric] [y.Numeric] {r : Dyadic'} (hr : 0 < r) (h : x < y) :
ω^ x < r * ω^ y

A version of wpow_lt_mul_wpow stated using dyadic rationals.

theorem IGame.Numeric.mul_wpow_lt_mul_wpow {x y : IGame} [x.Numeric] [y.Numeric] (r : ) {s : } (hs : 0 < s) (h : x < y) :
r * ω^ x < s * ω^ y
theorem IGame.Numeric.mul_wpow_lt_mul_wpow' {x y : IGame} [x.Numeric] [y.Numeric] (r : Dyadic') {s : Dyadic'} (hs : 0 < s) (h : x < y) :
r * ω^ x < s * ω^ y

A version of mul_wpow_lt_mul_wpow stated using dyadic rationals.

theorem IGame.Numeric.mul_wpow_add_mul_wpow_lt_mul_wpow {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (r s : ) {t : } (ht : 0 < t) (hx : x < z) (hy : y < z) :
r * ω^ x + s * ω^ y < t * ω^ z
theorem IGame.Numeric.mul_wpow_add_mul_wpow_lt_mul_wpow' {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (r s : Dyadic') {t : Dyadic'} (ht : 0 < t) (hx : x < z) (hy : y < z) :
r * ω^ x + s * ω^ y < t * ω^ z

A version of mul_wpow_add_mul_wpow_lt_mul_wpow stated using dyadic rationals.

theorem IGame.Numeric.mul_wpow_lt_mul_wpow_add_mul_wpow {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (r : ) {s t : } (hs : 0 < s) (ht : 0 < t) (hx : x < y) (hy : x < z) :
r * ω^ x < s * ω^ y + t * ω^ z
theorem IGame.Numeric.mul_wpow_lt_mul_wpow_add_mul_wpow' {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (r : Dyadic') {s t : Dyadic'} (hs : 0 < s) (ht : 0 < t) (hx : x < y) (hy : x < z) :
r * ω^ x < s * ω^ y + t * ω^ z

A version of mul_wpow_lt_mul_wpow_add_mul_wpow stated using dyadic rationals.

@[simp]
theorem IGame.Numeric.wpow_lt_wpow {x y : IGame} [x.Numeric] [y.Numeric] :
ω^ x < ω^ y x < y
@[simp]
theorem IGame.Numeric.wpow_le_wpow {x y : IGame} [x.Numeric] [y.Numeric] :
ω^ x ω^ y x y
theorem IGame.Numeric.wpow_congr {x y : IGame} [x.Numeric] [y.Numeric] (h : xy) :
ω^ xω^ y
@[irreducible]
theorem IGame.Numeric.wpow_add_equiv (x y : IGame) [x.Numeric] [y.Numeric] :
ω^ (x + y) ≈ ω^ x * ω^ y
theorem IGame.Numeric.wpow_sub_equiv (x y : IGame) [x.Numeric] [y.Numeric] :
ω^ (x - y) ≈ ω^ x / ω^ y

ω-pow on Surreal #

@[simp]
theorem Surreal.mk_wpow (x : IGame) [x.Numeric] :
mk (ω^ x) = ω^ mk x
@[simp]
theorem Surreal.wpow_zero :
ω^ 0 = 1
@[simp]
theorem Surreal.wpow_pos (x : Surreal) :
0 < ω^ x
@[simp]
theorem Surreal.wpow_ne_zero (x : Surreal) :
ω^ x 0
@[simp]
theorem Surreal.wpow_abs (x : Surreal) :
|ω^ x| = ω^ x
@[simp]
theorem Surreal.wpow_lt_wpow {x y : Surreal} :
ω^ x < ω^ y x < y
@[simp]
theorem Surreal.wpow_le_wpow {x y : Surreal} :
ω^ x ω^ y x y
@[simp]
theorem Surreal.wpow_inj {x y : Surreal} :
ω^ x = ω^ y x = y
@[simp]
theorem Surreal.wpow_add (x y : Surreal) :
ω^ (x + y) = ω^ x * ω^ y
@[simp]
theorem Surreal.wpow_neg (x : Surreal) :
@[simp]
theorem Surreal.wpow_sub (x y : Surreal) :
ω^ (x - y) = ω^ x / ω^ y
theorem Surreal.mul_wpow_lt_wpow {x y : Surreal} (r : ) (h : x < y) :
r * ω^ x < ω^ y
theorem Surreal.wpow_lt_mul_wpow {x y : Surreal} {r : } (hr : 0 < r) (h : x < y) :
ω^ x < r * ω^ y
theorem Surreal.mul_wpow_lt_mul_wpow {x y : Surreal} (r : ) {s : } (hs : 0 < s) (h : x < y) :
r * ω^ x < s * ω^ y

Archimedean classes #

@[simp]

ω^ x and ω^ y are commensurate iff x = y.

Every non-zero surreal is commensurate to some ω^ x.

ω-logarithm #

The ω-logarithm of a positive surreal x is the unique surreal y such that x is commensurate with ω^ y.

As with Real.log, we set junk values wlog 0 = 0 and wlog (-x) = wlog x.

Equations
Instances For

    Returns an arbitrary representative for Surreal.wlog.

    Equations
    Instances For
      @[simp]
      theorem Surreal.mk_wlog (x : IGame) [h : x.Numeric] :
      mk x.wlog = (mk x).wlog
      @[simp]
      theorem Surreal.wlog_zero :
      wlog 0 = 0
      @[simp]
      theorem Surreal.wlog_wpow (x : Surreal) :
      (ω^ x).wlog = x
      @[simp]
      theorem Surreal.wlog_neg (x : Surreal) :
      (-x).wlog = x.wlog
      @[simp]
      theorem Surreal.wlog_abs (x : Surreal) :
      @[simp]
      theorem Surreal.wlog_mul {x y : Surreal} (hx : x 0) (hy : y 0) :
      (x * y).wlog = x.wlog + y.wlog
      @[simp]
      theorem Surreal.wlog_realCast (r : ) :
      (↑r).wlog = 0
      @[simp]
      theorem Surreal.wlog_ratCast (q : ) :
      (↑q).wlog = 0
      @[simp]
      theorem Surreal.wlog_intCast (n : ) :
      (↑n).wlog = 0
      @[simp]
      theorem Surreal.wlog_natCast (n : ) :
      (↑n).wlog = 0
      theorem Surreal.mem_range_wpow_of_forall_mk_ne_mk {x : IGame} [x.Numeric] (h : 0 < x) (Hl : ∀ (y : IGame) (hy : y IGame.moves Player.left x), 0 < yArchimedeanClass.mk (mk y) ArchimedeanClass.mk (mk x)) (Hr : ∀ (y : IGame) (hy : y IGame.moves Player.right x), ArchimedeanClass.mk (mk y) ArchimedeanClass.mk (mk x)) :
      mk x Set.range fun (x : Surreal) => ω^ x

      A game not commensurate with its positive options is a power of ω.