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

Algorithm 寻找第一个大于N的数,它是M的相对素数,algorithm,numbers,integer,primes,greatest-common-divisor,Algorithm,Numbers,Integer,Primes,Greatest Common Divisor,基本上,标题说明了一切。数字不是太大(N的最大值是~2/3*max(long),max M是max(long)),因此我认为即使是我目前拥有的一个简单解决方案也足够了。M总是大于N 我目前拥有的: 最简单的方法是,从N+1开始,执行普通的欧几里德GCD,如果它返回1,我们就完成了,如果不增加,再试一次 我想知道这个解决方案的最坏情况是什么。性能不是一个大问题,但我仍然觉得必须有更好的方法 谢谢 关于最坏的情况,我做了一个小测试: Random r = new Random(); while

基本上,标题说明了一切。数字不是太大(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)更精确的答案

我不知道最坏的情况是什么,但利用M<264这一事实,我可以将其上限限制为292次迭代,下限限制为53次(消除了N/M近似固定的限制)

设p1,…,pk是大于或等于5的素数,其中M是可除的。让我们≥ N为最小整数,使得N'=1模6或N'=5模6。对于每个i=1,…,k,素数pi最多除以整数N',N'+6,N'+12,…,N'+288的ceil(49/pi)。上界∑i=1,…,k细胞(49/pi)为∑i=3,…,16 ceil(49/qi)=48,其中q是从q1=2开始的顺序的素数。(这是因为∏i=3,…,17≥ 264意味着M是除2和3之外最多14个不同素数的乘积。)我们得出结论,所提到的整数中至少有一个与M相对素数

对于下界,设M=614889782588491410(前十五个素数的乘积),N=1。1之后,相对于前15个素数的第一个整数是第16个素数,53

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

确保它不是O(n),通过知道素数间隔是logen,我们可以简单地说您的算法最多有logen迭代(因为在传递最多logen数后,您将看到相对于给定数的新素数
n
),以了解有关此间隔的更多详细信息,你可以看到

因此,对于有界情况,它小于logen=loge264