Modular Multiplication: How to Efficiently Calculate (a * b) mod c in C/C++?

  • Thread starter Thread starter chesschi
  • Start date Start date
  • Tags Tags
    Multiplication
Click For Summary
To efficiently calculate (a * b) mod c for three 64-bit numbers in C/C++, one approach involves breaking down the multiplication into smaller components to avoid overflow. The formula a * b can be expressed as x1y1 * 2^64 + (x0y1 + x1y0) * 2^32 + x0y0, where a and b are split into high and low parts. The challenge lies in managing the potential overflow when a and b exceed 32 bits. Using modular arithmetic during the multiplication process can help keep the intermediate results within bounds. Implementing this method can yield an efficient solution without relying on libraries like BigInt or GMP.
chesschi
Messages
3
Reaction score
0
I want to write a C/C++ program and encounter a problem.If I have three 64 bit numbers and need to manipulate
"a * b mod c"

Is there any well-known, efficient and simple algorithm to implement it?

I only know it can be calculated sth. like this..
__int64 a, b, c
a = x1 * 2^32 + x0
b = y1 * 2^32 + y0

then a * b = x1y1 * 2^64 + (x0y1 + x1y0) * 2^32 + x0y0

but I don't know what to do in the next step

Note that this cannot be calculated using some classes like BigInt, gmp

Thank you very much!
 
Mathematics news on Phys.org
chesschi said:
I want to write a C/C++ program and encounter a problem.If I have three 64 bit numbers and need to manipulate
"a * b mod c"

Is there any well-known, efficient and simple algorithm to implement it?

I only know it can be calculated sth. like this..
__int64 a, b, c
a = x1 * 2^32 + x0
b = y1 * 2^32 + y0
C, C++, C#, and other languages that are based on C have a modulus operator, %

C:
unsigned long long a, b, c;
// Assign values to a, b, and c
x =  a * b % c;
One thing to be concerned about is that if a and b are larger than 32 bits, their product won't fit in 64 bits, and you'll get overflow.
chesschi said:
then a * b = x1y1 * 2^64 + (x0y1 + x1y0) * 2^32 + x0y0

but I don't know what to do in the next step

Note that this cannot be calculated using some classes like BigInt, gmp

Thank you very much!
 
Here is a little puzzle from the book 100 Geometric Games by Pierre Berloquin. The side of a small square is one meter long and the side of a larger square one and a half meters long. One vertex of the large square is at the center of the small square. The side of the large square cuts two sides of the small square into one- third parts and two-thirds parts. What is the area where the squares overlap?

Similar threads

  • · Replies 14 ·
Replies
14
Views
7K
  • · Replies 14 ·
Replies
14
Views
4K
  • · Replies 11 ·
Replies
11
Views
3K
Replies
2
Views
3K
  • · Replies 13 ·
Replies
13
Views
3K