🎨 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 (μ†Œμˆ˜μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜)

경이·2024λ…„ 8μ›” 3일
post-thumbnail

🎨 μ†Œμˆ˜μ°ΎκΈ°

  • μ†Œμˆ˜λž€ 1κ³Ό 자기 μžμ‹ λ§Œμ„ μ•½μˆ˜λ‘œ κ°€μ§€λŠ” 수둜 일반적으둜 μ•„λž˜ μ½”λ“œμ™€ 같이 μ†Œμˆ˜λ₯Ό 찾을 수 μžˆλ‹€.

    const isPrimeNumber = (n) => {
      for (let i = 2; i < n; i++) {
        if (n % i === 0) return false;
      }
      return true;
    };
    
  • μœ„μ˜ 방법을 μ μš©ν•œλ‹€λ©΄ μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)이 λœλ‹€. 2λΆ€ν„° NκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄μ„œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ”μ§€ μ•„λ‹Œμ§€ 확인해야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.


🎨 κ°œμ„ λœ μ†Œμˆ˜μ°ΎκΈ°

  • μ•½μˆ˜μ˜ νŠΉμ§•μ„ ν™œμš©ν•˜μ—¬ μ†Œμˆ˜λ₯Ό 더 효율적인 λ°©λ²•μœΌλ‘œ 찾을 수 μžˆλ‹€.

  • λ§Œμ•½ n이 μ†Œμˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ μ•½μˆ˜λ₯Ό κ°€μ§ˆν…λ° μ΄λ•Œ μ•½μˆ˜λŠ” n = a * b (a와 bλŠ” n의 μ•½μˆ˜)둜 ν‘œν˜„ν•  수 μžˆλ‹€. μ΄λ•Œ a λ‚˜ b λ‘˜μ€‘ ν•˜λ‚˜λŠ” 무쑰건 μ œκ³±κ·Όλ³΄λ‹€ μž‘μ€ μˆ˜μ—¬μ•Ό ν•œλ‹€.

  • 즉 n이 μ†Œμˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ √nκΉŒμ§€ μ•½μˆ˜κ°€ λ°˜λ“œμ‹œ ν•˜λ‚˜ 이상 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것이기 λ•Œλ¬Έμ— μ†Œμˆ˜μ˜ νŒλ³„μ€ μ œκ³±κ·ΌκΉŒμ§€λ§Œ ν•˜λ©΄ λœλ‹€.

    const isPrimeNumber = (n) => {
      for (let i = 2; i <= Math.sqrt(n); i++) {
        if (n % i === 0) return false;
      }
      return true;
    };
  • μœ„μ˜ 방법을 μ μš©ν•œλ‹€λ©΄ μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” O(√n)이 λœλ‹€.


🎨 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

  • λ§Œμ•½ 1λΆ€ν„° 1,000,000κΉŒμ§€μ˜ λͺ¨λ“  μ†Œμˆ˜λ₯Ό νŒλ³„ν•΄μ•Ό ν•˜λŠ” 경우 μœ„ 방법을 μ‚¬μš©ν•˜μ—¬ μ†Œμˆ˜λ₯Ό νŒλ³„ν•˜λŠ” 것은 μ œκ³±κ·ΌκΉŒμ§€ κ²€μ‚¬ν•˜λŠ” κ°œμ„ λœ 방법을 μ μš©ν•΄λ„ 느릴 수 μžˆλ‹€.
  • λ”°λΌμ„œ μ—¬λŸ¬ 개의 수λ₯Ό μ†Œμˆ˜νŒλ³„ ν•˜λŠ” κ²½μš°μ—λŠ” μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λΌλŠ” 방법을 μ‚¬μš©ν•œλ‹€.
  • κ³ λŒ€ 그리슀의 μˆ˜ν•™μž μ—λΌν† μŠ€ν…Œλ„€μŠ€κ°€ λ§Œλ“€μ–΄ λ‚Έ μ†Œμˆ˜λ₯Ό μ°ΎλŠ” λ°©λ²•μœΌλ‘œ 이 방법은 마치 체둜 μΉ˜λ“―μ΄ 수λ₯Ό κ±ΈλŸ¬λ‚Έλ‹€κ³  ν•˜μ—¬ 'μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체' 라고 λΆ€λ₯Έλ‹€.

  1. 2λΆ€ν„° μ†Œμˆ˜λ₯Ό κ΅¬ν•˜κ³ μž ν•˜λŠ” κ΅¬κ°„μ˜ λͺ¨λ“  수λ₯Ό λ‚˜μ—΄ν•œλ‹€.
  2. νšŒμƒ‰μœΌλ‘œ μƒ‰μΉ λœ μˆ˜λŠ” μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€ νŒλ³„ν•˜μ§€ μ•Šμ€ μˆ˜μ΄λ‹€. νšŒμƒ‰ 수 쀑 κ°€μž₯ μž‘μ€ 2λΆ€ν„° νŒλ³„μ„ μ‹œμž‘ν•œλ‹€.
  3. 자기 μžμ‹ μ„ μ œμ™Έν•œ 2의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€. (μ—°ν•œ 빨간색)
  4. 남은 νšŒμƒ‰ 수 쀑 κ°€μž₯ μž‘μ€ μˆ˜λŠ” 3μ΄λ―€λ‘œ 자기 μžμ‹ μ„ μ œμ™Έν•œ 3의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€. (μ—°ν•œ μ΄ˆλ‘μƒ‰)
  5. 남은 νšŒμƒ‰ 수 쀑 κ°€μž₯ μž‘μ€ μˆ˜λŠ” 5μ΄λ―€λ‘œ 자기 μžμ‹ μ„ μ œμ™Έν•œ 3의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€. (μ—°ν•œ νŒŒλž€μƒ‰)
  6. 남은 νšŒμƒ‰ 수 쀑 κ°€μž₯ μž‘μ€ μˆ˜λŠ” 7μ΄λ―€λ‘œ 자기 μžμ‹ μ„ μ œμ™Έν•œ 3의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€. (μ—°ν•œ λ…Έλž€μƒ‰)
  7. κ΅¬ν•˜κ³ μž ν•˜λŠ” κ΅¬κ°„μ˜ μ œκ³±κ·ΌκΉŒμ§€ ν•΄λ‹Ή λ‘œμ§μ„ λ°˜λ³΅ν•΄μ€€λ‹€.
    μœ„ μ˜ˆμ‹œμ—μ„œλŠ” κ΅¬ν•˜κ³ μž ν•˜λŠ” ꡬ간(n)의 크기가 120이기 λ•Œλ¬Έμ— n의 제곱근인 11κΉŒμ§€λ§Œ μœ„μ˜ 과정을 λ°˜λ³΅ν•΄μ€˜λ„ μΆ©λΆ„ν•˜λ‹€.

🎨 μ†ŒμŠ€μ½”λ“œ(JS)

const n = 120;
const primeNumber = Array.from({ length: n + 1 }).fill(true);

for (let i = 2; i <= Math.sqrt(n); i++) {
  // iκ°€ μ†Œμˆ˜μΈ 경우
  if (primeNumber[i]) {
    for (let j = i * 2; j <= n; j = j + i) {
      primeNumber[j] = false;
    }
  }
}


for (let i = 2; i <= n; i++) {
  if (primeNumber[i]) console.log(i);
}

🎨 Ref

profile
둝타λ₯΄μ˜€κ°€λ₯΄

0개의 λŒ“κΈ€