public class Atkin_Algo : IEnumerable<ulong>
{
private List<ulong> primes;
private ulong limit;
public Atkin_Algo(ulong _limit)
{
limit = _limit;
primes = new List<ulong>();
}
public IEnumerator<ulong> GetEnumerator()
{
if (!primes.Any())
Find_Primes();
foreach (var p in primes)
yield return p;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private void Find_Primes()
{
var is_prime = new bool[limit + 1];
var sqrt = Math.Sqrt(limit);
for (ulong x = 1; x <= sqrt; x++)
{
for (ulong y = 1; y <= sqrt; y++)
{
var n = 4 * x * x + y * y;
if (n <= limit && (n % 12 == 1 || n % 12 == 5))
{
is_prime[n] ^= true;
}
n = 3 * x * x + y * y;
if (n <= limit && n % 12 == 7)
{
is_prime[n] ^= true;
}
n = 3 * x * x - y * y;
if (x > y && n <= limit && n % 12 == 11)
{
is_prime[n] ^= true;
}
}
}
for (ulong n = 5; n <= sqrt; n++)
{
if (is_prime[n])
{
var s = n * n;
for (ulong k = s; k <= limit; k += s)
{
is_prime[k] = false;
}
}
}
primes.Add(2);
primes.Add(3);
for (ulong n = 5; n <= limit; n += 2)
{
if (is_prime[n])
{
primes.Add(n);
}
}
}
}
所以我的問題是當我想生成一個大的列表我得到OutOfMemoryException這是預期的,但我想能夠解決這個問題。我沒有做任何這樣的事情之前,任何意見將不勝感激。C#素數發生器內存不足
我想避免這個問題的原因是很快就會使用BigInteger類並能夠生成大量素數。
預先感謝您。
什麼是你想要找到素數的限制。 – 2013-05-11 02:07:51
我不會使用阿特金斯,如果它不適用於實際數量有限的數字,但是您並不真正限制自己。這只是一個額外的參數。 – SimpleVar 2013-05-11 02:13:43