Nombre perfecte

De Viquipèdia
Dreceres ràpides: navegació, cerca

Un nombre perfecte és un enter que és igual a la suma dels seus divisors positius, excepte ell mateix. Així, 6 és un nombre perfecte, perquè els seus divisors propis són 1, 2 i 3, i 6 = 1 + 2 + 3. Els següents nombres perfectes són 28, 496 i 8.128.

Els nombres perfectes estan relacionats amb els nombres primers de Mersenne: si M és un primer de Mersenne (un nombre primer que és una unitat menor que una potència de 2), aleshores M(M+1)/2 és un nombre perfecte, és a dir, que 2n−1(2n − 1) és un nombre perfecte. Això va ser demostrat per Euclides en el segle IV abans de la nostra era:

per a n = 2:   21(22 − 1) = 6
per a n = 3:   22(23 − 1) = 28
per a n = 5:   24(25 − 1) = 496
per a n = 7:   26(27 − 1) = 8128

A més, Euler va demostrar en el segle XVIII que tots els nombres perfectes parells són d'aquesta forma. També està demostrat que l'última xifra de qualsevol nombre perfecte parell ha de ser 6 o 8.

No es coneix l'existència de nombres perfectes senars. No obstant això, existeixen alguns resultats parcials: si existeix un nombre perfecte imparell, ha de complir, entre altres les condicions següents: ser major que 10300; tenir almenys 8 factors primers diferents (i com a mínim 11 si no és divisible per 3); un d'aquests factors ha de ser major que 107, dos d'ells han de ser majors que 10.000 i tres han ser majors que 100; tenir, com a mínim, 75 factors primers (incloent-hi repeticions).

Considerant la suma dels divisors propis existeixen altres tipus de nombres.

Es pot dir que el nombre perfecte és un nombre amic de si mateix.


Implementació en informàtica[modifica | modifica el codi]

En C++ es pot escriure un codi com el que segueix per tal de trobar si un nombre és perfecte. El mètode mostrat és el més eficient, amb cost Log(n).


bool es_perfecte (int n) {
   int sum=1;
   for (int compt=2; compt*compt<=n ; ++compt) {
           if (compt*compt==n) sum=sum+compt;
           else if (n%compt==0) {
           sum=sum+compt;
           sum = sum + n/compt;
       }
       
   }
   if (sum==n and n!=0 and n!=1) return true;    
   else return false;
}


En java:

 public static boolean perfecte(int n) {
       return divisors(n) == n;
 }
 public static int divisors(int n) {
       int suma = 1;
       for (int i = 2; i < n; ++i) {
               if (n%i == 0) suma += i;
       }
       return suma;
 }

En Python:

 def perfecte(n):
     return divisors(n) == n
 def divisors(n):
     suma = 1
     for i in range(2, n):
         if n%i == 0: suma += i
     return suma