Nombre perfecte

nombre

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.[1] 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[2] en el segle IV abans de la nostra era:

per a n = 2: 2¹(2² − 1) = 6
per a n = 3: 2²(23 − 1) = 28
per a n = 5: 24(2⁵ − 1) = 496
per a n = 7: 2⁶(27 − 1) = 8128

A més, Euler va demostrar en el segle xviii que tots els nombres perfectes parells són d'aquesta forma.[2] 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 hi ha un nombre perfecte imparell, ha de complir, entre d'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'aquests 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, hi ha altres tipus de nombres.

Implementació en informàtica

modifica

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  .

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 && n!=0;
}

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

En Python:

def perfecte(n):
 return divisors(n) == n

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

Referències

modifica
  1. Corbalán Yuste, F. et al.. Gamma 2 : matemàtiques : Educació Secundària, segon curs. 1a.. Barcelona: Vicens Vives, 2003, p. 8. ISBN 84-316-6978-2. 
  2. 2,0 2,1 Gardner, Martin. «11. Perfectos, amigos y sociables». A: Festival mágico-matemático (en castellà). 2a. Madrid: Alianza Editorial, 2018, p. 208. ISBN 978-84-8181-315-6 [Consulta: 22 febrer 2020].