Day 25
all / 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18 / 19 / 20 / 21 / 22 / 23 / 24 / 25
Merry Christmas everyone, it's December 25th :D
The Christmas Problem is usually supposed to be a quick and concise one, since Eric wants people to spend the holiday with their family. This one is a bit obscured in the jargon, but once you sort through it, the solution ends up being pretty tidy :)
In the end you are exponentiating the number 7 by a given number of times (the
loop count) to get the number you see. So you're solving 7^x = <your number>
...so that's basically a logarithm!
The arithmoi library (which I previously used in problems like Day 13) offers a nice discrete logarithm function, so that's really all we need to use:
type Magic = 20201227
magicGroup :: CyclicGroup Integer Magic
Just magicGroup = cyclicGroup
primBase :: PrimitiveRoot Magic
Just primBase = isPrimitiveRoot magicGroup 7
findSecret :: Mod Magic -> Maybe Natural
findSecret = fmap (discreteLogarithm magicGroup primBase)
. isMultElement
And so our final solution is just (after converting the input numbers to the
Mod Magic
data type)...
day25 :: Mod Magic -> Mod Magic -> Maybe Integer
day52 x y = do
secret <- findSecret x
pure . getVal $ y ^% secret -- exponentiate by the loop count
Merry Christmas to everyone, and happy New Years too. Thank you for reading these reflections, and I hope they have been helpful in some way :) Special thanks to Eric Wastl too for such a great event as always. Until next year!
Back to all reflections for 2020
Day 25 Benchmarks
>> Day 25a
benchmarking...
time 1.997 ms (1.971 ms .. 2.023 ms)
0.998 Rยฒ (0.997 Rยฒ .. 0.999 Rยฒ)
mean 2.042 ms (2.019 ms .. 2.066 ms)
std dev 73.99 ฮผs (63.56 ฮผs .. 100.2 ฮผs)
variance introduced by outliers: 22% (moderately inflated)
* parsing and formatting times excluded