基本的にタイトルが全てです。数値が大きすぎない (N の最大値は ~2/3 * max(long) で、最大 M は max(long) です) ので、現在持っている単純なソリューションでも十分だと思います。M は常に N より大きくなります。
私が現在持っているもの:
- 最も単純なのは、N + 1 から始めて、単純なユークリッド GCD を実行し、1 が返された場合は完了です。そうでない場合は、インクリメントして再試行します。
このソリューションの最悪のシナリオを知りたいです。パフォーマンスは大きな問題ではありませんが、それでももっと良い方法があるはずだと感じています。
ありがとう。
最悪のケースについて、私は小さなテストを行いました:
Random r = new Random();
while (true)
{
long num = (long) r.Next();
num *= r.Next();
f((long)(num * 0.61), num);
}
...
public static int max;
public static int f(long N, long M)
{
int iter = 0;
while (GCD(N++, M) != 1)
{
iter++;
}
if (iter > max)
{
max = iter;
Console.WriteLine(max);
}
return 0;
}
約 30 分間実行され、これまでの最悪のケースは 29 回の反復です。したがって、O(N) よりも正確な答えがあると思います。