jueves, 31 de marzo de 2011

Generación de primos con Python y LinQ

Bueno, estos son scripts que hice, y se muestra la simplicidad de usar expresiones lambda, son muy simples, sobre todo el de python, bueno esto son los scripts

Codigo Python:
#!/usr/bin/python
# primos.py
# Genera primos usando programacion funcional
# Coded by SerG
from math import sqrt
n = int("n> ")
nums = range(2,n+1)
root = int(sqrt(n))#Nro. de divisores
for i in range(2,root+1):
    nums = filter(lambda num: num==i or num%i!=0, nums)
# desde aca se puede hacer cualquier cosa con el
# vector nums, ya que contiene los primos



Codigo C# (LinQ):
using System;
using System.Collections.Generic;
using System.Linq;
namespace PrimosLinq
{
class Program
    {
        static void Main(string[] args)
        {
            int n = Convert.ToInt32(Console.ReadLine());
            int[] nums = Enumerable.Range(2, n).ToArray();            
            int root = (int)(Math.Sqrt(n));//# de divisores            
            for (int i = 2; i <= root; i++)
                nums = (from x in nums where x == i || x % i != 0 select x).ToArray();
            long fin= DateTime.Now.Ticks;
            Console.WriteLine("Primos generados");
            /* 
             * Desde aca se puede hacer cualquier cosa con el
             * vector nums, ya que contiene los primos
             */
            Console.Read();
        }
    }
}


Bueno, basicamente lo que hace es  generar un vector que tenga todos los números desde 2 hasta n, luego hacemos un bucle desde 2 hasta la raiz cuadrada de la cantidad que queremos generar y obtiene los numeros que sean igual al indice o no sean divisores, esto lo hace la tantas veces dependiendo del tamaño de root.

Bueno, como pueden ver, usando expresiones lambda, las cosas siempre son más simples

1 comentario: