Consider below simple method to multiply two numbers.
The above function works fine when multiplication doesn’t result in overflow. But if input numbers are such that the result of multiplication is more than maximum limit.
For example, the above method fails when mod = 1011, a = 9223372036854775807 (largest long long int) and b = 9223372036854775807 (largest long long int). Note that there can be smaller values for which it may fail. There can be many more examples of smaller values. In fact any set of values for which multiplication can cause a value greater than maximum limit.
How to avoid overflow?
We can multiply recursively to overcome the difficulty of overflow. To multiply a*b, first calculate a*b/2 then add it twice. For calculating a*b/2 calculate a*b/4 and so on (similar to log n exponentiation algorithm).
// To compute (a * b) % mod multiply(a, b, mod) 1) ll res = 0; // Initialize result 2) a = a % mod. 3) While (b > 0) a) If b is odd, then add 'a' to result. res = (res + a) % mod b) Multiply 'a' with 2 a = (a * 2) % mod c) Divide 'b' by 2 b = b/2 4) Return res
Below is C++ implementation.
Thanks to Utkarsh Trivedi for suggesting above solution.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
- Assigning long values carefully in Java to avoid overflow
- Check for integer overflow on multiplication
- Modular Exponentiation (Power in Modular Arithmetic)
- Heap overflow and Stack overflow
- Why we should avoid using std::endl
- What is Memory Leak? How can we avoid?
- How to avoid Structure Padding in C?
- What are Wild Pointers? How can we avoid?
- Memory leak in C++ and How to avoid it?
- Avoid these mistakes on D-day | Gate 2018
- Minimum length of jumps to avoid given array of obstacles
- CSS | Overflow
- Check for Integer Overflow
- Buffer Overflow Attack with Example
- Compute average of two numbers without overflow