Diferencia entre revisiones de «Números amigos»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Sin resumen de edición
Leugim1972 (discusión · contribs.)
Deshecha la edición 31098450 de 80.35.24.164 (disc.)
Línea 454: Línea 454:
[[uk:Дружні числа]]
[[uk:Дружні числа]]
[[zh:相亲数]]
[[zh:相亲数]]
z

Revisión del 10:36 2 nov 2009

Dos números amigos son dos enteros positivos a y b tales que a es la suma de los divisores propios de b y b es la suma de los divisores propios de a. (la unidad se considera divisor propio, pero no lo es el mismo número).

Un ejemplo es el par (220, 284), ya que:

  • los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 284
  • los divisores propios de 284 son 1, 2, 4, 71 y 142, que suman 220

Para los pitagóricos los números amigos tenían muchas propiedades místicas.

Alrededor del año 850, Tabit ibn Qurra (826-901) descubrió una fórmula general para la cual se podían hallar números amigos: si

p = 3 × 2n-1 - 1,
q = 3 × 2n - 1,
r = 9 × 22n-1 - 1,

donde n > 1 es entero y p, q, y r son números primos, entonces

2npq y 2nr son un par de números amigos.

Esta fórmula genera los pares (220, 284), (1184, 1210), (17.296, 18.416) y (9.363.584, 9.437.056). El par (6232, 6368) también es de números amigos, pero no se puede hallar por la fórmula anterior.

Los números amigos han sido estudiados por Al Madshritti (muerto en 1007), Abu Mansur Tahir al-Baghdadi (980-1037), Pierre de Fermat(1601-1665), René Descartes (1596-1650), a quien se atribuye a veces la fórmula de Tabit, C. Rudolphus y otros. La fórmula de Tabit fue generalizada por Euler.

En la Edad Media, existió la creencia de que si se daba de comer a dos personas (al mismo tiempo pero no en el mismo lugar) sendos alimentos que contenían una inscripción 220 para uno y de 284 para el otro, entonces se volvían amigos por arte de magia.

Si un número es amigo de sí mismo (es igual a la suma de sus divisores propios), recibe el nombre de número perfecto.


Descubrimientos

Los pitagóricos observaron una rara relación entre los números 220 y 284: la suma de los divisores de cada uno de ellos, salvo el propio número, es el otro. Los denominaron números amigos. Durante muchos siglos, la pareja 220 y 284 fueron los únicos amigos conocidos, hasta que en 1636 Fermat descubrió que 17.296 y 18.416 también lo son. En 1638 Descartes, colega y competidor de Fermat, encontró la tercera pareja: 9.363.584 y 9.437.056

Implementación en lenguajes de programación

Python

Comprobar si dos números son amigos.

# Definición de la función de comprobación de números amigos
def números_amigos(x,y):
    suma_x=0
    suma_y=0
    for i in range(1,x):
        if x%i==0:
            suma_x+=i
        
    for k in range(1,y):
        if y%k==0:
            suma_y+=k
        
    return suma_x==y and suma_y==x

# Cuerpo del programa
n_1=int(raw_input('Introduzca el nº 1: '))
n_2=int(raw_input('Introduzca el nº 2: '))

if numeros_amigos(n_1,n_2):
    print '¡Son amigos! :)'
else:
    print 'No son amigos :('

Haskell

--Definición de la función "sonNumerosAmigos x y"

sonNumerosAmigos :: Int -> Int -> Bool

sonNumerosAmigos x y = if (x > 0 && y > 0) then ( sum (listaDivisores y) == x && sum 
(listaDivisores x) == y ) else error("Los números deben ser enteros positivos")
       where listaDivisores n = [ x | x <- [1..(n-1)], (mod n x) == 0]

VB .NET

    Private Function numeros_amigos(ByVal num_1 As Integer, ByVal num_2 As Integer) As Boolean
        Dim x As Integer            'Contador para bucles num_1 y num_2
        Dim suma_1 As Integer       'Acumular de suma de divisibles de Num_1
        Dim suma_2 As Integer       'Acumular de suma de divisibles de Num_2

        x = 1       'Inicializamos a 0 el bucle para sacar los números divisibles de num_1

        Do
            If num_1 Mod x = 0 Then     ' Si la division es 0 entra
                suma_1 = suma_1 + x     'Guardamos la suma de los divisibles para luego comparala
            End If
            x = x + 1
        Loop Until x >= num_1           'Recorre todos los números hasta ser + o = a num_1

        x = 1       'Inicializamos a 0 el bucle para sacar los números divisibles de num_2

        Do
            If num_2 Mod x = 0 Then     ' Si la division es 0 entra
                suma_2 = suma_2 + x     'Guardamos la suma de los divisibles para luego comparala
            End If
            x = x + 1
        Loop Until x >= num_2           'Recorre todos los números hasta ser + o = a num_2

        If ((suma_1 = num_2) And (suma_2 = num_1)) Then 'Si la suma de los divisibles de num_1 es
                                                        '= a num_2 o al reves entra
            numeros_amigos = True
        Else
            numeros_amigos = False
        End If

    End Function

    Sub main()
        Dim num_1 As Integer
        Dim num_2 As Integer

        Console.Write("Introduzca el primer numero:  ")
        num_1 = CInt(Console.ReadLine())
        Console.Write("Introduzca el segundo numero: ")
        num_2 = CInt(Console.ReadLine())
        Console.WriteLine("")

       Console.Write("La comparación para saber si los números {0} y {1}", num_1, num_2)
       Console.Write("son amigos es: {0}", numeros_amigos(num_1, num_2))
       Console.ReadLine()
    End Sub

/* Hecho por maximiliano apodo Dengue para la Tecnicatura

  • /
  1. include<conio.h>
  2. include<stdio.h>

/*declaro las funciones*/ int perfecto(int); int numero(int);

/*empieza programa principal*/ main() { int num=1,sw=0,div,div2,mostrar,mostrar2,i=0,par1; clrscr(); while(sw<5) { div=numero(num); /*busco la suma de los divisores perfectos del primer numero*/ div2=numero(div); /*busco la suma de los divisores perfectos del resultado*/

/*si son iguales, si el numero no es perfecto, y si todavia no encontre ese par de numeros entra al bucle*/

if (((num==div2) && perfecto(num))&& num!=par1) { sw++; if (div<div2) /*esto solamente es para mostrar ordenadamente*/ { mostrar=div; mostrar2=div2; par1=div2; printf(" %d-%d\n",mostrar,mostrar2); } else { mostrar=div2; mostrar2=div; par1=div; printf(" %d-%d\n",mostrar,mostrar2); } } num++;

} /*parte opcional del programa*/


printf(" si desea probar algun conjunto de numeros ingrese la cantidad a probar.\n Si no desea probar ninguno, ingrese 0 \n si ingresa un numero mayor a cuatro se tomara como 4 \n " ); scanf("%d",&num); while(i<8 && i<(num*2)) { printf(" ingrese el numero que desea probar  : "); scanf("%d",&sw); mostrar=numero(sw); printf(" %d \n",mostrar); i++; } /*termina la parte opcional del programa*/

printf("\n Fin del programa."); getch(); } /*termina programa*/


/*primer funcion, me determina la suma de los divisores perfectos del numero que se le entrega*/

int numero(int num) { int divmin=1,divmax,acu=0; divmax=num/2; while(divmin<=divmax) { if(num%divmin==0) { acu+=divmin; } divmin++; } return acu; }

/*fin de la primer funcion*/

/*segunda funcion, determina si el numero es perfecto*/ /*el numero no debe ser perfecto porque por ejemplo: 6 = 1+2+3 y mostraria este siendo un perfecto y no un "amigo"*/

int perfecto(int num) { if (numero(num)==num) return 0; return 1;

}

C++

#include <conio.h>
#include <iostream.h>

int main()

{ long n1, n2, acum1, acum2, N, i;
  
  cout <<"digite el maximo: ";
  cin >>N;
  
    for (n1= 2; n1<N; n1= n1+1)
    {  for (n2= n1+ 1; n2<= N; n2= n2+1)
       {  acum1= 0; acum2= 0;
          for (i= 1; i<=n1/2; i= i+1)
          {  if (n1%i== 0)
             acum1= acum1+i;
          }
          for (i= 1; i<=n2/2; i= i+1)
          {  if (n2%i== 0)
             acum2= acum2+i;
          }
          if (n1== acum2 && n2== acum1)
          cout<< n1<< " "<< n2<< "\n ";
       }
    }

cout <<"\n No se encontaron mas amigos";
    
getch ();
return 0;
}

Java

despliega "n" primeros números amigos
made by zero
public class Nlist
	{

	public static int cont=0;
	public static void main(String[] args) throws Exception
	{
		
			for(int i=2;i<n+2;i++)
			{
				System.out.print(i-1+ " ");
				pop(i);
				
								
			}
	System.in.read();
				
	}
		
	public static void pop(int num)
	{
	
		int p=3*((int)Math.pow(2,num-1))-1;
		int q=(3*((int)Math.pow(2,num)))-1;
		int r=9*(int)Math.pow(2,2*num-1)-1;
		int num1=(int)Math.pow(2,num)*p*q;
		int num2=(int)Math.pow(2,num)*r;
		System.out.println("num1 "+num1 +" num2 "+num2);
		
	
	
	}
	
	}


//APLICACIÓN QUE VERIFICA SI DOS NÚMEROS SON AMIGOS

import javax.swing.JOptionPane;
public class Main {
public static void main(String[] args) {

    String Cade1, Cade2;
    int num1, num2, i, div1, div2;
    i = 1;
    div1 = 0;
    div2 = 0;

    Cade1=JOptionPane.showInputDialog("Ingrese primer numero");
    num1=Integer.parseInt(Cade1);
    Cade2=JOptionPane.showInputDialog("Ingrese primer numero");
    num2=Integer.parseInt(Cade2);


     while(i < num1){ // Mientras 'i' sea menor o igual a 'numero1'
            if(num1%i == 0){ // Si 'numero1'%'i' es igual a   
               div1 = div1 + i; // suma los divisores de numero 1     
            }
            i++;
     }
        i=1;
     while(i < num2){ // Mientras 'i' sea menor 'numero2'
         if(num2%i == 0){ // Si 'numero1'%'i' es igual a
            div2 = div2 + i; // suma los divisores de numero 2
         }
         i++;
     }
     if (div1 == num2 & div2 == num1){
         JOptionPane.showMessageDialog( null, "LOS NUMEROS SON AMIGOS", "Resultado", JOptionPane.INFORMATION_MESSAGE );

        }
     else {
         JOptionPane.showMessageDialog(null,"NO SON NUMEROS AMIGOS","Resultado",0);
     }


     }
}

Scheme

;funcion principal
(define (amigos? A B)
  (cond
    ((and (= A (sumdivisores B 1)) (= B (sumdivisores A 1)))"Amigos")
    (else "No Amigos")
    )
  )
;funcion secundaria:suma los divisores de cada numero
(define (sumdivisores A B)
 (cond
   ((= A B) 0)
   ((integer? (/ A B))(+ B (sumdivisores A (+ B 1))))
   (else (sumdivisores A (+ B 1)))
   )
  )

SLE

/*Este algoritmo calcula si dos números ingresados por el usuario son amigos. En el caso de ser iguales 
y la suma de sus divisores también, advierte que son perfectos. Puede ser modificado fácilmente para que
automáticamente busque los números él mismo*/

var
acum : numerico
a : numerico
b : numerico
cont : numerico
div_a : numerico
div_b : numerico

inicio

imprimir ("\nDos números amigos son dos enteros positivos a y b", 
          "\ntales que a es la suma de los divisores propios de", 
          "\nb y b es la suma de los divisores propios de a.")

mientras (a==a){

imprimir ("\nIngrese un nº: ")
leer (a)
imprimir ("\ningrese otro nº: ")
leer (b)
 mientras (cont <a-1){
 cont=cont+1
   si (a%cont==0){
    acum=acum+cont
   sino
    acum=acum
   }
 }
div_a=acum
cont=0
acum=0

 mientras (cont<b-1){
  cont=cont+1
    si (b%cont==0){
     acum=acum+cont
    sino
     acum=acum
    }
}
div_b=acum

si ((div_a==b and div_b==a) and (a<>b)){
  imprimir ("\nlos nºs son amigos")
sino
  si ((div_a==b and div_b==a) and (a==b)){
  imprimir ("\nLos números son iguales y perfectos")
  sino
  imprimir ("\nlos nºs no son amigos")
 }
}
cont=0
acum=0
}
fin

Véase también