2012-12-08 4 views
4

나는 상상할 수있는 모든 사이트를 검색했으며, 루비 1.8이 mathn의 Prime 클래스에 소수의리스트를 생성하기 위해 사용하는 기본 알고리즘을 결정할 수 없다. 다음은 100 번 호출 된 succ 메소드의 실행 가능한 버전입니다 (100 번째 소수를 찾으려면). 아무도 이것이 어떻게 작동 하는지를 압니까? http://ruby-doc.org/stdlib-1.8.7/libdoc/mathn/rdoc/Prime.htmlruby ​​1.8 prime succ algorithm

가려 할 미리 정의 된 목록이 없기 때문에 그것은 체 알고리즘처럼 보이지 않는이 어떤 부문 없거나으로,이 시험 분할 알고리즘이 아니다 :

number_of_primes = 100 

seed = 1 
primes = Array.new 
counts = Array.new 


while primes.size < number_of_primes 
    i = -1 
    size = primes.size 
    while i < size 
    if i == -1 
     seed += 1 
     i += 1 
    else 
     while seed > counts[i] 
     counts[i] += primes[i] 
     end 
     if seed != counts[i] 
     i += 1 
     else 
     i = -1 
     end 
    end 
    end 
    primes.push seed 
    counts.push (seed + seed) 
end 

puts seed 

실제 코드는 물론이고 모듈러스 연산. 나는 완전히 엉망이다.

+2

난 당신이 downvotes과 가까운 표를 가지고 왜 문제가 있는지, 매우 명확하지 않다 생각 :

여기에 약간 단순화 및 주석 코드입니다. –

+1

내가 뭔가 어리 석다고/불분명 한 무언가를 게시 한 경우 나는 downvoted 받고 상관 없어. 그러나 downvotes를 던지는 사람들이 왜 내가 그것을 고칠 수 있는지 알려주면 좋을 것입니다. – cycala

답변

5

알고리즘은 Eratosthenes의 체를 기반으로합니다.

seed은 익명 성을 테스트하는 정수입니다. primesseed보다 작은 소수의리스트이고 countsseed보다 큰 해당하는 가장 작은 배수를 유지합니다.

counts은 "다음"넘어온 숫자의 목록으로 생각되지만 소수 당 하나만 지속적으로 업데이트됩니다. 그 다음으로 큰 배수를 찾을 때 정확하게 seed이되면 소수가 아니므로 바깥 쪽 루프를 다시 설정합니다 (i=-1). 우리가 정확히 seed가 발생하지 않고, 더 큰 배수의 목록을 업데이트 한 만

, 우리는 seed 총리는 것을 추론 할 수있다.

number_of_primes = 100 

seed = 1 
primes = [] 
counts = [] 

while primes.size < number_of_primes 
    seed += 1 
    i = 0 
    while i < primes.size  # For each known prime 
    while seed > counts[i] # Update counts to hold the next multiple >= seed 
     counts[i] += primes[i] # by adding the current prime enough times 
    end 
    if seed != counts[i] 
     i += 1 # Go update next prime 
    else 
     i = 0  # seed is a multiple, so start over... 
     seed += 1 # with the next integer 
    end 
    end 
    # The current seed is not a multiple of any of the previously found primes, so... 
    primes.push seed 
    counts.push (seed + seed) 
end 

puts seed 
+0

감사합니다. 귀하의 도움과 귀하의 설명의 명확성에 감사드립니다. 무슨 일이 일어나고 있는지 완전히 이해하는 데는 아직 두 번째가 걸렸지 만 지금은 이해하고 있습니다. – cycala

+0

정말 고마워요! 저는 수년 동안 알고리즘에 대해 궁금해했습니다. 당신의 설명과 함께, 마침내 의미가 있습니다. –