Diferencia entre revisiones de «Número perfecto»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
m Revertidos los cambios de 189.202.59.221 a la última edición de 217.125.253.21
Línea 309: Línea 309:


<source lang="java">
<source lang="java">
class perfecto {
import java.util.Scanner;
public static void main(String args[]) {

int numero=6;
/**
int sumas=1, menor=2, Mayor=numero;
*
while ( menor < Mayor ) {
* @author M.C. Jorge Ivan Fuentes Rosado
Mayor = numero / menor;
*/
if ( numero % menor == 0 )
public class numPerfecto {
sumas += menor;
public static boolean perfecto(int x){
if ( Mayor != menor && numero % Mayor == 0 )
int suma=0;
for(int i =1; i<=x/2;i++ ){
sumas += Mayor;
if(x%i==0){
menor++;
}
suma +=i;
}
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;");
}
}
if(suma ==x){
return true;
}
return false;
}

public static void main(String[] args){
Scanner reader = new Scanner(System.in);
int n;

System.out.print("Introduce el límite: ");
n = reader.nextInt();
System.out.print("Los números perfectos entre 1 y n son: ");
for(int i = 1; i<=n;i++){
if(perfecto(i)){
System.out.print(i+",");
}
}

}
}
}
</source>
</source>



Revisión del 15:33 2 oct 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.

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

Véase también

Enlaces externos