Archive

Posts Tagged ‘Maths’

Simple mathematical concepts I: Induction.

March 29th, 2010 Serabe No comments

4458595395 2c1bbc10e5 m Simple mathematical concepts I: Induction.
After reading this and this I realized something is really, really wrong about mathematical concepts out there. Proof by induction is a really, really simple yet powerful proof method.  In this post, I will talk about induction for natural numbers.

Induction is based on two steps, usually called basis and inductive step. I will proof that 1+2+…+n=n(n+1)/2  for all natural numbers using induction.

  1. Basis or base case consists on proving the predicate for an initial value, usually a small one. In the example 1=1*2/2=1.
  2. Inductive step consists on supposing the if the predicate holds for n, then it also holds for n+1. In the example:

1+2+…+n+(n+1)=(n+1)+n(n+1)/2 because we supposed that predicate held for n. We need to prove that this expression is equivalent to (n+1)(n+2)/2. Indeed,

(n+1)+n(n+1)/2=(n+1)(1+n/2)=(n+1)((2+n)/2)=(n+1)(2+n)/2

so the predicate has been proofed for all natural numbers.

Why does induction work?

Think of any natural number, as big as you want. Got it? We know that the predicate holds for 1, and that if the predicate holds for a number it holds for its successor. So it holds for 2, and for 3 and so on until it reach your number.

Other types of induction.

There are several types of inductions. Two of these types are structural induction and complete induction.

cc Simple mathematical concepts I: Induction. photo credit: hartboy

article clipper Simple mathematical concepts I: Induction.
 
share save 171 16 Simple mathematical concepts I: Induction.

Problema 2

March 23rd, 2008 Serabe No comments

Enunciado:
Suma todos los números pares de la sucesión de Fibonacci menores que un cuatro millón.

Primera solución:

La primera solución es muy simple. Hay un método que devuelve un array con todos los números de la sucesión de Fibonacci menores que un máximo max tomando como inicio un array de dos elementos arr.

RUBY:
  1. def fib1(max,arr=[1,1])
  2.   while(arr.last <max) do
  3.     arr <<(arr.last+arr[arr.size-2])
  4.   end
  5.   arr.pop
  6.   arr
  7. end

Después simplemente se eliminan los impares y se suman los que quedan.

RUBY:
  1. def euler2a(max, ini=[1,1])
  2.   fib1(max,ini).delete_if{|x| x%2 == 1}.inject{|memo,obj| memo+obj}
  3. end
  4.  
  5. puts euler2a(4e6)

Segunda solución:

Esta solución es un poco mejor. Se va a hacer un nuevo método que calcule todos los números de la sucesión de Fibonacci menores que un máximo max pero que sólo almacene aquellos que pasen una condición que se le pasa como bloque:

RUBY:
  1. def fib2(max,a=1,b=1)
  2.   arr = []
  3.   arr <<a if yield(a)
  4.   while(b<max) do
  5.     arr <<b if yield(b)
  6.     a,b=b,a+b
  7.   end
  8.   arr
  9. end

Después sólo hace falta pasar el filtro adecuado, y sumar los resultados:

RUBY:
  1. def euler2b(max,a=1,b=1)
  2.   fib2(max,a,b){|x| x%2==0}.inject{|memo,obj| memo+obj}
  3. end
  4.  
  5. puts euler2b(4e6)

Tercera solución:

Esta tercera solución es una modificación directa de la segunda. En vez de almacenar los datos, se suman directamente.

RUBY:
  1. def fib3(max,a=1,b=1)
  2.   res = 0
  3.   res += a if yield(a)
  4.   while(b<max) do
  5.     res += b if yield(b)
  6.     a,b=b,a+b
  7.   end
  8.   res
  9. end
  10.  
  11. def euler2c(max,a=1,b=1)
  12.   fib3(max,a,b){|x| x%2==0}
  13. end
  14.  
  15. puts euler2c(4e6)

Y eso es todo.

Actualización: Hay diferencias entre la página de PyEuler y la del Proyecto Euler. El problema ha sido actualizado para corresponderse con esta última.

article clipper Problema 2
 
share save 171 16 Problema 2

Tweets del 19-03-2008

March 19th, 2008 Serabe No comments
article clipper Tweets del 19 03 2008
 
share save 171 16 Tweets del 19 03 2008
Categories: Anti-GOTAM, Maths, Twitter Tags:

Problema 1

February 27th, 2008 Serabe No comments

Empiezo aquí una serie de artículos de periodicidad variable que lo único que pretende es ser algo similar (de una manera muy amplia) a PyEuler. La lista completa de problemas está en el Proyecto Euler y, como no podía ser de otra manera, empiezo por el primero.

Enunciado:
Halla la suma de todos los números menores que 1000 y múltiplos de 3 o de 5.

Solución 1:

RUBY:
  1. def euler1a(e, numbers)
  2.   (1..e).select{|x| numbers.any?{|y| (x%y == 0)}}.inject{|memo,o| memo+=o}
  3. end
  4.  
  5. puts euler1a(1000,[3,5])

La explicación es simple. Tenemos un rango desde 1 hasta el límite, filtramos los que son múltiplos de algún elemento del array y después se suman.

Solución 2:

RUBY:
  1. def euler1b(e,numbers)
  2.   (1..e).inject(0){|memo,o| (numbers.any?{|x| (o%x)==0}) ? memo+o : memo }
  3. end
  4.  
  5. puts euler1b(1000,[3,5])

Éste es similar al anterior, sólo que se suma según se recorre el rango.

Solución 3:
Para este necesitamos antes un par de funciones. La primera, halla el máximo común divisor de dos números. Para ello, básicamente usa el algoritmo de Euclides.

RUBY:
  1. def mcd(n1,n2)
  2.   if n1 <n2
  3.     mcd(n2,n1)
  4.   elsif (n1%n2) == 0
  5.     n2
  6.   else
  7.     mcd(n2,n1%n2)
  8.   end
  9. end

Por otra parte, está la función que calcula el mínimo común múltiplo. Para ello usa su relación con el m.c.d..

RUBY:
  1. def mcm(n1,n2)
  2.   n1*n2/mcd(n1,n2)
  3. end

Con esto, ya podemos pasar a la tercera solución, que es diferente de las otras dos en que sólo sirve si utilizamos dos números como filtro.

RUBY:
  1. def euler1c(limit, n1, n2)
  2.   (n1*((limit/n1)*((limit/n1)+1)/2)+n2*((limit/n2)*((limit/n2)+1)/2)-mcm(n1,n2)*((limit/mcm(n1,n2))*((limit/mcm(n1,n2))+1)/2))
  3. end
  4.  
  5. puts euler1c(1000,3,5)

La explicación es un poco más complicada, pues implica teoría básica de conjuntos y la conocida fórmula de la suma de 1 a n.

Ahora es vuestro turno. ¿Cómo se os ocurre hacerlo?

article clipper Problema 1
 
share save 171 16 Problema 1
Categories: Maths, Programming, Ruby, RubyEuler Tags: , ,
Improve the web with Nofollow Reciprocity.