이 기능을 구현하는 가장 우아한 방법은 무엇입니까?
ArrayList generatePrimes(int n)
이 함수는 첫 번째 n
소수 (편집 : where n>1
)를 생성하므로 with generatePrimes(5)
를 반환합니다 . (저는 C #에서이 작업을 수행하고 있지만 Java 구현 또는 다른 유사한 언어 (하스켈이 아님)에 만족합니다).ArrayList
{2, 3, 5, 7, 11}
이 함수를 작성하는 방법을 알고 있지만 어제 밤에했을 때 내가 기대했던 것만 큼 멋지지 않았습니다. 내가 생각해 낸 것은 다음과 같습니다.
ArrayList generatePrimes(int toGenerate)
{
ArrayList primes = new ArrayList();
primes.Add(2);
primes.Add(3);
while (primes.Count < toGenerate)
{
int nextPrime = (int)(primes[primes.Count - 1]) + 2;
while (true)
{
bool isPrime = true;
foreach (int n in primes)
{
if (nextPrime % n == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
break;
}
else
{
nextPrime += 2;
}
}
primes.Add(nextPrime);
}
return primes;
}
분명히 비효율적이기를 원하지는 않지만 속도에 대해서는 너무 걱정하지 않습니다. 나는 어떤 방법이 사용되는지 (순진하거나 체 또는 다른 것) 상관하지 않지만, 그것이 어떻게 작동하는지 상당히 짧고 분명하기를 원합니다.
편집 : 많은 사람들이 내 실제 질문에 대답하지 않았지만 응답 해 주신 모든 분들께 감사드립니다. 다시 말해서, 소수 목록을 생성하는 깔끔한 코드를 원했습니다. 나는 이미 여러 가지 방법을 알고 있지만 명확하지 않은 코드를 작성하는 경향이 있습니다. 이 스레드에서 몇 가지 좋은 옵션이 제안되었습니다.
- 원래 가지고 있던 것의 더 좋은 버전 (Peter Smit, jmservera 및 Rekreativc)
- Eratosthenes (starblue) 체의 매우 깨끗한 구현
- 특히 효율적이라고 상상할 수는 없지만 (dfa) Java의
BigInteger
및nextProbablePrime
매우 간단한 코드를 사용하십시오. - LINQ를 사용하여 소수 목록 (Maghis)을 느리게 생성
- 많은 소수를 텍스트 파일에 넣고 필요할 때 읽습니다 (다린).
편집 2 : 여기에 제공된 두 가지 방법과 여기에 언급되지 않은 다른 방법 을 C # 으로 구현했습니다 . 그들은 모두 처음 n 개의 소수를 효과적으로 찾습니다 (그리고 체에 제공 할 한계를 찾는 적절한 방법 이 있습니다).