存储素数列表<long>

时间:2015-10-10 16:18:36

标签: c# .net prime-factoring

我正在编写一个程序来计算Prime因子,我需要下一个素数来查看我的输入数是否可以被整除。素数列表,直到足够大的数字,是已知的。 Example

我的问题是,在我的C#代码中存储前10,000个素数列表并在计算素数因子时使用它是好还是坏?

2 个答案:

答案 0 :(得分:1)

您可以存储偏移量:

如果您的素数是:2,3,5,7,11,13,17,19,23,29,31,37,41,43

那么你的偏移量将是(基数= 2):0,1,1,2,2,3,2,4,2,4,6,2,6,4,2 ......

基本上,偏移量只是列表中素数与下一个素数之间的差值。从数学上讲,我不确定这是否真的可以节省太多空间,但值得研究。您很可能使用较小的数据类型来覆盖相同的数字空间。

这是关于&#34;黄金差距&#34;的有趣读物。这表明素数的差异在非常大的素数中保持相对较小:https://en.wikipedia.org/wiki/Prime_gap

如果您只存储10,000个素数,这是毫无意义的。只需存储或计算它们。

答案 1 :(得分:1)

我要做的是创建一个布尔函数,该函数可以返回一个布尔值,具体取决于该值是否为PrimeNumber。

private bool IsPrimeNumber(int value)
{
    for(int i = 2; i < value; i++)
    {
        if(value % i == 0)//If the remainder of "value" divided by "i" is equal to 0.
        {
            return false;
        }
    }
    return true;
}

然后我会创建一个确定值的所有素因子的函数。

private int[] primefactors(int value)
{
    if (value < 0)
    {
        throw new Exception("Value can't be less than 0.");//Make sure value is not less than 0.
    }
    List<int> primefactors = new List<int>();
    for(int i = 2; i < value; i++)
    {
        if (value % i == 0 && IsPrimeNumber(i))//If the remainder of "value" divided by "i" is equal to 0 and "i" is a prime number.
        {
            factors.Add(i);
        }
    }
    return primefactors.ToArray();
}