A computer receives a series of binary digits (1s and 0s) representing a large number. Devise an algorithm that can decide after each bit if the number accumulated so far is divisible by 5. You cannot simply divide by 5 because you do not have infinite storage to store the incoming bit stream.
Source: 1. Emanuel Manasci, citing a past interview question. 2&3. Original Extensions.
First is an algorithmic approach, to verify the proper remainder as each bit is received. Jim Gillogly's summary is similar to many others':
Part 1: Algorithm: Accumulate current value of N mod 5, noting that 2^n mod 5 cycles through 1, 2, 4, 3 in a repeating sequence. We can count 1, 2, 4, 3, 1, ... with (2 * n) mod 5. 1. Initialize next = 1, mod = 0 2. b = Incoming bit If (b == 1) mod = (mod + next) % 5 next = (2 * next) % 5 if (mod == 0) print "Divisible by 5." else print "Not divisible by 5." go to 2 Part 2: This is easier: as we add a low bit we double the accumulated remainder (mod 5). 1. Initialize mod = 0 2. b = incoming bit mod = (mod * 2) % 5 if (b == 1) mod = (mod + 1) % 5 if (mod == 0) print "Divisible by 5." else print "Not divisible by 5." goto 2 Part 3: Yes. In each case above we can replace 5 with the target divisor (10, 13, 100, etc.) and the algorithm still works. It can also be extended to different bases -- for example, one could use this algorithm to do trial division in a factoring program a word at a time, in which case the simpler form of Part 2 would suggest doing it from the top.
I think you can keep count of groups of four and add them because 1111 divisible by 5 example 205 1100 1101 12 +13 = 25 dovisible 715 10 1100 1011 2 + 12 + 11 = 25 8155 1 1111 1101 1011 1 + 15 + 13 +11 30 divisible and so on in second case, with the most significant bit received first, you can apply the same rule, but complete with zeros, up to multiply of four: you have to keep an accumulator of 4 bits: example 70 1000 110 put one zero to the last group of three 1000 + 1100 = 8 + 12 = 20 divisible by 5 45 1011 01 1011 + 0100 = 11 + 4 = 15