Live data from Hacker News

Divisibility by 7 is a Walk on a Graph - how does it work?

blog.tanyakhovanova.com

1–10 of 19 posts

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#3

Divisibility by any n is a walk on a graph with n nodes, each one representing one of the modulus equivalence classes 0 .. n-1.

And there are graphs going either way, either starting from most or least significant digit. (Take previous modulus, *10 mod N, + next digit mod N), or (Take previous modulus, + 10^(next digit) mod N)

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#4
This graph is just deterministic finite automaton[1] with some fancy rules to make it easier to remember and to draw less arrows. What this proves is that that when you look at natural numbers as a words over {0, 1, ..., 9} alphabet, numbers divisible by 7 form a regular language[2]. This method generalizes to divisiblity by any number, not just 7, though it requires some cunning to come up with a nice way of representing the DFA like in OP's post, without tens or hundreds of arrows.

Another cool thing in this is that existence of such graph implies existence of a regular expression testing divisibility by 7. Indeed, it's easy to check divisibility by 2 or 5 using regular expressions, it's /^.[star](0|2|4|6|8)$/ and /^.[star](0|5)$/, where [star] means star operator (HN markup changes it to italics). It's a bit less clear how to construct similar regular expression for 7, but if follow closely the proof of equivalence between regular languages and languages recognizable by finite state automata, you can reconstruct the regular expression checking the divisibility by 7 from OP's graph.

[1] - http://en.wikipedia.org/wiki/Deterministic_finite_automaton [2] - http://en.wikipedia.org/wiki/Regular_language

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#5
jowair already said this [1], but here's a less concise explanation:

The black arrows implement the operation of adding one mod 7, the white arrows implement the operation of multiplying by ten mod 7. The decimal expansion of a number tells you how to build it out of the operations of adding 1 and multiplying by 10, for example, to get 321, start at 0 and then do the operations +1, +1, +1, x10, +1, +1, x10, +1. Of course, if you do the operations mod 7, by following the arrows in the graph, instead of getting your number you get its residue mod 7.

[1]: http://news.ycombinator.com/item?id=3909866

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#6
You asked "how does it work?" so let me answer that. How it works:

Okay, so the black arrows represent adding one, and the white arrows represent multiplying by ten. The circle that you see represents the fact that after we hit 7 when adding by one, we "loop around" to 0 again, because 7 has remainder 0 when divided by 7.

So we are constructing (in their example) 325 by saying:

    Instruction     | Number | Remainder
    start with 0.   |    0   |  0
    add 3.          |    3   |  3
    multiply by 10. |   30   |  2
    add 2.          |   32   |  4
    multiply by 10. |  320   |  5
    add 5.          |  325   |  3
Now the only thing you really need to know is that "multiply by 10" is only a function of the current remainder, it can never depend on the rest of the digits we've processed before in any other way.

To see this, just write out the number. The number is 7 k + r for some remainder r. Multiplying by 10 produces 70k + 10 r. Taking the remainder when you divide by 7 is just... (10 r) % 7, because the first term is divisible by 7. So you only need to keep track of the remainder.

In fact, 10 r is really 7r + 3r, and the 7r is also divisible by 7, which means that the white arrows really just multiply by 3. That is why 0 maps to 0, 1 maps to 3, 2 maps to 6, and 3 maps to 9 % 7 == 2.

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#7
post #4

This graph is just deterministic finite automaton[1] with some fancy rules to make it easier to remember and to draw less arrows. What this proves is that that when you look at natural numbers as a words over {0, 1, ..., 9} alphabet, numbers divisible by 7 form a regular language[2]. This method generalizes to divisiblity by any number, not just 7, though it requires some cunning to come up with a nice way of represe…

Great comment. Am I the only person waiting for someone to provide the regular expression intimated at above?

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#8
post #7
post #4

This graph is just deterministic finite automaton[1] with some fancy rules to make it easier to remember and to draw less arrows. What this proves is that that when you look at natural numbers as a words over {0, 1, ..., 9} alphabet, numbers divisible by 7 form a regular language[2]. This method generalizes to divisiblity by any number, not just 7, though it requires some cunning to come up with a nice way of represe…

Great comment. Am I the only person waiting for someone to provide the regular expression intimated at above?

I've written out the Regex for divisibility by 3 before, it's a bit of a beast. I've had a blog post half-finished for ages where I talked about just this thing, but I never got around to actually computing the re for divisibility by 7. Maybe this will provide the impetus...

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#9
Would this help solve the ITA Software "luck sevens" puzzle? (http://www.itasoftware.com/careers/puzzle_archive.html) I never understood how to do that one except by brute force.

"Write a program to compute the sum of all the integers between 1 and 10^11 both divisible by seven and, when the decimal digits are reversed, are still divisible by seven."

Re: Divisibility by 7 is a Walk on a Graph - how does it work?

#10
post #7
post #4

This graph is just deterministic finite automaton[1] with some fancy rules to make it easier to remember and to draw less arrows. What this proves is that that when you look at natural numbers as a words over {0, 1, ..., 9} alphabet, numbers divisible by 7 form a regular language[2]. This method generalizes to divisiblity by any number, not just 7, though it requires some cunning to come up with a nice way of represe…

Great comment. Am I the only person waiting for someone to provide the regular expression intimated at above?

On HN: http://news.ycombinator.com/item?id=1859007

I also found a solution on stackoverflow: http://codegolf.stackexchange.com/questions/3503/hard-code-g...

Post reply on HN