Both unsalted and salted hashes are, as the name implies, hashes. They are both different from encryption.
Hashes don't have to take time - unsalted hashes are easily broken by rainbow tables in mere seconds.
A salt is not an algorithm, but merely the first input in a hash function that takes two inputs. It's not a "crazy algrorithm" - the same algorithm is used each time for what we're talking about - the md5 hashing algorithm.
x^2 does not refer to the salt - it refers to how many attempts must be made to bruteforce every possible combination given a certain keyset. X is the number of possibilities with an unsalted hash, whereas X^2 was the number of possibilities with a salted hash.
The reason you didn't crack the hash at your military exercise was because you didn't understand salting/rainbow tables in general and thus tried to apply a solution to the wrong problem (you used rainbow tables where they are obsolete).
The way JTR cracks hashes is simply - it keeps hashing random combinations of words/letters until it finds a hash it produced that matches the hash provided. It then knows that the last combination it tried is the correct one.
I'd suggest reading articles on google/wikipedia about hashing to get a better understanding of the topic.
The difference between encryption and hashing is that with encryption, you can get the original input from the output, whereas with hashing, you can not. Hashing is a one-way function, whereas encryption goes both ways.
HTS User Composition: