MATEMÁTICAS2: NÚMERO PERFECTO. Un número perfecto es un número natural que es igual a la suma de sus divisores propios positivos, sin incluirse él mismo. Dicho de otra forma, un número perfecto es aquel que es amigo de sí mismo.
Número perfecto
Un número perfecto es un número natural que es igual a la suma de sus divisores propios positivos, sin incluirse él mismo. Dicho de otra forma, un número perfecto es aquel que es amigo de sí mismo.
Así, 6 es un número perfecto, porque sus divisores propios son 1, 2 y 3; y 6 = 1 + 2 + 3. Los siguientes números perfectos son 28, 496 y 8128.
El matemático Euclides descubrió que los cuatro primeros números perfectos vienen dados por la fórmula :
- n = 2: 21 × (22 – 1) = 6
- n = 3: 22 × (23 – 1) = 28
- n = 5: 24 × (25 – 1) = 496
- n = 7: 26 × (27 – 1) = 8128
Al darse cuenta que 2n – 1 es un número primo en cada caso, Euclides demostró que la fórmula 2n–1(2n – 1) genera un número perfecto par siempre que 2n – 1 es primo.
Los matemáticos de la Antigüedad hicieron muchas suposiciones sobre los números perfectos basándose en los cuatro que ya conocían. Muchas de estas suposiciones han resultado ser falsas. Una de ellas era que, como 2, 3, 5 y 7 eran precisamente los cuatro primeros números primos, el quinto número perfecto se obtendría con n = 11, el quinto número primo. Sin embargo, 211 – 1 = 2047 = 23 × 89 no es primo y por tanto n = 11 no genera un número perfecto. Dos de las otras suposiciones equivocadas eran:
- El quinto número perfecto tendría cinco dígitos, ya que los cuatro primeros tienen 1, 2, 3 y 4, respectivamente.
- Los números perfectos terminarían alternativamente en 6 y en 8.
El quinto número perfecto (33550336) tiene 8 dígitos, contradiciendo así la primera suposición. En cuanto a la segunda, el quinto número perfecto acaba en 6, pero también el sexto (8589869056) termina en 6. (El que la última cifra de un número perfecto par expresado en base 10 siempre sea 6 u 8 no es difícil de demostrar.)
Es verdad que si 2n – 1 es un número primo, entonces 2n–1(2n – 1) es un número perfecto, pero el recíproco no es necesariamente cierto. Hoy en día, a los números primos generados por la fórmula 2n – 1 se los conoce como números primos de Mersenne, en honor al monje del siglo XVII Marin Mersenne, quien estudió teoría de números y números perfectos.
Posteriormente, Euler demostró en el siglo XVIII que todos los números perfectos pares se generan a partir de la fórmula que ya descubrió Euclides.
No se conoce la existencia de números perfectos impares. Sin embargo, existen algunos resultados parciales al respecto. Si existe un número perfecto impar debe ser mayor que 10300, debe tener al menos 8 factores primos distintos (y al menos 11 si no es divisible por 3). Uno de esos factores debe ser mayor que 107, dos de ellos deben ser mayores que 10.000 y tres factores deben ser mayores que 100.
Considerando la suma de los divisores propios existen otros tipos de números.
- Números defectivos: la suma de los divisores propios es menor que el número.
- Números abundantes: la suma es mayor que el número.
- Números amigos: a y b tales que a es la suma de los divisores propios de b y viceversa.
- Números sociables: como los amigos, pero con un ciclo mayor de números.
Se puede decir que el número perfecto es un número amigo de sí mismo.
Contenido[ocultar] |
[editar] Otras propiedades de los números perfectos pares
[editar] Son números triangulares
Un número triangular es de la forma , donde «n» es un número entero positivo cualquiera distinto de cero. Si partimos de la identidad y distribuimos el producto del lado derecho obtenemos: . La expresión 2p − 1 es un número primo de Mersenne y vemos que el término derecho de la identidad adopta la forma correspondiente a la definición de número triangular. Podemos afirmar que un número perfecto par es un número triangular y su orden es un número primo de Mersenne.
[editar] Son números combinatorios o coeficientes del binomio
Como todos los números triangulares están en la tercera columna del triángulo de Pascal y acabamos de ver que todo número perfecto par es un número triangular, los números perfectos son también números combinatorios. , donde 2p es la potencia correspondiente a un número primo de Mersenne aumentado en una unidad.
[editar] Son números hexagonales
Un número hexagonal es de la forma n(2n − 1) = 2n2 − n, para «n» un número entero positivo cualquiera distinto de cero. Surge inmediatamente de la identidad , llamando «n» al número 2p − 1.
[editar] Cuestiones abiertas
Por cuestión abierta se entiende una propiedad de la que todavía no se tiene una demostración, tanto de su afirmación como de su negación. Son cuestiones abiertas:
- Determinar si existen infinitos números perfectos. Hasta el año 2008 se conocen 46 números perfectos.
- Demostrar la imposibilidad de un número perfecto impar o encontrar uno.
[editar] Implementación en lenguajes de programación
[editar] Lenguaje Visual Basic .Net
Module Module1
'Numero perfecto
Sub Main()
Dim Resultado As Integer
For index As Integer = 1 To 8200
Resultado = Perfecto(index)
Console.WriteLine(Resultado)
'Comparo el numero con el total sumado
If Resultado = index Then
Console.WriteLine("El numero " & index & " es PERFECTO: " & Resultado)
Else
Console.WriteLine("El numero " & index & " no es perfecto: " & Resultado)
End If
Next
Console.ReadKey()
End Sub
Function Perfecto(ByVal Numero As Integer) 'Averiguo si el numero es perfecto
Dim Total As Integer
For index As Integer = 1 To Numero - 1
If Numero Mod index = 0 Then
Total = Total + index
End If
Next
Return Total
End Function
End Module
[editar] Lenguaje C
El siguiente código permite determinar si un número es perfecto:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int numeroPerfecto(int num);
main()
{
int numero;
printf("nIngrese un numero: ");
scanf("%i", &numero);
if(numeroPerfecto(numero))
printf("nEs Perfecton");
else
printf("nNo es Perfecton");
system("pause");
}
int numeroPerfecto(int num)
{
int acum = 0 ;
int i;
for( i = 1; i<=(num/2); i++ )
if( num%i == 0 )
acum += i;
if( acum == num )
return 1;
else
return 0;
}
Otro ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (void)
{
int n,i,resto,suma;
printf ("nEste programa comprueba si un numero entero es perfecto o no");
printf ("nnIntroduce el numero: ");
scanf ("%i",&n);
suma=0;
resto=0;
for (i=1; i<=(n/2); i++) //cuenta desde 1 hasta n/2 : El mayor múltiplo posible de n, asumiendo que n es divisible por 2, es n/2.
{
resto=n%i;
if (resto==0)
suma=suma+i;
}
if (n==suma)
printf ("nEl numero %i es perfectonn",n);
else
printf ("nEl numero %i no es perfectonn",n);
system ("pause");
return (0);
}
[editar] Lenguaje PHP
<?php
/* Este programa crea números perfectos en un rango dado. */
$inicio = 0; //número donde inica el rango
$fin = 1000; //número donde ternina el rango
for ($orsq=$inicio; $orsq<=$fin; $orsq++) //ciclo que nos sirve para recorer el rango deseado
{
$c=0; // contador para almacenar los datos con residuo con valor de cero
for ($b=1; $b<$orsq; $b++) //ciclo for para efectuar la división desde el valor de inicio hasta el número de fin
{
$o=$orsq%$b; //operación para obtener el residuo si es Cero
if ($o==0) //decisión si secumple
{
$c=$c+$b; //sumará al contador el valor de contador más el número que posee residuo cero
}
}
if ($c==$orsq)//si el contador es igual al valor recorido en el primer ciclo entonses es un numero perfecto
{
echo "$orsq es un numero perfecto<br />"; // visualizar el número perfecto
}
}
?>
Otro ejemplo:
<?php
/* Funcion que al pasarle un numero nos imprime si es perfecto o no, nos regresa 1 en caso de ser perfecto y
0 en caso contrario.
Autor: Eduardo Cortez*/
function numeroPerfecto($numero){
for($i=1;$i<$numero;$i++){
$residuo=$numero%$i;
if($residuo==0){
$sum=$i+$sum;
}
}
if($sum==$numero){
echo("El numero es perfecto");
return 1;
}else{
echo("El numero no es perfecto");
return 0;
}
}
?>
>
[editar] LogoFE (Lenguaje Logo)
muestra divisores 16
[1 2 4 8 16]
muestra menosultimo divisores 16
[1 2 4 8]
muestra suma menosultimo divisores 16
15
muestra expon [[suma menosultimo divisores] mismo] 16
[15 16]
muestra serie frase [1 1] 16
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
muestra escoge [esigual expon [[suma menosultimo divisores] mismo]] serie frase [1 1] 100
[1 6 28]
muestra escoge [esigual expon [[suma menosultimo divisores] mismo]] serie frase [1 1] 1000
[1 6 28 496]
funciona "perfectos.menores.que [escoge [esigual expon [[suma menosultimo divisores] mismo]] serie frase [1 1]]
muestra perfectos.menores.que 100
[1 6 28]
[editar] VisualBasic
Este código permite ver si un número es perfecto o no, aunque está limitado a los cinco primeros números perfectos ya que el sexto provoca un error de desbordamiento.
numero = Val(TextBox1.Text)
sumas = 0
For i = 1 To numero - 1
If numero Mod i = 0 Then sumas = sumas + i
Next
If sumas = numero Then
Label5.Text = Str(numero) + " es un numero perfecto"
Else
Label5.Text = Str(numero) + " no es un numero perfecto"
End If
[editar] C#
El siguiente código en C# muestra la cantidad de números perfectos indicada por cant.
private static bool EsPerfecto(Int64 n)
{
Int64 t = 0;
for (Int64 i = 1; i < n; i++)
if (n % i == 0) t += i;
return (n == t);
}
private static void Lista(int cant)
{
for (Int64 i = 1; cant > 0; i++)
{
if (EsPerfecto(i))
{
Console.WriteLine(i);
cant--;
}
}
}
static void Main(string[] args)
{
Lista(3);//Imprime los primeros 3
Console.ReadLine();
}
[editar] Haskell
El siguiente código genera la lista de números perfectos.
listaperfec :: [Int]
listaperfec = [x | x <- [2..], perfecto x]
where perfecto n = sum(divisores n) == n
where divisores n = [x | x <- [1..(n-1)], n `mod` x == 0]
sum::[Int]->Int
sum [] = 0
sum (x:xs) = x+ (sum xs)
=== Otra Alternativa más Eficiente ===
{-
Función para determinar si un número es primo
-}
esPrimo :: Integer -> Integer -> Bool
esPrimo _ 1 = True
esPrimo x n = if ((mod x n) == 0) then False
else (esPrimo x (n - 1))
{-
Función para dar la lista de los Números Perfectos
-}
perfectos :: [Integer]
perfectos = [x | x <- [2..], esPrimo (2^x-1) (2^x - 2) , x <- [(2^(x-1))*(2^x-1)]]
[editar] Java
Este código permite comprobar si un número dado es perfecto.
class perfecto {
public static void main(String args[]) {
int numero=6;
int sumas=1, menor=2, Mayor=numero;
while ( menor < Mayor ) {
Mayor = numero / menor;
if ( numero % menor == 0 )
sumas += menor;
if ( Mayor != menor && numero % Mayor == 0 )
sumas += Mayor;
menor++;
}
if (sumas == numero) {
System.out.println("El numero "+numero+" es un numero perfecto;");
} else {
System.out.println("El numero "+numero+" no es un numero perfecto;");
}
}
}
[editar] Python
from math import sqrt
def perfecto(num):
contador = 0
for i in range(1,sqrt(num)):
if num % i == 0:
contador += i
if contador == num:
print u"Es un número perfecto."
else:
print u"No es un número perfecto."
# llamando al método, probando con el número 6
perfecto(6)
[editar] SLE
Generador de números perfectos
variables
t,v,x,y,z,maxnum :numerico
inicio
leer(maxnum)
cls()
v=2
desde x=6 hasta maxnum{
desde y=2 hasta x{
si(x%y==0){
z=x/y
t=t+z}}
si(x==6){imprimir("1.- 1n")}
si(t==x){imprimir(v,".- ",x,"n"); v=v+1}
t=0}
imprimir("programa finalizado")
fin
[editar] Fortran 90
Este código permite ver si un número es perfecto o no, aunque está limitado a los cinco primeros números perfectos ya que el sexto provoca un error de desbordamiento.
program Perfecto
implicit none
integer ::num
Print*, "Dime un número"
Read*, num
If (perfect(num)) then
Print*,"Es perfecto"
else
Print*, "No es perfecto"
endif
pause
!!
Contains
logical function perfect(n)
Integer :: n,suma,i
suma=0
perfect=.false.
Do i=1,n-1
If (mod(n,i)==0) suma=suma+i
enddo
If (suma==n) perfect=.true.
endfunction
endprogram
[editar] Scheme
Este código permite comprobar si un número dado es perfecto.
;funcion principal
(define (perfecto? A)
(cond
((= A 1) "No es Perfecto")
((= A (apply +(divisores A))) "Es perfecto")
(else "No es Perfecto")
)
)
;funciones auxiliares
(define (divisores A)
(cond
((= A 1) '(1))
(else (cons 1 (divisores-aux A 2)))
)
)
(define (divisores-aux A B)
(cond
((= A B) ())
((integer? (/ A B))(cons B (divisores-aux A (+ B 1))))
(else (divisores-aux A (+ B 1)))
)
)
[editar] Batch Script
@echo off
:: Numeros perfectos, Leo Gutierrez R.
:code
set /p "numero=Numero : "
if not defined numero (goto:code)
set /a "i=1"
set /a "suma=0"
set /a "operacion=0"
:bucle
if %i% equ %numero% (goto:end)
set /a "operacion=%numero% %% %i%"
if %operacion% equ 0 (set /a "suma+=%i%")
set /a "i+=1"
goto:bucle
:end
if %suma% equ %numero% (
echo El numero es perfecto.
) else (
echo El numero no es perfecto.
)
goto:eof
[editar] Extended Pascal
Program NumerosPerfectos(input, output);
(*Este programa encuentra números perfectos.*)
Var
numero, divisor, acumulador : integer;
Begin
For numero:=1 To maxint Do
Begin
acumulador:=0; (*Este bucle calcula los divisores del número y los suma para realizar la comprobación.*)
For divisor:=1 To numero-1 Do If (numero Mod divisor = 0) Then acumulador:=(acumulador + divisor);
If (acumulador = numero) Then writeln(acumulador)
End
End.
[editar] PSeInt
Proceso ITESA_LEVO
Escribir "--------------------------------Numero Perfecto--------------------------------";
Escribir "Ingrese el numero:";
Leer n;
c<-1;
a<-0;
Repetir
r<-n%c;
Si r=0 Entonces
escribir c;
a<-a+c;
FinSi
c<-c+1;
Hasta Que c=n
Si a=n Entonces
Escribir "----";
Escribir a;
Escribir "El numero es perfecto!";
Sino
Escribir "----";
Escribir a;
Escribir "El numero no es perfecto!";
FinSi
FinProceso
0 comentarios