Sum of all the factors of a number

Given a number n, the task is to find the sum of all the divisors.

Examples :

Input : n = 30
Output : 72
Dividers sum 1 + 2 + 3 + 5 + 6 + 
             10 + 15 + 30 = 72 

Input :  n = 15
Output : 24
Dividers sum 1 + 3 + 5 + 15 = 24



A simple solution is to traverse through all divisors and add them.

filter_none

edit
close

play_arrow

link
brightness_4
code

// Simple C++ program to 
// find sum of all divisors 
// of a natural number
#include<bits/stdc++.h>
using namespace std;
   
// Function to calculate sum of all 
//divisors of a given number
int divSum(int n)
{
    // Sum of divisors
    int result = 0;
   
    // find all divisors which divides 'num'
    for (int i = 2; i <= sqrt(n); i++)
    {
        // if 'i' is divisor of 'n'
        if (n % i == 0)
        {
            // if both divisors are same
            // then add it once else add
            // both
            if (i == (n / i))
                result += i;
            else
                result += (i + n/i);
        }
    }
   
    // Add 1 and n to result as above loop
    // considers proper divisors greater 
    // than 1.
    return (result + n + 1);
}
   
// Driver program to run the case
int main()
{
    int n = 30;
    cout << divSum(n);
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Simple Java program to 
// find sum of all divisors 
// of a natural number
import java.io.*; 
  
class GFG {
  
    // Function to calculate sum of all 
    //divisors of a given number
    static int divSum(int n)
    {
        // Final result of summation 
        // of divisors
        int result = 0;
      
        // find all divisors which divides 'num'
        for (int i = 2; i <= Math.sqrt(n); i++)
        {
            // if 'i' is divisor of 'n'
            if (n % i == 0)
            {
                // if both divisors are same
                // then add it once else add
                // both
                if (i == (n / i))
                    result += i;
                else
                    result += (i + n / i);
            }
        }
      
        // Add 1 and n to result as above loop
        // considers proper divisors greater
        // than 1.
        return (result + n + 1);
          
    }
      
    // Driver program to run the case
    public static void main(String[] args)
    {
        int n = 30;
        System.out.println(divSum(n));
    }
}
  
// This code is contributed by Prerna Saini. 
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Simple Python 3 program to 
# find sum of all divisors of
# a natural number
import math  
  
# Function to calculate sum 
# of all divisors of given
#  natural number
def divSum(n) :
      
    # Final result of summation 
    # of divisors
    result = 0
    
    # find all divisors which
    # divides 'num'
    for i in range(2,(int)(math.sqrt(n))+1) :
  
        # if 'i' is divisor of 'n'
        if (n % i == 0) :
  
            # if both divisors are same 
            # then add it only once
            # else add both
            if (i == (n/i)) :
                result = result + i
            else :
                result = result + (i + n//i)
          
          
    # Add 1 and n to result as above 
    # loop considers proper divisors
    # greater than 1.
    return (result + n + 1)
    
# Driver program to run the case
n = 30
print(divSum(n))
  
# This code is contributed by Nikita Tiwari.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Simple C# program to 
// find sum of all divisors 
// of a natural number
using System;
  
class GFG {
  
    // Function to calculate sum of all 
    //divisors of a given number
    static int divSum(int n)
    {
        // Final result of summation 
        // of divisors
        int result = 0;
      
        // find all divisors which divides 'num'
        for (int i = 2; i <= Math.Sqrt(n); i++)
        {
            // if 'i' is divisor of 'n'
            if (n % i == 0)
            {
                // if both divisors are same
                // then add it once else add
                // both
                if (i == (n / i))
                    result += i;
                else
                    result += (i + n / i);
            }
        }
      
        // Add 1 and n to result as above loop
        // considers proper divisors greater
        // than 1.
        return (result + n + 1);
    }
      
    // Driver program to run the case
    public static void Main()
    {
          
        int n = 30;
          
        Console.WriteLine(divSum(n));
    }
}
  
// This code is contributed by vt_m.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// Find sum of all divisors 
// of a natural number
  
// Function to calculate sum of all 
//divisors of a given number
function divSum($n)
{
    // Sum of divisors
    $result = 0;
  
    // find all divisors 
    // which divides 'num'
    for ( $i = 2; $i <= sqrt($n); $i++)
    {
        // if 'i' is divisor of 'n'
        if ($n % $i == 0)
        {
            // if both divisors are same
            // then add it once else add
            // both
            if ($i == ($n / $i))
                $result += $i;
            else
                $result += ($i + $n / $i);
        }
    }
  
    // Add 1 and n to result as
    // above loop considers proper 
    // divisors greater than 1.
    return ($result + $n + 1);
}
  
// Driver Code
$n = 30;
echo divSum($n);
  
// This code is contributed by SanjuTomar.
?>
chevron_right

Output :

72

An efficient solution is to use below formula.
Let p1, p2, … pk be prime factors of n. Let a1, a2, .. ak be highest powers of p1, p2, .. pk respectively that divide n, i.e., we can write n as n = (p1a1)*(p2a2)* … (pkak).

Sum of divisors = (1 + p1 + p12 ... p1a1) * 
                  (1 + p2 + p22 ... p2a2) *
                  .............................................
                  (1 + pk + pk2 ... pkak) 

We can notice that individual terms of above 
formula are Geometric Progressions (GP). We
can rewrite the formula as.

Sum of divisors = (p1a1+1 - 1)/(p1 -1) * 
                  (p2a2+1 - 1)/(p2 -1) *
                  ..................................
                  (pkak+1 - 1)/(pk -1)

How does above formula work?

Consider the number 18.  

Sum of factors = 1 + 2 + 3 + 6 + 9 + 18

Writing divisors as powers of prime factors.
Sum of factors = (20)(30) + (21)(30) + (2^0)(31) +
                 (21)(31) + (20)(3^2) + (2^1)(32)
               = (20)(30) + (2^0)(31) + (2^0)(32) +
                 (21)(3^0) + (21)(31) + (21)(32)
               = (20)(30 + 31 + 32) + 
                 (21)(30 + 31 + 32)
               = (20 + 21)(30 + 31 + 32)
If we take a closer look, we can notice that the
above expression is in the form.
(1 + p1) * (1 + p2 + p22)
Where p1 = 2 and p2 = 3 and 18 = 2132

So the task reduces to finding all prime factors and their powers.

filter_none

edit
close

play_arrow

link
brightness_4
code

// Formula based CPP program to
// find sum of all  divisors of n.
#include <bits/stdc++.h>
using namespace std;
  
// Returns sum of all factors of n.
int sumofFactors(int n)
{
    // Traversing through all prime factors.
    int res = 1;
    for (int i = 2; i <= sqrt(n); i++)
    {
  
          
        int curr_sum = 1;
        int curr_term = 1;
        while (n % i == 0) {
  
            // THE BELOW STATEMENT MAKES
            // IT BETTER THAN ABOVE METHOD 
            //  AS WE REDUCE VALUE OF n.
            n = n / i;
  
            curr_term *= i;
            curr_sum += curr_term;
        }
  
        res *= curr_sum;
    }
  
    // This condition is to handle 
    // the case when n is a prime
    // number greater than 2.
    if (n >= 2)
        res *= (1 + n);
  
    return res;
}
  
// Driver code
int main()
{
    int n = 30;
    cout << sumofFactors(n);
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Formula based Java program to 
// find sum of all divisors of n.
  
import java.io.*;
import java.math.*;
public class GFG{
      
    // Returns sum of all factors of n.
    static int sumofFactors(int n)
    {
        // Traversing through all prime factors.
        int res = 1;
        for (int i = 2; i <= Math.sqrt(n); i++)
        {
      
              
            int  curr_sum = 1;
            int curr_term = 1;
              
            while (n % i == 0
            {
      
                // THE BELOW STATEMENT MAKES
                // IT BETTER THAN ABOVE METHOD 
                // AS WE REDUCE VALUE OF n.
                n = n / i;
      
                curr_term *= i;
                curr_sum += curr_term;
            }
      
            res *= curr_sum;
        }
      
        // This condition is to handle 
        // the case when n is a prime 
        // number greater than 2
        if (n > 2)
            res *= (1 + n);
      
        return res;
    }
      
    // Driver code
    public static void main(String args[])
    {
        int n = 30;
        System.out.println(sumofFactors(n));
    }
}
  
/*This code is contributed by Nikita Tiwari.*/
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Formula based Python3 code to find 
# sum of all divisors of n.
import math as m
  
# Returns sum of all factors of n.
def sumofFactors(n):
      
    # Traversing through all
    # prime factors
    res = 1
    for i in range(2, int(m.sqrt(n) + 1)):
          
        curr_sum = 1
        curr_term = 1
          
        while n % i == 0:
              
            n = n / i;
  
            curr_term = curr_term * i;
            curr_sum += curr_term;
              
        res = res * curr_sum
      
    # This condition is to handle the 
    # case when n is a prime number 
    # greater than 2
    if n > 2:
        res = res * (1 + n)
  
    return res;
  
# driver code    
sum = sumofFactors(30)
print ("Sum of all divisors is: ",sum)
  
# This code is contributed by Saloni Gupta
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Formula based Java program to 
// find sum of all divisors of n.
using System;
  
public class GFG {
      
    // Returns sum of all factors of n.
    static int sumofFactors(int n)
    {
          
        // Traversing through all prime factors.
        int res = 1;
        for (int i = 2; i <= Math.Sqrt(n); i++)
        {
      
              
            int curr_sum = 1;
            int curr_term = 1;
              
            while (n % i == 0) 
            {
      
                // THE BELOW STATEMENT MAKES
                // IT BETTER THAN ABOVE METHOD 
                // AS WE REDUCE VALUE OF n.
                n = n / i;
      
                curr_term *= i;
                curr_sum += curr_term;
            }
      
            res *= curr_sum;
        }
      
        // This condition is to handle 
        // the case when n is a prime 
        // number greater than 2
        if (n > 2)
            res *= (1 + n);
      
        return res;
    }
      
    // Driver code
    public static void Main()
    {
          
        int n = 30;
          
        Console.WriteLine(sumofFactors(n));
    }
}
  
/*This code is contributed by vt_m.*/
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// Formula based PHP program to 
// find sum of all divisors of n.
  
// Returns sum of all factors of n.
function sumofFactors($n)
{
      
    // Traversing through 
    // all prime factors.
    $res = 1;
    for ($i = 2; $i <= sqrt($n); $i++)
    {
  
        $curr_sum = 1;
        $curr_term = 1;
          
        while ($n % $i == 0) 
        {
  
            // THE BELOW STATEMENT MAKES
            // IT BETTER THAN ABOVE METHOD 
            // AS WE REDUCE VALUE OF n.
            $n = $n / $i;
  
            $curr_term *= $i;
            $curr_sum += $curr_term;
        }
  
        $res *= $curr_sum;
    }
  
    // This condition is to handle 
    // the case when n is a prime 
    // number greater than 2
    if ($n > 2)
        $res *= (1 + $n);
  
    return $res;
}
  
// Driver Code
$n = 30;
echo sumofFactors($n);
  
// This code is contributed by Anuj_67.
?>
chevron_right


Output :
72

Further Optimization.
If there are multiple queries, we can use Sieve to find prime factors and their powers.

References:
https://www.math.upenn.edu/~deturck/m170/wk3/lecture/sumdiv.html
http://mathforum.org/library/drmath/view/71550.html




Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : SanjuTomar, vt_m, arupjyoti_dutta



Article Tags :