LINQ ile asal çarpanların bulunması

Asal çarpanların bulunması ile ilgili bir yazı...

Daha önceden asal sayıların bulunması ile ilgili bir yazı hazırlamıştım.

Bu yazıda asal sayıların bulunması yöntemini kullanarak, asal çarpanların bulunmasını göstereceğim:

Az laf çok kod:

public static IEnumerable<int> AsalSayilar()
{
    var ints = Enumerable.Range(2, Int32.MaxValue - 1);
    return ints.Where(x => !ints
                            .TakeWhile(y => y < x)
                            .Any(y => x % y == 0));
}

public static IEnumerable<int> CarpanlariAl(int input)
{
    int first = AsalSayilar()
                .TakeWhile(x => x <= Math.Sqrt(input))
                .FirstOrDefault(x => input % x == 0);
    return first == 0
            ? new[] { input }
            : new[] { first }.Concat(CarpanlariAl(input / first));
}
static void Main(string[] args)
{
    bool ok = true;
    int sayi = 0;

    while (ok)
    {
        Console.WriteLine("Asal çarpanları bulunacak sayıyı giriniz, Çıkış için: Enter.");
        string str = Console.ReadLine();

        ok = int.TryParse(str, out sayi);

        if (string.IsNullOrEmpty(str)) return;

        var carpanlar = CarpanlariAl(sayi);
        carpanlar.ToList().ForEach(Console.WriteLine);
    }
}

Bu da programın çıktısı:

Asal çarpanlar