```On 25.07.2009 12:14, David A. Black wrote:
> Hi --
>
> On Sat, 25 Jul 2009, Lloyd Linklater wrote:
>
>> I am writing a little thing to find all the prime numbers to a million.
>> I got it to work this way:
>>
>> highestPrime = 1_000_000
>> primes = Array.new(highestPrime, true)
>>
>> currentNum = 3
>> while currentNum < highestPrime do
>>  (currentNum*currentNum).step(highestPrime, currentNum * 2) { |i|
>> primes[i] = false }
>>  currentNum += 2
>>  while primes[currentNum] == false do
>>    currentNum += 2
>>  end
>> end
>>
>> I am unhappy with using currentNum += 2 twice.  I very much want to
>> write something like this:
>>
>> while currentNum < highestPrime do
>>  (currentNum*currentNum).step(highestPrime, currentNum * 2) { |i|
>> primes[i] = false }
>>  currentNum += 2 until primes[currentNum] == true
>> end
>>
>> but that just hangs the program.  What am I missing?
>
> When you do:
>
>    statement until condition
>
> statement isn't executed at all unless condition is true. Since
> primes[3] is false, the incrementation never takes place.
>
> You can guarantee that the body of an until statement gets executed at
> least once by doing it like this:
>
>    begin
>      num +=2
>    end while primes[num]

begin
num += 2
end until primes[num]

?  At least that would be a direct translation of the original

currentNum += 2
while primes[currentNum] == false do
currentNum += 2
end

> There's another issue here, though. Since the default value for
> non-existent array values is nil, the test for truth will fail even if
> num has gone over the maximum. So you might want to flip the logic:

There's yet another issue: the limit highestPrime is not honored during
the incrementation of current_num which likely leads to the hanging
which I assume is in fact an endless loop.

The whole looping construction looks suspicious though: there is an
outer loop and two inner loops of which I am not sure they align
properly.  Lloyd, I believe you should reevaluate your logic.  This
reminds me of Eratosthenes' Sieve but your code is different.

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

```