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

05 Nov, 2021
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++
C
Java
Python3
C#
PHP
Javascript
// 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 codeint 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
// 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 programint 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;}
// 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));                      }}
# 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 programn = 10; p = 3print ("The largest power of %d that divides %d! is %d\n"%                                (p, n, largestPower(n, p)))         # This code is contributed by Shreyanshi Arun.
// 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
<?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?>
<script>// Javascript 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    let x = 0;     // Calculate x = n/p +    // n/(p^2) + n/(p^3) + ....    while (n)    {        n = parseInt(n / p);        x += n;    }    return Math.floor(x);} // Driver Codelet n = 10;let p = 3;document.write("The largest power of " + p);document.write(" that divides " + n + "! is ");document.write(largestPower(n, p));     // This code is contributed by _saurabh_jaiswal</script>
Output:  
The largest power of 3 that divides 10! is 4
Time complexity: O(logpn)
Auxiliary Space: O(1)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_divisorsThis 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. 
Sam007
jit_t
SHUBHAMSINGH10
_saurabh_jaiswal
subham348
factorial
number-theory
Mathematical
number-theory
Mathematical
factorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Operators in C / C++
Prime Numbers
Find minimum number of coins that make a given value
Minimum number of jumps to reach end
The Knight's tour problem | Backtracking-1
Algorithm to solve Rubik's Cube
Program for Decimal to Binary Conversion
Modulo 10^9+7 (1000000007)
Modulo Operator (%) in C/C++ with Examples