Jun 17 09

Números perfectos

by admin

Un número perfecto es aquél que es igual a la suma de todos sus divisores excepto el mismo, o también es aquel que es amigo de sí mismo.

El siguiente algoritmo en Scheme es una forma ineficiente y rápida (de programar) de conseguir los números perfectos, o también una muestra de lo chapucero que se puede llegar a ser.

Primero tres funciones auxiliares, una para el incremento en uno de un número, otra para saber si un número f es factor de otro número x, y la tercera para calcular la suma de factores

(define (1+ x)
    (+ x 1))
 
(define (es-factor? f x)
    (if (= 0 (remainder x f)) #t #f))
 
(define (suma-de-factores x z y)
    (cond
      ((= z 1) y)
      ((es-factor? (- z 1) x) (suma-de-factores x (- z 1) (+ y (- z 1))))
      (else (suma-de-factores x (- z 1) y))))

La peor de esas tres funciones auxiliares es la de suma-de-factores, si quieres hayar la suma de factores de 23 por ejemplo, tienes que utilizarla de la forma

(suma-de-factores 23 23 0)

Los dos últimos parámetros son contadores. Como es una función auxiliar supongo que esa falta de elegancia está permitida.

Finalmente llegamos a la función siguiente-perfecto

(define (siguiente-perfecto x)
    (if (= (1+ x) (suma-de-factores (1+ x) (1+ x) 0)) 
        (1+ x)
        (siguiente-perfecto (1+ x))))

Y haciendo una virguería encadenada como

(siguiente-perfecto (siguiente-perfecto (siguiente-perfecto (siguiente-perfecto 0))))

Obtenemos el cuarto número perfecto que es 8128.

May 9 09

Soporte LaTeX para WordPress y MediaWiki

by admin

Es posible añadir soporte para \LaTeX en MediaWiki y WordPress. Para WordPress sólo podremos añadir fórmulas matemáticas de forma cómoda utilizando la sintaxis de encerrar la fórmula entre símbolos de dólar. Para MediaWiki veremos dos formas distintas de hacer esto mismo y además un plugin que convierte el wiki en un auténtico repositorio de documentos \LaTeX.

Soporte MediaWiki

El proceso es bastante simple:

  1. Te aseguras de que en el PATH tengas los comandos: latex, dvips, convert, gs. Convert se instala con el paquete ImageMagick.
  2. Vas al directorio wiki/math y le haces un make. Seguramente necesites instalar ocaml a través de algún paquete genérico.
  3. Y luego pones a true las variables wgUseTeX y wgEnableUploads en el fichero de configuración LocalSettings.php del wiki.

Ahora ya puedes escribir ecuaciones como ésta en el wiki:

\sum_{k=0}^{n-1} e^{2 \pi i k/n} = 0

En el manual oficial viene todo perfectamente detallado, si encontramos problemas podemos echar mano de la sección Troubleshooting.

Cuando empieces a utilizarlo te darás cuenta de que las etiquetas math son muy incómodas. La extensión WikiTex facilita la escritura porque elimina la necesidad de la etiqueta math y te permiten escribir más parecido a cómo se escribe en LaTeX. Sin embargo la extensión genera todo el documento en una imagen (adios links) y además es bastante complicada de instalar.

Finalmente para transformar un wiki en un repositorio de documentos \LaTeX tenemos la extensión LatexDoc.

Soporte WordPress

Para poder escribir fórmulas matemáticas en WordPress podemos utilizar los plugins wp-LaTeX y Latex for WordPress.

Se puede modificar la expresión regular que utilizan para detectar la cadena de texto matemático y así utilizar la sintaxis de símbolo de dólar. Sólo he conseguido hacerlo bien con el segundo. Hay que editar el plugin y buscar la cadena:

$regex = '#\$\$(.*?)\$\$#si';

y sustituirla por:

$regex = '#\$(.*?)\$#si';

Y esta otra cadena:

if (substr($formula_text, -1, 1) == "!")        return "$$".subs\
tr($formula_text, 0, -1)."$$";

sustituirla por:

if (substr($formula_text, -1, 1) == "!")        return "$".subs\
tr($formula_text, 0, -1)."$";

Ya podemos escribir las fórmulas encerradas sólo entre dos símbolos de dólar, tal y como se hace en \LaTeX. Por ejemplo la siguiente fórmula escrita en el post así:

$\left[
\begin{array}{ c c }
sin(\pi/2) & cos(0) \\
cos(0) & sin(\pi/2)
\end{array} \right]
$

Se muestra de la forma:

 \left[<br />
  \begin{array}{ c c }<br />
     sin(\pi/2) & cos(0) \\<br />
     cos(0) & sin(\pi/2)<br />
  \end{array} \right]

Lo que además es una ventaja del plugin ya que te permite imprimir también la fórmula en \LaTeX sin procesar. En el post del Método de Euler se puede ver cómo queda.

Oct 8 08

El método de Euler

by admin

El método de Euler para la aproximación de una función partiendo de un punto conocido de ésta y de su derivada.

La derivada de una función es aproximadamente:

 \frac{dx\;}{dt\;}\approx\frac{x(t+h)-x(t)}{h}=f(t)

Despejando tenemos:

 \begin{cases}x(t+h)=x(t)+hf(t)\\x(0)\text{ es conocido}\end{cases}

Y dando valores a  t=0,h,2h,3h,\dots

 x(h)=x(0)+hf(0)

 x(2h)=x(h)+hf(h)

 x(3h)=x(2h)+hf(2h)

 \dots

Con lo que ya tenemos el algoritmo. Lo siguiente es la implementación en Sagemath ploteando juntos el primer punto, los puntos calculados con el método de Euler y la función original (en linea roja) para comparar.

En este caso la función original es  x={{e}^{t}\cos\left(t\right)}. De la que únicamente conocemos la derivada f={{e}^{t}\cos\left(t\right)}-{{e}^{t}\sin\left(t\right)} y el punto  x(0)=1. Finalmente el algoritmo quedaría:

#Variables
var('h,t,n')
h = 1/10 #paso
puntos = 100 #puntos a calcular
#Condiciones iniciales
f = exp(t)*cos(t) - exp(t)*sin(t) #ecuacion diferencial
x = exp(t)*cos(t) #funcion original para comparar
x0 = 1 #el punto conocido
 
p = point((0,1))
for i in range(puntos):
    x1 = RR(x0 + h*f(i*h))
    #print x1,RR(x(i*h)),x1-RR(x(i*h))
    p += point((i*h,x1))
    x0 = x1
 
#graficar la funcion original junto con los puntos hallados
p += plot(x,0,puntos*h,color="red")
p

metodoEuler

Apr 23 08

Protocolo ed2k para Firefox

by admin

Activar el protocolo ed2k para el navegador firefox y que al pinchar sobre un link a un fichero descargable pase directamente a la lista de descargas de la mula es sencillo.

En mi caso utilizo amule, por lo que primero instalo los útiles de consola amule-utils. Después en firefox abrimos la pestaña de configuración about:config e introducimos dos configuraciones:

network.protocol-handler.external.ed2k boolean true
network.protocol-handler.app.ed2k string /usr/bin/ed2k

Y listo. Si se comete algún error, para borrar una linea de configuración buscaríamos el fichero prefs.js y tras cerrar el navegador haríamos una copia de seguridad y lo editaríamos borrando la entrada erronea.