Author |
Topic: Modulo 3 and 5 (Read 1402 times) |
|
Barukh
Uberpuzzler
Gender:
Posts: 2276
|
|
Modulo 3 and 5
« on: Apr 6th, 2004, 8:52am » |
Quote Modify
|
This one is not difficult, but may be a candidate for an interview question Propose the implementations for the following functions without using multiplication and division: unsigned modulo_3(unsigned n); unsigned modulo_5(unsigned n);
|
|
IP Logged |
|
|
|
hsp246
Guest
|
The naive solution is to iteratively subtract 3 and 5 until it is smaller that 3 and 5. Is there a better/faster way to do it though?
|
|
IP Logged |
|
|
|
towr
wu::riddles Moderator Uberpuzzler
Some people are average, some are just mean.
Gender:
Posts: 13730
|
|
Re: Modulo 3 and 5
« Reply #2 on: Apr 6th, 2004, 10:17am » |
Quote Modify
|
::for modulo_3, you could add the base 4 digits (using shift, instead of divide). Base 4 should have the same property as base 10 in that the sum of the digits mod 3 is equal to the number mod 3. If you throw out all digits that are 3, then you would be done in 3 steps, I think.. [e]hmm.. actually, it might suffice tho just XOR all the digits.. (or it might not)[/e] (I really ought to work these ideas out on paper first):: [e] while (n > 3) n = (n >> 2) + (n & 3); if (n > 2) n -=3; [/e] [e2] For modulo_5 it's pretty much the same, but with base 16 (Basicly for any modulo a, I'm looking for a base k*a+1 = 2m) while (n > 15) n = (n >> 4) + (n & 15); while (n > 4) n -=5; [/e2]
|
« Last Edit: Apr 6th, 2004, 10:44am by towr » |
IP Logged |
Wikipedia, Google, Mathworld, Integer sequence DB
|
|
|
hsp246
Newbie
Posts: 1
|
|
Re: Modulo 3 and 5
« Reply #3 on: Apr 6th, 2004, 10:41am » |
Quote Modify
|
I see. Using the same idea I think: we can use it on modulo 5 as well, with base 16 ==
|
« Last Edit: Apr 6th, 2004, 10:41am by hsp246 » |
IP Logged |
|
|
|
Barukh
Uberpuzzler
Gender:
Posts: 2276
|
|
Re: Modulo 3 and 5
« Reply #5 on: Apr 6th, 2004, 11:37pm » |
Quote Modify
|
Well done, towr and hsp246! I was thinking about something different in case of mod 5... What about: unsigned modulo_257(unsigned n);
|
|
IP Logged |
|
|
|
towr
wu::riddles Moderator Uberpuzzler
Some people are average, some are just mean.
Gender:
Posts: 13730
|
|
Re: Modulo 3 and 5
« Reply #6 on: Apr 7th, 2004, 3:13am » |
Quote Modify
|
on Apr 6th, 2004, 11:37pm, Barukh wrote:unsigned modulo_257(unsigned n); |
| how about, :: a = 257 << 23; for(int i=0; i < 24; i++) { if (n >= a) n-=a; a >>= 1; } ::
|
« Last Edit: Apr 7th, 2004, 3:13am by towr » |
IP Logged |
Wikipedia, Google, Mathworld, Integer sequence DB
|
|
|
towr
wu::riddles Moderator Uberpuzzler
Some people are average, some are just mean.
Gender:
Posts: 13730
|
|
Re: Modulo 3 and 5
« Reply #7 on: Apr 7th, 2004, 3:36am » |
Quote Modify
|
or (rather better) :: n = (n & 0xff) - ((n >> 8) & 0xff) + ((n >> 16) & 0xff) - (n >> 24); while (n > 256) n += 257; ::
|
« Last Edit: Apr 7th, 2004, 3:37am by towr » |
IP Logged |
Wikipedia, Google, Mathworld, Integer sequence DB
|
|
|
Barukh
Uberpuzzler
Gender:
Posts: 2276
|
|
Re: Modulo 3 and 5
« Reply #8 on: Apr 7th, 2004, 6:19am » |
Quote Modify
|
on Apr 7th, 2004, 3:36am, towr wrote: You've got it towr! It's like a division by 11, isn't it?
|
|
IP Logged |
|
|
|
towr
wu::riddles Moderator Uberpuzzler
Some people are average, some are just mean.
Gender:
Posts: 13730
|
|
Re: Modulo 3 and 5
« Reply #9 on: Apr 7th, 2004, 6:37am » |
Quote Modify
|
Yep.. that's how I found it as well.. Interesting how these things work..
|
|
IP Logged |
Wikipedia, Google, Mathworld, Integer sequence DB
|
|
|
John_Gaughan
Uberpuzzler
Behold, the power of cheese!
Gender:
Posts: 767
|
|
Re: Modulo 3 and 5
« Reply #10 on: Apr 7th, 2004, 6:56pm » |
Quote Modify
|
Does anyone know of a computer that understands base 4? I suppose it would be trivial to translate the function to use base 2. The only bases I have seen computers use are 2, 8, 10, and 16.
|
|
IP Logged |
x = (0x2B | ~0x2B) x == the_question
|
|
|
Barukh
Uberpuzzler
Gender:
Posts: 2276
|
|
Re: Modulo 3 and 5
« Reply #11 on: Apr 13th, 2004, 11:30pm » |
Quote Modify
|
on Apr 7th, 2004, 6:56pm, John_Gaughan wrote:Does anyone know of a computer that understands base 4? I suppose it would be trivial to translate the function to use base 2. The only bases I have seen computers use are 2, 8, 10, and 16. |
| Maybe the following is not exactly what you were asking, but still… A few modern processors (including Intel IA32) have a division unit that actually uses the radix 4 computations for speedup. Already the original Pentium processor with the famous FDIV flaw used this technique. I strongly recommend to read the following paper that gives a very detailed description of both the division method and the flaw.
|
|
IP Logged |
|
|
|
Grimbal
wu::riddles Moderator Uberpuzzler
Gender:
Posts: 7527
|
|
Re: Modulo 3 and 5
« Reply #12 on: May 21st, 2004, 1:10pm » |
Quote Modify
|
on Apr 7th, 2004, 3:36am, towr wrote:or (rather better) :: n = (n & 0xff) - ((n >> 8) & 0xff) + ((n >> 16) & 0xff) - (n >> 24); while (n > 256) n += 257; :: |
| Now, find the smallest n for which it does not work .
|
|
IP Logged |
|
|
|
towr
wu::riddles Moderator Uberpuzzler
Some people are average, some are just mean.
Gender:
Posts: 13730
|
|
Re: Modulo 3 and 5
« Reply #13 on: May 22nd, 2004, 4:56am » |
Quote Modify
|
on May 21st, 2004, 1:10pm, grimbal wrote: Now, find the smallest n for which it does not work . |
| What n wouldn't it work for? (note that n is unsigned)
|
|
IP Logged |
Wikipedia, Google, Mathworld, Integer sequence DB
|
|
|
Grimbal
wu::riddles Moderator Uberpuzzler
Gender:
Posts: 7527
|
|
Re: Modulo 3 and 5
« Reply #14 on: May 22nd, 2004, 8:03am » |
Quote Modify
|
For instance, it doesn't work with 0xff00ff. But that is not the smallest. A small change is needed in the program to fix this.
|
|
IP Logged |
|
|
|
towr
wu::riddles Moderator Uberpuzzler
Some people are average, some are just mean.
Gender:
Posts: 13730
|
|
Re: Modulo 3 and 5
« Reply #15 on: May 23rd, 2004, 7:57am » |
Quote Modify
|
You mean because 255+255 > 256 ? hmm.. I suppose so..
|
|
IP Logged |
Wikipedia, Google, Mathworld, Integer sequence DB
|
|
|
|