 Alright, so let's begin. We've been looking at quite a few codes right now. The last thing we looked at was ReadMiller codes. So let me just summarize as to where we are right now. Okay, so at this point, I think what we should be comfortable doing, open your door at the very end. You're okay? You don't want the fan. I don't know if you can hear me, but it's okay. Don't matter. So what we've been looking at is one of the various things we saw. We saw ReadMiller codes. So essentially this was where we got to and these two guys were very interesting from various points of view and ReadMiller codes and other interesting properties. But essentially what we can do there is given a block length and given p which is required of our correcting capability, we can come up with a code most probably a ReadSolomon or a PCH code which can achieve this. So these two can achieve for a given block length and error correcting capability. They can achieve some good code construction and in fact this is also good from a complexity point of view. The construction is easy to do then even the decoding is easy to do. So you have an algorithm which works. So the nice thing about ReadMiller codes is they're probably not as efficient as the ReadSolomon and PCH codes but they have some other properties. The decoder is even simpler than the ReadSolomon and PCH codes and they work very directly with the parity projects and all that and it's very intuitive and nice to decode. Then like I said the decoder that we used in the ReadMiller code can be extended for other things also and we'll see that in the next course. So this is where we are as far as the course is concerned and we have about three weeks to go two and a half to three weeks I think. So we're going to take what we're going to do in the next two to three weeks is the first thing we'll look at are a couple of issues like concatenated reflections. That's what we'll see today mostly it will be over today may not even take all of today. So after that we'll move on to an area for weight distribution and time permitting you might do something else after that. So after that maybe a little bit of more interesting stuff. So these two I want to do and with that I think more or less the course itself will be over and after that we'll worry about a few things and we're doing okay on time in case we are a little short to make those things. So this idea of concatenation is very bad post it's very crucial and even in modern codes they are used a lot for this notion of thinking of one code in terms of several other codes and what I'm going to do is talk about concatenations next. So the first kind of concatenation we'll talk about is what's known as concatenation. We're not really a concatenation. So I'm putting it into the general topic of concatenations because it falls into the category of bringing two different codes together and constructing a new code. So that's the idea of concatenations. So you bring two different codes together. So how do you do that is the idea and the concatenation. The first thing you'll see is the product code. Product code is quite simple. It's an interesting little idea. So what we do is we have two codes C1, N1, K1, D1, we have another code C2 and N2, K2, D2, we have two codes N1, K1, D1 and N2, K2, C2. So let's say G1 was the standard matrix of C1 and G2 was the standard matrix of C1. In the product construction what you do is you take so what you do is the product construction product of C1 and C2 will result in N1 times N2 comma K1 times K2 code. So we'll come back to the minimum distance later on but essentially the code will be N1, N2 and K1, K2. So that's where we call it the product. So the dimension gets multiplied, the blockchain gets multiplied. So this is the code that you're going to get. So the code essentially has K1, K2, message bits. So we'll think of the message as a matrix. So far we've been thinking of the message as a vector. You can also think of it as a matrix. In the product construction it's convenient to think of it as a matrix. You can of course also unwrap it and think of it as one big long vector if you want but the matrix is simple. So I'm going to have a message M which is K1 by K2. So to get a code word of the product code this message is K1 by K2 matrix. What's my code word going to be? K keeping with the same spirit. What will my code word be? How many bits are there in the code word? N1 and N2. So what is my code word going to be? N1 cross N2 matrix. So I want the N1 cross N2 matrix. I'm going to take this message matrix and do something with it and get a code word which is an N1 cross N2 matrix. So what I do is the following. So I'll take G1 transpose and multiply on the left side and then I'll take G2 and multiply on the right side. So that's what I'm going to do to get a N1 cross N2 matrix and this is essentially the product construction. So first of all this multiplication is very well defined. G1 transpose what's the dimensions of G1 transpose N1 cross K1. So that I can definitely multiply with an M which is N1 cross K2. And G2 is also K2 cross N2 and I do definitely get a N1 cross N2 matrix. So first of all is this product code a linear code which is linear. You take a message M1 produce a code word with it, take a message M2 produce a code word with it and then add the two what happens. You naturally get the code word corresponding to M1 plus M2 so it's linear. So that's it. This is linear. What is the next interesting question that we can ask about this code? The minimum distance. The rate may be what will be the rate. K1 K2 by N1 N2 product of the two rates. It's not too interesting. Minimum distance is not interesting. To get to the minimum distance there is one little property that we can do which is nice. So in this code word matrix let's look at the code word matrix a little bit more closely. N1 cross N2. It will have N1 rows and N2 columns. An arbitrary row of this matrix. What can I say about it? My goodness. A row of this matrix of this code word. The row of this matrix. Does it have any interesting property? Can you observe something from the way it was constructed? What will be the row? Sorry why? Yeah so it will be some code word of C2. So that's the first statement I want and then we will worry about the minimum distance later. So let's do a code word of you can do the multiplication, G1 transpose, N first remember matrix multiplication is associated. You can do it in any order. You will get the same answer. So you do the multiplication, G1 transpose, N first and you get some matrix and then you multiply by G2. So finally what you get will actually be a combination of the rows of G2 so clearly that has to belong to the code C. What about any column? The column will do a code word of C1. How do you get to that? You do the multiplication M times G2 first and then you multiply by G1 transpose on the left product you get column will be a linear combination of the columns of G1 transpose which is nothing but the rows of G1 and that has to be a code word of C. So it's just a basic matrix multiplication but we will get that answer. So this is a crucial property. So every row of the product code word is a code word of C2. Every column of a product code word is a code word of C1. So that's an advantage. That's a nice property to have for the product code word. So now we can think about the minimum distance. Let's talk about the minimum distance. So let's just tell you anything about the minimum distance. M1 D2? D1 is a code word of C1. Then there are also the minimum distance program that we have introduced. Let's look at it. Suppose somebody tells me there is a non-zero code word matrix. If somebody tells me there is a non-zero code word matrix there should be at least one column which is non-zero. If all columns are zero then you are finished. There should be at least one column which is non-zero. You go to that column. How many ones should be there in the column? At least D1. There should be at least D11 in that non-zero column. So now go to those D1 rows corresponding to the non-zero values in that column. Each of those D1 rows is non-zero and it's a code word of C2. So each of those D1 rows should have weight at least D2. So what should the overall weight be? At least D1 times D2. So that's the final result. So there is another way to view this multiplication which will complicate things a little bit. So typically we take G1 and G2 to be systematic form. We take them systematic form. So that when you do G1 transpose and G2 what will happen if you take G1 and G2 in systematic form? The code word will be M will be a top of it on the top K1 by K2 part. There will be a top K1 by K2 part. And then there will be a N minus K1 part N1 minus K1 part and N2 minus K2 part. So what's happening in the encoding? The first encoding M by G2 let's say. Then you will fill out all these parities. And then what are you doing? Encoding each column by G1. So we will be filling out all these parities. So usually people think of these parities as the row parities of M. And these parities as the column parities of M. And then what are these parities? They are parities on the parities. So if I describe it to you this way, it's a bit more complicated to quickly... Remember the other fact, every column is still a code word of C1. And every row is still a code word of C2. So it's a little bit more complicated to think of it that way. So you encode by C2 first and then encode by C1. It's not clear why every row should again be a code word of C2. So this multiplication works. So you can do it either way. So it has to be consistent in some way. So even these rows will be code words of C2. So it may not be immediately clear that that's the truth. So this is how the structure of the code word will look. So let's take some nice examples here. So one more for doing this example. Let's take some simple quotes. For instance, you have the 7, 4, 3, and encode. Except in some very strange cases, usually you take C1 to be equal to C2. So it's a very common situation. So nobody takes it. So you look at the product of C and C. What would be its parameters? 9, 16, 11 is equal to 9. So you have a 4 error correcting code of length 49. So suppose you want to come up with a DCH code with length 49. What will happen? So directly if I constructed. So maybe 49 may not be used to it. Maybe length 63. Let's say length 63, DCH code of 4 error correcting. What will you have? What will be the error? What will be K? 63 comma, what will be K? 39. So you have to subtract 24. 9 comma greater than or equal to 9. This case is going to be equal to 9. I know that. So you need 24 parities. So if you try and shorten, what will happen? You can always shorten. When you shorten, you can go to 49. And then you have to subtract 24. So you will have 25. So if you construct it directly using the DCH, you have an advantage over the product code. Definitely the product code is not that interesting. From optimal dimensions for a given minimum distance point of view. At least in this example. In many examples also it could be true. So this is the situation. But then there are some other advantages to the product code. But remember that this can be a problem. Some simple stuff. So to improve your rate, maybe you want to take... This is the first example. Maybe you want to take C to be the 743 and then maybe you take C2 to be let's say 9, 8, 2, even 8, 4. So let's try that. Just for fun. Just to see how it works out. What's the product of C1 and C2? It's going to be 63. 22. So if I try to construct it directly by DCH, what will I get? If I want minimum distance let's say 5. So 5 is more reasonable. So let's T equals 2. We'll get even a 63. 51 code. So it's not that competitive. Maybe you want to try something else. Let's try something else. Let's take C1 to be 8, 4, 4 code. How will I get the 8, 4, 4 code? You can take the Hamming code and do an extension by 1. Or it's the same as the ReadMuller code. ReadMuller code at length 8. And let's say we just do C1. Let's just do C with C. 64. 16. Now that's a little bit more interesting. 16 is a large new distance. If you want to do a corresponding DCH code you can aim for a 63 code with length 15. And then maybe extend it and get this. Suppose you try to add then what will you get? DCH should be 63. 15. Remember this. T equals 7. And we know a lower bound under K for DCH. What's the lower bound? N minus MT. N is going to be 6. 6 into 7 is 42. 643 minus 42 is 11. So it's 21. In most cases it looks like the DCH code is going to be from a rate point of view better overall if you directly constrain. But the product code will have some advantage. So let me say what the advantage is. The advantage will be in the decoding. So there is a structure to the product code which the DCH code does not have. You can exploit that. That is basically that each column is a code word of a smaller code. You don't have to worry too hard about decoding. Each row is a code word of a smaller code. So you can take that row alone and do some suboptimal decoding and try to combine all of them together and play some tricks there. So those things you cannot do with the DCH code. You'll have to directly run your bellicam messy for decoding 7 errors and that's going to take some time. So that's where you can put the game. That's one thing. The other thing is finding soft input decoders for product codes is also easier. You keep it easier than finding infertile pieces. Those are advantages today. But let me try and motivate this decoder. So we'll look at the 7.4.3 Hamming code. So we'll go back to this original example. Product of 7.4.3 with itself. Let's try and come up with that decoder which will correct 4 errors. So let's see if it's possible or not. Let's try that. So decoding product code. So we'll do this by example. I'm never going to do it in great detail. So we'll take the 7.4.3 Hamming product of basically a product of 1916 product of 9 code. So you should be able to correct 4 errors. So from just a single error character. So let's look at the structure of the code. Basically a 7.7 code word. Each row is a code word of the Hamming code. Each column is a code word of the Hamming code. And you can have, suppose I can have any 4 errors. So this is a code word. Let's say this is a received word. So any 4 positions can be an error. So how can I, so is there any strategy that you can think of? Which is useful in correcting. Any ideas? How can I go about correcting errors? Let's say there are some T errors. We are in the received word. What is the strategy that you can use? How to use the product property? So you try to do it one row at a time or one column at a time. So that's the idea. So try and decode one row at a time. One column at a time. So now we will have some interesting combinations arising. So typically I want to correct the minimum distance capability. I want to be able to correct 4 error patterns. So if my 4 error patterns are like this then what will happen? So if I correct row wise I will be in trouble. But then what can I do? If I correct column wise I will be okay. I will be able to correct. So like this you can think of so many other ways in which these 4 errors can distribute over a 7 x 7 matrix. Is there any case in which I will never be able to correct either row wise or column wise? If you have the same column then my row decoder will correct only. There is some error. It's part of a column which has 4 errors and it's part of a row which also doesn't. There are only 4. Let's say I am looking at only 4. Maximum of 4. So we need to be in a shape like this. So any other shape is correct about. But if we form this shape what will happen? What will happen if we form this shape? Yeah so there will be trouble. Whether you go row wise or column wise you will never be able to correct it fully. So you have to combine both the row and the column. So what do you do? You go row wise and see which rows there are errors. So all the syndromes will evaluate to 0 except for 2 rows. The equation of columns all the syndromes will evaluate to 0 except for 2 columns. And then you have to do some additional row to think about what is the possibility. So if it is just 1 or 2. So there are so many cases. So you have to work it out combinatorially one after the other. So basically it's I think possible for this case you can list out case by case thing and correct that to whatever. I think it might be possible. So I am not very sure. So you should not decode. That's what I am saying. Just compute the syndromes all the row syndromes. Compute all the column syndromes. If you have only 1 row syndrome being non-zero. I mean so many combinations are possible. So you have to try and correct and then re-evaluate all the syndromes. So there are so many things you can do. So one thing you can do is look at all the rows. You compute all the syndromes and correct the rest just based on that. And then go through all the columns. Go through all the columns and then correct the rest based on that. Then go through all the rows. Keep iterating it till all the row syndromes are 0 and the column syndromes are 0. Keep on doing this iterative. Usually it should work except that these kind of cases may not work very well. So what will happen? If I do a row is what will happen? There are two rows. If you do the hamming correction what will happen? It will try and introduce another error somewhere. And these two will introduce another error here. You don't know how it will work out. So I think it should actually introduce in the same place. So it's a hamming code. It's the same code. So you get another error here. And then when you go column wise there are more errors to be introduced. And you keep on exploring. So you cannot just do row iteration, column iteration in a dumb fashion. You have to use your row iteration and column iteration together in the next iteration etc. So on the top of my head I don't know if there's an algorithm or not. But I believe you can come up with something which might be able to correct power for errors. So it might be an exhaustive more painful list than what I've been doing it. But you might be able to correct it. So essentially the idea is to iterate between row and column decoders. And this is quite powerful. So what will happen is when you do these kind of iterations you usually cannot guarantee an error correcting capability. You cannot say all errors are very T I might be able to correct. You just do a simple iteration. You won't be able to correct this pattern for instance. If you just do all the rows, all the columns and keep on doing it you will never be able to correct this pattern. But this pattern is kind of peculiar. It requires some very precise coordination between the way the row and column errors happen. But so many other patterns which have even more errors can be corrected. So many six other patterns can be corrected. It's not that it's a very sharp bounded distance decoder. It will be a strange non-bounded distance decoder. You can think of the combinatorics here. So many other errors you will be able to correct. And that's an advantage in practice several times. Even though you cannot precisely guarantee an error correcting capability, if you can only not correct very few error patterns, that's okay. Usually these things don't occur with very high probability. Probability will be low. It might be better. So these kind of ideas are powerful today in the modern probabilistic kind of decoding as opposed to the very bounded distance type of decoding. These kind of ideas are very popular. The nice thing is each iteration is not very painful. If you're just correcting one Hamming code, I mean how hard is it? It's not like you don't need any finite field or anything. Just quickly you can correct one Hamming code after the other. So component decoders are very simple. And you kind of do some iterations here and there using some particle code. Another crucial point I want you to observe is you can also write this code word out as a 49 length vector. So let's try and do that. If you write the code word as a 49 length vector, somebody c1, c1, c2, c1, c2, c1, c2, c2, c7, c7, c7, c7, c7, c7. So basically you write code word as a vector. So one nice property I have is that these guys belong to the what? 743 Hamming code. So sticking with the example. So each of these guys belong to the Hamming code. Likewise these guys also belong to the Hamming code. These guys also belong to the Hamming code. So basically this code word has some local structure. What do we mean by local? A few of the code word bits together have some structure with it. Overall the code itself has some structure and that might be a very long code word you may not be interested in exploiting the overall code structure. But locally there might be some nice structure which you can quickly explore. And there is some merit in it. Particularly if you can iterate between these local structures and then try to combine them in some global way if you can or even just iterate blindly. Actually the global structure will begin to asset itself. So iterating but you have to combine them carefully and then you will bring in the thing together. So this kind of idea is very powerful today. So in today's modern interpretation you use some local structure in the code word and then try and iterate and get to your advantage. So this product code is a very simple way in which you can bring in local structure. So it's not so efficient but it's nice. So there are also other local structures. For instance these words together they also have some structure. So you kind of interlace these local structures and then you get some more interesting ideas coming up. Alright so you can definitely generalize these decoders. You can generalize this decoder and construct some more general decoders for the N1, K1, K1 case. But usually you may not be able to guarantee that you can correct up to the error correcting capability. You may not be able to guarantee that but what will be true? You will be able to correct a significant fraction of the errors. Maybe 1 or 2 where ever you may not be able to correct depending on the pattern. If you don't care about it, it will be over. You can implement the decoder. Yes. Yeah. Yeah. Yeah, you can do that. You can write down a particular matrix for this also. Overall, combine it with a big matrix. See the problem is, well it won't scale. That's the problem. Small numbers you can do it. But when you go to like, you want to take a product of two big codes and you may not be able to do it. Yes. I didn't say it can always be corrected. I said there might be some patterns before which you may not be able to correct. My D is the same which means my T has to be corrected. Sir, what decoder? My only distance decoder for what? What is that decoder? It will be the simple decoder, the ML decoder. Yeah. You don't want to go to the ML decoder for the long code. The ML decoder for the small code is not bad. The long code you don't want to do an ML decoder. That's the idea. I'm going to use the decoders for the component codes to decode a larger concatenated code. So that's the idea. What is the advantage that the component codes are easier to decode? The smaller block length is smaller. Maybe I have better decoders for them. I can implement the decoders and I can cleverly combine them to decode the original code overall. There might be some problems with error correcting capability and all that. But my decoder is very, very simple. Not only that, it can correct beyond error correcting capability. So the other boundary distance decoders are the problem that beyond error correcting capability there is a failure. These decoders won't have that failure. They will do something, eventually they might also decode. So there are both advantageous and disadvantageous. So those are important ideas. These kind of ideas are quite important. So there's another kind of concatenation which I'm going to talk about now. These are actually called concatenated codes. So that's kind of product codes. I'm not going to talk more about product codes. How will I write the generator matrix? You can do it. So you can think of it this way. If you have the messages, there are seven code words in the row. Then you have to first convert it into the error message. So it's a little bit more complicated. It's not that easy. It can be done. Maybe that will be a problem in the final exam. How do you write a generator matrix for the overall code? Parity check matrices also can be written. Yeah, here I search for a linear space. It's actually a length 49. When I say a length 49, 16 code, you write it as a 7 by 7 matrix. But it's a length 49 linear code. There's nothing wrong with that. How do you know individual basic vectors to get these separating? So parity check matrix I think is a little bit easier. You have seven of these things. Each of these things will usually satisfy the H. So you can put H in a block diagonal form. Is that enough? That's not enough. Then you also have the other columns satisfying. So another set of H will come in a slightly permeated form. So that's a valid parity check matrix. That fully gives you that. From there, you'll have to do elimination, go to a generator matrix. Maybe it's a little bit more complicated. Parity check matrix at least in principle is these. Yeah, I think it's possible to think about it. So essentially the overall code can be written as m1 times something plus m2 times something. So each method is multiplying some vector. You can do it. Maybe there's some chronicle product or something involved in the final answer. Might be eight commas. Think about it. So that's product codes. There are so many ideas there which are very useful. Once again, remember the idea, use two small codes to construct a bigger code. The big advantage is in the decoding side. You can decode with the two small codes to explore the local structure. You may not be able to observe any guarantees on error correcting capability but a large fraction of errors even beyond error correcting capability might be corrected. The next kind of concatenated code is a little bit more theoretical. I'll write it down here just for completeness. So in these ideas what we do is concatenated code. We also call form is concatenated codes. So you start with the one comma k code gf2 power m. So I'm putting all capital because small letters are also going to come. So gf2 power m. Let me be careful here. m comma k code over gf2 power, let me put small k. This is the first code c. Then I'll take an n comma k code but it won't work. Yeah, yeah, the two k's are the same. We have to be the same. Let me think about that once again. Let me make sure it goes fine. Yeah, I think it's fine. These two k's are the same. The same k here. I'm going to concatenate them using that. So what I'll do first is I'll take k times k bits. This is the overall message. And I take k times k bits. These are also k elements of gf2 power k. So I can encode it with c1. I will get n elements of gf2 power k. Or what? k times n bits. As n blocks of small k bits. Capital n blocks of small k bits. And then encode with c2 k at a time. What will I get outside? n times n bits. This is my idea. So I have an n comma k code over some field but I will not use that code like that. I'll use its expanded version. That's the idea. So when I use the expanded version everything is in terms of bits. So this overall code is called the concatenated case. So let me put some minimum distance here. Sorry for that. I'll add the minimum distance here. Perfectly deep. So my first question is is this code linear? So we're doing some gf2 power k conversion and all that. Is that okay? All that's okay. Because anyway addition in gf2 power k is the same as binary xor which is again addition in gf2. So this code is linear. There's no problem. What will be its dimension? It's going to be small k times capital k. What is going to be the block length, small n times capital n? What about the minimum distance? What can I say about the minimum distance? We don't know equal to which d. So think about it. Think about it a little bit more carefully. So you have n elements of gf2 power k. If I have a non-zero code word how many of those elements will be non-zero? dk. That's k in the picture. So I have a capital n, capital k, capital d code over gf2 power k. Every code where non-zero code word has at least how many non-zero elements? Capital d. That's the definition of minimum distance. Every non-zero code word of this code has at least capital d non-zero elements in it. So which means in my second encoding how many non-zero code words must be there? See in the second encoding what am I doing? I'm taking capital n elements and each element is being encoded into a code word in the vector representation. How many of these elements were non-zero? Capital d. So how many non-zero code words of c2 will I get after encoding? Capital d non-zero code words of c2 I will get after encoding. So each code word of c2, non-zero code word of c2 has what way? Small d. So what should be the minimum weight of the overall vector? Capital d times small d. Is that okay? So there's some argument here which you have to carefully think about. Is that okay? You're not convinced? Okay. So think about it this way. So I do. So I have here k times k bits. Each row is an element of what? gf2 power k. So I do the encoding here. What will I have? n times k bits each row is an element of gf2 power k. How many of these have to be non-zero? Some d of them have to be non-zero. Let's say these are d. What do I do in the next step? I take each row and encode it with c2. That's what I'm doing in the next step. Is that clear? Maybe what I'm doing in the next step was not clear to you. I take each row and then get the n bit code word of what? c2. So I have d non-zero messages to encode which means d of these rows will be non-zero and each row has to have weight greater than or equal to small d. So overall the weight will be greater than or equal to small d times capital d. If you view it in this matrix form it's a little bit clearer but usually you don't think of matrix when you're in this language. Just think of it as a rule. So once again we have a very similar idea where we've gotten two small codes and obtained a product like construction but this is not very simple product like construction. There is some complication here because we're going to this io field and you're doing some encoding there and then coming back to this binary field and doing some encoding there. So it's not very simple like product construction but nevertheless the principles that we had there are equally true. So there are two codes which are component codes of a bigger code. Then each code word has some local structure which you can try to exploit and do some decoding and try to conveniently combine it with something else. So let's take an example and see how this looks. Let's take I don't know I mean just let's take 255 what do you like so let's say 245.11 RS code word so just you can take anything else also if you like just taking this and then you concatenate with remember K is 8 so I need some code word K is 8 let's take the 9,8 even weight code 9,8 even weight code so 255 times 9 what is that 22 and what is this 245 times 8 24,0 divided by 8 is 2 are you sure 1880,1960 and then minimum distance is greater than 22 okay so if you just one read column and decode you can expect to only correct 10 errors,5 errors right this is saying minimum distance is 22 you should be able to correct 10 errors how do you put it together I mean is there any idea how will you correct 10 errors code word has this picture how can I hope to correct 10 errors suddenly it makes sense yeah that's true but I want a simple decode and I want to be able to combine these two decoders I don't want to say okay this is a overall binary code you do syndrome decoding on it is there anything that you can think of any smart ideas the 982 code what can you do you can't decode anything so that's the problem what can you do so what you do is for each thing there you find the parity if the parity is 0 you let it alone if the parity is 1 what do you do definitely there is an error so how can you help the reach element code you just say that's an erasure so now let's say there are 10 errors distributed over 10 different blocks one error each in different blocks then this scheme will correct why because I have marked 10 erasures and the reach element code can correct 10 erasures can I claim that this decoder the strategy that I am using all error vectors of weight less than or equal to 10 yes it needs more work I will have less number of erasures which means the erasures can definitely be correct once the erasures are corrected I will look at the code word I will look at the code word and that code word will not match it won't be a reach element code word so now I will have to correct the code word so be a little careful you can easily have an erasure plus error situation you have to do erasure plus error decoding and you have to be careful about that because if there are 2 errors in one block what will happen my parity will be satisfied and I won't mark it as an erasure but then if there are 2 errors there can be only 8 other errors and you have to worry about how many erasures I can have at this time I might have 8 erasures so if I have 8 erasures in one error I can correct the only thing is 2 times the number of errors plus number of erasures should be less than or equal to T so depending on the number of erasures you can keep adjusting my decode I know reach element is really easy correcting erasures if you select the polynomial is known and then you just do it is that clear so try to see if you can show that that strategy will work for any combination of errors less than or equal to 10 you can have a stage situation like 3 of 10 might be in one place suppose you have 3 errors in one block and then the rest of the 7 errors are distributing like erasures what will happen that is ok that works you might have some crazy situation is it possible can you always correct maybe it is possible so you have to think about it so it needs more careful analysis of the error events so what you basically have to look at is how do you get errors map on to block errors that is the crucial point if it is favourable to you then it is fine if it is not favourable it may not be fine so let me just leave it like that so you can do a decoder so basically you can do 2 decoders in the contact motion function you can mark erasures within a decoder if the inner decoder fails for instance the parity case it will really fail if the parity is not satisfied you cannot do anything so if you fail whenever the inner decoder fails you simply mark it as an erasure and the outer usually is going to be its element and you can help to correct errors like erasures and the tricky aspect is to show you what is the error correcting capability so computation of error correcting capability is a little hard but it is usually not so perfect it will work so error correcting capability will require a bit more work it is something you have to be very careful about even in the simple situation we saw that the combinatorics is a little bit involved you have to enumerate all the cases and see what happens I believe it is okay if you mark it as erasures you will be fine I think but you have to prove that okay so this is the concatenation idea I hope it is clear so we saw 2 different ideas one was the product construction which was a little bit simpler and the next is the concatenation idea which is also interesting okay we will stop with this today and this is kind of I mean I think maybe there is one or two more constructions that I want to talk about I mentioned that in the next class which will be next week Monday then after that we will move on to wait distributions and maybe close to it