Генерация последовательности простых чисел до Long.MaxValue, C # - PullRequest
0 голосов
/ 29 мая 2019

Внедрение решетки эратосфена на C # с использованием массива булен с размером типа long дает исключение переполнения, так как тип массива в c # ограничен максимальным размером 32-разрядного целого числа. Как я понимаю, это потому, что обычно пользователь не может хранить в ОЗУ больше 32-битных целочисленных массивов. Но у нас есть логический тип, который является только 2-битной информацией, поэтому для такого массива требуется значение ram $ 2 * Long.MaxValue $. поэтому вопросы следующие:

1) Как сгенерировать последовательность простых чисел до Long.MaxValue?

2) Какой тип данных лучше использовать для хранения такой последовательности?

3) Можем ли мы переопределить наш собственный тип массива с максимальным размером больше 32 бит?

Моя попытка здесь:

public bool[] MakeSieve(long max)
    {
        // Make an array indicating whether numbers are prime.
        bool[] is_prime = new bool[max + 1];
        for (int i = 2; i <= max; i++) is_prime[i] = true;

        // Cross out multiples.
        for (int i = 2; i <= max; i++)
        {
            // See if i is prime.
            if (is_prime[i])
            {
                // Knock out multiples of i.
                for (int j = i * 2; j <= max; j += i)
                    is_prime[j] = false;
            }
        }
        return is_prime;
    }

Конечно, он генерирует исключение переполнения.

...