rename statics/euler and sync b93 code with main repo
This commit is contained in:
30
www/statics/euler/Euler_Problem-066_explanation.md
Normal file
30
www/statics/euler/Euler_Problem-066_explanation.md
Normal file
@@ -0,0 +1,30 @@
|
||||
Okay I admit this one took me five days to complete (with two days pause in between, because of I kinda got frustrated).
|
||||
|
||||
I needed eight numbers that were too big for int64 so I encoded them in base-67108864 (`2^26`).
|
||||
The reason for this specific number (and I had to fail first to see the problem with bigger bases) is that the biggest calculation I do is `D_0 * D_0 * D * 1`.
|
||||
Which is maximally `2^26 * 2^26 * 2^10` which fits *barely* in an signed 64-bit integer.
|
||||
|
||||
Also I needed to first write code to multiply two numbers, both in base-67108864 and both bigger than `2^63`. Let me tell you that was no fun and long-addition is far easier to implement than long-multiplication.
|
||||
Especially after first I did everything wrong and then had to redo it :/
|
||||
|
||||
The first running version of this program was full of debug statements (even more than normally) and had a size of 200x60. (You can look at it, it's the `Problem-066 (annotated)` file).
|
||||
But after that I managed to shrink it quite a bit :D I even *(barely)* managed to fit it in the 80x25 restriction.
|
||||
I have the feeling I've gotten pretty good at compacting my programs...
|
||||
|
||||
But back to the interesting stuff, how did I solve this one:
|
||||
|
||||
I can' really explain everything in detail here, so I give you a few useful links:
|
||||
|
||||
- [https://en.wikipedia.org/wiki/Diophantine_equation](https://en.wikipedia.org/wiki/Diophantine_equation)
|
||||
- [https://en.wikipedia.org/wiki/Pell's_equation](https://en.wikipedia.org/wiki/Pell%27s_equation)
|
||||
- [https://en.wikipedia.org/wiki/Generalized_continued_fraction](https://en.wikipedia.org/wiki/Generalized_continued_fraction)
|
||||
- [http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/cfINTRO.html#section9.4](http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/cfINTRO.html#section9.4)
|
||||
|
||||
If you want to have the `(x|y)` solution for a number D:
|
||||
|
||||
- First you calculate the continuous fraction of `sqrt(D)`
|
||||
- For the continuous fraction you calculate the convergents `hi / ki` (read the link about Pell's equation)
|
||||
- Now you just test if `hi` and `ki` are solutions, if not go on to the next convergent pair
|
||||
|
||||
In the end the algorithm is really not that complex (around 30 lines in C#) but all the numbers get so big - and you need to multiply and add the already big numbers together so you get even bigger immediate values.
|
||||
So on a last note I could say ... I wished the numbers in befunge were unlimited.
|
||||
Reference in New Issue
Block a user