sábado, 29 de diciembre de 2018

domingo, 4 de noviembre de 2018

CÁLCULO DEL VALOR DEL FACTORIAL ¿?


Todos nos hemos enfrentado alguna vez desde el bachillerato al cálculo de factoriales, el cálculo es sencillo:

n!=n x (n-1) x ........1

es decir
0!=1
1!=1
2!=2 x 1
3!=3 x 2 x 1
etc

El problema aparece con los números "grandes", ya sólo el valor de 70!, no da el siguiente valor:

70!=11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000

un número muy grande, que suele ser el tope de las calculadoras de bolsillo y que nos lo ofrecen sin tantos valores.

Vamos a realizar un test para calcular factoriales usado varios lenguajes de propósito general , y usando buscadores :

Empezamos por los buscadores, la opción más facil:




Empezamos por la opción más rápida (google), el entero más grande que puede procesar a la fecha de edición de este texto es 170!, con un valor de :




Como se puede ver con sólo seis decimales

En el caso de Duck Duck Go, tenemos el siguiete resultado, para un máximo de 170:




Y en en Wolfram Alpha (el que lleva las de ganar):

Sencillamente la parte más agotadora es la de ver todos los números del factorial, que no parecian tener fin.





Entre los Lenguajes de propósito general vamos a usar :

  • Java
  • Python

Para estos lenguajes es necesario realizar un programa muy corto, el problema es la capacidad de soportar enteros muy grandes, se va a hacer uso de librerias propias de los lenguajes, es decir no se van a usar extensiones de terceros.



Vamos a empezar por los lenguajes de propósito general.

Para el caso de Java el código puede ser:



import java.util.Scanner; // libreria de entrada de datos
import java.math.BigInteger; // libreria de BigInteger



public class bigfactorial 
{

public static void main(String[] args)
{
// Factorial para numeros enteros grandes usando BigInteger max 1667!
// sin recursividad
// usar BigDecimal no supone aumentar el valor del factorial calculado
// Generamos la instancia de la entrada
Scanner entrada= new Scanner(System.in);
int numero; // numero el que le vamos a calcular el factorial
BigInteger factorial = BigInteger.valueOf(1);
// introducimos un numero al que le vamos a calcular el factorial
System.out.print("Introduce el numero ");
numero = entrada.nextInt(); 
entrada.close(); // cerramos el Scanner de entrada
// calculo del factorial mediante BigInteger
for (int i=numero;i>0;i--)
{
factorial = factorial.multiply(BigInteger.valueOf(i));
}
System.out.printf("El valor del factorial de %d es %s\n",numero,factorial.toString());
 
}

}

La limitación del tipo BigInteger de Java nos lleva hasta 1667, que no está mal del todo


En el caso del código en lenguaje Python, el código sería por ejemplo :

# scrip para calcular el factorial de un número sin recursividad

numero = int (input("Introduce el número al que calcular el factorial "))
factorial=1

for n in range(1, numero+1):
    factorial*=n

print("El factorial de "+str(numero)+" es "+str(factorial))

# colocamos un input para que no se cierre la ventana del sistema operativo
print("pulsa intro para terminar")

tecla = input()

En este caso se cálculo hasta el 25.000! pero este no es el número más grande del que se puede cálcular el factorial de numeros mayores.

También es posible usar :

  • Octave
  • MatLab
  • Mathematica
  • etc
que implementan funciones para el cálculo del factorial de un número.




domingo, 2 de septiembre de 2018

SOBRE LA MÉTRICA DE ALCUBIERRE Y EL MOTOR DE CURVATURA





No hace mucho retomé una de las series de ciencia ficción clásicas que supongo os sonará, se trata de Star Trek.
De esta serie una de las cosas con las que primero te quedas es el hecho de que las naves estelares se deplazan a velocidades mayores que la de la luz usando la tecnología warp, mediante un impulso de distorsión, permitiendo distorsionar el espacio-tiempo sin contradecir las teorías de la Relatividad de Einstein, algo hasta ahora dificil hasta en el campo teórico.



Buscando en ese pozo sin fondo que es internet me he encontrado con la teoría del físico mexicano Miguel de Alcubierre, que propone la posibilidad de viajar a multiplos de la velocidad de la luz, sin contradecir las actuales teorías de la relatividad.

Aqui os dejo un vídeo de como va el tema



Y como no una explicación de los fundamentos de la métrica, es muy interesante la colección de artículos al final del enlace wiki

Enlace Wiki

En el siguiente enlace el artículo de Miguel Alcubierre
Warp Drive Hyper-fast Travel Within General Relativity

y otros artículos que he localizado:
Hyper Fast Interstellar Travel Within General Relativity:The Alcubierre and Natario Warp Drive Spacetimes:From Science Fiction to Science Fact

A Theorical Warp Drive, The Mathematics of Faster Than Light Travel



martes, 2 de enero de 2018

SOBRE EL ACERTIJO DEL PIN

Hoy dos de enero de 2018 he visto en Google+ la propuesta de un problema para acertar un PIN, era :
  • Tiene cuatro números
  • Los cuatro números suman 9
  • Ninguna de las cifras es 0
  • El número que forma el PIN es múltiplo de 5
  • Es mayor de 2007

Con estos planteamientos empezamos:
  • Si es múltiplo de 5, termina en 5 o en 0, como ninguna cifra es 0, debe de ser un 5, el número tendría la forma XYZ5
  • Los cuatro números suman 9, es decir X+Y+Z+5=9, o lo que es lo mismo X+Y+Z=9-5=4
  • Por lo que tenemos que encontrar tres números naturales que sumados den 4, ¿que posibilidades tenemos?, sólo una 1+1+2 
  • La cifra del PIN es mayor de 2007, por lo que el PIN sería 2115 
Ya sólo falta hacernos con la tarjeta y ver que sacamos en claro de todo esto