Diferencia entre revisiones de «Número perfecto»
m Revertidos los cambios de 189.133.91.188 a la última edición de 190.159.139.34 |
|||
Línea 328: | Línea 328: | ||
} |
} |
||
} |
} |
||
[[Media:Ejemplo.ogg]] |
|||
Este codigo permite realizar la busqueda de numeros perfectos hasta el limite que se requiera. |
|||
//autor Titi&Fk |
|||
import java.io.*; |
|||
public class Nperfectos { |
|||
public static void Main(String args[]) throws IOException{ |
|||
InputStreamReader isr=new InputStreamReader(System.in); |
|||
BufferedReader br=new BufferedReader(isr); |
|||
int lim, sum,fini; |
|||
System.out.println("Introduzca limite de busqueda"); |
|||
fini=Integer.parseInt(br.readLine()); |
|||
for(int i = 1; i <= fini; i++) { |
|||
lim = i/2; |
|||
sum = 0; |
|||
for(int j = 1; j <= lim; j++) { |
|||
if( (i % j) == 0 ){ |
|||
sum += j; |
|||
if(sum == i) { |
|||
System.out.println(i); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</source> |
</source> |
||
Revisión del 21:48 27 ago 2009
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 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.
Otras propiedades de los números perfectos pares
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 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.
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 es la potencia correspondiente a un número primo de Mersenne aumentado en una unidad.
Son números hexagonales
Un número hexagonal es de la forma , para «n» un número entero positivo cualquiera distinto de cero. Surge inmediatamente de la identidad , llamando «n» al número .
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.
Implementación en lenguajes de programación
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
Lenguaje C++
//Este programa crea números perfectos
#include <iostream.h>
#include <stdio.h>
#include <iomanip.h>
int num,divisor,a,contador;
long i;
int main()
{
do
{
cout<<" introducir cantidad de números perfectos ";
cin>>num;
}
while (num<=0);
while (contador<num)
{
for (divisor=2;contador<num;divisor++)
{
for (i=1;i<=divisor;i++)
{
if (divisor%i==0)
a=a+i;
if (divisor==i)
{
if ((a-i)==divisor)
{
cout<<i<<endl;
contador++;
}
a=0;
}
}
}
}
getchar();
}
Lenguaje C
El siguiente código permite determinar si un número es perfecto:
# include <stdio.h>
# include <stdlib.h>
int numeroPerfecto(int num);
main()
{
int numero;
printf("\nIngrese un numero: ");
scanf("%i", &numero);
if(numeroPerfecto(numero))
printf("\nEs Perfecto\n");
else
printf("\nNo es Perfecto\n");
system("pause");
}
int numeroPerfecto(int num)
{
int acum = 0 ;
int i;
for( i = 1; i<num; i++ )
if( num%i == 0 )
acum += i;
if( acum == num )
return 1;
else
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int n,i,resto,suma;
printf ("\nEste programa comprueba si un numero entero es perfecto o no");
printf ("\n\nIntroduce el numero: ");
scanf ("%i",&n);
suma=0;
resto=0;
for (i=1; i<n; i++) //cuenta desde 1 hasta n-1 vs: si n=5, cuenta 1,2,3 y 4
{
resto=n%i;
if (resto==0)
suma=suma+i;
}
if (n==suma)
printf ("\nEl numero %i es perfecto\n\n",n);
else
printf ("\nEl numero %i no es perfecto\n\n",n);
system ("pause");
return (0);
}
Lenguaje PHP
//Este programa crea números perfectos en un rango dado
<?php
$me =""; //nos sirve par imprimir mensajes
$inicio = "numero que desees"; //numero donde inica el rango
$fin = "muero que desees"; //numero 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 divicion desde el valor de inicio hasta el numero de fin
{
$o=$orsq%$b; //operacion para obtener el residuo si es Cero
if ($o==0) //desicion si secumple
{
$c=$c+$b; //sumara al contador el valor de contador mas el numero 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 numero perfecto
}
}
?>
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
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();
}
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)]]
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;");
}
}
}
Python
def perfecto(num):
contador = 0
for i in range(1,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)
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.- 1\n")}
si(t==x){imprimir(v,".- ",x,"\n"); v=v+1}
t=0}
imprimir("programa finalizado")
fin
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
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)))
)
)
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