Legendre’s formula (Given p and n, find the largest x such that p^x divides n!)

Given an integer n and a prime number p, find the largest x such that px (p raised to power x) divides n! (factorial)

Examples:

Input:  n = 7, p = 3
Output: x = 2
32 divides 7! and 2 is the largest such power of 3.

Input:  n = 10, p = 3
Output: x = 4
34 divides 10! and 4 is the largest such power of 3.

n! is multiplication of {1, 2, 3, 4, …n}.



How many numbers in {1, 2, 3, 4, ….. n} are divisible by p?
Every p’th number is divisible by p in {1, 2, 3, 4, ….. n}. Therefore in n!, there are ?n/p? numbers divisible by p. So we know that the value of x (largest power of p that divides n!) is at-least ?n/p?.

 
Can x be larger than ?n/p? ?
Yes, there may be numbers which are divisible by p2, p3, …

 
How many numbers in {1, 2, 3, 4, ….. n} are divisible by p2, p3, …?
There are ?n/(p2)? numbers divisible by p2 (Every p2‘th number would be divisible). Similarly, there are ?n/(p3)? numbers divisible by p3 and so on.

 
What is the largest possible value of x?
So the largest possible power is ?n/p? + ?n/(p2)? + ?n/(p3)? + ……
Note that we add only ?n/(p2)? only once (not twice) as one p is already considered by expression ?n/p?. Similarly, we consider ?n/(p3)? (not thrice).
Below is implementation of above idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find largest x such that p*x divides n! 
#include <iostream>
using namespace std; 
  
// Returns largest power of p that divides n! 
int largestPower(int n, int p) 
    // Initialize result 
    int x = 0; 
  
    // Calculate x = n/p + n/(p^2) + n/(p^3) + .... 
    while (n) 
    
        n /= p; 
        x += n; 
    
    return x; 
  
// Driver code 
int main() 
    int n = 10, p = 3; 
    cout << "The largest power of "<< p <<
            " that divides " << n << "! is "<< 
            largestPower(n, p) << endl; 
    return 0; 
  
// This code is contributed by shubhamsingh10

chevron_right


C

filter_none

edit
close

play_arrow

link
brightness_4
code

// C program to find largest x such that p*x divides n!
#include <stdio.h>
  
// Returns largest power of p that divides n!
int largestPower(int n, int p)
{
    // Initialize result
    int x = 0;
  
    // Calculate x = n/p + n/(p^2) + n/(p^3) + ....
    while (n)
    {
        n /= p;
        x += n;
    }
    return x;
}
  
// Driver program
int main()
{
    int n = 10, p = 3;
    printf("The largest power of %d that divides %d! is %d\n",
           p, n, largestPower(n, p));
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find largest x such that p*x divides n!
import java.io.*;
  
class GFG 
{
    // Function that returns largest power of p 
    // that divides n!
    static int Largestpower(int n, int p)
    {
        // Initialize result
        int ans = 0;
  
        // Calculate x = n/p + n/(p^2) + n/(p^3) + ....
        while (n > 0)
        {
            n /= p;
            ans += n;
        }
        return ans;
    }
  
    // Driver program
    public static void main (String[] args) 
    {
        int n = 10;
        int p = 3;
        System.out.println(" The largest power of " + p + " that divides "
                + n + "! is " + Largestpower(n, p));
          
          
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find largest
# x such that p*x divides n!
  
# Returns largest power of p that divides n!
def largestPower(n, p):
      
    # Initialize result
    x = 0
  
    # Calculate x = n/p + n/(p^2) + n/(p^3) + ....
    while n:
        n /= p
        x += n
    return x
  
# Driver program
n = 10; p = 3
print ("The largest power of %d that divides %d! is %d\n"%
                                (p, n, largestPower(n, p)))
          
# This code is contributed by Shreyanshi Arun.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find largest x 
// such that p * x divides n!
using System;
  
public class GFG 
{
      
    // Function that returns largest  
    // power of p that divides n!
    static int Largestpower(int n, int p)
    {
        // Initialize result
        int ans = 0;
  
        // Calculate x = n / p + n / (p ^ 2) +
        // n / (p ^ 3) + ....
        while (n > 0)
        {
            n /= p;
            ans += n;
        }
        return ans;
    }
  
    // Driver Code
    public static void Main () 
    {
        int n = 10;
        int p = 3;
        Console.Write(" The largest power of " + p + " that divides "
                + n + "! is " + Largestpower(n, p));
          
          
    }
}
  
// This code is contributed by Sam007

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find largest 
// x such that p*x divides n!
  
// Returns largest power 
// of p that divides n!
function largestPower($n, $p)
{
    // Initialize result
    $x = 0;
  
    // Calculate x = n/p + 
    // n/(p^2) + n/(p^3) + ....
    while ($n)
    {
        $n = (int)$n / $p;
        $x += $n;
    }
    return floor($x);
}
  
// Driver Code
$n = 10;
$p = 3;
echo "The largest power of ", $p ;
echo " that divides ",$n , "! is ";
echo largestPower($n, $p);
      
// This code is contributed by ajit
?>

chevron_right


Output:

The largest power of 3 that divides 10! is 4

Time complexity of the above solution is Logpn.

What to do if p is not prime?
We can find all prime factors of p and compute result for every prime factor. Refer Largest power of k in n! (factorial) where k may not be prime for details.

Source:
http://e-maxx.ru/algo/factorial_divisors

This article is contributed by Ankur. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details




My Personal Notes arrow_drop_up

Improved By : Sam007, jit_t, SHUBHAMSINGH10