İçeriğe atla
ΣDSA Patterns
Menü
Dil

Matematik & Sayı Teorisi

Rehber 3 / 6 · Yol 3 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
0
1
2
3
4
5
6
7
8
9

array length n, not n+1

n=10'dan kesinlikle küçük asallar. Kalbur: bileşikleri p²'den işaretle.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Count Primes

Problem (yeniden ifade)

Tamsayı n verildiğinde n’den küçük kaç asal olduğunu döndür.

Sezgi

Her adayı deneme bölmek O(n √n). Elek bileşikleri toplu işaretler: her asal p için katları p²’den başlayarak sil (daha küçük katlar daha küçük bir asalle zaten vuruldu).

Yaklaşımlar

Eratosthenes eleği

Doğrulanmadı
Zaman O(n log log n)Alan O(n)

Fikir. Boyu n boolean dizi, 0 ve 1 false. p 2’den p² < n iken, p hâlâ asalsa p², p²+p, … işaretle. Kalan true’ları say.

Yürüyüş. n = 10 → 2, 3, 5, 7 → 4. n ≤ 2 → 0.

Trade-off. Hızın bedeli doğrusal alan. Çarpmaya 2p’den değil p²’den başla. Cevap n’den küçük asallar, dizi uzunluğu n+1 değil n.

Çözüm
export function countPrimes(n: number): number {
  if (n <= 2) return 0;
  const prime = new Array<boolean>(n).fill(true);
  prime[0] = false;
  prime[1] = false;
  for (let p = 2; p * p < n; p++) {
    if (!prime[p]) continue;
    for (let m = p * p; m < n; m += p) prime[m] = false;
  }
  let c = 0;
  for (let i = 2; i < n; i++) if (prime[i]) c++;
  return c;
}
export function countPrimes(n: number): number {
  if (n <= 2) return 0;
  const prime = new Array<boolean>(n).fill(true);
  prime[0] = false;
  prime[1] = false;
  for (let p = 2; p * p < n; p++) {
    if (!prime[p]) continue;
    for (let m = p * p; m < n; m += p) prime[m] = false;
  }
  let c = 0;
  for (let i = 2; i < n; i++) if (prime[i]) c++;
  return c;
}

Şablon bağlantısı

Math & Number Theory’nin sieve şekli: boolean dizi, p*p’den sil. “n’den küçük” off-by-one’ı klasik tuzak.

Yansıma