Fast Exponentiation Power in Log N in DSA Javascript - Time & Space Complexity
We want to understand how fast the power calculation grows as the exponent gets bigger.
How does the number of steps change when we calculate base raised to a large power?
Analyze the time complexity of the following code snippet.
function fastPower(base, exponent) {
if (exponent === 0) return 1;
let half = fastPower(base, Math.floor(exponent / 2));
if (exponent % 2 === 0) {
return half * half;
} else {
return half * half * base;
}
}
This code calculates base raised to the exponent using a method that splits the problem in half each time.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls that halve the exponent each time.
- How many times: About log base 2 of the exponent times.
Each step cuts the exponent roughly in half, so the number of steps grows slowly as the exponent grows.
| Input Size (exponent) | Approx. Operations (recursive calls) |
|---|---|
| 10 | About 4 |
| 100 | About 7 |
| 1000 | About 10 |
Pattern observation: Doubling the exponent adds only one more step, so growth is very slow.
Time Complexity: O(log n)
This means the steps needed grow slowly, only increasing a little when the exponent gets much bigger.
[X] Wrong: "Calculating power always takes as many steps as the exponent value."
[OK] Correct: This method reduces the problem size quickly by splitting the exponent, so it needs far fewer steps than the exponent itself.
Knowing how to speed up power calculations shows you understand how to reduce work by breaking problems down smartly, a skill useful in many coding challenges.
"What if we changed the method to multiply base by itself exponent times without splitting? How would the time complexity change?"
Practice
Fast Exponentiation to calculate baseexponent compared to simple repeated multiplication?Solution
Step 1: Understand simple repeated multiplication
Calculatingbaseexponentby multiplyingbaseby itselfexponenttimes takesexponentmultiplications, which is linear time.Step 2: Understand fast exponentiation approach
Fast exponentiation reduces multiplications by squaring results and halving the exponent, achieving logarithmic time complexity.Final Answer:
It reduces the number of multiplications from linear to logarithmic in the exponent. -> Option DQuick Check:
Fast exponentiation = fewer multiplications [OK]
- Thinking it avoids multiplication entirely
- Believing it only works for powers of two
- Confusing memory use with speed
Solution
Step 1: Identify fast exponentiation pattern
Fast exponentiation uses recursion with halving the exponent and squaring intermediate results.Step 2: Check each function
function power(base, exp) { if (exp === 0) return 1; let half = power(base, Math.floor(exp / 2)); return exp % 2 === 0 ? half * half : half * half * base; } uses recursion, halves the exponent, and squares results correctly. The other options use linear multiplication or built-in operator, not fast exponentiation.Final Answer:
implements fast exponentiation correctly. -> Option AQuick Check:
Recursion + halving exponent = fast exponentiation [OK]
- Choosing simple loops instead of recursion
- Using built-in power operator without algorithm
- Confusing base case conditions
function fastPower(base, exp) {
if (exp === 0) return 1;
let half = fastPower(base, Math.floor(exp / 2));
if (exp % 2 === 0) return half * half;
else return half * half * base;
}
console.log(fastPower(2, 5));Solution
Step 1: Trace recursive calls for fastPower(2, 5)
fastPower(2,5) calls fastPower(2,2), which calls fastPower(2,1), which calls fastPower(2,0)=1.Step 2: Calculate values bottom-up
fastPower(2,1) = 1*1*2 = 2; fastPower(2,2) = 2*2 = 4; fastPower(2,5) = 4*4*2 = 32.Final Answer:
32 -> Option AQuick Check:
2^5 = 32 [OK]
- Calculating 2^5 as 16 by squaring only once
- Confusing exponent halving with division
- Missing multiplication by base when exponent is odd
function fastPower(base, exp) {
if (exp === 0) return 1;
let half = fastPower(base, exp / 2);
if (exp % 2 === 0) return half * half;
else return half * half * base;
}Solution
Step 1: Analyze recursive call argument
The recursive call usesexp / 2without flooring, so for odd exponents it passes a decimal, causing infinite recursion.Step 2: Identify fix
UsingMath.floor(exp / 2)ensures the exponent decreases properly and recursion ends.Final Answer:
The exponent is not floored before recursive call, causing infinite recursion for odd exponents. -> Option BQuick Check:
Floor exponent before recursion to avoid infinite calls [OK]
- Ignoring decimal exponents in recursion
- Changing base case return value incorrectly
- Assuming multiplication order causes bugs
313 modulo 7 efficiently using fast exponentiation. Which of the following code snippets correctly implements this with modulo at each multiplication step to avoid large numbers?Solution
Step 1: Understand modulo in fast exponentiation
Modulo must be applied after each multiplication to keep numbers small and correct.Step 2: Check each option
function modPower(base, exp, mod) { if (exp === 0) return 1; let half = modPower(base, Math.floor(exp / 2), mod); let halfSquared = (half * half) % mod; if (exp % 2 === 0) return halfSquared; else return (halfSquared * base) % mod; } console.log(modPower(3, 13, 7)); applies modulo after squaring and multiplication recursively. function modPower(base, exp, mod) { let result = 1; for (let i = 0; i < exp; i++) { result = (result * base) % mod; } return result; } console.log(modPower(3, 13, 7)); uses linear loop (correct but slower). function modPower(base, exp, mod) { if (exp === 0) return 0; return (base * modPower(base, exp - 1, mod)) % mod; } console.log(modPower(3, 13, 7)); returns 0 for base case (wrong). function modPower(base, exp, mod) { return (base ** exp) % mod; } console.log(modPower(3, 13, 7)); uses built-in power without modulo at each step (incorrect for large exponents).Final Answer:
correctly implements fast exponentiation with modulo at each step. -> Option CQuick Check:
Modulo after each multiply keeps numbers small [OK]
- Not applying modulo at intermediate steps
- Wrong base case returning 0
- Using built-in power without modulo
Ready to prove it?
Pass the test and this pattern moves unknown
