C# 素数公式

C# 素数公式,c#,math,formula,primes,C#,Math,Formula,Primes,我正在尝试用C语言编写一个素数函数,我想知道下面的代码是否可以工作。它似乎适用于前50个左右的数字。我只想确保无论数字有多大,它都能工作: static bool IsPrime(int number) { if ((number == 2) || (number == 3) || (number == 5) || (number == 7) || (number == 9)) return true; if ((number % 2 != 0) &am

我正在尝试用C语言编写一个素数函数,我想知道下面的代码是否可以工作。它似乎适用于前50个左右的数字。我只想确保无论数字有多大,它都能工作:

static bool IsPrime(int number)
{
    if ((number == 2) || (number == 3) || (number == 5) || (number == 7) || (number == 9))
            return true;

    if ((number % 2 != 0) && (number % 3 != 0) && (number % 5 != 0) &&
        (number % 7 != 0) && (number % 9 != 0) && (number % 4 != 0) &&
        (number % 6 != 0))
        return true;

        return false;
 }
不,这行不通!例如,尝试121=11*11,它显然不是素数

对于给定给函数的任何数字,即素数X1,X2,…,xn的乘积,其中n>=2且所有这些数都大于或等于11,函数将返回true。而且,正如前面所说,9不是素数

从维基百科可以看到:

在数学中,素数或素数是一个自然数,它正好有两个不同的自然数因子:1和它本身

因此,一个非常简单和幼稚的检查数字是否为素数的算法可以是:

public bool CalcIsPrime(int number) {

    if (number == 1) return false;
    if (number == 2) return true;

    if (number % 2 == 0) return false; // Even number     

    for (int i = 2; i < number; i++) { // Advance from two to include correct calculation for '4'
       if (number % i == 0) return false;
    }

    return true;

}
要获得更好的算法,请点击此处:

如果你想检查你的代码,做一个测试,这里有一个测试用例

不,这行不通!例如,尝试121=11*11,它显然不是素数

对于给定给函数的任何数字,即素数X1,X2,…,xn的乘积,其中n>=2且所有这些数都大于或等于11,函数将返回true。而且,正如前面所说,9不是素数

从维基百科可以看到:

在数学中,素数或素数是一个自然数,它正好有两个不同的自然数因子:1和它本身

因此,一个非常简单和幼稚的检查数字是否为素数的算法可以是:

public bool CalcIsPrime(int number) {

    if (number == 1) return false;
    if (number == 2) return true;

    if (number % 2 == 0) return false; // Even number     

    for (int i = 2; i < number; i++) { // Advance from two to include correct calculation for '4'
       if (number % i == 0) return false;
    }

    return true;

}
要获得更好的算法,请点击此处:

如果你想检查你的代码,做一个测试,这里有一个测试用例


这种方法肯定行不通,除非if语句显式枚举0和sqrtINT_MAX之间的所有素数或C等价物


为了正确地检查素数,您基本上需要尝试将您的数字除以每个小于其平方根的素数。该算法是您的最佳选择。

除非您的if语句显式枚举0和sqrtINT_MAX之间的所有素数或C等价物,否则这种方法肯定行不通


为了正确地检查素数,您基本上需要尝试将您的数字除以每个小于其平方根的素数。算法是你最好的选择。

你显然是从一个相反的维度写的,其中9是一个素数,所以我想我们的答案可能对你不适用。但有两件事:

素数生成函数是一个非常重要但令人兴奋的问题,Wikipedia页面是一个很好的开端

来自数字%2=0它跟在数字%4后面=0如果你不能除以10,那么你也不能除以100


你显然是从一个反事实的维度写的,其中9是一个质数,所以我猜我们的答案可能对你不适用。但有两件事:

素数生成函数是一个非常重要但令人兴奋的问题,Wikipedia页面是一个很好的开端

来自数字%2=0它跟在数字%4后面=0如果你不能除以10,那么你也不能除以100

这必须要做

public static bool IsPrime(this int number)
{
    return (Enumerable.Range(1,number).Where(x => number % x == 0).Count() == 2);
}
这必须要做

public static bool IsPrime(this int number)
{
    return (Enumerable.Range(1,number).Where(x => number % x == 0).Count() == 2);
}

素性测试是一条路要走,但如果你想要一个快速和肮脏的黑客,这里有一些东西

如果它的运行速度不够快,您可以围绕它构建一个类,并在每个调用之间存储素数集合,而不是为每个调用重新填充它

    public bool IsPrime(int val)
    {
        Collection<int> PrimeNumbers = new Collection<int>();
        int CheckNumber = 5;
        bool divisible = true;
        PrimeNumbers.Add(2);
        PrimeNumbers.Add(3);

        // Populating the Prime Number Collection
        while (CheckNumber < val)
        {
            foreach (int i in PrimeNumbers)
            {
                if (CheckNumber % i == 0)
                {
                    divisible = false;
                    break;
                }
                if (i * i > CheckNumber) { break; }
            }
            if (divisible == true) { PrimeNumbers.Add(CheckNumber); }
            else { divisible = true; }
            CheckNumber += 2;
        }
        foreach (int i in PrimeNumbers)
        {
            if (CheckNumber % i == 0)
            {
                divisible = false;
                break;
            }
            if (i * i > CheckNumber) { break; }
        }
        if (divisible == true) { PrimeNumbers.Add(CheckNumber); }
        else { divisible = true; }

        // Use the Prime Number Collection to determine if val is prime
        foreach (int i in PrimeNumbers)
        {
            if (val % i == 0) { return false; }
            if (i * i > val) { return true; }
        }
        // Shouldn't ever get here, but needed to build properly.
        return true;
    }

素性测试是一条路要走,但如果你想要一个快速和肮脏的黑客,这里有一些东西

如果它的运行速度不够快,您可以围绕它构建一个类,并在每个调用之间存储素数集合,而不是为每个调用重新填充它

    public bool IsPrime(int val)
    {
        Collection<int> PrimeNumbers = new Collection<int>();
        int CheckNumber = 5;
        bool divisible = true;
        PrimeNumbers.Add(2);
        PrimeNumbers.Add(3);

        // Populating the Prime Number Collection
        while (CheckNumber < val)
        {
            foreach (int i in PrimeNumbers)
            {
                if (CheckNumber % i == 0)
                {
                    divisible = false;
                    break;
                }
                if (i * i > CheckNumber) { break; }
            }
            if (divisible == true) { PrimeNumbers.Add(CheckNumber); }
            else { divisible = true; }
            CheckNumber += 2;
        }
        foreach (int i in PrimeNumbers)
        {
            if (CheckNumber % i == 0)
            {
                divisible = false;
                break;
            }
            if (i * i > CheckNumber) { break; }
        }
        if (divisible == true) { PrimeNumbers.Add(CheckNumber); }
        else { divisible = true; }

        // Use the Prime Number Collection to determine if val is prime
        foreach (int i in PrimeNumbers)
        {
            if (val % i == 0) { return false; }
            if (i * i > val) { return true; }
        }
        // Shouldn't ever get here, but needed to build properly.
        return true;
    }

有一些基本规则可以用来检查一个数是否为素数

偶数出局了。如果x%2=0,则它不是素数 所有非素数都有素数因子。因此,您只需要针对素数测试一个数字,看看它是否会影响
任何数字的最大可能因子是它的平方根。您只需要检查值是否有一些基本规则可以用来检查数字是否为素数

偶数出局了。如果x%2=0,则它不是素数 所有非素数都有素数因子。因此,您只需要针对素数测试一个数字,看看它是否会影响 任何数字的最大可能因子是它的平方根。您只需检查值是否这是一个简单的值

只有奇数才是素数……所以

static bool IsPrime(int number)
{
int i;
if(number==2)
    return true;                    //if number is 2 then it will return prime
for(i=3,i<number/2;i=i+2)           //i<number/2 since a number cannot be 
  {                                     //divided by more then its half
    if(number%i==0)                 //if number is divisible by i, then its not a prime
          return false;
  }
return true;                        //the code will only reach here if control
}                                       //is not returned false in the for loop
这是一个简单的例子

只有奇数才是素数……所以

static bool IsPrime(int number)
{
int i;
if(number==2)
    return true;                    //if number is 2 then it will return prime
for(i=3,i<number/2;i=i+2)           //i<number/2 since a number cannot be 
  {                                     //divided by more then its half
    if(number%i==0)                 //if number is divisible by i, then its not a prime
          return false;
  }
return true;                        //the code will only reach here if control
}                                       //is not returned false in the for loop
有一个很好的代码可以让你为素数生成任何ulong数。但基本上要点如下:

int primesToFind = 1000;
int[] primes = new int[primesToFind];
int primesFound = 1;
primes[0] = 2;
for(int i = 3; i < int.MaxValue() && primesFound < primesToFind; i++)
{
   bool isPrime = true;
   double sqrt = Math.sqrt(i);
   for(int j = 0; j<primesFound && primes[j] <= sqrt; j++)
   {
      if(i%primes[j] == 0)
      {
         isPrime = false;
         break;
      }
   }
   if(isPrime)
      primes[primesFound++] = i;
}
一旦这段代码运行完毕,您的素数将全部在primes数组变量中找到。

有一段很好的代码,可以让您为素数生成任何ulong数。但基本上要点如下:

int primesToFind = 1000;
int[] primes = new int[primesToFind];
int primesFound = 1;
primes[0] = 2;
for(int i = 3; i < int.MaxValue() && primesFound < primesToFind; i++)
{
   bool isPrime = true;
   double sqrt = Math.sqrt(i);
   for(int j = 0; j<primesFound && primes[j] <= sqrt; j++)
   {
      if(i%primes[j] == 0)
      {
         isPrime = false;
         break;
      }
   }
   if(isPrime)
      primes[primesFound++] = i;
}
一旦此代码被删除 运行完的primes将在primes数组变量中找到


这是一个根据您的输入查找素数的简单代码

  static void Main(string[] args)
    {
        String input = Console.ReadLine();
        long num = Convert.ToInt32(input);
        long a, b, c;
        c = 2;
        for(long i=3; i<=num; i++){
            b = 0;
            for (long j = 2; j < i ; j++) {
                a = i % j;
                if (a != 0) {
                    b = b+1;
                }
                else {
                    break;
                }
            }

            if(b == i-2){
                Console.WriteLine("{0}",i);
            }
        }
        Console.ReadLine();
    }

这是一个根据您的输入查找素数的简单代码

  static void Main(string[] args)
    {
        String input = Console.ReadLine();
        long num = Convert.ToInt32(input);
        long a, b, c;
        c = 2;
        for(long i=3; i<=num; i++){
            b = 0;
            for (long j = 2; j < i ; j++) {
                a = i % j;
                if (a != 0) {
                    b = b+1;
                }
                else {
                    break;
                }
            }

            if(b == i-2){
                Console.WriteLine("{0}",i);
            }
        }
        Console.ReadLine();
    }
在不到十分之二秒内从0到100万的素数

刚做完。最后一次测试为0.017秒

普通HP笔记本电脑。2.1千兆赫

当它变大时需要更长的时间。对于10-10亿素数,我的最后一次测试是28.6897秒。在您的程序中可能会更快,因为我正在强制转换类对象以获取我的参数值

方法信息

使用Eratosthenes筛 接受地板和天花板作为参数 使用数组而不是列表以实现快速性能 数组大小根据Rosser Schoenfeld上限初始化 赋值时跳过2、5和7的倍数 最大范围在0和2147483646之间1分钟44.499秒 大量评论 使用

方法

欢迎评论!特别是改进。

质数在不到十分之二秒内从0到100万

刚做完。最后一次测试为0.017秒

普通HP笔记本电脑。2.1千兆赫

当它变大时需要更长的时间。对于10-10亿素数,我的最后一次测试是28.6897秒。在您的程序中可能会更快,因为我正在强制转换类对象以获取我的参数值

方法信息

使用Eratosthenes筛 接受地板和天花板作为参数 使用数组而不是列表以实现快速性能 数组大小根据Rosser Schoenfeld上限初始化 赋值时跳过2、5和7的倍数 最大范围在0和2147483646之间1分钟44.499秒 大量评论 使用

方法


欢迎评论!尤其是改进。

< P>这里,我们必须考虑平方根因子。如果质数不能被任何小于任何近似数的平方根的数整除,则可以验证质数

static bool isPrime(long number) 
{
    if (number == 1) return false;
    if (number == 2) return true;
    if (number % 2 == 0) return false; //Even number     
    long nn= (long) Math.Abs(Math.Sqrt(number));
    for (long i = 3; i < nn; i += 2)  {
       if (number % i == 0) return false;
    }
    return true;
}

这里我们必须考虑平方根因子。如果质数不能被任何小于任何近似数的平方根的数整除,则可以验证质数

static bool isPrime(long number) 
{
    if (number == 1) return false;
    if (number == 2) return true;
    if (number % 2 == 0) return false; //Even number     
    long nn= (long) Math.Abs(Math.Sqrt(number));
    for (long i = 3; i < nn; i += 2)  {
       if (number % i == 0) return false;
    }
    return true;
}


为什么不直接使用%2呢?9可能是。看看你的代表、问题和答案——你在开玩笑吗;不一定,因为任何大于10的素数也需要从接受的答案中检查,例如121=11*11。另外,不需要检查%6,因为它是%2的倍数,而%9是%3的倍数。为什么不使用%2呢?9可能是。看看你的代表、问题和答案——你在开玩笑吗;不一定,因为任何大于10的素数也需要从接受的答案中检查,例如121=11*11。另外,不需要检查%6,因为它是%2的倍数,而%9是%3的倍数。>如果很容易检查一个数字是否为素数,那么我猜RSA不会那么安全实际上,RSA的安全性取决于很容易判断一个数字是否为素数这使得安全密钥生成成为可能,它很难计算出两个素数的乘积,这使得加密更安全。只需测试Math.sqrtnumberReplace前两行,if number&1==0返回number==2;如果编号<9,返回编号>1;正确处理1和负数。为了所有神圣的爱,只测试平方根以内的几率!你为什么要一个一个地前进?从3开始,以2前进!!我想当你将算法提升2时,你可能已经破坏了算法,我还没有测试过,但我认为对于所有偶数,它都会返回true>2>如果很容易检查一个数是否为素数,那么我猜RSA实际上就不会那么安全了,RSA的安全性取决于它很容易判断一个数字是否是素数这使得安全密钥生成成为可能,并且它很难将两个素数的乘积计算出来这使得加密安全。只需测试Math.sqrtNumber就可以用if number&1==0返回数==2替换前两行;如果编号<9,返回编号>1;正确处理1和负数。为了所有神圣的爱,只测试平方根以内的几率!你为什么要一个一个地前进?从3开始,以2前进!!我想当你将算法向前推进2时,你可能已经破坏了算法,我还没有测试过,但我认为对于所有大于2int的偶数,它都会返回true。MaxValue给出int的C max。不,你只需要测试到平方根。@starblue:对于任何特定的数,你都需要测试到平方根,正如我在回答中所说的。对于一个通用函数来说,要处理所有可能的输入,它必须将所有素数编码到其最大可能输入的平方根。显然,如果你真的要这样写的话,不要!!!,你需要它来短路。如果您是在C中使用,可能会使用带有fall-through的反向switch语句。最好只使用

某种程度上来说……如果你将原始海报的方法扩展到包含int,你需要明确列出最高为sqrtINT_MAX的素数。@starblue:正是我想说的…:int.MaxValue给出int的C max。不,你只需要测试到平方根。@starblue:对于任何特定的数字,你都需要测试到它的平方根,正如我在回答中所说的。对于一个通用函数来说,要处理所有可能的输入,它必须将所有素数编码到其最大可能输入的平方根。显然,如果你真的要这样写的话,不要!!!,你需要它来短路。如果你在C语言中使用fall-through,可能会使用一个相反的switch语句。不过最好只使用某种数组……如果你将原始海报的方法扩展到包含int,那么你需要显式列出最高为sqrtINT_MAX的素数。@starblue:正是我想说的…:返回Enumerable.Range1,number.Countx=>number%x==0==2;Linq比方法版本慢得多。我只是用毫秒测试了它:18:162为真,29:1387为假,数字1-10000。但是,是的,至少要展示它是如何做到的:我不知道为什么真的更快。我使用的方法实际上与公认答案中给出的方法相同。不管怎样,这么多有趣的浪费时间。可能是它计算速度的问题。如果小于一毫秒,它就不会得到它。但是linq也是这样。有趣。实际上,我的方法代码只计算sqrt。这可能会有所不同。的确如此。一旦我纠正了这一点,就没有什么区别了。14:24和10:35.return Enumerable.Range1,i/2.Countx=>i%x==0==1;返回Enumerable.Range1,number.Countx=>number%x==0==2;Linq比方法版本慢得多。我只是用毫秒测试了它:18:162为真,29:1387为假,数字1-10000。但是,是的,至少要展示它是如何做到的:我不知道为什么真的更快。我使用的方法实际上与公认答案中给出的方法相同。不管怎样,这么多有趣的浪费时间。可能是它计算速度的问题。如果小于一毫秒,它就不会得到它。但是linq也是这样。有趣。实际上,我的方法代码只计算sqrt。这可能会有所不同。的确如此。一旦我纠正了这一点,就没有什么区别了。14:24和10:35.return Enumerable.Range1,i/2.Countx=>i%x==0==1;IsPrime4的结果是什么?IsPrime4的结果是什么?这与原来的问题没有多大关系。@Teepeemm:我试图用C写一个素数函数,上面的函数是一个素数函数。我没有把它命名为IsPrime,但它也有同样的功能。要确定951是否为素数,请使用GetPrimeArray951951。它写的是951和951之间没有素数。这与原来的问题没有多大关系。@Teepeemm:我想用C写一个素数函数,上面的函数是素数函数。我没有把它命名为IsPrime,但它也有同样的功能。要确定951是否为素数,请使用GetPrimeArray951951。它写到951和951之间没有素数。