だから私は単に与えられた数のすべての除数を見つけたいのです(数自体を除いて)。現在、私はこれを持っています:
public static List<int> proper_divisors(int x)
{
List<int> toreturn = new List<int>();
toreturn.Add(1);
int i = 0;
int j=1;
int z = 0;
while (primes.ElementAt(i) < Math.Sqrt(x))
{
if (x % primes.ElementAt(i) == 0)
{
toreturn.Add(primes.ElementAt(i));
toreturn.Add(x / primes.ElementAt(i));
j = 2;
z = (int)Math.Pow(primes.ElementAt(i), 2);
while (z < x)
{
if (x % z == 0)
{
toreturn.Add(z);
toreturn.Add(x / z);
j++;
z = (int)Math.Pow(primes.ElementAt(i), j);
}
else
{
z = x;
}
}
}
i++;
}
toreturn = toreturn.Distinct().ToList<int>();
return toreturn;
}
ここで、primesは素数のリストです(正しく、十分に大きいと仮定します)。このアルゴリズムは、すべての素因数を検出するという意味で機能しますが、すべての素因数を検出するわけではありません(つまり、34534を指定すると、{1,2,17267,31,1114}を返しますが、62は組み合わせであるため、{62、557}を見逃します。したがって、557も見逃します。
また、数の素因数を取得しようとしましたが、それをすべての正しい組み合わせのリストに変換する方法がわかりません。
そのアルゴリズムのコードは次のとおりです。
public static List<int> prime_factors(int x)
{
List<int> toreturn = new List<int>();
int i = 0;
while (primes.ElementAt(i) <= x)
{
if (x % primes.ElementAt(i) == 0)
{
toreturn.Add(primes.ElementAt(i));
x = x / primes.ElementAt(i);
}
else
{
i++;
}
}
return toreturn;
}
最初のものを修正する方法、または2番目のものから組み合わせのリストを作成する方法についてのアイデアはありますか(私はそれがより速いのでそれを好むでしょう)?