 So I'd like to first off thank you guys for having me here. This is an amazing conference. So far during lunch, someone gave me multiple high fives in a conversation about hypervisors. So I feel like I'm in a room of kindred spirits. Just to test that out, who wants to hear about math? That would only work here. Okay, great. So I'll tell you a bit about myself, and then I'll tell you a bit about the talk, and then I will give you the talk. So I'm a security researcher first, but then also I am a PhD candidate in mathematics at the University of Waterloo. If you haven't heard of it, it's in Canada. And I work on quantum algorithms for cryptanalysis. So what this means is we look at the difficulty of computational problems upon which cryptography is built, and we find sometimes that the problems that we thought were very hard on a typical classical computer are in fact very easy on our proposed quantum systems. So what I'm going to talk to you about today is a bit related to that, but I would like to ground it in programming and thinking about programming languages and systems that we can actually construct. So what I hope you can take away from the talk that I'm about to give is an understanding of what, like it's not quite the network stack, but what the various levels of abstraction are within quantum computing and how a room full of people inclined toward the use of classical conventional computing could make use of quantum resources for speed-ups in their algorithms. So whenever I'm getting a big head about how I feel about my research, I have to remind myself that I spend all day thinking about imaginary computers. And that brings me right back down. So quantum computing as a very simple definition is using quantum mechanical phenomena, so things like entanglement or superposition to perform computational tasks. Why do we do this? It wouldn't make a lot of sense if it were just as good as the computers that we have because quantum computers are very, very expensive, and so far we have 15 or so qubits, and that's maybe not as useful as what we're looking for. So why do we have these very expensive computers? Because we think that we can have some trade-off and have less computationally expensive algorithms. So this is only true if we can scale it up. So to be useful, a quantum computer needs to scale, but this is really challenging because the things that make a quantum computer useful are the exact things that are getting in its way. So quantum computers are really sensitive to environmental noise. If we have a qubit in a room and someone walks down the hall in a non-specialized building, many floors away, it will disturb our qubit and it will collapse, and maybe we're not done our computation. So we have to have very specialized buildings. Another thing is we have a challenge with measurement in quantum systems. So when we measure a quantum state, we destroy a superposition, which is something I'll explain, and then it's really hard to create memory. And then beyond this, there's some other things, but I don't want to use too much time. So I stole this from Scott Aronson, who is a phenomenal physicist. Quantum mechanics in one slide. You can think of quantum mechanics as being probability theory, but you're doing it over the complex numbers, and this allows us to compute things in a really interesting way. So the basic unit for a quantum computer is a qubit. So we have regular bits, we have our ones and our zeros. A quantum bit is a superposition, so this is kind of when we put them all together. Superposition of values zero and one. So we're creating some linear combination of things, and that's when something is both values at the same time. With measurement or with noise, we can collapse this superposition, and what's interesting about it is sometimes we'll get a zero out and sometimes we'll get a one out, and yet we can set the same superposition up over and over again, and sometimes get a one and sometimes get a zero and not really know what's going to happen. So a cool thing, like I'm really interested in alternative computing architectures. When I was younger, I thought about, you could make a computer out of anything, you could make it out of beer cans, you could make it out of ant farms. So now I make it out of particle spins and polarizations of photons and things like that, which is probably better than the time I thought of making a computer out of many cats. So it's also more useful because you can't, well, we're not going to go down that path, but okay, so you have n qubits, let's say you have three qubits. This is equivalent to classically something like, and it's not completely equivalent, but let's go with it, this can represent something like two to the n complex coefficients. So to kind of break that down, we can look at the diagram up there. You have a three qubit register and you have three, zero, one, zero, one, zero, one. You can actually represent two to the three values, so the binary digits, you can get eight. So this is kind of interesting when you have three qubits, but it quickly scales. So this is one of my favorite kind of thought experiments about quantum computing, which is, so let's say you have a 64 qubit quantum computer, keeping in mind that a qubit can be like a particle of light. So 64 qubits, you know, you could easily fit this in your hand, right, much smaller than that, would be 18 quintillion parallel operations. If we were to run that on conventional supercomputers as of a couple of years ago, this would cover something on the order of 750 trillion acres with supercomputers, which would give us computing clusters covering the surface of 5,000 Earths. So I'm really inspired by thinking about covering 5,000 Earths in supercomputers and running them until the heat death of the universe, and it turns out we don't have to. So, I don't know why my research grants get turned down. All right, so there's seven stages. So the reference to this is, I don't know, I'd have to get back to you, but the reference to this is a paper by Dvorak and Schollkopf. That was published in, I think, Science a few years ago. And this is basically, we have seven stages to get from having a particle of light to having a large-scale quantum computer that can do some crazy stuff. So the first thing is we have to have a qubit and we have to be able to do stuff to it. The second thing is we have to be able to do stuff to a lot of qubits. Then we have to be able to correct our mistakes. After that, we need to be able to keep that data in memory. After that, we need to be able to deploy a quantum algorithm on at least one qubit. After that, we have to be able to do it on a lot of qubits. And then after that, we have to be able to deal with some of these noise and fault tolerance issues that I kind of alluded to before. So, we thought about qubits. We thought about this basic thing that we make a quantum computer out of, and take the qubits and we construct quantum gates. So this is when we configure our qubits so that we can perform logical operations. So if we think back, when I put up that slide a while back that I stole from Scott Aronson's story about that, we had several matrices that corresponded to these different quantum mechanical ideas. And as we can see here, the matrices that we have correspond to these quantum gates. Now, what's great is these are unitary matrices, so if that means anything to you, you know that there's certain things we can compute. Whereas, probabilistically, we have a different kind of matrix and the math becomes less powerful. Maybe that's not the best explanation, but let's go with it. Quantum circuits are composed of reversible, and this is very important, quantum gates, like those listed on the left. And they allow us to do a range of basic operations for an n qubit register. So in the same way, well, not quite the same, but in a very similar and analogous way we can build up circuits on our conventional computing hardware. We can build up quantum circuits as well out of our qubits that construct gates that construct circuits. So what does a quantum computer look like? It can look like many things. So interestingly, the qubits are very small, but the machines are very big. So here are several different implementations. You will notice that D-Wave is listed here. I will not say too much one way or the other, other than that is a different type or suspected to be a different type of quantum computing than what we think about when we think about the really powerful quantum computers that could break our cryptography or whatever it is. So D-Wave is very important for things like quantum annealing, so optimization problems, and it can be applied to perhaps machine learning. But when we think about the really powerful novel approaches to quantum computing, it's probably likely to be a different type of implementation. So when I proposed this talk, I've never really talked about quantum programming languages in a public fora before, so I hope it's going well. When I proposed this, I just thought it's kind of like a beautiful topic to think about, you know, you have this, you have a qubit, you have something that is a manifestation of the laws of physics, and that's really beautiful. And then you apply some operations to it to perform a computation, and you effectively exert control over to the universe to the fullest extent possible to get some output that is determined by the laws of quantum physics. I think this is beautiful. But maybe if beauty isn't your thing, or if you're like, why am I listening to this? Because this is, I'll never use this. Maybe the thing that we can take away from it in a more applied context is by understanding how we can build up a quantum computer from lowest to highest levels of abstraction, you offer yourselves an opportunity perhaps in the future. So when we think about very expensive quantum computers, we can also think about the likelihood that they're going to be available as a sort of, I'm not sure how to phrase it, some computational resource that you could rent time on and make use of for your own specific computational tasks. You wouldn't have a quantum computer at home. So in understanding that there are ways of building up to quantum algorithms, and implementing these on quantum computers, yet having fully classical interfaces and fully classical ways of programming them, we can then start to understand how we, as any kind of programmer that you may have, trying to solve any kind of computational problem that's perhaps relevant here, could make use of these resources. So you don't have to be a strange physicist to get the strange physics. So quantum programming language research, we're largely looking at higher level formalisms. So we have our algorithms that we can run on a quantum computer, and when we're talking about programming languages, a lot of what's come out is ways of articulating those algorithms. So it also involves things like a little bit lower level controls of how you're going to manipulate the qubits, and then things like compiler design. Now this becomes very challenging because we have to figure out, like we've learned from classical computing and programming languages about, you know, programming languages that weren't ready in time for the hardware. So let's learn from our mistakes. We need to figure out what the semantics are of the programming language before the quantum hardware becomes available. But this is really hard, because as we saw in the image a few slides ago, there were many different things that quantum computing could turn into. There's many different competing and diverse application areas, and we don't know which will be the first to scale or which ones are capable of scaling. So it's very hard at this point. Now why do we care about any of this at all? So these are the, I think these are really important application areas. These are the ones that never show up on a grant proposal, and I'll show you why shortly. One of the things is quantum simulations. So we think back to Richard Feynman, a very famous physicist of a few decades ago. He was talking about, you know, chips are getting smaller and smaller, and we're increasing the amount of processors that we can fit on a piece of computational real estate, and this is really cool. But the problem with this is we hit a fundamental physical limit, which is eventually quantum effects start to come into play and mess up our chips. This is maybe we can turn it around. Maybe we can make a victory story out of this. What if we harness those quantum effects to do something useful and to do something interesting? So the first application area of this was quantum simulations. This was thinking about a lot of the universe. We think about it classically, but perhaps it could be better understood quantumly. How can we simulate a quantum system, and what could this mean for various areas of science? Similar way of turning it around is metrology. We have very sensitive systems, but this is very good for performing precise measurements. We've also found that even quantum annealing, so the more readily available forms of quantum computing today, are very useful for certain kinds of optimization problems, and we see similar applications in material science, quantum chemistry, and debate ability, perhaps machine learning. So for example, when I talk about these quantum subroutines that we could all perhaps run once our computers scale up, machine learning is doing this right now. So there's a quantum algorithm that exists that gives us a quadratic speedup on the search of large unstructured databases, and this algorithm is called Grover's algorithm, and people are using it with a machine learning algorithm to speed up those application areas. So this is something that analogously we could perhaps do on very interesting computational problems in the future. But this is really not the sexy thing. This is not what you get interviewed about in the news. This is not where my research funding comes from. So why do we really think about quantum computing? And that is we could break the internet with this circuit right here. So this is what a quantum circuit looks like for Schor's algorithm. Some of you may have heard of this, if not, welcome. So Schor's algorithm was written, the first paper was written in 1994, and it's essentially a quantum algorithm that can be used to provide exponential speedup on the factoring of large numbers into their component primes. Why this is interesting is because most of the, almost all of the public key cryptography, widely used on the internet today, so this would be RSA, this would be elliptic curve cryptography, is based upon this mathematical problem, or specifically the hardness of this mathematical problem. But this specific circuit, this single circuit that lays before us, if implemented could dramatically improve our computation times for solving this. And what that means is you have your public key and you have your secret key, and in fact, from the public key with this circuit, with some implementation of large scale quantum computing, you can get the secret key back. What this means is at some level, we break the internet or any of the internet that requires any level of privacy or integrity or authentication. So it becomes very powerful, and this is maybe the most interesting application area of quantum computing. Now, to me, crypt analysis is really just thinking about what are the kinds of problems that computers cannot solve. So we've always thought of computers as one single thing, but now that we have quantum computers, we have to think about what are the kinds of problems that a quantum computer cannot solve. And in doing so, that's how we'll find the replacement for all of the cryptography that we have right now. So when we talk about unsolvable problems, and I think I'm running over time, so don't worry, I'm almost done. When we talk about the difficulty of computational problems, this comes right back to cryptography and crypt analysis. So when we think about quantum computational complexity, some of you may be familiar with the notions of P and NP and whether problems are efficiently computable. And what quantum computing fundamentally presents to us is an opportunity to find problems that are very hard to compute with a classical computer and very easy on a quantum computer, and this is very exciting. So maybe I'll leave it here, just finishing off with why I find existential pleasure in quantum computing. So one of the things is just being able to replicate, as I mentioned, the essential properties of the universe and hold them in your own soft hands. I think that's a very beautiful thing to have happen. The other, and take this as abstractly as you like, is quantum systems teach us that sensitivity is a source of power. It also teaches us that true randomness can present opportunities for a well-lived life that we've never seen before. So when we can create many different computational paths, we find that our universe becomes much bigger and our problems become much smaller. And I'd like to take that home with me. One of the things that I love most about quantum computing is we can solve problems that otherwise couldn't be computed before the heat death of the universe, and I'll still be here when it's over. And then finally, just accepting that what I observe of a system, I set up a state, and what you will observe if you set up the exact same state could collapse, and things could be totally different from each other, and it's really important to remember this. So these, I guess, are the reasons that I wake up in the morning, and we're letting me share them.