方針
以下の手順を踏むと素因数分解することができます。
- 整数nを以下の素数で小さい方から割れるまで割る
- 値が1以外ならそれも素因数とする
- 割った素数とその回数を素因数として出力する
コード
public static Dictionary<long, long> PrimeFactorization(long n) { var result = new Dictionary<long, long>(); for (long i = 2; i * i <= n; i++) { if (n % i != 0) continue; long exponents = 0; // 割り続ける while (n % i == 0) { exponents++; n /= i; } result[i] = exponents; } // 素数が残っている場合 if (n != 1) result[n] = 1; return result; }
使い方
static void Main(string[] args) { var n = 12; var results = PrimeFactorization(n); StringBuilder builder = new StringBuilder($"{n}:"); foreach (var item in results) { for (int i = 0; i < item.Value; i++) builder.Append($" {item.Key}"); } Console.WriteLine(builder.ToString()); // 12 : 2 2 3 }
Dictonary
のKey
が素因数,Value
が数となっています。
さいごに
この計算量を考えてみたところだと思ったのですが、と書いてあるサイトもありました。
おそらく自分が間違っているのは思うのですがわかる方がいらっしゃれば教えてくださると嬉しいです。
ではまた。