Suma de todos los factores de un número

Dado un número n, la tarea es encontrar la suma de todos los factores.
Ejemplos: 
 

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

Una solución simple es atravesar todos los divisores y sumarlos. 
 

C++

// 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)
{
    if(n == 1)
      return 1;
 
    // 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;
}

Java

// 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)
    {
         if(n == 1)
           return 1;
        // 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.

Python3

# 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) :
    if(n == 1):
       return 1
 
    # 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.

C#

// 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)
    {
        if(n == 1)
           return 1;
 
        // 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.

PHP

<?php
// Find sum of all divisors
// of a natural number
 
// Function to calculate sum of all
//divisors of a given number
function divSum($n)
{
    if($n == 1)
      return 1;
 
    // 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.
?>

Javascript

<script>
    // Find sum of all divisors
// of a natural number
 
// Function to calculate sum of all
//divisors of a given number
function divSum(n)
{
    if(n == 1)
      return 1;
 
    // Sum of divisors
    let result = 0;
 
    // find all divisors
    // which divides 'num'
    for ( let 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 Code
let n = 30;
document.write(divSum(n));
 
// This code is contributed by _saurabh_jaiswal.
</script>

Producción : 
 

72

Complejidad temporal: O(√n) 
Espacio auxiliar: O(1)

Una solución eficiente es usar la siguiente fórmula. 
Sean p 1 , p 2 , … p k factores primos de n. Sean a 1 , a 2 , .. a k potencias máximas de p 1 , p 2 , .. p k respectivamente que dividen n, es decir, podemos escribir n como n = (p 1 a 1 )*(p 2 a 2 )* … (p k a k )
 

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)

¿Cómo funciona la fórmula anterior? 
 

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

Entonces la tarea se reduce a encontrar todos los factores primos y sus potencias. 
 

C++

// 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;
}

Java

// 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.*/

Python3

# 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

C#

// 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.*/

PHP

<?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.
?>

Javascript

<script>
    // Formula based Javascript program to
// find sum of all divisors of n.
 
// Returns sum of all factors of n.
function sumofFactors(n)
{
     
    // Traversing through
    // all prime factors.
    let res = 1;
    for (let i = 2; i <= Math.sqrt(n); i++)
    {
 
        let curr_sum = 1;
        let 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
let n = 30;
document.write(sumofFactors(n));
 
// This code is contributed by _saurabh_jaiswal.
</script>

Producción : 
 

72

Complejidad de Tiempo: O(√n log n) 
Espacio Auxiliar: O(1)

Sugiera si alguien tiene una mejor solución que sea más eficiente en términos de espacio y tiempo.
Este artículo es una contribución de Aarti_Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Optimización adicional. 
Si hay múltiples consultas, podemos usar Sieve para encontrar factores primos y sus potencias .
Referencias:  
https://www.math.upenn.edu/~deturck/m170/wk3/lecture/sumdiv.html  
http://mathforum.org/library/drmath/view/71550.html
 

Publicación traducida automáticamente

Artículo escrito por DevanshuAgarwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *