The $5000 Compression Challenge
patrickcraig.co.uk
patrickcraig.co.uk
"I think that I did not make a mistake except to believe that you truly intended to attempt to compress the data I was sending you."
Mike is happily preying upon people by taking their money to enter what he believes is an impossible contest, but the moment he is outsmarted he appeals to morals and calls into question whether Patrick was acting honestly.
I'm guessing there is some backstory on this newsgroup involving people who would claim to invent compression algorithms that do the impossible. I'm imagining that one day Mike thought "time to get these people to put their money where their mouth is."
Still, it's pretty low to pose the challenge without saying "I'm taking this bet because it's highly unlikely that you can actually succeed. This is explained in the FAQ. Are you sure you want to give me $100?"
I've seen such loans proposed often, but I don't know if anyone has ever actually taken one.
The problem is - it would take astronomical computational resources to recreate that program, although there is a very straightforward algorithm to find it - just test out all possible programs starting from 0,1,2,3, and so on...
The file was generated using random data from random.org which gets its randomness by using specially tuned radios to record atmospheric noise.
It is WIDELY agreed upon by people who engage in this activity regularly (known as "prop betting") that the spirit of the law does not matter one bit.
He was way out of his element here and Patrick was well within his rights to do what he did.
Amarillo Slim engaged in these sort of prop bets all the time. Some of the more interesting stories where he "abuses the rules":
* He bet that he could hit a golf ball a mile, "as long as bounces and rolls are allowed... flat ground of course"... When the wager was accepted, he teed off at a frozen pond, where it wasn't that difficult to accomplish.
* Two variations on beating a champion at their own game:
- Slim played Minnesota Fats at pool, "as long as I can provide the cue sticks"... And then beat Fats when they both had to play with broomsticks instead of real pool cues.
- Slim bet that he could beat a very good ping pong player, "as long as I get to pick the rackets"... When the wager was accepted, Slim brought two identical cast iron skillets and let his opponent pick which "racket" he wanted. Without having practiced, his opponent didn't stand a chance. -- Later, someone else approached Slim and wanted to do the same bet. They had heard of the original bet, and had an Asian pingpong champion "ringer". (It seems pitifully obvious to me that Slim wouldn't pull the same trick after the story was out, but apparently this gambler had his Asian ringer practice with a skillet and thought he would be "safe")... For the second bet, Slim used "standard" Coca-Cola bottles, and won again.
If you get to custom write the algorithm for the data you can arrange things so that for this datafile it will be smaller, yet larger for any other file, and still meet the principle.
i.e. this is not actually impossible. If you can find ANY redundancy in the data, and you can code a very small decompresser specifically for that, you can probably win.
And due to the nature of randomness, there are always numeric streaks, and other patterns in the data. The larger the datafile the better the chance of finding some sort of pattern or streak.
The decompresser does not have to be large either - it would be perfectly legal to use a perl script for example. (i.e. so you don't have to use space writing IO handling code).
Edit: I suspect I may be wrong here.
Let's say you have a file of size X. You want to write a program of size Y which will decompress an X-Y-1 sized file back to the original program. Does such a program and file exist for every file of size X?
Using the pigeon hole principle, we can see that it does not. There are 2^X files of size X, but only 2^(X-1) inputs of length Y+X-Y-1. Therefore, not every file can be compressed this way. It doesn't matter what your decompressor is written in or how, you still can't do it.
But now I think I'm wrong because what if you take the new data (i.e. the decompressor plus the compressed data), and try to compress that.
If this were possible, there would be a minimum file size, beyond which further compression were impossible.
I agree, for any specific machine configuration there exist non-compressible files, but I don't think we are so restricted. *Edit, it might also be possible to include in your compression algorithm the logic: change the OS into a state where this file is compressible.
I think that it was an unwritten requirement that it would work on Goldman's computer, and I think even people who say that Patrick's technique was legit would agree with that.
You hardcode it in the decompressor.
Edit: Never mind. If I think of the decompressor as data too, then all I did was flag it at the start of the datastream rather than inline.
Brainstorming I came up with some ideas but those fail at first glance. "Convert it to unicode and utilise all those 0s!", "Find the sequence in Pi, give a Pi generation algo and an offset!"
It'd be interesting to see what people on HN come up with, even if their approaches do not 'win' this challenge.
To me it is clear that Mike Goldman should have paid up. Patrick clearly completed the challenge placed on him.
While Patrick didn't obey the spirit of the challenge he obeyed the law, and Mike knew full well that the spirit of his challenge was impossible!
As the designer of those new rules it was his responsibility to be clear, particularly since he was intending to use that discrepancy to his advantage.
Yeah, Mike was stupid and not exactly nice - but that doesn't mean Patrick wasn't too.
Indeed the fact that the content length was preselected implies some amount of regularity that might be (abused).
Oh well.
Let the compressed file contain a hash (say, SHA1) of the original file. The decompression program then generates random files of the chosen size. If a generated file's hash doesn't match the desired hash, delete it. Now run the program for a very long time. The program is likely to eventually reproduce the original file (along with a bunch of files that happen to have the same hash), and you win :)
That would still take forever...
Mathematically this has non-zero (albeit very small) probability but I'd wager that even having such file it would be unfeasible to find its compressed form. Maybe the file is the third million of bytes of pi squared, but how do you find this fact?
So by the very nature of it if your decompressor is non-zero in length, you have to find some efficiency/tricks to make the file smaller.
Realistically the overhead on the decompressor will be 10 KB and that is before any kind of actual logic, so you are looking at shaving a minimum of 50 KB off of the original file (which is completely random).
So if, for example, 2% of files can actually be reduced in size (I don't know what the actual number is, and if it is even computable) that's still positive EV in a $100 vs $5000 bet.
That is, if the file was truly random, it would have a chance of 1/(2^X) of being all 0, where X is the size of the file. But since Mike would reject that file, the chance is actually 0.
Same for all files with easily exploitable patterns - for example, I am sure that Goldman checked that the file could not be compressed with gzip before sending it.
So the EV is probably not positive, even if there is a small chance that a random file of size X can be compressed.
Consider an arbitrary long series of integers. Somewhere within this series of integers, there will be some kind of randomly created pattern, since this is a property of an infinite set. eg. somewhere within the data set, there could be the values [1, 2, 3, ... 10] or [1, 3, 9, .. 27] or [1, 2, 4, 16, 32] - it does not matter which of these patterns, exist, only that there does exist some mathematical pattern in the data.
The chances of there being no pattern in a big enough set of random data is impossible as there is a finite number of possible data combinations for bytes [1..256][1..256] etc. I guess a data set of 256^256 bytes would guarantee a pattern, but I'm sure there is a far smaller number that would give 99% confidence.
Once you find a pattern in the data, you can remove that pattern and replace it with code that will recreate the pattern using a data offset. ie. you remove the pattern from the data completely, and replace it with a smaller piece of code to recreate that pattern exactly and insert it into the correct position.
The key here is that once the data has been generated, it is no longer 'random data', but a fixed input. eg, you cannot compress a random unknown string of bytes, but you can compress the string [1,2,4,16..]
The output data would have all possible mathematical patterns removed from it, and the decompression code would be just a list of mathematical functions and data offset points.
To be sure, of course, Patrick Craig did not compress it in the pure information theoretic sense. Mike Goldman failed to equate the goal to that information theoretic compression however.
So the method will work, but it may take a very large amount of data before it does. If the method does not work, it implies that a random process cannot generate an image that can be compressed with PNG - and that is definitely false.
This is similar to the argument that since pi is (probably) normal, any sequence of characters appears in it and we can simply use indexes into pi instead of storing numbers.
The problem is that given a file of size X, that sequence of X bytes probably only occurs at more than 2^X places into pi.
Mike's challenge took a specially selected random file. As other people said, this was an attempt to show compression kooks that some files are not compressible (if you include the size of the decompressor).
This all is not so simple as pointing at Kolmogorov complexity. Randomness is not so much inherent as relative to the machine on which you're running your program.
http://rjlipton.wordpress.com/2011/06/02/how-powerful-are-ra...
The short answer is, it was (almost certainly) impossible. You cannot compress random data. The only reason files you compress normally seem to compress is almost every file you come across normally contains some structure and therefore some redundancy.
IF you could write an algorithm that would compress a specific block of random data by any non-zero percentage, and IF you can make the original random data arbitrarily large, THEN the overall size of the code to implement this algorithm would not matter, because you could amortize it over an arbitrarily large random data file.
However I am not claiming that such an algorithm to compress a specific block of random data exists! However other people are arguing that this is indeed theoretically possible: http://news.ycombinator.com/item?id=5025527
There are always redundancies in random data. If you can pick them out ahead of time with a custom algorithm it's certainly possible to "compress" it.
Edit: I think I may be wrong here.
Thinking a bit further, for a file of length l, the probability getting a file that can be compressed is smaller than
\sum_{k=1}^{l-1} 2^{-k} [1]
which approaches 1 for l against infinity. ( So just based on the upper limit, your odds seem to get better for longer programs. :)
[1]rendered formula for the equation (hope this works): http://latex.codecogs.com/gif.latex?\sum_{k=0}^{l-1}%202^{-k...