Внедрение решетки эратосфена на 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;
}
Конечно, он генерирует исключение переполнения.