Ruby에서 소수를 찾아 보았습니다. (엘라토스테네스의 체)

6805 단어 루비algorithm

소수의 정의



이하, Weblio 사전: 소수로부터 인용.

1과 자신 이외에는 약수를 가지지 않는 양의 정수. 1은 소수에 포함되지 않습니다.

엘라토스테네스 체


  • 2에서 숫자를보고 소수를 찾으십시오,
  • 소수의 배수는 소수가 아니기 때문에 소수가 나타날 때마다 배수는 소수가 아니라고 결정합니다.
  • 찾은 소수에서 볼 때 찾은 소수보다 큰 소수를 찾습니다.
  • 2.와 3.의 동작을 반복한다.

  • 이상의 공정에서 소수를 찾아내는 것을 エラトステネスのふるい라고 합니다.
    표가 실려 있는 사이트를 알기 쉽기 때문에 이하를 소개해 둡니다.
    여기입니다. (엘라토스테네스의 체)

    구현



    eratosthenes_sieve.rb
    def eratosthenes_sieve(num)
      # nums = Array.new(num, true)
      nums = [*0...num]
      primes = []
      k = 2 # 0, 1 aren't  prime-nums
      while k*k<=num
        for i in k..num/k
          nums[k*i] = nil
        end
        k += 1
        while !nums[k]
          k += 1
        end
      end
    =begin
      primes = nums.each_with_index.select {|num, index| index if num}
      primes.clone.each_with_index do |prime, index|
        primes[index] = prime[1]
      end
      primes
    =end
      nums.compact[2...nums.size]
    end
    
    num = rand(100)
    prime_nums = eratosthenes_sieve(num)
    p "num: #{num}" # "num: 53"
    p "prime_nums: #{prime_nums}" # "prime_nums: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]" 
    

    덤 (Ruby의 nil 체크?)



    코딩 중에 "응???"라고 생각하는 것이있었습니다.
    문제 부분은 다음과 같습니다.
    primes << i if nums[i] = true
    

    이 문장은, 우연히 if nums[i] == true 라고 쓰고 싶었던 것을 실수해 버린 일문입니다. 하지만 이것이라도 다녔습니다. 나제일까...라고 신기하게 생각해 여러가지 시험해 보았습니다.
    a = 'test'
    p a # "test"
    p a if a = 'change' # "change"
    

    아, if 의 조건식에 배치한 a = 'change' 가 영향해 "change" 이 출력되고 있다!

    어쩌면 swift if let와 비슷한 nil 체크와 같은 기능을 수행하는 것이 아닌가! 라고 생각했습니다.
    a = nil
    p a # nil
    p 'hogehoge' if b = a # nil
    a = 'test'
    p 'hogehoge' if b = a # "hogehoge"
    

    오 역시 그럴까!
    그러나...
    a = 'test'
    p b if b = a
    

    이렇게하면 b는 변수를 모르겠다고 말해 버렸습니다.
    a = 'test'
    if b = a
      p b # "test"
    end
    

    이것이라면 괜찮습니다. Ruby if의 원 라이너로 쓰는 방법 중 내용을 앞으로 가져올 경우는 이 nil 체크는 사용할 수 없는 것 같네요.

    nil 체크라는 단어가 올바른지 어떤지는 확실하지 않습니다. 누군가 아시면 이런 동작의 명칭을 가르쳐 주시면 발광합니다

    좋은 웹페이지 즐겨찾기