@@ -1687,7 +1687,19 @@ begin
1687
1687
(lt_of_lt_of_le (ordinal.pos_iff_ne_zero.2 a0) ab) (le_of_lt h))) } }
1688
1688
end
1689
1689
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 :=
1691
1703
(opow_is_normal a1).self_le _
1692
1704
1693
1705
theorem opow_lt_opow_left_of_succ {a b c : ordinal}
@@ -1718,6 +1730,9 @@ begin
1718
1730
(opow_is_normal a1)).limit_le l).symm }
1719
1731
end
1720
1732
1733
+ theorem opow_one_add (a b : ordinal) : a ^ (1 + b) = a * a ^ b :=
1734
+ by rw [opow_add, opow_one]
1735
+
1721
1736
theorem opow_dvd_opow (a) {b c : ordinal}
1722
1737
(h : b ≤ c) : a ^ b ∣ a ^ c :=
1723
1738
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
1758
1773
1759
1774
/-- The set in the definition of `log` is nonempty. -/
1760
1775
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)⟩
1762
1777
1763
1778
@[simp] theorem log_not_one_lt {b : ordinal} (b1 : ¬ 1 < b) (x : ordinal) : log b x = 0 :=
1764
1779
by simp only [log, dif_neg b1]
@@ -1833,7 +1848,7 @@ else by simp only [log_not_one_lt b1, ordinal.zero_le]
1833
1848
theorem log_le_self (b x : ordinal) : log b x ≤ x :=
1834
1849
if x0 : x = 0 then by simp only [x0, log_zero, ordinal.zero_le] else
1835
1850
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))
1837
1852
else by simp only [log_not_one_lt b1, ordinal.zero_le]
1838
1853
1839
1854
@[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
2243
2258
le_antisymm
2244
2259
((opow_le_of_limit (one_le_iff_ne_zero.1 $ le_of_lt a1) omega_is_limit).2
2245
2260
(λ b hb, le_of_lt (opow_lt_omega h hb)))
2246
- (le_opow_self _ a1)
2261
+ (right_le_opow _ a1)
2247
2262
2248
2263
theorem is_normal.apply_omega {f : ordinal.{u} → ordinal.{u}} (hf : is_normal f) :
2249
2264
sup.{0 u} (f ∘ nat.cast) = f omega :=
@@ -2394,6 +2409,9 @@ begin
2394
2409
exact ⟨(deriv_is_normal f).strict_mono, H.deriv_fp, λ _, H.apply_eq_self_iff_deriv.1 ⟩
2395
2410
end
2396
2411
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
+
2397
2415
end
2398
2416
2399
2417
/-! ### 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 }
2435
2453
2436
2454
theorem deriv_add_eq_mul_omega_add (a b : ordinal.{u}) : deriv ((+) a) b = a * omega + b :=
2437
2455
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, _⟩,
2439
2459
{ rw [deriv_zero, add_zero],
2440
2460
exact nfp_add_zero a },
2441
2461
{ rw [deriv_succ, h, add_succ],
2442
2462
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)) },
2449
2579
end
2450
2580
2451
2581
end ordinal
0 commit comments