問題 39

(初級 🌟) 整数の範囲(下限と上限)が与えられたとき、その範囲内のすべての素数のリストを作成せよ。

/-- エラトステネスの篩 -/
def eratosthenes (n : Nat) : Array Bool := Id.run do
  let mut isPrime := Array.replicate (n + 1) true

  isPrime := isPrime.set! 0 false
  isPrime := isPrime.set! 1 false

  for p in [2 : n + 1] do
    if not isPrime[p]! then
      continue

    if p ^ 2 > n then
      break

    let mut q := p * p
    while q <= n do
      isPrime := isPrime.set! q false
      q := q + p

  return isPrime

/-- n 以下の素数のリストを返す -/
def primeSieve (n : Nat) : List Nat :=
  let result := eratosthenes n
  result.toList.zipIdx
    |> List.filter (fun (i, _e) => i)
    |> List.map (fun (_i, e) => e)

def primesR (s t : Nat) : List Nat :=
  primeSieve t |>.filter (· ≥ s)

#guard primesR 10 10 == []
#guard primesR 11 11 == [11]
#guard primesR 1 10 == [2, 3, 5, 7]
#guard primesR 30 100 == [31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]