Simple C Hello world because why not #include #include uint64_t thingies[8] = {6067222560, -14845362264, 13980265334, -6589377431, 1710792125, -248465651, 18919901, -588254}; uint64_t extraction(int); int main() { for(int i = 1; i <= 8; i++) { for(int j = 0; j < 2; j++) { putchar((extraction(i) >> (8*(1-j))) & 0xFF); } } return 0; } uint64_t extraction(int point) { uint64_t output=0; uint64_t input=1; const uint64_t stable_input = point; for(int i = 0; i < 8; i++) { output += thingies[i]*input; input *= stable_input; } return output/5040; } When you run it, you get `Hello, besties!` --- I was inspired by [this tsoding video](https://www.youtube.com/watch?v=hmMtQe_mYr0) Ok so I want to just display the text `Hello, besties!`, now I actually started with the standard `Hello world!`, but I settled on a string that's 15 characters long so that I get a nice round number (I also add a line feed at the end) So if I convert the string `Hello, besties!` to hex, I get `48 65 6C 6C 6F 2C 20 62 65 73 74 69 65 73 21`, now to make it a nice round 16 characters, we can append a line feed `0A`. Now how do I represent it in some funky way to obfuscate it? I was playing with the idea of splitting this into two halfs, reinterpreting them as `int`s or `double`s, but both of those options resulted in absurdly large numbers. I ended up splitting the string into eight parts and reinterpreting them as 16bit `int`s. This results in: `18533, 27756, 28460, 8290, 25971, 29801, 25971, 8458` Now what do I do with that? I ended up just placing those numbers on a graph as `y` values for `x` values running from 1 to 8 and fitting a polynomial through that. I get the following polynomial: -(294127 x^7)/2520 + (2702843 x^6)/720 - (35495093 x^5)/720 + (48879775 x^4)/144 - (941339633 x^3)/720 + (998590381 x^2)/360 - (206185587 x)/70 + 1203814 Now I can recover the values by plugging in numbers from 1 to 8. To get around doing division on `int`s, I can multiply through with the `lcm` of all denominators and I just need to remember to divide with it at the end. I can confidently do that, because I built the polynomial in such a way, to get an `int` from it at the end. The `lcm` is 5040, and when I multiply through I get my modified polynomial: -588254 x^7 + 18919901 x^6 - 248465651 x^5 + 1710792125 x^4 - 6589377431 x^3 + 13980265334 x^2 - 14845362264 x + 6067222560 Now I can just store the coefficients in an array, placing them from lowest to highest power to make evaluation a bit simpler for me uint64_t thingies[8] = {6067222560, -14845362264, 13980265334, -6589377431, 1710792125, -248465651, 18919901, -588254}; So to recover my eight starting numbers I can just successively plug numbers from 1 to 8 into the polynomial, remembering I need to divide by 5040 at the end uint64_t extraction(int point) { uint64_t output=0; uint64_t input=1; const uint64_t stable_input = point; for(int i = 0; i < 8; i++) { output += thingies[i]*input; input *= stable_input; } return output/5040; } And then in `main` I read off the numbers one byte at a time, piping the result into putchar int main() { for(int i = 1; i <= 8; i++) { for(int j = 0; j < 2; j++) { putchar((extraction(i) >> (8*(1-j))) & 0xFF); } } return 0; }