Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit d6f337d

Browse files
committed
feat(set_theory/ordinal_arithmetic): The derivative of multiplication (#12202)
We prove that for `0 < a`, `deriv ((*) a) b = a ^ ω * b`.
1 parent e6fef39 commit d6f337d

File tree

1 file changed

+141
-11
lines changed

1 file changed

+141
-11
lines changed

src/set_theory/ordinal_arithmetic.lean

Lines changed: 141 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,7 +1687,19 @@ begin
16871687
(lt_of_lt_of_le (ordinal.pos_iff_ne_zero.2 a0) ab) (le_of_lt h))) } }
16881688
end
16891689

1690-
theorem le_opow_self {a : ordinal} (b) (a1 : 1 < a) : b ≤ a ^ b :=
1690+
theorem left_le_opow (a : ordinal) {b : ordinal} (b1 : 0 < b) : a ≤ a ^ b :=
1691+
begin
1692+
nth_rewrite 0 ←opow_one a,
1693+
cases le_or_gt a 1 with a1 a1,
1694+
{ cases lt_or_eq_of_le a1 with a0 a1,
1695+
{ rw lt_one_iff_zero at a0,
1696+
rw [a0, zero_opow ordinal.one_ne_zero],
1697+
exact ordinal.zero_le _ },
1698+
rw [a1, one_opow, one_opow] },
1699+
rwa [opow_le_opow_iff_right a1, one_le_iff_pos]
1700+
end
1701+
1702+
theorem right_le_opow {a : ordinal} (b) (a1 : 1 < a) : b ≤ a ^ b :=
16911703
(opow_is_normal a1).self_le _
16921704

16931705
theorem opow_lt_opow_left_of_succ {a b c : ordinal}
@@ -1718,6 +1730,9 @@ begin
17181730
(opow_is_normal a1)).limit_le l).symm }
17191731
end
17201732

1733+
theorem opow_one_add (a b : ordinal) : a ^ (1 + b) = a * a ^ b :=
1734+
by rw [opow_add, opow_one]
1735+
17211736
theorem opow_dvd_opow (a) {b c : ordinal}
17221737
(h : b ≤ c) : a ^ b ∣ a ^ c :=
17231738
by { rw [← ordinal.add_sub_cancel_of_le h, opow_add], apply dvd_mul_right }
@@ -1758,7 +1773,7 @@ if h : 1 < b then pred (Inf {o | x < b ^ o}) else 0
17581773

17591774
/-- The set in the definition of `log` is nonempty. -/
17601775
theorem log_nonempty {b x : ordinal} (h : 1 < b) : {o | x < b ^ o}.nonempty :=
1761-
⟨succ x, succ_le.1 (le_opow_self _ h)⟩
1776+
⟨succ x, succ_le.1 (right_le_opow _ h)⟩
17621777

17631778
@[simp] theorem log_not_one_lt {b : ordinal} (b1 : ¬ 1 < b) (x : ordinal) : log b x = 0 :=
17641779
by simp only [log, dif_neg b1]
@@ -1833,7 +1848,7 @@ else by simp only [log_not_one_lt b1, ordinal.zero_le]
18331848
theorem log_le_self (b x : ordinal) : log b x ≤ x :=
18341849
if x0 : x = 0 then by simp only [x0, log_zero, ordinal.zero_le] else
18351850
if b1 : 1 < b then
1836-
le_trans (le_opow_self _ b1) (opow_log_le b (ordinal.pos_iff_ne_zero.2 x0))
1851+
le_trans (right_le_opow _ b1) (opow_log_le b (ordinal.pos_iff_ne_zero.2 x0))
18371852
else by simp only [log_not_one_lt b1, ordinal.zero_le]
18381853

18391854
@[simp] theorem log_one (b : ordinal) : log b 1 = 0 :=
@@ -2243,7 +2258,7 @@ theorem opow_omega {a : ordinal} (a1 : 1 < a) (h : a < omega) : a ^ omega = omeg
22432258
le_antisymm
22442259
((opow_le_of_limit (one_le_iff_ne_zero.1 $ le_of_lt a1) omega_is_limit).2
22452260
(λ b hb, le_of_lt (opow_lt_omega h hb)))
2246-
(le_opow_self _ a1)
2261+
(right_le_opow _ a1)
22472262

22482263
theorem is_normal.apply_omega {f : ordinal.{u} → ordinal.{u}} (hf : is_normal f) :
22492264
sup.{0 u} (f ∘ nat.cast) = f omega :=
@@ -2394,6 +2409,9 @@ begin
23942409
exact ⟨(deriv_is_normal f).strict_mono, H.deriv_fp, λ _, H.apply_eq_self_iff_deriv.1
23952410
end
23962411

2412+
theorem deriv_eq_id_of_nfp_eq_id {f : ordinal → ordinal} (h : nfp f = id) : deriv f = id :=
2413+
(is_normal.eq_iff_zero_and_succ (deriv_is_normal _) is_normal.refl).2 (by simp [h, succ_inj])
2414+
23972415
end
23982416

23992417
/-! ### Fixed points of addition -/
@@ -2435,17 +2453,129 @@ by { rw ←add_eq_right_iff_mul_omega_le, exact (add_is_normal a).le_iff_eq }
24352453

24362454
theorem deriv_add_eq_mul_omega_add (a b : ordinal.{u}) : deriv ((+) a) b = a * omega + b :=
24372455
begin
2438-
refine b.limit_rec_on _ (λ o h, _) (λ o ho h, _),
2456+
revert b,
2457+
rw [←funext_iff, is_normal.eq_iff_zero_and_succ (deriv_is_normal _) (add_is_normal _)],
2458+
refine ⟨_, λ a h, _⟩,
24392459
{ rw [deriv_zero, add_zero],
24402460
exact nfp_add_zero a },
24412461
{ rw [deriv_succ, h, add_succ],
24422462
exact nfp_eq_self (add_eq_right_iff_mul_omega_le.2 ((le_add_right _ _).trans
2443-
(lt_succ_self _).le)) },
2444-
{ rw [←is_normal.bsup_eq.{u u} (add_is_normal _) ho,
2445-
←is_normal.bsup_eq.{u u} (deriv_is_normal _) ho],
2446-
congr,
2447-
ext a hao,
2448-
exact h a hao }
2463+
(lt_succ_self _).le)) }
2464+
end
2465+
2466+
/-! ### Fixed points of multiplication -/
2467+
2468+
@[simp] theorem nfp_mul_one {a : ordinal} (ha : 0 < a) : nfp ((*) a) 1 = a ^ omega :=
2469+
begin
2470+
unfold nfp,
2471+
rw ←sup_opow_nat,
2472+
{ congr,
2473+
funext,
2474+
induction n with n hn,
2475+
{ rw [nat.cast_zero, opow_zero, iterate_zero_apply] },
2476+
nth_rewrite 1 nat.succ_eq_one_add,
2477+
rw [nat.cast_add, nat.cast_one, opow_add, opow_one, iterate_succ_apply', hn] },
2478+
{ exact ha }
2479+
end
2480+
2481+
@[simp] theorem nfp_mul_zero (a : ordinal) : nfp ((*) a) 0 = 0 :=
2482+
begin
2483+
rw [←ordinal.le_zero, nfp_le],
2484+
intro n,
2485+
induction n with n hn, { refl },
2486+
rwa [iterate_succ_apply, mul_zero]
2487+
end
2488+
2489+
@[simp] theorem nfp_zero_mul : nfp ((*) 0) = id :=
2490+
begin
2491+
refine funext (λ a, (nfp_le.2 (λ n, _)).antisymm (le_sup (λ n, ((*) 0)^[n] a) 0)),
2492+
induction n with n hn, { refl },
2493+
rw function.iterate_succ',
2494+
change 0 * _ ≤ a,
2495+
rw zero_mul,
2496+
exact ordinal.zero_le a
2497+
end
2498+
2499+
@[simp] theorem deriv_mul_zero : deriv ((*) 0) = id :=
2500+
deriv_eq_id_of_nfp_eq_id nfp_zero_mul
2501+
2502+
theorem nfp_mul_eq_opow_omega {a b : ordinal} (hb : 0 < b) (hba : b ≤ a ^ omega) :
2503+
nfp ((*) a) b = a ^ omega.{u} :=
2504+
begin
2505+
cases eq_zero_or_pos a with ha ha,
2506+
{ rw [ha, zero_opow omega_ne_zero] at *,
2507+
rw [ordinal.le_zero.1 hba, nfp_zero_mul],
2508+
refl },
2509+
apply le_antisymm,
2510+
{ apply (mul_is_normal ha).nfp_le_fp hba,
2511+
rw [←opow_one_add, one_add_omega] },
2512+
rw ←nfp_mul_one ha,
2513+
exact monotone.nfp (mul_is_normal ha).strict_mono.monotone (one_le_iff_pos.2 hb)
2514+
end
2515+
2516+
theorem eq_zero_or_opow_omega_le_of_mul_eq_right {a b : ordinal} (hab : a * b = b) :
2517+
b = 0 ∨ a ^ omega.{u} ≤ b :=
2518+
begin
2519+
cases eq_zero_or_pos a with ha ha,
2520+
{ rw [ha, zero_opow omega_ne_zero],
2521+
exact or.inr (ordinal.zero_le b) },
2522+
rw or_iff_not_imp_left,
2523+
intro hb,
2524+
change b ≠ 0 at hb,
2525+
rw ←nfp_mul_one ha,
2526+
rw ←one_le_iff_ne_zero at hb,
2527+
exact (mul_is_normal ha).nfp_le_fp hb (le_of_eq hab)
2528+
end
2529+
2530+
theorem mul_eq_right_iff_opow_omega_dvd {a b : ordinal} : a * b = b ↔ a ^ omega ∣ b :=
2531+
begin
2532+
cases eq_zero_or_pos a with ha ha,
2533+
{ rw [ha, zero_mul, zero_opow omega_ne_zero, zero_dvd],
2534+
exact eq_comm },
2535+
refine ⟨λ hab, _, λ h, _⟩,
2536+
{ rw dvd_iff_mod_eq_zero,
2537+
rw [←div_add_mod b (a ^ omega), mul_add, ←mul_assoc, ←opow_one_add, one_add_omega,
2538+
add_left_cancel] at hab,
2539+
cases eq_zero_or_opow_omega_le_of_mul_eq_right hab with hab hab,
2540+
{ exact hab },
2541+
refine (not_lt_of_le hab (mod_lt b (opow_ne_zero omega _))).elim,
2542+
rwa ←ordinal.pos_iff_ne_zero },
2543+
cases h with c hc,
2544+
rw [hc, ←mul_assoc, ←opow_one_add, one_add_omega]
2545+
end
2546+
2547+
theorem mul_le_right_iff_opow_omega_dvd {a b : ordinal} (ha : 0 < a) : a * b ≤ b ↔ a ^ omega ∣ b :=
2548+
by { rw ←mul_eq_right_iff_opow_omega_dvd, exact (mul_is_normal ha).le_iff_eq }
2549+
2550+
theorem nfp_mul_opow_omega_add {a c : ordinal} (b) (ha : 0 < a) (hc : 0 < c) (hca : c ≤ a ^ omega) :
2551+
nfp ((*) a) (a ^ omega * b + c) = a ^ omega.{u} * b.succ :=
2552+
begin
2553+
apply le_antisymm,
2554+
{ apply is_normal.nfp_le_fp (mul_is_normal ha),
2555+
{ rw mul_succ,
2556+
apply add_le_add_left hca },
2557+
{ rw [←mul_assoc, ←opow_one_add, one_add_omega] } },
2558+
{ cases mul_eq_right_iff_opow_omega_dvd.1 ((mul_is_normal ha).nfp_fp (a ^ omega * b + c))
2559+
with d hd,
2560+
rw hd,
2561+
apply mul_le_mul_left',
2562+
have := le_nfp_self (has_mul.mul a) (a ^ omega * b + c),
2563+
rw hd at this,
2564+
have := (add_lt_add_left hc (a ^ omega * b)).trans_le this,
2565+
rw [add_zero, mul_lt_mul_iff_left (opow_pos omega ha)] at this,
2566+
rwa succ_le }
2567+
end
2568+
2569+
theorem deriv_mul_eq_opow_omega_mul {a : ordinal.{u}} (ha : 0 < a) (b) :
2570+
deriv ((*) a) b = a ^ omega * b :=
2571+
begin
2572+
revert b,
2573+
rw [←funext_iff,
2574+
is_normal.eq_iff_zero_and_succ (deriv_is_normal _) (mul_is_normal (opow_pos omega ha))],
2575+
refine ⟨_, λ c h, _⟩,
2576+
{ rw [deriv_zero, nfp_mul_zero, mul_zero] },
2577+
{ rw [deriv_succ, h],
2578+
exact nfp_mul_opow_omega_add c ha zero_lt_one (one_le_iff_pos.2 (opow_pos _ ha)) },
24492579
end
24502580

24512581
end ordinal

0 commit comments

Comments
 (0)