Modular Arithmetic Basics in DSA Typescript - Time & Space Complexity
We want to understand how long modular arithmetic operations take as numbers get bigger.
How does the time to compute remainders or modular sums change with input size?
Analyze the time complexity of the following code snippet.
function modAdd(a: number, b: number, m: number): number {
return ((a % m) + (b % m)) % m;
}
function modMultiply(a: number, b: number, m: number): number {
return ((a % m) * (b % m)) % m;
}
This code calculates modular addition and multiplication of two numbers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The modulo (%) operation and basic arithmetic (+, *)
- How many times: Each operation runs a fixed number of times (once per call), no loops or recursion.
Since the operations do not repeat or loop, the time stays about the same no matter how big the numbers are.
| Input Size (number size) | Approx. Operations |
|---|---|
| 10 | 3 modulo and arithmetic operations |
| 100 | 3 modulo and arithmetic operations |
| 1000 | 3 modulo and arithmetic operations |
Pattern observation: The number of operations does not grow with input size; it stays constant.
Time Complexity: O(1)
This means the time to do modular addition or multiplication stays the same no matter how big the numbers are.
[X] Wrong: "Modular arithmetic takes longer as numbers get bigger because the numbers are bigger."
[OK] Correct: The modulo operation runs in constant time on fixed-size numbers, so the time does not increase with number size in typical programming languages.
Understanding that modular arithmetic operations run in constant time helps you reason about algorithms that use these operations repeatedly, like hashing or cryptography.
"What if we had to compute modular exponentiation by repeated multiplication? How would the time complexity change?"
Practice
7 % 3 in modular arithmetic?Solution
Step 1: Understand the modulo operation
The modulo operator (%) gives the remainder when the first number is divided by the second.Step 2: Calculate 7 % 3
7 divided by 3 is 2 with a remainder of 1, but since 7 = 3*2 + 1, the remainder is 1.Final Answer:
1 -> Option AQuick Check:
7 % 3 = 1 [OK]
- Confusing remainder with quotient
- Thinking modulo returns division result
- Mixing up dividend and divisor
a divided by b?Solution
Step 1: Recall TypeScript modulo operator
In TypeScript, the modulo operator is represented by the percent sign (%).Step 2: Identify correct syntax
let result = a % b; usesa % b, which correctly computes the remainder.Final Answer:
let result = a % b; -> Option AQuick Check:
Modulo operator is % in TypeScript [OK]
- Using / instead of %
- Using 'mod' keyword which doesn't exist
- Using bitwise & operator by mistake
const a = 14; const b = 5; console.log(a % b);
Solution
Step 1: Calculate 14 % 5
Divide 14 by 5: 5 * 2 = 10, remainder is 14 - 10 = 4.Step 2: Confirm output
The console.log prints the remainder, which is 4.Final Answer:
4 -> Option BQuick Check:
14 % 5 = 4 [OK]
- Calculating quotient instead of remainder
- Mixing up operands order
- Assuming modulo returns division result
function mod(a: number, b: number): number {
return a % b;
}
console.log(mod(10, 0));Solution
Step 1: Analyze modulo with zero divisor
In TypeScript/JavaScript, modulo by zero returns NaN and does NOT throw a runtime error.Step 2: Understand error behavior
Callingmod(10, 0)computes 10 % 0 which is NaN, and console.log prints NaN.Final Answer:
Returns NaN without error -> Option DQuick Check:
10 % 0 = NaN [OK]
- Thinking modulo by zero causes runtime error
- Assuming modulo by zero returns 0
- Confusing with languages that raise exceptions
a = 123456789 and b = 987654321 is divided by m = 1000. Which expression correctly uses modular arithmetic to compute (a + b) % m without overflow?Solution
Step 1: Understand modular addition property
Modular arithmetic allows splitting sums: (a + b) % m = ((a % m) + (b % m)) % m.Step 2: Apply property to avoid overflow
Computing(a % m + b % m) % mprevents large intermediate sums and overflow.Step 3: Check other options
(a + b) % m risks overflow; B and D misuse modulo operations.Final Answer:
(a % m + b % m) % m -> Option CQuick Check:
Use modular addition property [OK]
- Directly adding large numbers before modulo
- Misusing modulo on operands incorrectly
- Ignoring overflow in large sums
Ready to prove it?
Pass the test and this pattern moves unknown
