1votos

Cálculo número primo con exprexiones Lambda en C#

por josejuan hace 5 años

Nunca (el mismo algoritmo) va a ser MÁS rápido usando Linq que con un bucle normal. Por añadir algo, genero una lista perezosa de números primos (el límite está en la implementación actual de Linq que es más o menos 2^29).

Implementar una función en C# que devuelva si un número pasado por parámetro es primo pero usando expresiones lambda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Aplicando directamente la definición de número primo (véase http://es.wikipedia.org/wiki/N%C3%BAmero_primo). 
// "Un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos: él mismo y el 1" 
Func<int, bool> isPrime = n => Enumerable.Range(1, n).Where(z => n % z == 0).Count() == 2; 
 
// Para obtenerlos todos perezosamente, podemos usar directamente una enumeración: 
var allPrimes = Enumerable.Range(2, int.MaxValue >> 1).Where(isPrime); 
 
 
 
 
 
// Por ejemplo: 
foreach(var p in allPrimes.Take(10)) 
    Console.WriteLine(p); 
3 comentarios
0votos

Escrito por Jaume González hace 5 años

Muchas gracias por tu aportación Jose Juan, aun me queda mucho por aprender de LINQ, propuse el ejercicio para ver como se iba resolviendo y naturalmente tu solución es mejor.

No obstante comentar que te aseguro que he comprobado que la solución con LINQ es más rápida, aunque ciertamente no le veo la lógica.
1votos

Escrito por josejuan hace 5 años

@Jaume, mi solución no tiene porqué ser necesariamente mejor, únicamente es diferente, de hecho, es muy deficiente, porque aplica literalmente la definición.

La ventaja en este caso, es que está escrita con la idea que presenta el desafío.

En cuanto a la eficiencia, ya digo que debe ser el mismo algoritmo, en C#, un código imperativo adhoc siempre va a ser al menos tan eficiente como otro genérico.

Por ejemplo, los dos siguientes códigos no tienen porqué ser iguales:

// Coste O(n)
int Suma = 0, n;
for(n = 1; n < 100; n++)
  Suma += n;

// ¡Podría tener coste O(1)! (depende de la implementación de Linq)
Enumerable.Range(1, 100).Sum();


:)
1votos

Escrito por Jaume González hace 5 años

Gracias por la aportación.
Quería votarte pero no puedo porque aun no tengo 5 puntos.

Saludos

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.