In short
Ryan Williams (MIT, Gödel Prize-winning complexity theorist) explains how “optimal” textbook algorithms can be beaten in practice and in theory, using 3SUM as a case study, then broadens to fine-grained complexity, Strong ETH, and space-time tradeoffs.
Guests
Ryan Williams is an MIT professor of theoretical computer science; he won the Gödel Prize. The episode also references other researchers (e.g., Scott Aaronson, Russell Impagliazzo, Russell Impagliazzo’s friend/proposer of Strong ETH ideas, and James Cook/Ian Mertz for tree-evaluation; Hopcroft–Paul–Valiant for time/space simulation).
Key claims
- 3SUM can beat O(n^2) by grouping the sorted array and using preprocessed “finger search” variants with faster group-level lookups (linear decision tree model), achieving roughly n^2/(log n log log n)^(2/3).
- Fine-grained complexity studies whether exponents in canonical algorithms can be improved, via “fine-grained reductions” that preserve small improvements.
- He’s skeptical of Strong ETH (he says he doesn’t believe it), though he finds it operationally useful.
- He discusses time/space simulation: prior results gave ~t/log t space; his work achieves ~sqrt(t) space (with exponential time caveats), using tree-evaluation ideas and XOR-based memory tricks.
Notable examples
- 3SUM: brute force O(n^3); standard sorted “finger search” O(n^2); improved grouped approach beats n^2.
- Subset Sum via meet-in-the-middle to reduce to 2SUM.
- Strong ETH: no 1.999…^n algorithms for k-SAT (for all k).
- Neural-net analogy: majority/threshold circuits (TC) as Boolean equivalents.
Written by AI. May contain mistakes. Listen to the episode to check what was said.
Chapters
Tap a time to open that second in VOExploring the Threesome Problem
0:45 to 4:00
Ryan discusses the threesome problem and the brute force solution, leading to a more efficient algorithm.
“given a list of numbers and we want to find three numbers such that they sum to zero.”
Optimizing Beyond N Squared
4:00 to 7:30
Ryan explains how to achieve better than N squared time complexity for the threesome problem with innovative techniques.
“And I know a lot of your research is kind of about pushing lower bounds.”
Understanding Fine-Grained Complexity
7:30 to 11:15
Ryan elaborates on fine-grained complexity and the significance of reducing time complexity bounds for canonical algorithms.
“And, you know, maybe there are some savings you can do here and there by sort of compressing things a little differently.”
Relating Problems Through Reductions
11:15 to 14:00
Discussion on how reductions can relate seemingly unrelated problems in complexity theory, focusing on subset sum and two-sum.
“And you want to know if there's a subset of those numbers that sum to a particular target value.”
Understanding Subset Sum and Two-Sum Problems
14:00 to 15:03
Learn how the subset sum problem can be addressed through a two-sum reduction.
“but subset sum is an arbitrary integer that sum to the target sum, right?”
The Magic of Algorithmic Reductions
15:03 to 16:45
Explore how algorithmic reductions can unveil efficient solutions and the concept of 'preserving magic'.
“And if you translate it to the other problem, you lose a little bit of time complexity, but less than the aggregate.”
Explaining the Strong Exponential Time Hypothesis
16:45 to 19:40
Gain insight into the strong exponential time hypothesis and its implications on SAT problem solving.
“for a subset sum that avoids trying all of the to the end subsets.”
Questioning the Validity of Strong ETH
19:40 to 21:51
Delve into the speaker's perspective on the validity of the strong ETH and the implications on research.
“ETH, I guess that shows how old I am, I was trying to think about how to solve this so-called CNFSAT problem faster than 2dn.”
The Utility of Hypotheses in Algorithmic Research
21:51 to 24:38
Discover how exploring hypotheses in algorithm research leads to innovative problem-solving techniques.
“Like, because if I believe that it's false, then I get good ideas.”
Different Forms of SAT Problems
24:38 to 28:00
Learn about various representations of SAT problems and their significance in computer science.
“We've talked about SAT, or we've mentioned SAT so many times in this conversation.”
Show all 23 chapters
Understanding K-SAT and Algorithm Efficiency
28:00 to 34:10
Learn about the complexities of K-SAT problems and algorithmic strategies for efficiency.
“And you can look at the SAT problem on circuits like that as well, for example.”
Conjectures in Complexity Theory
34:51 to 42:00
Explore various conjectures in complexity theory and the rationale behind them.
“And I pulled a few of these that were kind of minority opinions or maybe, you know, less common takes.”
Understanding MP and co-MP
42:00 to 43:15
Explore the differences between MP and co-MP complexity classes.
“that and so yeah i was curious why that's such a contentious statement so nx versus co-nx let's let's first talk about MP versus co-MP.”
The Role of the Little Birdie
43:15 to 46:48
Learn how a hypothetical advisor could impact NX algorithms solving co-NX problems.
“And in fact, like MP different from co-MP implies P different from MP.”
Breakthrough in Space Complexity
46:48 to 52:15
Discuss the relationship between time and space complexity in algorithms.
“things which are no so what remains must be a yes and we talked a lot about time complexity And you mentioned a little bit, this advice, I guess, is kind of space complexity.”
Innovative Techniques in Computation
52:15 to 56:00
Learn about memory optimization techniques in algorithm evaluation.
“Well, the trick for me was to read James Cook and Ian Mertz's paper on tree evaluation very, very carefully.”
Understanding Square Root Computation
56:00 to 57:49
Learn how the square root of time impacts computational efficiency.
“So what you do is you break the computation into square root of t time intervals, and each time interval has about square root of t steps in it.”
The Journey of Conviction in Ideas
57:50 to 1:00:04
Discover the process of validating complex mathematical ideas.
“Um, so I would just kind of leave it and then come back to it sometimes when I was bored of whatever else I was working on.”
The Joy of Problem Solving
1:00:05 to 1:02:14
Explore the importance of enjoying the problem-solving process.
“i'm not going to i'm like they just didn't believe it period just like me i mean they didn't believe follow it, but there was a footnote that you put like in the bottom of some page.”
Finding Opportunities in Research
1:02:15 to 1:06:04
Learn about strategic approaches to research that ensure progress.
“Like trying not to get emotional, trying not to whatever, just trying to follow everything one step after another.”
Recommended Reading for Complexity Theory
1:06:05 to 1:08:24
Get book recommendations to deepen your understanding of complexity theory.
“And then I get some other type of algorithm.”
Advice for Aspiring Researchers
1:08:25 to 1:10:02
Learn essential advice for tackling tough problems in research.
“Last question for you is if you could go back to the beginning of your career, knowing what you know now, what advice would you give yourself?”
Self-Reflection in Grad School
1:10:02 to 1:11:50
Learn the importance of self-evaluation and reflection in academic progress.
“Um, you can, you know, you can just end up coasting in a certain direction.”
Transcript
Automatic transcript. May contain errors.0:00Hypotheses which are at the edge of our understanding can be enlightening. This is Ryan Williams. He's a professor at MIT who won the Gödel Prize for theoretical computer science. And I started by asking him a leak code question. So the question is threesome. Can you do better than N squared for this? Yeah, you actually can do better than N squared. And this is not at all obvious. He also had contrarian takes on popular hypotheses. I think I'm on the record as not believing this hypothesis. We really don't understand polynomial time computation as deeply as we think we do.
0:41I want to start by asking you the most popular LeakCode question. So the question is threesome. given a list of numbers and we want to find three numbers such that they sum to zero. Yes. And so what are your thoughts on the brute force solution for this? We can start there. So the obvious brute force solution takes, if you've got n numbers, n cubed time, just try all the triples of numbers, sum them up, see if they sum to zero, there is a faster solution. So one way to get an order n squared time algorithm for threesome is to first start by sorting the numbers. And then you go through the numbers one by one, say like you're looking at a number A.
1:35And you want to know, is there a B and a C in the rest of the list, whose sum with A is going to be zero. Okay, so the way this works is after you sort the numbers, you do what's called a finger search. So you put the finger from your left hand on the minimum element and a finger from your right hand on the maximum element. So you start there and you check like, okay, are these my B and C, right? So you add the min and max and check if adding that with A gets you zero, okay? And if you're lucky, okay, then you're done, but typically you're not lucky. And so this sum of the min and the max is either larger than your target value minus A or it's smaller.
2:32Okay. If it's larger, then you need to decrease the larger number. So you take your right finger, which is sitting on the maximum element, and you move it to the left, one slot. Okay. So you decrease the larger one. All right. If the sum is smaller than your target, you need to take the smaller number and make it a little bit bigger. So you move your left finger sitting on the minimum over one slot. Okay. And you keep doing this. You keep checking whether, you know, your left finger and right finger are pointing at a solution. And if they aren't, then you adjust it. If they do, if they ever do sum up to exactly what you want, you're done.
3:14And so after each comparison like this, right, one of your fingers moved. Okay. If the fingers ever cross, then you don't have a solution. Like there just can't be a solution. And so the number of times you move your fingers in total is like n. So you have an order n solution for finding that extra pair. And you do this for each of the numbers a. So then you get an order n squared solution overall. You do it n times. Each finger search takes order n time. And that is the popular solution. That's the popular solution. A lot of people know when we're in these algorithmic leak code interviews. And I know a lot of your research is kind of about pushing lower bounds.
4:04So maybe we can start that conversation off by, can you do better than N squared for this? Yeah, you actually can do better than N squared. And this is not at all obvious. In fact, it stems from taking this finger search idea and pushing it in a different direction. So what you do is you take your sorted list, okay, and you break the sorted list up into little groups of contiguous elements. So let's say your little group is like log n size or square root log n. It's like a really small little group, okay? So you've got either n over log n groups total or n over square root log n groups total, depending on how you break up your groups.
4:51And then the idea is you're going to perform the same kind of finger search, but you're going to set things up so that you're comparing two pairs of groups. Your finger is always pointing at an entire group. So like the left hand and right hand are pointing at two groups and you want to know if there's a three-sum solution in that group. And you can set up a kind of fast data structure to check a small group. Okay. This data structure will take much less than the number of elements in the two groups squared. So you set up some kind of fancy data structure. And because you set your group size so small, it's like a pre-processing that you do over all the possible inputs you could send from a pair of groups.
5:40And so you have some data structure and it will, you know, let's say it takes you into the 1.5 time to prepare this data structure, this fancy data structure. But now when you're looking at a pair of groups, you can look up the answer much faster than what finger search would have taken. I guess finger search through like a group of length G and another group of length G would take about order G time. And you can actually do faster by this kind of lookup, this kind of table lookup. I think it's kind of like you take this list of length in and you kind of shrink it into like in over group size number of things.
6:24And these are more complicated objects. And now you're trying to speed up the check over these small complicated objects. For like, should I move my finger to the right? Is there nothing in this group? Would finger search just go straight through this group or not? Is basically what you're asking. So the unit that you're operating on is not a single integer, it's a group. Yeah, it's like a group of them. So you use some kind of table lookup. And so, well, it's much fancier than a table lookup, actually. It goes through some other model called the linear decision tree model. So it's like in some weird model where you can actually get a faster threesome solution.
7:06You can get an end of the 1.5 solution. It's a really interesting and sophisticated solution. But what I want to emphasize is that it starts from the finger search solution and sort of like figuring out how to like process finger moves faster. So do pre-processing so that finger moves can go faster. Yeah, I saw the time complexity of this. It's n squared divided by log n divided by log log n all raised to the two thirds. Is there any intuition? I mean, that's just crazy. So there are several algorithms of this kind, and they all work by doing some modification on what I was talking about, because you can sort of reduce to a different model, like a different kind of lookup table, a different kind of set of tricks.
7:55And, you know, maybe there are some savings you can do here and there by sort of compressing things a little differently. um so that yeah there are several algorithms that beat the n-squared running time bound and they all to my large kind of work in a similar type of of way like they they're they're taking this in squared time algorithm finding little ways to like pre-process and then optimize like based on the pre-processing like make finger searches faster and things like this sort of A lot of your research is on this topic of fine-grained complexity or kind of lowering lower bounds. So maybe you can explain what is fine - Lowering lower bounds.
8:38I like that. Yeah, lower. The idea behind fine-grained complexity is we have a variety of problems, canonical problems that we teach to undergrads. We have canonical algorithms for these problems. These algorithms have resisted any major improvements in decades. And so we wonder, are these algorithms optimal? And what does the theory of optimality look like in terms of time complexity? So what if we just focus solely on the time complexity of a problem, like the fastest algorithm that will solve that problem? What does complexity look like then? Because like P versus NP is not about time. I mean, it's about time complexity, but on a coarse grained level where P is just polynomial time.
9:35That polynomial could be into the 10, into the billion, whatever. And so like showing that something's not NP is showing that it needs some super polynomial amount of time. Whereas here, we are concerned with there's a canonical problem. It takes n cubed time with some very elegant canonical algorithm. We want to know, could you do any better? Could you improve that exponent to enter the 3 minus epsilon for some epsilon? And then you ask, well, suppose I have a problem over here, and it has a quadratic time algorithm. and I want to know if I can improve that quadratic time algorithm by a little bit.
10:18Then you start asking questions like, well, suppose I improve this algorithm by a little bit. Can I improve this algorithm over here by a little bit? And this is naturally a notion of reduction, like saying that I want to have some reduction from problem A to problem B so that if I can improve the algorithm for problem B just a little bit, then I can also improve the algorithm for problem A by just a little bit. This actually leads to a different notion of complexity. You can even take an NP-complete problem and a P problem and reduce the NP problem to the P problem, and the question still makes sense.
11:00So, for example, you could talk about the subset sum problem, okay? So the subset sum problem, you've got N numbers. and a target value. And you want to know if there's a subset of those numbers that sum to a particular target value. Okay. Now you've got in numbers, there's two to the n possible subsets. The obvious algorithm takes two to the n time. Okay. But you can actually do better than this. And the way you do better than this is to reduce to a polynomial time solvable problem. So you can get an algorithm which runs in square root of to the n time for the subset sum problem. You can avoid enumerating over all the possible subsets in a substantial way.
11:54And this is in fact known commonly in cryptanalysis by, I guess, like a meat in the middle type approach. Like, so people do this sort of thing all the time. The idea is you partition the set of all the numbers into two halves, n over two, n over two. You enumerate all the subset sums on the two halves. So you have two to the n over two possible sums for like the first half, two to the n over two possible sums for the second half. Then you want to know, is there a number from the first half, from this huge list plus another number from the second half, this huge list that sums to the target. Now, this is the twosum problem.
12:43This is really nothing more than the twosum problem, which you can solve by sorting and binary search. And this is a reduction. We have shown how to solve a subset sum problem, like which would normally take to the end time in square root of 2 to the n time. The n-p-complete problem, by reducing it to a problem like 2-sum, the obvious algorithm there takes n-squared time, trying all the pairs of numbers to see if they sum to a target, and using an n log n time algorithm for that. So fine-grained complexity can relate problems that would not be relatable at all in the traditional p versus n-p theory.
13:28Like one problem is going to be complete. The other problem is not. So they should not have a polynomial time reduction between them, like in general, right? But if you just look at the time complexity and you focus on, okay, I have an algorithm, two to the n algorithm, is it the best possible? Then I have an n squared algorithm, is it the best possible? Then you can relate the two problems. And this is a general phenomenon that you can relate problems that look like they should have nothing to do with each other. So you talked about reducing a subset sum to two sum, but subset sum is an arbitrary integer that sum to the target sum, right?
14:11Yeah. So the idea is nobody said I had to use a polynomial time reduction or something like that to reduce one problem to another. So what happened, the trick was I took this subset sum problem that had n numbers, and then I blew it up to an instance of this two-sum problem. But that two-sum problem has about square root of two to the n numbers. Now, I can solve two-sum in linear time, so solving that instance gives me a square root of two to the n time algorithm for the original problem. But yeah, in the meantime, going from one problem to the other, I blew it up. But by blowing it up, I'm able to improve the time complexity of the obvious algorithm for subset sum.
15:01I get it. Okay, so the reduction, it's kind of like the, if you solve the subset sum, you have some time complexity. And if you translate it to the other problem, you lose a little bit of time complexity, but less than the aggregate. So all you want to make sure is when all the dust is cleared and settled, you want to be able to say, look, if I can improve the obvious algorithm for two sum, then I can improve the obvious algorithm for subset sum. And that's what this thing achieves. Because I know how to get a faster algorithm for two sum, I can get one for subset sum. So you just want your reduction between two problems to have this property.
15:43If I can improve one problem by a little bit in running time, I can improve the other problem by a little bit. In one of your talks, you mentioned preserving magic between. Right. Okay, so this is that. Yes, this is exactly like preserving magic because, well, I mean, once you see the two-sum solution, it's not so magical anymore. But imagine that you didn't know about sorting and binary search and the like. And someone just says, find a pair of things with a certain property and there are n things. And you're like, well, I mean, the number of possible pairs is about n squared. So maybe it'll take me n squared.
16:23In this particular case, because they're numbers and you're summing them, there's an n log n time algorithm. it is a surprise when you first see that no you don't have to try all of the pairs of numbers there is a shortcut there is a clear shortcut that lets you find a pair much faster and then you can use that surprise or magic if you will and get something for a subset sum get an algorithm for a subset sum that avoids trying all of the to the end subsets. So I understand one of the driving motives for pursuing this, I guess, lowering of lower bounds is that strong exponential time hypothesis.
17:12I see it S-E-T-H. Could you explain that and its significance? Strong ETH is like a severe strengthening of the P versus MP question. So P versus MP is asking whether the SAT problem has a polynomial time algorithm or not. Right. And strong ETH is basically saying that for the SAT problem, you cannot solve it faster than, much faster than to the end. So there's no 1.999 to the end time algorithm. For every string of nines, there is no 1.9999 to the end time algorithm. them. To say the hypothesis totally precisely, it has to do with the k-sat problem, and you're looking at clauses of length k for arbitrary k, but those details don't matter so much.
18:21It's a canonical NP-complete problem. Sat is solved all the time in practice. It's extremely useful for verification nowadays. It's an engine for verification. So it can be solved fairly well in practice. However, in the worst case, we still don't know how to solve it significantly faster than to the end. So the hypothesis that it needs, say, 1.99999 to the end time for all strings of nines is a very strong exponential time hypothesis. It's stronger than P different from NP. It says, no, no, no, it's not super polynomial. It's actually darn near to the end time that you need. Right. And so do you think that hypothesis is true and you know, why or why not?
19:15I think I'm on the record as not believing this hypothesis. Yeah. Yeah. Why don't I believe this hypothesis? Well, I started thinking about this hypothesis maybe already as an undergrad, but certainly starting in grad school. Like early in grad school, I was thinking about this. So before it was even called Sr. ETH, I guess that shows how old I am, I was trying to think about how to solve this so-called CNFSAT problem faster than 2dn. And well, at the time, there were a number of other MP-complete problems that had faster algorithms, like subset sum. So I thought, well, there's not, I mean, what's so special about SAT.
20:08Like if all these other problems have faster algorithms, why not SAT as well? Like if you restrict to the three-SAT problem, like, so this is where you have an AND of these clauses. Each clause has like, is an OR of three variables. Some of the variables may be negated. You want to know if there's a way to set all the variables to make all the clauses simultaneously true. There is a faster album for that, but this is a more general version of SAT. So at first I just thought, well, there's no good reason to think in a lower bound. These other related problems have upper bounds, so why not? But then over time, I would have different attacks on strong ETH, like trying to refute it.
21:02Always trying to refute it in different ways. these attacks would fail in some completely catastrophic and ridiculous way. Like, they would have no chance of actually solving the original problem. But by sort of staring at my failure and trying to think, well, there's something interesting happening here. What can I do with this? Like, there's something interesting. Yeah, it doesn't refute the strong ETH thing. What does it do? So by trying to pivot and figure out, okay, what can I do with my failure? I was able to solve a variety of other problems instead. And so after a while, I realized that The truth value of StrongETH to me is almost irrelevant.
21:55Like, because if I believe that it's false, then I get good ideas. I get good ideas. Like, and so by trying to think about, okay, what would an algorithm that breaks to the end look like? What could it look like? I sort of forced myself to think in a different way. I have to like discard other natural possibilities because we know they won't work. And I have to think in a different direction. And so because it kind of like sends my brain in a different direction, sends me thinking a different way, it's very useful for research. you know i mean even even though i still haven't refuted it or whatever like it's very useful for me to believe that it's false like operationally so the truth value i mean i believe this is a minority opinion right why would they go against i mean i think um for example russell impagliazzo a good friend of mine who helped propose this, I mean, he always emphasizes to me, well, this is a hypothesis.
23:13We explicitly did not name it a conjecture. We wanted to sort of put forth some lower bound that would get you to think about it, like something that's maybe a little more controversial than the other types of things like P.D. or MP or whatever, or other things that people more normally believe. So like hypotheses which are at the edge of our understanding can be enlightening to think about, like where we truly don't know what the answer might be based on our intuition. So this is, I guess, one reason why it was proposed. But one reason why you might believe that starting TH is true is because believing it implies a lot of other lower bounds for you conveniently because you can reduce the SAT problem to a bunch of other problems that seem totally unrelated, like edit distance, various pattern matching problems.
24:17They have natural polynomial time solutions. If you can improve on the algorithms for any of those, you would improve the one for SAT as well. You would get something better than to the end. So believing in it sort of makes a convenient worldview. It shows that all these different textbook algorithms are indeed optimal. We've talked about SAT, or we've mentioned SAT so many times in this conversation. I know there's so many forms of that problem. What are all the different forms? And I know there's clause width, also this idea of depth too. The most common representation of a SAT formula is a conjunctive normal form, a so-called CNF representation.
25:02And this is what modern SAT solvers get as input. They get their file in so-called DIMACS CNF form. And this is just every line of my file, I give you a list of variables, possibly with negations, and each one is a clause. And I'm supposed to take the or of those variables or negations. These are variables or negations. They're often called literals. Okay, so I take an or of these literals. And the width of that clause is the number of literals in it. Okay. And I'm supposed to take the and over all those lines, each line in my DIMACCNF file. And so it's an and of a bunch of ors. And each or has some small number of literals in it.
25:59Call it K. So usually the width is called K. And so the KSAT problem is to find an assignment to all the variables that satisfies all the clauses when each clause has width k or width at most k. It could be smaller. So that's the most popular version. That's what SAT solvers, you know, churn on. And that's what is behind strong ETH. That's the representation there. But there are other ways to represent a Boolean formula. You could just simply represent it as some arbitrary expression made up of ors and ands and negations. It could just be some arbitrary expression with nested parentheses and all that mess.
26:50You could ask, given a formula in this representation with a bunch of variables, is there a way to set the variables to make this true? That's formula SAT. You could also look at circuits of bounded depth, as you mentioned. So there is this class of circuits that people study called AC circuits for alternating circuits. It doesn't mean alternation in terms of electricity. It means alternation in terms of ores and ands. So these circuits are made up of ores and ands, like in layers. So the C and F representation is a special case where I have an and of ores, like an and of a bunch of clauses and an ors of the literals.
27:46But you can go further. you can have an AND of OR of ANDs of variables with negations and things like that. And so these are constant depth AC circuits. And because the idea is you only have some constant number of layers of these ANDs and ORs. And you can look at the SAT problem on circuits like that as well, for example. Those are two other versions that people look at. yeah strong eth is on k sat and i saw on less than or i guess you know two sat three sat four sat five sat there exists solutions that are asymptotically better than two to the n so i guess it it in the the larger k can be the more difficult yes that's the intuition that that is intuition okay have you ever plotted that curve like is it does it drop off you know exponentially or yeah yeah um yeah that's what's so interesting uh about the current state of the art in ksat algorithms as k increases all of them all the different types of algorithms you might try to run they all approach a to the n exponent like as k grows and grows and grows they get 1.99 1.999 nine and so on and yeah it it drops um i mean you get in other words it will like it goes towards uh two pretty quickly actually and like so we understand like how the exponent behaves pretty well for the known algorithms we have and then um for for something like three sat what is the intuition behind speeding up an exponential time search yeah so for three sat let's just look at a single clause, okay?
29:38A clause that's got three variables in it, okay? We know that if we set all those three variables wrong, it's going to be false, okay? So we have to avoid one of those assignments, okay? Well, that means that there are seven out of the eight possible assignments. So there's like three variables, two to the three, eight possible assignments, seven of them could be a satisfying assignment. They could be part of a satisfying assignment. We don't know. But one of them is definitely not. So one easy way to see that two set can be solved in less than two the end time is just take any clause, try one of the seven possible assignments, and plug them in, and then recurse on the remaining formula.
30:29Now, let's think about what we did. If we were just trying all the possible to the end assignments, and we would plug in one of eight possible assignments for each of those three variables. And so we'd have eight recursive calls. Well, instead, because we're clever and we looked at the clause, we have seven recursive calls. and that that's the difference so so we reduced uh by three variables at the cost of seven recursive calls as opposed to eight and this gets you a slight improvement this gets you about uh 1.92 to the n something slightly better than than uh to the n okay but you can do better than this.
31:17But this is sort of like the idea. You try to look at ways to plug in variables that will force constraints so you can rule out a large portion of the possible assignments. When I was thinking about circuits and the different widths and depths, I don't know if this is an unusual question, but it reminds me of neural nets, but the operators are different and the space of the literals is different. So instead of Booleans, it's maybe floating points. And so it just made me wonder about the algorithms that you might apply on a neural net. Is there analogs in between these two spaces? Yes, yes. So yeah, if we look at, say, I want to model a neural network on, And so I want to compute, say it's still a Boolean function, but I want to do it with like a neural network.
32:17So like I want to use, let's say, ReLUs or sign activation functions or what have you. There is a slightly more general gate that we can use instead of ors and ands that turns out to basically be equivalent. So if instead of using ORs and ANDs, we use a so-called majority gate, which outputs one if and only if at least half of its inputs are one. Using this and negations, we can actually simulate neural nets, like the usual types of neural nets that you think of with the usual types of activation functions. So if they have a constant number of layers of neurons, we can get a constant number of layers of majority gates and negations.
33:14So this is so-called TC circuits for threshold circuits. Yeah, so once you allow threshold circuits, you can start to model neural networks. Still using Booleans. We're still looking at Boolean inputs, though, yes. So once you allow your input space to be larger and have floating points, then you can prove a lot more in terms of lower bounds. You can find things that take depth three in the neural net that can't be done in depth two and so on. So, yeah, once you go past that and you start looking at just arbitrary real domain, it becomes a totally different picture from a discrete domain. OpenAI, Anthropic, Cursor, and Vercel all use this product to make their lives better.
34:10And the problem it solves is when you're building SaaS or an AI product and you want to sell to other companies, there's all these requirements you need to meet. There's SSO, there's SCIM, there's RBAC, there's audit logs. These are all things that take time to integrate, but aren't the main focus of your app. WorkOS is an API layer that lets you meet all of these requirements in just a few lines of code. So let's say you have a new SaaS product and you want to sell to other companies. WorkOS will solve all of these critical feature gaps for you. You can check them out at workos.com to learn more and get started.
Read the full transcript
34:46And I appreciate them for supporting my work and sponsoring this podcast. One topic I thought might be fun to go over is you wrote this paper about the likelihoods of these various conjectures in complexity theory. And I pulled a few of these that were kind of minority opinions or maybe, you know, less common takes. So here's to hear your rationale. Okay. Okay. One of them, the well-known one, P not equal to MP or P versus MP, you assigned an 80 % confidence that they're not the same. Yes. And I think most people say much higher confidence. So why would you assign such a low confidence that they're not the same?
35:32It's interesting because I think I originally had something like 75%, percent. But then my college classmate, Scott Aronson, was like, how dare you? He sort of called me out and like, okay, fine. For you, 80 percent. Fine. I guess my point is that we really don't understand polynomial time computation as deeply as we think we do. And there are surprises like all the time in the power of algorithms. There are very few surprises in terms of lower bounds. Like when we are able to prove a lower bound, typically it's something we very much expected to be true, but it was hard to prove. It was hard to prove.
36:25Somehow we pulled it off. We got what we expect to be true. But all the time in algorithms, people are finding algorithms where it's just like surprising. Just wait, what? How do you get something that fast? So this just happens over and over. When I was younger, when I was first thinking about P versus MP, I had an intuition for what should be. And what I've understood over the years is that my intuition for what should be is often just wrong. And I'm having to revise my intuitions all the time. So when something like this happens often enough, you start asking yourself, what do I really understand?
37:23Do I really understand, Beers and Beers? Like, I mean, I understand the statement, right? Like, it's just one of those problems where somehow it is not so difficult to make formal, to write down mathematically, but to actually know what the answer is, is just orders of magnitude more difficult than it is to phrase the problem. And complexity theory in particular is littered with statements like this, where the space of algorithms is just that vast. So if you just keep getting surprised over time, you're just like, well, what do I understand? Maybe it was just misplaced confidence. Okay, what about this one?
38:11So exp not equal to nxp, or would you say nexp? Oh, nxp, yeah, x versus nx. So this is like the exponential time of p versus np. for x not equal to nx or nexp you gave it a 45 chance and if this is the p not equal to np equivalent but for exponential time why is your yeah why is it so low oh because exponential time albums are even more powerful did i really say 45 i mean you did for nx versus x or nx versus co-nx. Yeah, nx not equal to x 45%. It's in this table. So in other words, I believe nx equals x more than I believe they're different, right? So yeah, let me try to explain why. So you can think of the NX versus X question as some special case of P versus NP, where instead of looking at the arbitrary SAT problem, I'm looking at a SAT problem, which is extremely compressible.
39:26So there's like a really small little computer that is exponentially smaller than the length of the instance, and it just outputs the character on the line number and the column number for the DIMAX CNF, like the CNF file, okay? So it's like an extreme compression of some file. So it's like you zipped it down to something exponentially smaller than its original length, okay? So it's like some super compressed, extremely highly regular SAT instance. So I give you that, and I ask you, when you unpack this thing, decompress it, is the result going to be satisfiable or not? And I want you to solve this in time polynomial in the decompressed representation.
40:20Okay. So the point is that this is SAT, but in some very special case where the thing is extremely structured. So the idea, one conjecture for why SAT solvers work in practice, like one, I mean, this is, I mean, conjecture may be overkill because, I mean, this is just, this is not even a well-formed mathematical statement. So one hypothesis for why sat solvers work in practice is because the real world is highly structured. The real world is governed by physical laws that are not random. They're not arbitrary. Like from a very small number of rules, we can recreate so much of science. So what arises in practice from designs of hardware and things like this are often extremely compressible.
41:19They have to be extremely compressible. And so maybe it's true that, you know, every science which has a highly compact representation can just be solved efficiently. This is the idea of whether, you know, in X equals X. That when it's really, really structured like that and super compressible, there is some advantage. It's not like a completely random. and since it's not like something arbitrary it's no it's in fact very very special the other one is 80 likelihood on nx equal to co-nx and you wrote why would a self-respecting complexity theory do that and so yeah i was curious why that's such a contentious statement so nx versus co-nx let's let's first talk about MP versus co-MP.
42:13So co-MP is like the class of sort of complements of MP complete problems, like unsat, like checking whether something's unsat. Now, from the time complexity point of view, there's no difference between checking sat and unsat. You can always flip the answer. But from the complexity point of view, if I ask you, does co-MP equal MP, what I'm asking you is, could you prove to me that a formula is unsatisfiable with a short proof? When it's satisfiable, I can give you a short proof. I can just give you the satisfying assignment. You plug it in, check that it works. But if it's unsatisfiable, if no assignment works, we're saying for all assignments, the formula is not true.
43:03Can you flip that to an existential statement say, oh, there exists this little proof that makes it work. So people don't believe that MP is equal to co-MP. And in fact, like MP different from co-MP implies P different from MP. But so this is the exponential time version of MP versus co-MP. So it's co-NX versus is NX. The reason why I think these are likely to be equal is that if a little birdie sat on an NX machine's shoulder and gave it a little bit of advice about what the co-NX thing is doing, then the NX algorithm can actually solve co-NX problems. And so let me explain, let me explain what's the little birdie what the heck is the little birdie saying so because nx problems can run in two to the n time and two to the n squared time and things like that running an exhaustive search over all possible inputs of linkedin is no problem for nx so what a little birdie can do is say, okay, suppose I want to verify that this particular instance, let's say we can talk about an unsat, but some compressible unsat problem or something.
44:38Suppose I want to prove that this compressible unsat instance is a yes. How am I going to do that with nx. The little birdie will tell me the total number of inputs of length n, which are a yes. Okay. So it will just tell me some string, which says, here's the total number of inputs of length n. You gave me a length n input. Here's a total number of inputs of length n that are a yes. Okay. Okay, so this advice, this little, you know, Bertie's advice doesn't take very much, like to encode a count. It's like order in bits to encode a count of things. So what does the NX thing do to prove a co-NX thing?
45:32What it does is it guesses the things which are a no. So I'm trying to prove unsat. So unsat means yes, sat means no. So the NX thing guesses those things which are no. The no things it can answer, right? If it's a sat thing, it can just guess the answer to each of the no's, okay? So it guesses the answer to each of the no's. It verifies all those answers, and then it checks the number of things it guess is what the birdie told it. Once it's done that, all the no's have been covered. So everything else must be a yes. So it can actually prove a yes by just exhaustively finding all the no's and ruling out any other no's.
46:21But the big question in my mind is where do you get the little birdie? Where do you get the little birdie advice from? Yeah, yeah. So I've studied what the little birdie gives you. and it seems to me that it is possible that this little birdie itself can be constructed in NX and if so then we'd just be done like in NX you figure out what the little birdie would tell you and then use that to just flip the answer sort of guess let's sort of guess all the things which are no so what remains must be a yes and we talked a lot about time complexity And you mentioned a little bit, this advice, I guess, is kind of space complexity.
47:04And I know you had a major result relating space and time complexity, basically simulating time complexity with space complexity, but lower than it's been done prior. Could you explain what it was before your breakthrough results and then maybe the intuition behind your breakthrough result? In general, the problem is the following. I give you an algorithm that runs in time t, and I want to know, is there another algorithm that uses space much less than t? Uses the amount of memory, like units of memory much less than t, and still solves the problem completely. Still completely simulates the thing perfectly.
47:52um one intuition for why you might think um this question just can't be solved or some problems there's just no way to improve on the space is if you think of like the pro like a lot of problems in dynamic programming like let's say i have um some logic circuit that i want to evaluate and all the gates are provided to me in a row and all the wires sort of flow from left to right. And then, you know, I start with information on the left. I want to compute the information on the far right. And all the, you know, all the bits are flowing left to right by wires. The natural way to evaluate such a circuit is you start with, say, the inputs on the left for each gate in turn in the line, you look at its inputs, its inputs have been determined, there's some bits, use that to compute the value of that gate, you pass the values of that, you know, the output of that gate forward, okay?
48:58But if that circuit, you know, has T gates in it, you know, it will take about T time to solve, but it will definitely also take about T space in general, right? Like, The circuit could be wired up in some wild way, and there just might not be a way to save space for an arbitrary circuit. But already in 1975, people were studying this kind of question and finding counterintuitive answers to it. So Hopcroft, Paul, and Valiant, based on work of Patterson and Valiant, showed that time-t algorithms, at least in this so-called multi-tape Turing machine model, very powerful model, can be simulated in space t divided by a log of t.
49:53So, I mean, it's like you get some space savings, but it's only like a log t factor. And the way this is done is quite counterintuitive. I mean, even though there's only a log factor there, it was pretty shocking. That development was extended to random access models of computation later and more general models of computation. So like in the late 70s and early 80s. So it was known for pretty much any reasonable model of computation that time T can be simulated in space about T over log T. But there was a hidden, maybe not so hidden, gotcha in the space efficient simulation. It needs an exponential amount of time to run.
50:53So like you, there's a time space trade off. Okay, if you really want to save some space, you got to blow up the time by a lot. Nevertheless, yeah, it was kind of commonly conjectured that this T over log T space was about the best you could do. And that you were probably not going to get T to the 0.9 space or something much more efficient. Um, so yeah, it was a big surprise to me, uh, like that you can actually put time T and space about square root of T. Again, there's an exponential running time just to, you know, give the full caveat out there. But, um, but it's still very surprising. Like this holds for any kind of time t algorithm like including something that might be outputting you know something pseudorandom some you know something from cryptography you know like it's not at all obvious that every such process could be compressed to only be need like square root of t space and still get the job done still compute whatever function was being computed i mean i I know it's probably super involved, but if you could just, a high level, what's the trick?
52:18How'd you do it? Well, the trick for me was to read James Cook and Ian Mertz's paper on tree evaluation very, very carefully. I mean, and just knowing the landscape around P versus P space and knowing what Hopcroft, Paul, and Valiant did. And yeah, so I can give you a very high level idea of kind of what's going on and how what they did is useful. so Hopcroft, Paul, and Valiant the way they were modeling space bounding computation was in a particular way that seemed pretty general at the time but turned out to be restrictive in ways that we just didn't anticipate so the way they thought of it was I'm going to take like certain I'm going to break the computation up into little pieces and And I'm going to write pieces of the computation, like little bits into the memory, but I'm only going to do that over blank space.
53:32I mean, this is something that sounds natural, right? So I'm going to erase pieces of memory, and then I'm going to overwrite that blank space with a piece of memory. So I'm being very destructive in a certain sense. But this is a natural thing you do, right? If you want to swap something with something else, you often just erase. But there are ways to swap without erasing. So there's a common little trick that is taught in CS courses. So if you require everything to be written into a blank register, then if you want to swap the contents of two variables like x and y then you've you've got to have a temporary register like you move one into the temp you erase it you move y into the into there and so on right but if you don't want a temp you can achieve the same thing uh with just x oring the the registers bitwise or if you've got numbers you can add and subtract Okay.
54:42In three instructions, clever instructions, adding, subtracting, or XORing, you can actually swap the contents of two registers without needing a third. Okay. This is kind of the starting point for thinking about like, well, why does it matter if you're always writing into erased memory? So what James Cook and Ian Mertz showed at a very high level was they were studying a certain problem called tree evaluation, whatever that is. And the problem had an algorithm where you had a little stack and you're always sort of like popping and pushing on the stack. But you are always writing computation contents into erase memory.
55:42What they realized was that if you allow computations to XOR bits of memory into existing memory, then you can save a lot of space. So if you're really, really careful about how you XOR things, you can basically recover what's in your memory without storing all of it at once. you sort of offload things to computation and you xor on top of things very very cleverly you can get like nice cancellations of things you don't want and and keep around things you do want yeah so i mean that is a high level uh idea of how this stuff works and then going to square root is it just an extension of that or is it a completely different so the the way it works with square root is square root just happens to be kind of like the optimal trade-off in this tree evaluation business.
56:38So what you do is you break the computation into square root of t time intervals, and each time interval has about square root of t steps in it. And what you do is you give a particular way of simulating this thing so that you're only kind of holding about a constant number of blocks or like of these time intervals in memory at any point in time. Like you're only holding a small number of these time intervals, like records of time intervals in memory any point in time, which is entirely not obvious how you would do it. but it's some sort of sweet spot to set the square root of t. It's like the minimum setting of trade-off.
57:31Say I want to break the computation in the intervals and the intervals have a certain number of steps. If I set it to be square root of t, then the number of intervals and the number of steps in each interval is about the same. So, I mean, that was a long-held result. I mean, you mentioned it was 1975. that's maybe almost 50 years where if you come up with something like that and you you I guess you're writing it out you're thinking through and then you see it what is that moment like so I you know I'm I've been around long enough to have been deceived by myself many many many many times so yeah I guess the the first two or three times I thought about this um I just thought this is another one of those ideas that can't possibly work.
58:21There's no way. There's just no way this works. Um, so I would just kind of leave it and then come back to it sometimes when I was bored of whatever else I was working on. Um, like I, I, it was a pretty slow process of convincing myself that this could possibly be true. Like I, I thought there was either a bug in what James and Ian was doing somewhere, or there was a bug in my interpretation of what's happening. I thought there had to be a mistake for a long time. And the only way I got over that was just writing it down over and over and over in different ways, sort of writing and rewriting and writing and rewriting and adding more detail, and then maybe finding a different way of explaining it and erasing and, you know, writing something shorter and just sort of re-explaining it to myself over and over and over.
59:26And even then, like when I submitted it to the um stock conference where it was where it appeared um I wasn't entirely confident that it was correct I was just exhausted from like thinking about it for so long and just thought maybe someone else will find the mistake for me like I'm like I got like at this point like I was just like desperate like I had actually sent it to two colleagues that I trust you know privately and asked them can you help me find the mistake or whatever can you help me understand this and one of them just said like they're basically they just didn't read past the abstract they're like i'm not i'm sorry i'm not going to i'm like they just didn't believe it period just like me i mean they didn't believe follow it, but there was a footnote that you put like in the bottom of some page.
1:00:34After that, after that footnote, then I began to believe it. So then what I did was I just took that footnote and elaborated it in like a later revision, sort of made it what I called the warmup, because I was like, yeah, I've got to do, I've got to write this thing in a way that is airtight so that other people will actually believe this because, yeah, it took me a long time to get used to it, to believe it. Yeah. Wow. What motivates you to solve these hard problems? I mean, what keeps you driven? Because you kind of, it sounds like you got to just bash your head against the wall and maybe you get there, maybe you don't.
1:01:20I try not to bash my head against the wall. And if I'm going to do it, it's going to be a comfortable wall. It's going to be one that's high-end and luxurious or something. I'm going to enjoy the process is what I mean. If I don't enjoy the process of really grinding and trying to understand something, I'm just I'm not gonna do it like uh so I think that if you know if anything is uh one thing that I that I like I I like to involve myself in working on problems where the the grind is actually joyous and and fun yeah um for the other things uh they're just they're mainly opportunistic They're mainly me just taking something new that I see and just fully integrating it with everything I know and following everything to the logical conclusion and just seeing what happens.
1:02:26Like trying not to get emotional, trying not to whatever, just trying to follow everything one step after another. Yeah. How do you pick good research direction? The best kind of research direction, which is very hard to come across, is a direction where you've set yourself up in a way that you can't lose. That like, I have a hypothesis, H, and one of two things is going to happen. Like either I prove H is true or I refute H, prove not H. What I would like to have is a situation where if H is true, then good things happen. If not H is true, good things still happen. Other good things. Like I like to look at things where, yeah, it's a win-win.
1:03:23Kind of if you can find opportunities like this, this is important. Like, I think often I'm not looking at a specific problem. I'm looking at a method. I'm looking at the technique. I'm looking at not the specific proof, but like the space of ideas. And I'm trying to understand what else can be done in the space of ideas. So often I solve problems just by just taking some idea and putting it somewhere else. Do you have a concrete example of where you've pursued something knowing that if you succeed, good. If you succeed in another action, also good. I have some particular research program for which, if it materializes, would actually show that something called the orthogonal vectors problem can be solved in nearly linear time.
1:04:23okay now this um now if that's true then the sat problem can be solved in about the same time as subset sum it could be solved in like square root of 2 the n so this would like truly break a strong eth in like a radical way okay and um i did a lot of work uh in the past showing how Now, if you can improve on the running time of SAT, then you can somehow use that to prove circuit complexity lower bounds. You can take an algorithm for analyzing circuits that's non-trivial and interesting and turn that into a limitation on what those circuits can compute. Okay, so this hypothesis, maybe I won't exactly say what it is.
1:05:21It's a pretty technical statement. But the point is that if the hypothesis is true, then I get this fantastic algorithm for this orthogonal vectors problem. I get this algorithm for SAT. I get circuit complexity, lower bounds from that. I get to somehow prove limitations on what circuits can do. If the hypothesis is false, I can use that hypothesis to actually show another circuit complexity lower bound of a different flavor. So regardless of whether or not the hypothesis is true or false, I'm going to make progress in complexity theory. I'm going to prove a new limitation one way or the other.
1:06:03right so it so sometimes like i mean this can be difficult to do but um usually what has happened instead of something so clean is that i have i i read about some idea or whatever i try to apply the idea i read about some magical algorithm i try to apply the magical algorithm to solve something like SAT, it doesn't work. But I look at my approach. I stay really hard at it. I try to pivot. I try to just extract what I can. And then I get some other type of algorithm. I mean, this is essentially how I approved the circuit complexity lower bounds that first got me a job at Stanford, was I was trying to solve SAT faster with some algorithm.
1:06:54it didn't work but then i realized that that algorithm worked for a large class of circuits including ones we didn't know lower bounds for so then i use that to prove a lower a lower balance yeah so i mean um this is just a general principle that that i've had what what would be your book recommendation if someone wants to learn more on complexity theory yeah so it sort of depends on how deep you want to go. There's Avi's book. Yeah, Avi's book is really nice. If you're looking for something a little more gentle of an introduction, I would say you could read the early chapters of Lance Fortnell's The Golden Ticket, trying to imagine what a world would be like if P equaled MP.
1:07:45I like that imagination exercise that Lance did. On a more technical level, if you're looking for something slightly more technical, you could look at the nature of computation by Mertens and Moore, I think. So this is still not very technical, but Um, but a lot, but it is a textbook, right? Yeah. Um, and then of course, uh, Sipser's, uh, introduction to the theory of computation is like, um, a fairly concise and very well-written, uh, textbook. Yeah. Last question for you is if you could go back to the beginning of your career, knowing what you know now, what advice would you give yourself? So I guess one thing that I did by accident, I guess, which I think people should keep in mind, is that you don't need permission to work on very tough problems.
1:08:55Like, in fact, the tougher the problem, like in complexity theory, there are all these problems where like really nobody has a very good clue of what to do beyond like a few simple structural results. Like, so that kind of levels the playing field a bit. And yeah, like you just, you don't need permission to think about these problems. You don't need like, you know, anybody's say so or whatever. I mean, that's one thing that I would like younger people to keep in mind. I mean, this knowledge is open to the world and it's open to you and you can just go learn it and think about it. And you don't need anybody's permission, especially not mine.
1:09:42Um, yeah, like, um, another thing I think is, uh, to avoid inertia in the sense that like, you know, if you, if you don't think about and reflect, like, where am I going and what am I doing? Um, you can, you know, you can just end up coasting in a certain direction. And I think it's important for people to sit down and truly reflect and think from time to time, like, okay, if I keep going in this direction, is this going to lead to a place that I want to be? And this sort of advice is good for all aspects of life, really. Like, like if I keep, if I keep, you know, just allowing things to be the way they are, am I going to be okay with that?
1:10:41Or do I need to do something? Do I need to, so it's like a little interrupts, you know, in your life reflection and just sort of like, okay, is this, is this where I, do I, do I need to be coasting here? Like, do I need to, yeah, I think, um, like in research for me, I was always reevaluating like, okay, you know, what I do last year and what I do the year before. And, you know, could, you know, like, what do I know now that I didn't know then? And like, you know, am I progressing? I think like, like that sort of self-evaluation, uh, is crucial when you're in grad school, Because, you know, once you're in a PhD program, there are no more like easy metrics to gauge like how good or bad you are doing.
1:11:29And the truth is you're just doing like, you know, like there just isn't such a metric. So all you can really do is evaluate your past self with your present self and compare and contrast to see if you're making progress with whatever it is you want to do. Thank you so much for your time, Professor Williams. I really appreciate it. Yeah, I appreciate you having me here. It's been fun. Thanks.
1:12:19building the ergonomic keyboard that i wish existed here's a glance at the prototype it's a split keyboard so there's two sides this is in the case but yeah we launched on kickstarter and we hit our goal within eight hours of launching i really appreciate it if you were one of the people who grabbed one of the early units we're now working on the long journey of building the tooling now and so if you still want to pick one up i've left the late pledges open on kickstarter so you can grab one there. I'll put a link in the description. Thank you again for watching the podcast and I'll see you in the next episode.
From the publisher
Ryan Williams is a professor at MIT and the winner of the Gödel Prize in theoretical computer science. I interviewed him all about his work starting by asking him a popular Leetcode question (3 SUM).
• My ergonomic keyboard project I mentioned, you can follow along here: https://read.compose.llc/
• The Kickstarter page for it: https://www.kickstarter.com/projects/ryanlpeterman/compose-simple-ergonomics-beautifully-done
Podcast links:
• YouTube: https://youtu.be/AaK1SL2i_4Y
• Apple: https://podcasts.apple.com/us/podcast/the-peterman-pod/id1777363835
• Transcript: https://www.developing.dev/p/mit-complexity-theorist-on-leetcode
Thank you to this episode's sponsor for supporting my work:
• WorkOS: makes your app Enterprise Ready with easy to use APIs to add SSO, SCIM, RBAC, and more in just a few lines of code, check them out at https://workos.com/
Timestamps:
(00:00) Intro
(00:41) Asking him a popular Leetcode question
(03:54) Doing better than the popular optimal solution
(08:26) Fine grained complexity
(17:00) A severe strengthening of P vs NP
(24:38) SAT problems and solvers
(34:51) Hot takes on famous open questions
(46:57) Simulating space with time
(01:01:02) Why he solves hard problems
(01:02:35) How to pick good research direction
(01:07:14) Technical book recommendations
(01:08:31) Advice for his younger self
(01:11:56) Outro
Where to find Ryan:
• Wikipedia: https://en.wikipedia.org/wiki/Ryan_Williams_(computer_scientist)
• Website: https://people.csail.mit.edu/rrw/
• LinkedIn: https://www.linkedin.com/in/r-ryan-williams-a1b534a/
• X/Twitter: https://twitter.com/rrwilliams
Where to find Ryan:
• Newsletter: https://www.developing.dev/
• X/Twitter: https://x.com/ryanlpeterman
• LinkedIn: https://www.linkedin.com/in/ryanlpeterman/
• Threads: https://www.threads.com/@ryanlpeterman
• Instagram: https://www.instagram.com/ryanlpeterman
• TikTok: https://www.tiktok.com/@ryanlpeterman
Referenced in this episode:
• Some Estimated Likelihoods for Computational Complexity: https://people.csail.mit.edu/rrw/likelihoods.pdf
• Simulating Time with Square-Root Space: https://arxiv.org/abs/2502.17779
• Cook and Mertz's tree evaluation paper: https://dl.acm.org/doi/10.1145/3618260.3649664




