Fun maths, especially computing the inverse of 25 in Z/65536Z!<p>As the article mentions, you need a slightly different calculation in the period between 45 BC and 1582 AD -- the rule about 400 didn't exist in the Julian calendar in force then. Before 45 BC, and in non-Roman-based calendars, it gets even more complicated with intercalary months and postponing New Year's and such.<p>But surely in all but the tiniest fraction of cases, you only care about years after 1582, and years that are no more than a few centuries in the future. There are only 223 leap years from 1582-2500 (I checked with ChatGPT so that number must be right!) A binary search of an ordered 223-item list would require at most 8 comparisons, and if you don't mind a little more space, you could just store all 919 of those years in a list and look up the answer directly. Wouldn't either be faster than any of these methods (and clearer)?
Does a compiler use special cases for division by two (and other integers as well) that it implements as single bitwise operations? This seems like a lot of work to scan through all mathematical operations. Is that why compiling code takes so long sometimes?
I tried implementing the four versions:<p>16bit: <a href="https://gcc.godbolt.org/z/6G38YxcGr" rel="nofollow">https://gcc.godbolt.org/z/6G38YxcGr</a><p>32bit: <a href="https://gcc.godbolt.org/z/vEzf9h1jo" rel="nofollow">https://gcc.godbolt.org/z/vEzf9h1jo</a><p>I thought it's interesting how "div" is used in 16bit versions, whereas for 32bit versions the compiler optimized all of them to use only imul.