Great ideas in theoretical computer science
cs251.com
cs251.com
> The method we tend to use in 251 is throwing you deep into the water without a paddle (i.e., giving you very basic definitions for a new topic you haven't seen and expecting you to solve things that you might be given in a course dedicated to that topic in say the third week). We do this over and over, pretty much starting from scratch on a new topic every week. As a result, it can be very frustrating—which, of course, is the intention. If you're constantly trying to solve things that are just outside of your reach, you develop better strategies for thinking about problems you're given.
I dont think this teaching methodology made me gain any more from the course, if anything, it made me gain less because I constantly had the stress of trying to do these ridiculous problems on top of all of my other work every week
Right now we reached the other end of the pendulum swing, where everything is hand-fed to the students.
Around the time most schools were starting the 2014-15 school year I saw a post on Reddit in either a math or CS group from someone asking for how to solve a particular theoretical CS problem. The poster didn't say where the problem was from or why they needed a solution, but others quickly figured out it was from someone trying to cheat on the first homework set from COMS 331 (Theory of Computing) at Iowa State University.
No one helped and the poster deleted their post. I thought it was an interesting problem and gave it a try, expecting it to be a short but interesting diversion.
I didn't expect it to take too long because although I was not a CS major (I was a math major) I did take all of the undergraduate theoretical courses at my school and I got decent grades in them. That had been ~35 years earlier so I had forgotten a lot but the problem was from the first COMS 331 homework set so shouldn't require anything past the first week or so of that class, which should all be fairly basic stuff I would still remember.
I spent a couple days on it and got absolutely nowhere. Several times since then I've remembered it, thought about it for a few hours or a day and have continued to completely fail.
If anyone is curious, here is the problem:
Define a 2-coloring of {0, 1}∗ to be a function χ : {0, 1}∗ → {red, blue}. (For example, if χ(1101) = red, we say that 1101 is red in the coloring χ.)
Prove: For every 2-coloring χ of {0, 1}∗ and every (infinite) binary sequence s ∈ {0, 1}∞, there is a sequence
w₀,w₁,w₂,···
of strings wₙ ∈ {0, 1}∗ such that
(i) s = w₀w₁w₂ ···, and
(ii) w₁, w₂, w₃, · · · are all the same color. (The string w₀ may or may not be this color.)
Some thoughts that immediately spring to mind (apologies if you've already thought of these - just getting the brain flowing!):
* We only need consider colorings for which 0 and 1 are differently coloured. If 0 and 1 are the same colour, then we're trivially done - let w1, w2, w3, etc. all have length 1
* this smells like it'll be some sort of combination of induction and contradiction? E.g. "assume this property is true for w1w2w3...wn-1, and that wlog they are red. Assume there is no wn that can continue the sequence of red substrings - thus, all strings starting from the end of wn are blue. If that's the case _and_ if we can convert the string [w1...wn-1] into blue substrings, then we're done. So show that there is some contradiction proving that impossible (maybe using the observation I made above that we only care about cases where 1 and 0 are different colours)"
I start with { 0, 1 } which will obviously do. You take - I guess without loss of generality - my 0. I pick 00 and 01 as replacements and end up with { 00, 01, 1 } which will work again. You take away my 01, I replace it with 010 and 011 and { 00, 010, 011, 1 } will still work, I guess, but it is certainly becoming less obvious. In general I will pick x0 and x1 as replacements if you take x away which will allow me to still color x, I just have to choose between x0 and x1 depending on the following bit.
If I am not mistaken, you will have to take away an infinite set of words from me in order to prevent me from being able to color any infinite binary sequence in red, if you take only finitely many, I will be left with a set of red words that still works. My guess is now that if you take away that infinite set in order to stop me, you will accidentally assemble a set of blue words that will be able to color any infinite binary sequence blue. Unfortunately I do not have the time right now to properly think this through.
I am also not too confident because I do not clearly see how being allowed to have the first word in the wrong color comes into play. On the other hand, maybe, maybe you need my 1 for sequences starting with one or something like that.
EDIT: Just had an additional thought, this might actually work. If you take my 0, then you can not also take my 1 later on or you will end up with { 0, 1 }. If you take 01, then you can not also take 10 later. So you always have to take one of my two latest replacements and leave the other one to me forever. We will build complementary sets, you have 0, I have 1, you have 01, I have 10, you maybe 011, I 010, ... Now it seems quite plausible that this will work out and we end up with two complementary set that both can color all infinite binary sequences in [mostly] a single color.
0, 00, 000, 0000, … are all mapped to red 1, 11, 111, … are all mapped to blue
Neither set can construct all infinite binary sequences because red cannot construct infinite 1s, blue cannot construct infinite 0s.
[1] With cut I mean a set of vertices where no vertex in the cut is a descendant of any other vertex in the cut. Informally, repeatedly pick a vertex in the tree and remove the subtrees rooted at its children, the leaves of the remaining tree are the cut.
Needless to say, this exercise would be trivial if you just covered the pumping lemma and its applications in class, and next to impossible if you never heard of it.
[1] https://en.wikipedia.org/wiki/Pumping_lemma_for_regular_lang...
PS. I took 15-251 back when it was 15-299: a brand new class without a regular number assignment. Honestly, I would have enjoyed it a lot more now than I did back then. But several assignments still stand out for me, in particular "Building from scratch" [2]. Trying to get some of that feeling now, working through Turing Complete[3] with my daughter.
[2] https://www.cs.cmu.edu/afs/cs/academic/class/15299/handouts/...
Don't say/believe that and limit yourself. You just need to find the right books and slowly educate yourself (never mind what others say). I have spent a lot of time collecting and reading books much of which i still don't "grok fully" but what i do understand is intellectually very stimulating and gives me an edge over the competition (when needed in the industry).
What one man can invent, another can discover. - Sir Arthur Conan Doyle (via Sherlock Holmes).
There is no prison as strong and unbreakable as the mental prison you choose to build and stay in - Me :-)
You would have taken courses in discrete mathematics and data structures and algorithms as prerequisites, and have familiarity with proofs and some degree of mathematical maturity.
You build yourself up to a class like this by taking all the prereqs, same as any other high school graduate.
If this is true for more than one word, the problem can be solved by simply inverting the chosen color and using two larger words containing both subwords, which will always be of the same, originally wrong color, which leads to a contradiction.
Otherwise, if this is only true for one subword, and therefore the initial sequence and the rest of the sequence around cannot be made to be worded correctly while the subword is contained in a word of the correct color, but that the rest of the sequence can be covered with words of the same color, we can simply include this problematic subword inside w₀
In either of the three cases 0, 1 or 2+ "toxic subwords", it is always possible to find words of the same color covering the sequence. Therefore, there can be no sequence for which it is impossible to find a suitable w₀w₁w₂ ··, and the original proposition is proven.
Please tell me if you find any issue with this approach!
Case 1: there are infinitely many bad indices. Here we go to the first bad index then the second, and so on. The colour of w₀ does not matter, and since subsequent words start at a bad index, they will all be red.
Case 2: there are finitely many bad indices. Then there is some k which is larger than all bad indices. We start by going to k (again, the colour of w₀ does not matter). Since k is not bad, there must be some blue word starting at k. We take that one and move to a larger index. Again, that index is not bad. We repeat this process to find our sequence.
Call a position i in s "hard-red" (respectively, "hard-blue") if every positive-length substring of s beginning at i is red (respectively, blue); otherwise call i "soft". A position is "hard" if it is hard-red or hard-blue.
There are 3 possible cases:
1. s has no hard positions.
2. s has a positive but finite number of hard positions, with the last being i.
3. s has an infinite number of hard positions.
Case 1
Every position is soft, meaning that if we start a substring of s at that position and continue to grow it by appending digits from s, eventually (after a finite number of steps) the colour of the substring will change. So we can set w₀ arbitrarily to the first digit of s, then grow w₁ from position 2 of s until it has the same colour as w₀. Then we can grow w₂ from the next digit in s until it has the same colour, and so on. This results in all words having the same colour, including the first.
Case 2
Set w₀ to the first i-1 digits of s, and w₁ to the i-th digit of s. All positions > i are soft, meaning that, as for case 1, we can repeatedly grow substrings by appending digits from s until the substring turns the same colour as w₁.
Case 3
Since s has an infinite number of hard positions, it must have an infinite number of hard-red positions, an infinite number of hard-blue positions, or both. Suppose w.l.o.g. that it has an infinite number of hard-red positions (it may or may not also have an infinite number of hard-blue positions). Define p(k) to be the k-th hard-red position in s. Set w₀ to the first p(1)-1 digits of s, and for k >= 1 set word w_k to the substring of s beginning at p(k) and ending at p(k+1)-1. w₁, w₂, w₃, ... all begin at hard-red positions, so are all red. □
If folks would like to learn these ideas by hand via programming, i highly recommend Tom Stuart's Understanding Computation From Simple Machines to Impossible Programs - https://computationbook.com/
Very highly recommended.
* Computer Science, an interdisciplinary perspective by Robert Sedgewick * Code by Charles Petzold * Good Math by Mark C. Chu-Carroll
Genuine thanks again!
This full list I guess goes beyond and looks interesting.
[1]: https://math.bme.hu/~gabor/oktatas/SztoM/AlonSpencer.ProbMet...
Bonus points for those interested -- I think this paper(sadly, not mine) has a concise collection / history of obstruction proofs in its background section (1.2/1.3 and since it is a paper all of them are cited!): https://arxiv.org/abs/2309.09913
https://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15251-s...
He liked to call the course "SOME Theoretical Ideas FOR Computer Science", and it was known to be a very popular (and difficult) course.
I did some digging and found the class: https://people.eecs.berkeley.edu/~venkatg/teaching/15252-sp2...
I enjoy that it is called "More Great Ideas in Theoretical Computer Science", like a sequel (...and 'some' being the prequel). I'm now eagerly awaiting the 'return of the jedi' installment.
Great Ideas in Theoretical Physics?
Great Ideas in Experimental Physics?
Great Ideas in Economics?
etc
I did teach a course once called, Inventing the Information Age, in which we discussed all the inventions and ideas (starting from writing) all the way to modern computing infrastructure needed for a civilization to replicate our information age. This was not a single-field course, because the ideas/inventions were in language, physics, mathematics, and computer science. That made it more fun.
In fact, in my undergrad, the Physics lab and theory courses were flipped - you look the lab course before the theory course. In the lab course you used simple maths and simple experimental setups to probe phenomena in mechanics, thermodynamics, electromagnetism, optics etc. Doing experiments/observations in astronomy, quantum mechanics are also possible at that level.
* Brian Winston - Media technology and society a history: from the telegraph to the Internet, Routledge (1998)
* James Gleick - The Information A History, a Theory, a Flood (2011, Pantheo)
* Michael G. Raymer - The Silicon Web: Physics for the Internet Age, CRC Press (2009)
* Simon Singh - The Code Book: How to Make It, Break It, Hack It, Crack It (2003)
Plants I grow are complex function of CO2, water, energy and bunch of other things things. But I do know if I don’t water enough or too much, plant function will return not good results.
In the universe, how are the inputs and outputs divided into discreet units and states in which computation can occur? I know the universe isn’t running on a chip (wait… No I don’t), but what I’m unsure of here is how, or even if, the state of things in the universe is ever determined in order to be “computed” such that it can transition to the next state in which it has been acted upon again by the inputs around it.
Perhaps it’s the wrong analogy. I don’t understand though how computations can work with a fluid rather than clearly sliceable and unitized parameters you find in current computing technologies. Or is the universe actually able to broken down into frames of time?
I suppose if you don’t think you need to compute in discreet steps then the question doesn’t make sense. It’s taking the analogy too literally. I struggle not to, though. What is computation if it can’t be proven or reversible at any stage?
We would likely do this work in time steps, i.e., some version of discrete time.
So, in the simulation there would be a timing, time synchronization, etc. issue: In simple terms would have to update the whole universe, the whole state, FULLY at each single step before could start the next step.
Or if don't write just one program, and instead have some string theory where everything is made of elementary strings, each string has its own clock, supply of energy, momentum, charge, mass, etc. That's a lot of clocks and makes the strings not very elementary.
1) The Nature of Code by Daniel Shiffman - https://natureofcode.com/
2) The Computational Beauty of Nature by Gary William Flake - https://mitpress.mit.edu/9780262561273/the-computational-bea...
Use DieHard to avoid crashing newer window managers such as CWM:
1. Move to front lists are at most 2x the optimal list order search time (and are often much better than any static list order). [1]. A similar conjecture exists for Splay trees but is unproven called the dynamic optimality conjecture.
2. Randomized algorithms (e.g quicksort) often have the same worst case time as a non-randomized one but often are much faster in practice than their non-randomized variants.
1: https://www.dgp.toronto.edu/public_user/JamesStewart/378note...
It is a strange course though. It is grad level (2xx at Harvard) but the syllabus is survey topics from a range of undergrad courses in CS. I would guess it's a smattering of advanced topics in those areas, but the description doesn't sell it as having all those topics as prereqs. Maybes it's meant as an extension school / professional master's class for people who do not have CS degrees? Refugees from math, physics, and autodidacts?
category theory is historically not important to theory of computation, and it has questionable use if you aren't familiar with abstract algebra
Sorry, I had to guffaw when I read that last part about D. A dumpster fire of a language for garbage collection.
i found this stuff to be a lot of fun!
Horses for courses.
Something like variable names being too long or short. How to figure out what to do with unrealistic timelines.
Of all the scientific fields, computer science is the one that is mostly closely related to fields where theory is most worthless. If you have a computer science theory, then write some damn code to prove it. Then share your code. Others can then run it and replicate those results. At the "theory" phase, the idea is worthless.
Many of the key results of theoretical CS is to prove impossibility. There is no code to be written when you show that something is not possible.
- Halting problem: impossibility of TM to determine if other TMs halt. - crypto: impossibility for a Turing machine to break a cryposystem in polytime - sorting lower bounds: impossibility to sort objects given only a less_than operator on them in time less than O(n log n)
and so on. There is no code to be written for these, because they are mathematical theorems.
> computer science is about computers as much as astronomy is about telescopes ~Dikjstra.
Theoretical computer science is literally more solid and real than any code you could write. It's literally the mathematical foundation of how your favorite language works. It is all precise mathematical proofs, not just 'thoughts'.
(I'm only being half rhetorical. I've been thinking about this deeply lately.)
It’s a subset kind of relationship.
There is also the social aspect: people have to agree on it. Noise becomes music, and thoughts become proofs, only if several people agree.
However in the event that you really want to learn this via programming see this book - https://news.ycombinator.com/item?id=39721301