Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 素数算法是最小模运算吗_C#_Algorithm - Fatal编程技术网

C# 素数算法是最小模运算吗

C# 素数算法是最小模运算吗,c#,algorithm,C#,Algorithm,我需要做一个算法来检查一个数是否是素数,并进行最小模检查。我需要尽可能低的模运算 static int counter = 0; static bool isPrime(double n) { if (n <= 1) { return false; } if (n <= 3) { return true; } counter += 2; if (n % 2 ==

我需要做一个算法来检查一个数是否是素数,并进行最小模检查。我需要尽可能低的模运算

   static int counter = 0;

    static bool isPrime(double n)
    {

            if (n <= 1) { return false; }
            if (n <= 3) { return true; }

            counter += 2;
            if (n % 2 == 0 || n % 3 == 0) { return false; }

            for (int i = 5; i * i <= n; i = i + 6)
            {

            counter += 2;
                if (n % i == 0 || n % (i + 2) == 0)
                {
                    return false;
                }
            }
            return true;
        }

即使我真的不理解你的问题,你也可能想看看Zoran Horvat的以下内容

该网站提供了一个很好的分析如何测试一个数是一个素数。除了提供的链接外,该网站还包含更多关于同一主题的内容

这是代码片段,请查看链接以了解更多信息

static bool IsPrime(int n)
{
    bool result = false;

    if (n <= 3)
    {
        result = true;
    }
        else if (n % 2 != 0 && n % 3 != 0)
    { 
        int k = 5;
        int step = 2;

        while (k * k <= n && n % k != 0)
        {
            k = k + step;
            step = 6 - step;
        }

        if (n == k || n % k != 0)
            result = true;

    }

    return result;    
}
希望这有帮助。快乐编码

附言:


第一个问题是这个问题非常不清楚。让我澄清一下

该算法通过执行如下除法测试来测试素性:

被2整除 被3整除 现在我们进入一个循环,检查5和7,然后检查11和13,然后检查17和19,然后检查23和25,依此类推,直到被测数字的平方根。 这个算法很聪明,因为它跳过了对所有偶数的检查,这些偶数已经通过查看2的整除性进行了检查,也跳过了对奇数的所有除法,如9、15、21等等

问题是它确实检查了25个,即使已经检查了5个。它还将检查35个,尽管已经检查了5个和7个

使用该算法,您所能做的最好的事情就是仅通过素数进行整除性检查。这就是这些神秘数字的来源:

1009-11型、10091-25型、100913-66型

小于1009的平方根时,有11个主要因素需要测试。有25个基本因子要测试,小于10091的平方根,以此类推

解决方案是预先计算一个小素数表,不管你需要多少。比如说一千。您可以花任意多的时间,因为您只需花一次时间,然后将其放入您的程序中:

int[] primes = { 2, 3, 5, 7, 11, 13, 17, ... }
现在你的算法非常简单:

运动我为什么投到长


练习primes数组必须有多大才能确保每个可能的输入都给出正确的答案而不抛出?如果n是长的而不是int,那么有多少呢?提示:使素数小于一个数的函数称为素数计数函数;你知道吗?

我需要尽可能低的模运算。你怎么会认为你还没有呢?我甚至不明白他的问题你需要一张素数表。例如,floorsqrt10091是100,正好有25个素数小于100。所以要最小化模运算的数量,首先需要找到所有的素数。这可以用。不应该使用平方根。检查p>sqrtn是否为p*p>n的最快方法,但要注意溢出!1是的,继续使用sqrt。2您已经有6n+1和6n-1的代码;你已经发现它不起作用了。你只需要检查素数。我也在上面写了一些东西。本文主要关注如何对这样的操作执行多线程处理,但也讨论了5种左右的方法。我避免谈论更多的数学部分,因为我自己并不完全理解这些符号。你所知道的是使用6号轮子。这为模运算的数量提供了不错的优化,但并没有提供OP所寻求的绝对最小值。
static class Extensions {
  public static bool IsPrime(this int n)
  {
    if (n <= 1) return false;
    foreach(int prime in primes)
    {
        if (prime * (long)prime > (long)n) return true;
        if (n % prime == 0) return false;
    }
    throw new Exception("primes array is too small!");
  }
}