Bird
Raised Fist0
DSA Goprogramming~5 mins

Check if Number is Prime in DSA Go - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Check if Number is Prime
O(√n)
Understanding Time Complexity

We want to understand how the time to check if a number is prime grows as the number gets bigger.

How many steps does it take to decide if a number has no divisors other than 1 and itself?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

This code checks if a number n is prime by testing divisors from 2 up to the square root of n.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The for-loop that tests divisors i from 2 up to √n.
  • How many times: Approximately √n times in the worst case.
How Execution Grows With Input

As the number n grows, the number of divisor checks grows roughly with the square root of n.

Input Size (n)Approx. Operations
10About 3 checks (2,3)
100About 10 checks (2 to 10)
1000About 31 checks (2 to 31)

Pattern observation: The number of checks grows slower than n, roughly like the square root of n.

Final Time Complexity

Time Complexity: O(√n)

This means the time to check if a number is prime grows roughly with the square root of the number.

Common Mistake

[X] Wrong: "We need to check all numbers from 2 up to n-1 to find if n is prime."

[OK] Correct: Checking up to n-1 is unnecessary because any factor larger than √n would have a matching smaller factor already checked.

Interview Connect

Understanding this time complexity helps you explain efficient prime checking, a common coding challenge that shows your grasp of loops and optimization.

Self-Check

"What if we changed the loop to check divisors up to n/2 instead of √n? How would the time complexity change?"

Practice

(1/5)
1. What does it mean for a number to be prime?
easy
A. It has more than two divisors.
B. It is divisible by 2 only.
C. It is an even number greater than 2.
D. It has exactly two distinct positive divisors: 1 and itself.

Solution

  1. Step 1: Understand the definition of prime number

    A prime number is a number greater than 1 that has no divisors other than 1 and itself.
  2. Step 2: Compare options with definition

    It has exactly two distinct positive divisors: 1 and itself. matches this definition exactly, while others describe incorrect properties.
  3. Final Answer:

    It has exactly two distinct positive divisors: 1 and itself. -> Option D
  4. Quick Check:

    Prime number = two divisors only [OK]
Hint: Prime means only divisible by 1 and itself [OK]
Common Mistakes:
  • Thinking even numbers are always prime
  • Confusing prime with odd numbers
  • Believing 1 is prime
2. Which of the following Go code snippets correctly checks if a number n is prime?
easy
A. for i := 2; i < n; i++ { if n%i == 0 { return false } } return true
B. for i := 2; i <= n; i++ { if n%i == 0 { return false } } return true
C. for i := 1; i < n; i++ { if n%i == 0 { return false } } return true
D. for i := 2; i < n/2; i++ { if n%i == 0 { return true } } return false

Solution

  1. Step 1: Analyze loop range for prime check

    We check divisors from 2 up to but not including n to find if n is divisible by any number other than 1 and itself.
  2. Step 2: Evaluate each option's correctness

    for i := 2; i < n; i++ { if n%i == 0 { return false } } return true correctly loops from 2 to n-1 and returns false if divisible. for i := 2; i <= n; i++ { if n%i == 0 { return false } } return true incorrectly includes n itself, always returning false. for i := 1; i < n; i++ { if n%i == 0 { return false } } return true starts from 1, which divides all numbers. for i := 2; i < n/2; i++ { if n%i == 0 { return true } } return false returns true on divisor found, which is wrong logic.
  3. Final Answer:

    for i := 2; i < n; i++ { if n%i == 0 { return false } } return true -> Option A
  4. Quick Check:

    Loop 2 to n-1 and check divisibility [OK]
Hint: Loop from 2 to n-1, return false if divisible [OK]
Common Mistakes:
  • Checking divisibility including n itself
  • Starting loop from 1 instead of 2
  • Returning true when divisor found
3. What will be the output of this Go function call: isPrime(11)?
func isPrime(n int) bool {
 if n <= 1 {
  return false
 }
 for i := 2; i*i <= n; i++ {
  if n%i == 0 {
   return false
  }
 }
 return true
}
medium
A. true
B. false
C. runtime error
D. infinite loop

Solution

  1. Step 1: Check input and loop condition

    Input n=11 is greater than 1, so function proceeds. Loop runs from i=2 while i*i <= 11 (i <= 3).
  2. Step 2: Test divisibility inside loop

    Check i=2: 11%2 != 0; i=3: 11%3 != 0. No divisor found, loop ends.
  3. Final Answer:

    true -> Option A
  4. Quick Check:

    11 is prime, function returns true [OK]
Hint: Check divisors up to sqrt(n) for efficiency [OK]
Common Mistakes:
  • Not handling n <= 1 correctly
  • Looping beyond sqrt(n)
  • Assuming 11 is not prime
4. Identify the bug in this Go function that checks if a number is prime:
func isPrime(n int) bool {
 if n <= 1 {
  return false
 }
 for i := 2; i < n/2; i++ {
  if n%i == 0 {
   return false
  }
 }
 return true
}
medium
A. Loop should run until i <= n, not i < n/2
B. Function should return true if n <= 1
C. Loop should run until i*i <= n for efficiency and correctness
D. The modulo operator % is used incorrectly

Solution

  1. Step 1: Analyze loop range and condition

    The loop runs from 2 to less than n/2, which is inefficient and may miss divisors for small n.
  2. Step 2: Suggest correct loop condition

    Looping until i*i <= n is both correct and efficient because any divisor larger than sqrt(n) pairs with a smaller divisor already checked.
  3. Final Answer:

    Loop should run until i*i <= n for efficiency and correctness -> Option C
  4. Quick Check:

    Use i*i <= n to check divisors [OK]
Hint: Check divisors up to sqrt(n) to fix bugs [OK]
Common Mistakes:
  • Looping only to n/2 misses some divisors
  • Returning true for n <= 1
  • Misusing modulo operator
5. You want to find all prime numbers up to 20 using Go. Which approach is best to optimize performance?
hard
A. Check divisibility for each number up to n-1 without optimization
B. Check each number from 2 to 20 using a function that tests divisibility up to sqrt(n)
C. Use a loop from 2 to 20 and mark all numbers as prime without checks
D. Only check even numbers for primality since odd numbers are not prime

Solution

  1. Step 1: Understand prime checking for multiple numbers

    Checking each number from 2 to 20 individually is necessary to find all primes.
  2. Step 2: Optimize divisibility checks

    Testing divisibility only up to sqrt(n) for each number reduces unnecessary checks and improves performance.
  3. Final Answer:

    Check each number from 2 to 20 using a function that tests divisibility up to sqrt(n) -> Option B
  4. Quick Check:

    Use sqrt(n) limit for each number check [OK]
Hint: Test divisibility up to sqrt(n) for each number [OK]
Common Mistakes:
  • Checking all numbers up to n-1 wastes time
  • Ignoring odd numbers which can be prime
  • Marking all numbers prime without checks
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard