Get this book -> Problems on Array: For Interviews and Competitive Programming

Factorial calculations are a fundamental mathematical operation in computer science, commonly used in algorithms and equations. The factorial of a non-negative integer 'n' is defined as the product of all positive integers from 1 to 'n.' Computing factorials can be computationally expensive, especially for large values of 'n,' and optimizing this process is crucial in various applications.

One of the pioneers in this field was Adrien-Marie Legendre, an 18th-century French mathematician, renowned for his contributions to number theory and mathematical analysis. Legendre introduced a powerful formula that significantly accelerates factorial calculations. This article explores Legendre's formula and its applications in the realm of computer science.

## Legendre's Formula

Legendre's formula for computing factorials is based on the concept of prime factorization. It states that for any positive integer 'n,' the highest power of a prime number 'p' that divides 'n!' can be determined using the following expression:

## An Appplication of Legendre's Formula

Let's illustrate Legendre's formula with an example. Suppose we want to calculate 6! using Legendre's formula. We use it to find the exponent of the largest power that divides n! for all the primes smaller or equal to n.

## Applications in Computer Science

Legendre's formula offers several practical applications in computer science:

### 1. Prime Factorization

Prime factorization is a fundamental operation in number theory and cryptography. Legendre's formula can be used to find the highest power of a prime 'p' that divides 'n!' efficiently, helping in the prime factorization of large integers.

Let's say we want to find the highest power of the prime number 5 that divides 100!. Using Legendre's formula, we can calculate this efficiently:

L(100, 5) = ⌊100/5⌋ + ⌊100/5²⌋ + ⌊100/5³⌋ + ⌊100/5⁴⌋ = 20 + 4 + 0 + 0 = 24

This result tells us that 5^24 is the highest power of 5 that divides 100!. This kind of calculation is vital for prime factorization in cryptography and number theory.

### 2. Combinatorial Problems

Factorials are frequently used in combinatorial problems like permutations and combinations. Legendre's formula allows for faster computation of these quantities, making algorithms more efficient.A good example is the calculation of Catalan's number, which can be greatly optimised using Legendre's formula.

Catalan numbers are used in combinatorial problems, particularly in counting different types of bracket sequences. To calculate Catalan numbers efficiently, you can use Legendre's formula to optimize the calculation of factorials involved in the formula.

### 3. Algorithm Optimization

Algorithms that involve factorials, such as those in dynamic programming or recursive functions, can be optimized using Legendre's formula to reduce the computational burden and improve performance.

In dynamic programming, algorithms often involve calculating factorials, especially in problems related to permutations and combinations. For instance, consider the problem of finding the number of distinct permutations of a string with duplicate characters. Legendre's formula can optimize the calculation of factorials, reducing the time complexity of the algorithm.

### 4. Computational Mathematics

In scientific computing and symbolic mathematics software, Legendre's formula can significantly speed up factorial calculations, reducing the time required for complex mathematical operations.

Symbolic mathematics software, like Mathematica or MATLAB, frequently performs complex mathematical operations. In these environments, Legendre's formula can significantly speed up factorial calculations when dealing with large numbers or symbolic expressions, making the software more efficient for mathematical research and computations.

## Factorial using Legendre's Formula in C++

```
#include <iostream>
#include <vector>
using namespace std;
vector<int> sieveEratosthenes(int n) {
vector<bool> isPrime(n + 1, true);
isPrime[0] = isPrime[1] = false;
vector<int> primes;
for (int p = 2; p <= n; ++p) {
if (isPrime[p]) {
primes.push_back(p);
for (int i = p * p; i <= n; i += p) {
isPrime[i] = false;
}
}
}
return primes;
}
int legendreFormula(int n, int p) {
int power = 0;
while (n >= p) {
n /= p;
power += n;
}
return power;
}
long long factorial(int n) {
vector<int> primes = sieveEratosthenes(n);
long long result = 1;
for (int p : primes) {
int power = legendreFormula(n, p);
for (int i = 0; i < power; ++i) {
result *= p;
}
}
return result;
}
int main() {
int n; // Change this value to the factorial you want to calculate
cout << "Enter the value of n: ";
cin >> n;
long long result = factorialWithLegendreAndEratosthenes(n);
cout << n << "! = " << result << endl;
return 0;
}
```

## Conclusion

Adrien-Marie Legendre's formula for factorial calculations has stood the test of time and remains a valuable tool in computer science and mathematics. It provides an efficient way to find the highest power of a prime that divides a factorial, enabling faster computations in various domains. By harnessing Legendre's formula, computer scientists can optimize algorithms, improve efficiency, and tackle complex mathematical problems with greater ease.

## Key Takeaways

- Legendre's formula, a product of 18th-century mathematician Adrien-Marie Legendre's work, significantly accelerates the computation of factorials, offering a powerful tool for number theory and computer science.
- Prime Factorization is Key: Legendre's formula leverages prime factorization for efficiency.
- Legendre's formula continues to play a vital role in modern computer science, aiding in the optimization of algorithms and reducing computational complexity in mathematical operations.

With this OpenGenus article, you must have a good idea of Legendre's Formula.