基本上,标题说明了一切。这些数字并不太大(N 的最大值为 ~2/3 * max(long),max 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) 更精确的答案。