 Okay, let's see, Mike seems to be working as well. Okay, that's good. So this is lecture 3, but as usual the L does not show up at the right time, but the other are the alphabets are there, so you can figure out its lecture. And let me remind you of what we did last time, we noticed that a k dimensional subspace of 0, 1, n was actually a code, right, it was a linear code. We'll have a notation for this, we'll call any k dimensional subspace of 0, 1, n as an n k code. Okay, this is denoted n k code. Okay, can there be more than one n k code? Yeah, I mean how do I specify one n k code? What should I do to specify one n k code? I have to specify one particular subspace, how do I do that? k linearly independent elements from that, I have to provide some basis, right? So there can be more than one n k code obviously and then if for each basis there will be a hopefully several n k codes. Okay, so this notation is quite standard n comma k, n is called the block length and k is there are several names for it, I'll refer to it as either dimension or message length. Okay, so that's how we'll denote a k dimensional subspace of the n dimensional binary vector space. By the way, people who are sitting rows 4 and after, I would strongly recommend that you come closer because I tend to speak low often and then you can't really hear it unless you don't want to hear me, you don't want to hear me, that's fine. Okay, all right, so that's the n k code and we've been talking about the dual subspace, right? So what's the dual? of this subspace is dual of, I'm sorry, dual of an n k code. Okay, so we saw before that this will actually be a n minus k dimensional subspace or in my terminology now in my notation, I'll be, I'll know it'll be a n minus k code, right? It's an n minus k dimensional subspace, so I know it will be an n minus k code, that's my terminology. Okay, all right, so you see, you see by specifying the code, you're also specifying what the dual is, right? So you can do it either way, right? How do you specify a subspace? You either specify the basis or you specify a basis for the dual. Okay, once I specify a subspace, you know how to find its dual. Once I specify a dual, you know how to find its dual and come back to the subspace, right? So both of these will be equivalent in some sense. Specifying one is the same as specifying the other, in terms of specification, you don't have to specify both. Okay, so in this class, we will see a whole bunch of examples to make this, to look closely at how these subspaces look like and I'll stick to this n equals 6 which was the favorite number somebody picked in last class. Okay, so we'll pick this n equals 6 and look at a whole bunch of examples to get a feel for how these things look like. Okay, how do these dimensions look like? What are the various codes of length n equals 6? And what can we say about it? Okay, without looking at any of its applications or using it in a channel or anything like that. We will do that later but for now, we'll just look at all the subspaces and figure out if there's anything interesting that we can say. Okay, so the main skills you have to pick up when you look at just subspaces are, how do I go from code to dual? How do I go from dual back to code? Okay, what's the point of the dual? Right, why is why does the dual seem interesting? Right, to go from the message to the code, from to go from the message to the code word, maybe the dual is not so interesting. It's also interesting, but maybe not as interesting as the generator matrix. But on the decoding side, you can see the dual is so nice because it gives you parity checks on the code word, right, you don't know anything about the message, but you have a receipt word to work with. So the dual is very interesting in that fashion. Okay, anyway, so let's see a whole bunch of examples. The first example presumably that one can see is say we'll set k equals zero. Okay, what will happen if I set k equals zero? Okay, so what can we do? I mean, this is like the 6 comma zero code. Okay, there's only one 6 comma zero code. What is that? It'll simply contain all zeros, we can take this as like a notation, you know, I mean, there's no real zero dimension, right, it makes no sense, okay, you have a basis with no element, right, maybe, maybe we'll take it as a convention that the 6 comma zero code refers to the all zero vector alone. Is that a subspace? Yeah, it's a subspace. We do do it, nothing will happen, right, you add and multiply nothing will happen. So it's a subspace, we'll call it the 6 comma zero code, it's a trivial code, right, there's really nothing in it, it's a trivial code. Okay, so whenever you have a code, what is the skill that you have to develop? You have to go to the dual, right, that's what we're going to do. So now think about it for a while, okay, this is my code, what is its dual? Okay, so the first thing you have to determine is what are the dimension, what is the dimension of the dual? What is the dual in this notation? If you have a 6 comma zero code, the dual will be a 6 comma 6 code. Okay, so that's also a trivial thing, what is it actually? Yeah, it is the set of all six bit vectors. Okay, so I have a notation for it, I'll simply call it 016. Okay, does it make sense are these two duals of each other? How do I check if these two are duals of each other? Any two vectors you choose from these two have to be orthogonal, right, dot product should be 0, yeah, it's very clear, right, you pick all the all zero, this is going to be orthogonal to every vector in the dual, right, and that will be the only vector that's orthogonal to every vector in the dual, right, you can also convince yourself that has to happen. Okay, yeah, yeah, in this case it contains. You see the dual and the code will even the subspace and its dual will anyway intersect at the origin in any vector space that will happen. So this is not that strange, okay, you'll see as we go along, there will be more non-trivial intersections. Okay, so something I mentioned in last class, we will see it. Okay, so k equals zero is not that interesting, it only gives you two trivial codes, the code which is, which actually corresponds to an uncoded system, right, 6 comma 6 is a uncoded system, you know, you're not adding any parities, okay, so one can think of this as an uncoded system, an uncoded situation. Okay, in the other case like k equals zero is just totally meaningless to talk about what it is also. All right, so the next interesting thing is to look at k equals 1, okay, 6 comma 1, will there be only 1 6 comma 1 code? No, there'll be, there'll be many, right, so there'll be many. So I'll have to say 6 comma 1 codes, okay, there'll be several 6 comma 1 codes. How do you characterize the 6 comma 1 codes? Yeah, I have to have one more, right, so like she's saying, she's saying you need one element in the basis, okay, and it has to be linearly independent. So if you have a singleton set, linearly independent is the same as being what? Non-zero, okay, the only linearly independent singleton set is what? Is the zero vector, right, so anything non-zero will be linearly independent, okay, so on the face of it, how many different 6 comma 1 codes will you have? Without worrying too much about going into detail, you should have 63, right, it looks like you'll have 63 different 6 comma 1 codes, okay, so let's take a few, 63 of them, I'll put a question mark, and then we'll come back and look at it very closely, okay, so let's see a few examples, what's the, so how do I, okay, so I thought, so to specify a code, I'll write down a generator matrix, so that it's consistent with the many of the notations, so a few examples, so I could take G to be say for instance 1, 0, 0, 0, 0, 0, okay, this will correspond to a code, what is the code, what is the code, how many code words will the code have, a 6 comma 1 code will have 2 power 1 which is just two code words, one of them is all 0, the other one should be this, right, you just take linear combinations of these two, there are only two linear combinations, one is 0, and the other is this vector itself, in fact you don't have to even worry about this G, you can directly come up with all the 6 comma 1 codes, what will they be, the all 0 vector and some non-zero vector, okay, for every non-zero vector you'll have that, is that a subspace, is this a subspace, just these two, yeah, when you add any two of them, what's the only non-trivial addition here, are you adding? 1, 0 to itself, that will be the only non-trivial addition and that comes back to 0, right, so this is a vector space, it's no problem, all these things are codes, okay, but let's look at this other code, suppose I say, suppose I say instead of 1, 0, I pick G to be 0, 1, 0, 0, 0, it's just nothing really fancy here, what does the code look like, one code word is the same, 0, 1, 0, 0, 0, 0, okay, so well technically these two are different codes, right, when you can't say they are the same, because code word is different clearly, okay, but in practice suppose you say you're sending it over a symmetric channel, okay, independent channel, right, memoryless channel, each bit goes through an independent version of the channel and what's the difference between these two, there's really no difference, right, this is nothing but a simple reordering of the coordinates of the other code, okay, instead of sending the second bit, instead of sending the first bit, first time, you send it the second time around, since your channel is completely symmetric, not the big deal, since your channel is memoryless, it doesn't matter when you send the bits, these two codes really are not different, okay, they are the same, even though we would, they look, at least when you write them down, they look different, they are really not the same, not different when you use it on the, on the, on any channel, okay, as long as the channel is memoryless, okay, so typically people don't distinguish between these two codes, okay, so you don't think of these two codes as being same, different, okay, there's this notion of codes being permutation equivalent, okay, so I'll make it precise as we go along, basically if you permute the coordinates, if one code becomes another code, both of them are supposed to be the same, okay, there's really no difference, okay, so keep that in mind, so one can say 6 comma 1 codes, okay, many of them will be equivalent, right, how many codes will be equivalent to this first code that I wrote down, 6, right, so there might be more for the other things, but they'll all be equivalent, for instance if I think of g equals, let's say let's take some example like this, and the code would be this, okay, so this looks, this is of course not equivalent to the previous two codes, right, but there will be so many other codes that are equivalent to this, how many other codes will be equivalent to this, 6 e2, right, so that would be like some 15 codes which will be equivalent to this, if I pick a vector of, vector with three ones in the g, how many codes will be equivalent to it, 6 e3 likewise, so you'll add up, we'll ultimately get all the 63 codes, not all of them will be different, there'll be only six different classes, each of them will fall into that, okay, all right, so that's about just looking at the codes themselves, so what's the next skill, the skill that we really want is to find the dual of these codes, okay, so let's try to find the dual of the first code, okay, so maybe I should go to the next page if I can manage to, okay, so let's try to write down the duals, okay, suppose I started with c equals, okay, I write down usually c for the code, 0 0 0 0 0 0 and then 1 0 0 0 0 0, okay, so suppose this was my code, the dual we will denote as c perp, right, what will this be, okay, okay, yeah, everything with, it's like you're saying, so everything with 0 in the first place, okay, so that's, that seems like a good answer, you have to check a lot of things, right, you can't just happily accept that, first of all is that a subspace, it will be a subspace, okay, so all those things you can check, but there's also other simple mechanical methods, so you don't have to come up with all these fancy methods, what's the simple mechanical method, I want a simpler mechanical method, let me be more precise, you start with g, once g is in systematic form, you write it in ip form, i k p form, what is h, h is p transpose i n minus k, right, and the rows of h are my basis for the dual space, okay, so that's a very automatic way that in which you can find it without resorting to intelligently trying to find it, okay, if you can find it intelligently, that's great, but if you want to do a mechanical job, you can also do that, okay, so how do I do that, let me show that, I have g, what is g now at this point 1 0 0 0 0 0 0, okay, okay, I have to first write it in i k p form by doing elimination, whatever, okay, I have to do that, okay, but notice here what is k, k is 1, so i 1 is, it's already in that form, right, so what is, this is how you split it to see that it's in that form, okay, so now h becomes p transpose, okay, p is what, 5 zeros, so if you transpose it, you'll get 5 zeros in a column, okay, and then what do you have left, it should be i 5, so that's your h, okay, and what will c perp be, it will be that five dimensional subspace which is spanned by the rows of h, okay, so rows of h form a basis for c perp, okay, so this is the same as doing elimination, so how do you find null space for a matrix, this is what you do, right, you eliminate, get it into r r your form, and then you identify your free variables, put once there, and then it's the exact same procedure, it's nothing different, okay, just that we have a formula for it in the i p and then p transpose i form, okay, so this is the mechanical method, okay, you just reduce g to the systematic form and then use the formula to go from g to h and the rows of h you know will generate the dual which is the c, okay, very simple, so let's look at the other example, let's, this is for the first one, for the second one we had seemingly a more difficult problem, okay, because I had c being this and then this being this, okay, in which case g becomes 0 1 0 0 0 0, okay, so here it seems like elimination is not going to help you or will you get one to the left by elimination, okay, so you have to do a column swap, okay, and why is it that you can do column swaps without worrying about anything, only thing that column swap does is changes the order in which the bits are centered, nothing else happens, okay, so you can do a column swap, so the first thing to do is do a column swap to reduce g to systematic form, maybe you can call it g systematic if you don't want to say same g is equal to both vectors and now you can go to h systematic, okay, which will be what, which will be exactly the same as this matrix, right, right, you can do that, once you write write it in that form, this rows of hs will be a, will be the basis for the code, okay, but if you want the exact basis for this c what will you do, you undo the flip that you did column swaps that you did to go from g to gs, okay, so undo column swaps to get exact dual, okay, so that's the strict mathematical procedure, but in practice in coding nobody really will distinguish between these two codes, okay, a code with its column swapped is considered to be pretty much equal to the code which will add the columns in different order, okay, so nobody will obsess with this, okay, so you can just happily say this is the dual and be happy with it, just make sure you don't, you always use systematic form codes, so there's no problem, but if you want to be exact you might want to do these swaps and make sure everything works, okay, is that clear, so that's how you find the dual, all right, okay, so okay, so the next example we'll see will hopefully be a more interesting example for you, so you can keep going along like this for k equals 1, so k equals 2 will start to get more interesting, how many different possibilities will you have for k equals 2, okay, so if you want k equals 2, 6 comma 2 codes, looks like there'll be many more, okay, so we had 63 different, possibly different categories in the codes in the previous for k equals 1, for k equals 2 you have to pick two linearly independent code words, right, in the binary for binary vectors when will two vectors be linearly independent, when will two vectors be linearly dependent, believe me when one of them is zero, no, no, it's not, that's not the only credit, when both are the same, right, when one of them is zero, yeah, definitely it's linearly dependent, that's not the only case, both vectors can be exactly the same, if they are different can they be linearly dependent, no, for binary it's not possible, okay, but for instance in real vectors the vector 1, 1 is equal, is linearly dependent with the vector 2, 2, okay, why is that not possible in binary, everything is reduced, modulo 2, so you have only two scalars 0 and 1, so you can't multiply by the scalar 2, right, so there's no real 2 there, okay, so only way two vectors would be linearly dependent in binary vector spaces is they are identical, okay, so right now using that idea, how many different 6, 2 codes could you have possibly, 63 choose 2, right, it looks like all those things will show up, you'll have to actually consider all of them and then what maybe you can reduce based on permutation equivalence, you can just equate codes which are permutation equivalent and then reduce that number if you want and finally get to the really different 6, 2 codes, okay, that will be a lot of work, you have to do a lot of work for that, okay, we won't do that, we'll just consider some simple cases just to get started and think about how this is going to work, okay, so the case that we'll consider, we'll just see one example, I'll take g to be this way, 1, 1, 0, 0, 0, 0, 1, 1, okay, so the first thing I want you to do is tell me what c is, okay, all 0 of course, what will be the other vector and any other vectors in c, the rows of g will obviously be codewords, okay, so you can directly write down the rows of g, that will be linear combination, the first row multiplied by 1, second row multiplied by 0, that will give you this, the next linear combination is first row multiplied by 0, second row multiplied by 1, that will give you 1, 1, 1, 0, 0, the last one is both multiplied by 1, so that will give you 0, 0, 1, 1, 0, 0, is that fine, okay, so that's the code, okay, so I want you to do some work and get the few codewords of the exact dual, okay, so I think how many codewords will the dual have, what will be the dual? Dual of this 6, 2 code will actually be a 6, 4 code, so how many codewords will it have, 16 codewords, why is that such a difficult thing to do, it's just 2 power 4, right, 16 different codewords, okay, so just write down a few of them, don't have to write down all of them, at least write down four linearly independent ones and then a few combinations just to see how it works, what's the first step, first step is to go from g to gs, right, in systematic form and you'll have to do some swaps, right, it won't come without swaps, remember what swaps you do, go to hs and then undo the swaps and you'll get h, okay, shall I write down gs, okay, enough of you have done gs, okay, it's not too difficult, I think gs would be 1, 0, 1, 0, 0, am I right, you can have 0, 1, 0, 1, 0, 0, did you get it in this form, okay, what's the only swap you have to do, you have to swap the second and the third bit, right, you don't have to do anything else, okay, right, so what's hs, let me write down hs here just to save some space, it will be a, what will be the dimensions of hs first, this is a 2 by 6 matrix, so hs will be a 4 by 6 matrix, right, and the first thing to do is to write down the split, this is your i2 part and this is your p part, okay, hs the first part will be p transpose, what's p transpose now, 1, 0, 0, 0, 0, 1, 0, 0, okay, and then you'll have the identity part, which would be 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0 and 0, 0, 0, 1, okay, so now we have to undo these two swaps to get the exact h corresponding to this g, so the h will be what, okay, let me write down that also, actual h will be, the first column is going to be the same, second column will also be 1, 0, 0, 0, third column will become 0, 1, 0, 0 and after that you can happily repeat what you have in hs, is that fine, okay, so now we readily have four linearly independent vectors in the dual of c, okay, what are the four linearly independent vectors in the dual of c, the four rows of h, okay, so you could write for instance c perp is generated by 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, okay, this is a very mechanical way of getting this, okay, so what is a generator matrix for c perp h, which is the parity check matrix for c, okay, so both these roles are played by these two things, so what would be a parity check matrix for c perp g, okay, so all those things are there, okay, so let us let us try a few smart things now, okay, could you have guessed that these four would belong to c perp just by looking at the codewords of c, try some intelligent guesses, for instance look at the last two vectors, those two should be in the dual, right, you see why it is in the dual, okay, for any vector in c just by looking at g you can figure out those things, okay, so likewise even these two vectors it makes sense that they form parity checks for c, now I mean looking at the codewords, right, that is those are interesting things to look at, okay, okay, so now for instance people might want to think about intersections between c and c perp, what is the intersection between c and c perp, okay, so remember these are just the basis elements, c actually has c perp actually has how many codewords, 16, okay, go ahead let me see, what is the intersection between c and c perp, yeah, so you will see c will actually be present in c perp, okay, so you notice, notice what is happening, so all these interesting things will happen, so this is a surprise, okay, c is contained in c perp, okay, codes like this are called self orthogonal, okay, it is a very nice natural terminology, this is called self orthogonal, so such crazy things can happen in binary vector spaces, these things won't happen in real spaces, right, so you cannot have a non-trivial real subspace contained in its dual, right, it will never happen, the inner product is nice inner product there, here it is a little bit different, okay, alright, so any questions, basic questions on how I went about getting c perp from c, okay, so it is very important to be very comfortable with this, it is one of those very basic skills that is taught in the beginning of every coding class, okay, so you should know this very, very well, okay, it can get non-trivial, just do it by hand, for instance one nice computer assignment I would suggest is code this in c or matlab, okay, so it is a very nice assignment to try, okay, so you will have to take care of a lot of things in practice, for instance the rows of g might be linearly dependent, so when you eliminate you will end up getting rid of some of them, so the k that you initially thought you had may not be there, might reduce, the rank of g may not be exactly equal to the number of rows, right, can be less than that, so you have to take care of all those things, you will see all these utilities are not readily available in c or matlab, okay, using dating binary rank, matlab has some binary rank programs which are very, very slow, they don't run very fast, you might want to write these things, it is good training, okay, all right, so let us look at just one 6-3 code, okay, one 6-3 code which I think is very interesting, okay, we will just see one example, okay, so let us do a simple computation before we proceed, in the previous case we expected 63 choose two different codes on the face of it, could be permutation in equivalent or something, in this case what can you say, is it easy, is the computation easy, okay, how will you choose three different vectors which are linearly independent, right, that is what you need to do, okay, the first vector can be chosen to be any non-zero vector, the second vector should be chosen to be something which is not equal to the first one, what about the third one, not its sum also, right, so it is very easy to do that computation and you also have to take care of the fact that you could have chosen them in any order, so you have to divide by some three factorial or something, so you can easily compute the total number of different 6-3 codes that one can expect, maybe some of them will be permutation equivalent, that is different, okay, so that computation can be done, it is an interesting thing to do, okay, so the one 6-3 code that we will, I will try to give you as an example, it is following code, okay, it is a very, very simple code, so you notice that the way I have written it down, rank of g equals 3, right, you can very easily see that it is 3, 3 rows are linearly independent, so it is in fact, this g in fact defines a 6-3 code, you can easily write down the 8 code words which are what, which are members of this code, it is not, it is very easy to write that down also, okay, what I want you to do is find h, okay, so I think it is, so you have to do how many, I mean there is no elimination required here, but you need how many to reduce it to systematic form, what do you need to do? Column swaps, right, so you will do 3, 3 or 2, yeah, maybe 2 column swaps depending on how you do it, it is enough to do 2, 2 column swaps and get to the permutation and then you will see, you will notice to your surprise that when you undo the permutation, what do you get? You get the exact same thing as h, okay, so what does this mean? It means, in fact the c equals c perp, okay, this is, the situation is called self-dual, okay, so in this case it is very easy to analyze, right, the code and its dual are the same, okay, so finding self-dual codes is a very non-trivial problem, as I said it is very active, such problem as well, people work on it constantly, okay, so that is the only case I wanted to consider, so this thing can get a little bit non-trivial, if you are not used to it, particularly in exam pressure, if I give you a generator matrix and ask you to find the parity check matrix, I have seen a lot of people make mistakes, okay, so it is good to practice this just for you from an exam point, all right, so that is about code and the dual, I want to point out one further fact which is, which usually is not emphasized in the beginning of coding class, but it is becoming more and more significant today, now that you have so many, so many advances in coding theories, what is important, so I will go back to some k, the k equals 2k's just to highlight this fact, so we will look at a 6-2 code with g equals, let us say let me pick something, something in systematic form, 1, 1, 1, 0, 0, 1, 0, 1, 1, okay, I will pick it in systematic form itself, okay, what is the code, okay, what is the code, all zeros, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, okay, so that is my code, okay, well I think I should, that is my code, okay, all right, so if you try to find the parity check matrix, what will the parity check matrix be, did I make any mistakes or what, people are staring at me, I am not telling you what mistake I made, oh there is a, okay, there you go, it should be 0, 1, right, is that fine, okay, good, so if you write down h plus by doing the IPP transpose I switch, you will get 1, 1, 1, 0, 0, 1, 1, 1 and then you would get 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, okay, okay, right, okay, so I have been emphasizing that the dual and the parity check matrix are likely to play a very good role in decoding because without any reference to the message they tell you whether or not a six-bit vector in this case is going to be a codeword or not, why is it, why is it true, so you see is a codeword, a vector is a codeword if and only if, h times that vector transpose is 0, okay, so that is, you can see that itself gives you some information about decoding, maybe you want more information, suppose for instance what does, what does, what does it mean to say this is in the dual, okay, so for instance since that is the second row you know this belongs to C perp, okay, what does it mean, one way is, one way of interpreting that is that if you take a dot product of this vector with any codeword you should get 0, okay, so suppose I have a codeword that I will not specify, I will simply say it is C0, C1, C2, C3, C4, C5, an arbitrary codeword C, C, I know these two dot products have to be 0, okay, so suppose evaluate the dot product, what do I get, okay, C0 plus C1 plus C3 equals 0, okay, in every codeword of C, I should have C0 plus C1 plus C3 being 0, okay, so that is the power of that statement by saying 11010 belongs to the dual, okay, so likewise there are other parity checks, right, okay, so this is, this is called a parity check, okay, it says check the parity of the first bit, second bit and the fourth bit in your codeword, if it has even parity what does it mean, that vector could be a codeword, why am I saying could be a codeword, because I do not know about the other bits, right, when is it a codeword, when it satisfies all these four independent parity checks specified by the parity check matrix, then it is a codeword, if I know it satisfies one parity check it could be a codeword, if it does not satisfy what do I know definitely, there is no way it will be a codeword even if you give me all the other bits, okay, so that is a powerful check to have, okay, so likewise you can write down other parity checks, for instance the first row will give you what, C1, C0 plus C2 equals 0, third row will give you, I am sorry I think I am going a little bit here, it will give you C0 plus C1 plus C4 equals 0, okay, and the last row gives me C1 plus C5 equals 0, okay, I think I am writing all over the place but you can see that those are the parity checks, okay, those are four independent parity checks which together when satisfied also mean that the vector is definitely a codeword, okay, but are there other parity checks, can you come up with any other parity check? Yeah, any linear combination of these four will again be another parity check which has to be satisfied, so what will be the total number of non-trivial parity checks, of course if you use the all zero codeword then 0 equals 0, what is the total number of non-trivial parity checks in any nk code? 2 power n minus k minus 1 which is equal to the number of non-zero vectors in the dual code, okay, so every non-zero vector in the dual code gives you a parity check for the code, okay, so that is the important in today's context that is a very very important fact to note and I am bringing it up very early in this class because we will soon move into this and that time it should not surprise you, okay, so that is a very important fact. Every non-zero vector in C perp is a parity check for C, okay, it may not be, so if you take enough of them you will get a set of independent parity checks which together will mean and if and only if, if all these things are satisfied it is definitely a codeword, but you may not, you may also have partial information, you know, I may say, okay, these bits satisfy this information, okay, so that is the power of parity checks, so somebody says what is the total number of non-trivial parity checks it is 2 power n minus k minus 1, okay, so those are some facts about the parity check matrix, okay, all right, so I think there are about five minutes left, I do not want to start something new, I think I am happy with the way we have done the basic vector spaces idea, I think it should be reasonably clear but you will see easily that when this number becomes large, when n becomes 1000 and k becomes 500 you are not going to be able to do this by hand, okay, given a G you are not going to be able to do elimination and go from G to H by hand, it is very difficult, right, and it is also not possible to list out all the codewords, it is very clear, so you need computing tools that can do some fancy things for you to come up with parity checks, but you can come up with parity checks, right, you can come up with a lot of parity checks, maybe not all of them but lot of them and that kind of thing is useful for decode, okay, all right, so I think to sign off we will just see one example of a situation where I will ask you to go from G to H, which could be slightly interesting, okay, okay, this is my G, okay, so what are the, what can you say about the parameters of the code that G generates, okay, what is n? n is 8, that is very easy, can you decide k immediately? No, okay, so even to decide k, what should you do? You have to go through elimination and reduce it to systematic form, once it comes to systematic form, you can decide on k, okay, so I want you to do that, I want you to do the elimination, you might need to do swaps also, right, come bring it to systematic form, go to HS, go to GS and then go to HS and then come back to H and complete this picture, okay, so maybe some of you are very good at doing this, but I am sure some of you recognize that this can be slightly non-trivial, even in the very small, simple case, you have to do a lot of swaps, you have to do a lot of elimination, so if you are not used to doing this thing very fast, you can make a mistake very easily. See, you can also do row interchange, right, that does not change anything, right, from your linear algebra background, hopefully you realize row interchanges, do not change the row space, row space is my code space, so it is not a problem, three, which is your linear combination, which is in this four, so to get the exact dual, remember you have to remember your swaps, then undo them after you get, if you do not do that, you will not get the exact dual, you will end up with a dual which is not orthogonal, you say, okay, where did I go wrong, okay, you have to undo the swaps, okay, how many of you have concluded K equals 4, okay, so K equals 4 is the right answer, in fact, if you do a lot of work and find H, what do you think you will get, somebody make an intelligent guess, yeah, at the end of the day, you will get an H which is the same as G, okay, so this is also a self-dual code, it is a very famous code, okay, it is a very, very, very famous code in coding and you might want to get acquainted with it, in fact, if you find all its code words, what do you think it will be, it will be a very interesting set of code words you will get, okay, so it has got lots of, take a look at it, yeah, even parity, yes, but there will be a lot of structure to a lot of its code words, it is a very wonderful code, okay, so it is good if you like such things to list out the code words of this code, just stare at it for a while, see if you notice some patterns, it has got some beauty to this, okay, so I do not know, if you see beauty in ones and zeros forming patterns, you will like this, okay, all right, so that is, in this case G equals H, okay, all right, so I will just sign off with a couple of facts which you might want to prove when you have time, so first thing you can show is if G and H are generator and parity check matrices for a code, what will G times H transpose B, it will be a big zero matrix, right, what will be the dimension of the zero matrix, yeah, whatever, K by N minus K, whatever, some big zero matrix it will be, okay, so G times H transpose will be zero, what are the facts which you would like, for instance, G times G transpose is zero implies C is contained in C perp for instance, okay, and C is contained in C perp and K equals N by 2 implies C equals C perp, okay, okay, so all these things are nice things to try and show if you want to play around with these things a little bit more to try and understand, it is very trivial but still it is good practice to have, for instance in this eight, in this four by eight matrix G that I have here as an example, you will see G times G transpose is zero, what is G times G transpose being zero means any two row should be orthogonal to each other, the row should be orthogonal to itself, you will see all those thing properties will be satisfied, so you see immediately C will be contained in C perp but you notice what K is N by 2 which means the dimensions of C and C perp are the same, so the number of code words are the same, so obviously C should be equal to C perp as well, so you can easily conclude those things based on these kind of stones, okay, all right, thanks.