C#のLINQを素因数分解に使ってみる

C#LINQ素因数分解に使ってみたのでメモしておく。

因数ごとにグループ化し、グループのメンバー数をCountメソッドで取得/表示する。

各グループは同じ素数なのでどれでもよいのだが今回はFirstメソッドで取得した。

 

/*
    Factoring

    ulong max : 18,446,744,073,709,551,615
    18446744073709551615
*/
using System;
using System.Collections.Generic;
using System.Linq;

namespace MyFactoring
{

    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var list = new List<ulong>();
     ulong num, i;

            Console.WriteLine("Enter ulong number");
            num = ulong.Parse(Console.ReadLine());
     Console.WriteLine("num = {0}", num);

     for ( i=2; i<= num; i++ ){
         while ( num % i == 0 ){
                    list.Add(i);
      num /= i;
  }
     }

            var grps = list.GroupBy(a=>a);
            foreach( var c in grps )
            {
                Console.WriteLine($"{c.First()} - - - {c.Count()}");
            }
        }
    }
}

※コピー&ペーストするとインデントがおかしくなってしまう、なぜ???

 

◎実行例

PS >.\factoring.exe
Enter ulong number
18446744073709551615
num = 18446744073709551615
3 - - - 1
5 - - - 1
17 - - - 1
257 - - - 1
641 - - - 1
65537 - - - 1
6700417 - - - 1

 

以上