Having recently switched my major to CS, I've also decided this semester to minor in mathematics. I already had most of the 1000 and 2000 level courses done because of my previous major in engineering. My first upper level elective that I've chosen is Symbolic Computation; I'm also looking at taking Combinatorics next time it's offered, and I was recommended Theory of Probability. What do you thinkof these? And does the specialization / generalization ratio apply to math as well?
Discrete Math (this often include combinatorics, and was required for my CS major), Set Theory, and Mathematical Logic. I'd also try to take some sort of abstract algebra course as well, just so you get used to dealing with axioms and proofs. Get really good at vectors and matrices if you wanna do any sort of computer graphics or games; this usually means linear algebra. Skip calculus & differential equations if you're not particularly into scientific computing, though they're mighty handy in physics, and occasionally get used in computer graphics.<p>I've found I really don't use all that much math while programming. You do need to know finite state automata (that's usually in Discrete). If you want to do any sort of language design or type theory, you should know your set theory well, since types are based on sets. That's basically all that I use with any sort of regularity...
My computer science and computer engineering major required a discrete math course (which mostly included combinatorics, set theory, and logic) and probability theory, plus calc 1-3, linear algebra, and diff eq. I also took number theory.<p>Out of all of them, I'd say the discrete math course was the most applicable.<p>It also sort of depends on what area of CS you're interested in. For example, probability / statistics for computer networks, number theory for cryptography, artificial intelligence uses lots of logic (and many others), graph/set theory for general algorithms, geometry for graphics etc.
In addition to what's been mentioned, you should definitely take a solid Linear Algebra course. Besides the uses for computer graphics (vector stuff) and artificial intelligence applications (singular value decomposition et al), it is really philosophically useful to internalize the concept of transformations and how many non-obvious applications they have.
You should try taking a logic course. Apparently it makes you think more clear and argue better. I regret not taken one and now it's too late as I am about to graduate. Oh and I think you can also prove things better, and see more tricky cases easier.