Zulip Chat Archive
Stream: Is there code for X?
Topic: 2 is the first prime
Ralf Stephan (May 05 2024 at 16:49):
Is there code for it? If not, I suspect it should be possible to prove
import Mathlib
example : Nat.nth Nat.Prime 0 = 2 := by
sorry
using not_prime_zero
, not_prime_one
, and prime_two
, but I have no idea how. Can you please help?
Yaël Dillies (May 05 2024 at 16:50):
Does rfl
do it?
Yaël Dillies (May 05 2024 at 16:50):
I would check myself, but you haven't provided a #mwe
Ralf Stephan (May 05 2024 at 16:51):
type mismatch
Iff.rfl
has type
?m.7574 ↔ ?m.7574 : Prop
but is expected to have type
nth Nat.Prime 0 = 2 : Prop
Ralf Stephan (May 05 2024 at 16:52):
added the import above, sorry
Kyle Miller (May 05 2024 at 16:59):
Here's getting it into a different form that's more computational, but rfl
still doesn't work:
import Mathlib
example : Nat.nth Nat.Prime 0 = 2 := by
rw [Nat.nth_zero]
have : Set.Nonempty {n | Nat.Prime n} := ⟨2, Nat.prime_two⟩
rw [Nat.sInf_def this]
-- ⊢ Nat.find this = 2
sorry
Mitchell Lee (May 05 2024 at 17:19):
Here's one way
import Mathlib
example : Nat.nth Nat.Prime 0 = 2 := by
suffices 2 ≤ Nat.nth Nat.Prime 0 ∧ Nat.nth Nat.Prime 0 < 3 by linarith
rw [← Nat.count_le_iff_le_nth Nat.infinite_setOf_prime, ← Nat.lt_nth_iff_count_lt Nat.infinite_setOf_prime]
decide
Ralf Stephan (May 05 2024 at 17:28):
Thanks. I guess this is worth a PR? I just have the time.
Ruben Van de Velde (May 05 2024 at 17:32):
Yes, this seems fine to add
Mitchell Lee (May 05 2024 at 17:35):
Here's a potentially better way to do it
import Mathlib
theorem nth_eq_iff_of_ne_zero {p : ℕ → Prop} [DecidablePred p] {n m : ℕ} (hm : m ≠ 0) :
Nat.nth p n = m ↔ Nat.count p m = n ∧ p m := by
sorry
example : Nat.nth Nat.Prime 0 = 2 := by
rw [nth_eq_iff_of_ne_zero]
· decide
· decide
Kyle Miller (May 05 2024 at 17:42):
Another approach along those lines:
theorem Nat.nth_eq_iff_of_infinite {p : ℕ → Prop} [DecidablePred p] (hi : (setOf p).Infinite) {n m : ℕ} :
Nat.nth p n = m ↔ Nat.count p m = n ∧ p m := by
constructor
· rintro rfl
simp [Nat.count_nth_of_infinite hi, Nat.nth_mem_of_infinite hi]
· rintro ⟨rfl, h⟩
exact Nat.nth_count h
example : Nat.nth Nat.Prime 0 = 2 := by
rw [Nat.nth_eq_iff_of_infinite Nat.infinite_setOf_prime]
decide
Kyle Miller (May 05 2024 at 17:46):
It turns out that's more powerful than needed. This suffices:
example : Nat.nth Nat.Prime 0 = 2 := by
convert_to Nat.nth Nat.Prime (Nat.count Nat.Prime 2) = 2
exact Nat.nth_count Nat.prime_two
Kyle Miller (May 05 2024 at 17:47):
Or rather
example : Nat.nth Nat.Prime 0 = 2 := Nat.nth_count Nat.prime_two
Mitchell Lee (May 05 2024 at 17:53):
Here's a way to make it all decidable
import Mathlib
instance {p : ℕ → Prop} [DecidablePred p] [hp : Fact (setOf p).Infinite] {n m : ℕ} :
Decidable (Nat.nth p n = m) :=
decidable_of_iff (Nat.count p m ≤ n ∧ n < Nat.count p (m + 1)) (by
rw [Nat.lt_nth_iff_count_lt hp.elim, Nat.count_le_iff_le_nth hp.elim,
Nat.lt_succ_iff, ← Nat.le_antisymm_iff, eq_comm])
instance : Fact (setOf Nat.Prime).Infinite := ⟨Nat.infinite_setOf_prime⟩
example : Nat.nth Nat.Prime 0 = 2 := by decide
example : Nat.nth Nat.Prime 1 = 3 := by decide
example : Nat.nth Nat.Prime 2 = 5 := by decide
example : Nat.nth Nat.Prime 3 = 7 := by decide
Ralf Stephan (May 05 2024 at 17:55):
So this is more general, thus more preferred I guess.
Kyle Miller (May 05 2024 at 17:56):
That kind of decidable instance isn't the best, since it only applies to Nat.nth Nat.Prime n = m
, and it can't be used to evaluate Nat.nth Nat.prime n
inside of other expressions. (Plus, we generally don't want to add global Fact
s if we can help it. That Fact
might be ok since it has no hypotheses.)
Ralf Stephan (May 05 2024 at 18:00):
The zeroth case suffices for me so'll first PR the one-liner.
Kyle Miller (May 05 2024 at 18:08):
There could one day either be a norm_num
plugin or a simproc
to calculate Nat.nth Nat.prime n
in general
Ralf Stephan (May 05 2024 at 18:10):
Kyle Miller said:
Or rather
example : Nat.nth Nat.Prime 0 = 2 := Nat.nth_count Nat.prime_two
failed to synthesize instance
DecidablePred Prime
Ralf Stephan (May 05 2024 at 18:17):
Hmm.. simply adding it and an import of Nth to Nat/Prime will give me this error, but a plain mwe will not.
Ah, I inserted too high in the file.
Mario Carneiro (May 05 2024 at 18:18):
I think a good way to write the decidable instance would be to have a class Productive p
like this:
import Mathlib.Data.Nat.Nth
class Productive (p : ℕ → Prop) where
next : ℕ → ℕ
next_least {i n} (h : i ≤ next n) : next n = i ↔ p i ∧ n ≤ i
def Nat.nth' (p : ℕ → Prop) [Productive p] (n : ℕ) : ℕ :=
Productive.next p <|
match n with
| 0 => 0
| i+1 => Nat.nth' p i + 1
theorem nth_eq_nth' (p : ℕ → Prop) [Productive p] (n : ℕ) : Nat.nth p n = Nat.nth' p n := sorry
instance (p : ℕ → Prop) [Productive p] (n a : ℕ) : Decidable (Nat.nth p n = a) :=
decidable_of_iff (Nat.nth' p n = a) <| by rw [nth_eq_nth']
Timo Carlin-Burns (May 07 2024 at 15:25):
Is it possible to write an efficient implementation of Productive Nat.Prime
? next
only gives you the largest prime you've generated so far, but you want to test divisibility against all the primes you've generated so far.
Last updated: May 02 2025 at 03:31 UTC