找到大于N的第一个数字,它是M的相对素数

时间:2012-02-01 10:30:32

标签: algorithm numbers integer primes greatest-common-divisor

基本上,标题说明了一切。数字不是太大(N的最大值是~2 / 3 * max(长),最大M是max(长)),所以我认为即使是一个简单的解决方案,我现在已经足够了。 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)有更准确的答案。

2 个答案:

答案 0 :(得分:4)

我不知道最糟糕的情况,但使用的事实是M< 2 64 ,我可以通过292次迭代将其限制在上面,然后将其限制为53次(取消N / M比率近似固定的限制)。

设p 1 ,...,p k 是大于或等于5的素数,M可以被整除。令N'≥N是最小整数,使得N'= 1 mod 6或N'= 5 mod 6.对于每个i = 1,...,k,素数p i 最多除以ceil (49 / p i )整数N',N'+ 6,N'+ 12,...,N'+ 288.Σ i = 1的上限,..., k ceil(49 / p i )是Σ i = 3,...,16 ceil(49 / q i )= 48,其中q是以q 1 = 2开始的顺序的素数。(这是因为Π i = 3,...,17 ≥2 64 暗示M是除2和3之外最多14个不同素数的乘积。)我们得出结论,所提到的至少一个整数对M来说是相对素数。

对于下界,设M = 614889782588491410(前十五个素数的乘积)并且让N = 1.在1之后,对前十五个素数相对素数的第一个整数是第十六个素数,53。

我希望在没有太多工作的情况下可以改善两个界限,尽管我不清楚目的是什么。对于上限,分别处理2和3都是M的除数的情况,因为M可以是最多 13 其他素数的乘积。对于下限,人们可以尝试通过运行Eratosthenes筛来找到一个好的M,以计算一系列整数,这些整数除以这些整数。然后在整个范围内扫过一个窗口;如果窗口中不同质数的乘积太大,则推进窗口的尾端;否则,提前领先。

答案 1 :(得分:1)

当然不是O(n),通过知道素数间隙是log e n,我们可以简单地说你的算法最多只能记录 e n次迭代,(因为在通过最多log e n数字之后你会看到新的素数,这是对你的给定数字n的最重要的尊重),关于这个差距的更多细节,你可以看到{{3} }。

因此,对于你的有界情况,它小于log e n = log e 2 64 < = 44并且它会更小比44次迭代。