Erasure resilient systematic code with
two information packets and up to 7 redundant packets
emin.gabrielyan@{epfl.ch, switzernet.com}
2005-10-27
Given is the problem:
- The receiver needs to receive any two packets out of all transmitted packets (information and redundancy) in order to completely recover the two information packets.
- Length of the packets must be equal and divisible to 3 (minimum 3 bits).
Let the first packet’s first, second and third components be a, b and c, and the second packet’s components be correspondingly x, y and z.
We will use the following notation:
– denotes
the first packet
– denotes
the second packet
– denotes
a bitwise XOR result of the first and second packets (we mean an XOR results
when we put the components vertically)
The redundant packets produced by this code are XOR results
of the first packet with some derivative obtained from the second
packet
. The derivatives
are obtained by reordering and XOR-ing the three components of the second
packet.
Example of a (4,2) code:
,
,
,
In case if is received with one of the redundant packets,
we can produce from
the corresponding derivative and extract
from the redundant packet. In case we received
with one of redundant packets, we extract the
derivative from which (as you can see) we are capable to build back
. Finally if
we received the two redundant packets:
We XOR them and obtain . It is
another derivative of
, which can be
also converted back to
. Once
is found we can restore
from any redundant packet.
This example can be generalized:
-
The redundant packets must be built from such self-containing derivatives of , from which
we can fully restore back
(needed in the case when we receive
with one redundant packet). I.e. the
derivative of
must be reversible.
-
The XOR result of two self-containing derivatives must
be also a self-containing reversible derivative of (we need this when two redundant packets are
received).
Equipped with the above formulated point of view we first obtain
all reversible derivatives of .
A derivative of may have one of the following 7 components:
,
,
,
,
,
,
Thus we have candidates
The derivative is not reversible and must be removed from the list, if the XOR result of any of two of its components is equal to the third component.
From 210 candidates we obtain 168 self-containing reversible
derivatives of .
These 168 self-containing results consist of the re-ordered versions of the following 28 distinct derivatives:
Component 1 |
Component 2 |
Component 3 |
x |
y |
z |
x |
y |
x+z |
x |
y |
y+z |
x |
y |
x+y+z |
x |
x+y |
z |
x |
x+y |
x+z |
x |
x+y |
y+z |
x |
x+y |
x+y+z |
x |
z |
y+z |
x |
z |
x+y+z |
x |
x+z |
y+z |
x |
x+z |
x+y+z |
y |
x+y |
z |
y |
x+y |
x+z |
y |
x+y |
y+z |
y |
x+y |
x+y+z |
y |
z |
x+z |
y |
z |
x+y+z |
y |
x+z |
y+z |
y |
y+z |
x+y+z |
x+y |
z |
x+z |
x+y |
z |
y+z |
x+y |
x+z |
x+y+z |
x+y |
y+z |
x+y+z |
z |
x+z |
y+z |
z |
x+z |
x+y+z |
z |
y+z |
x+y+z |
x+z |
y+z |
x+y+z |
where the operation + is a binary XOR
Let us enumerate the list of all
derivatives and build a directed Graph whose vertices are the 168 self-containing
reversible derivatives of and there is an arc from one self-containing
derivative of
to another one, if the sequential number of
the first is smaller the number of the second one and if the XOR result of
these two reversible derivatives is also reversible (i.e. is in the set of the 168
derivatives).
Such a graph has 4032 edges.
Any two adjacent vertices of this Graph can be used for production of two redundant packets and we have a (2,2) erasure resilient code.
A 3-complete sub-graph of our
Graph consist of three distinct reversible derivatives of , such that an
XOR of any of two of these derivatives gives us also a reversible derivative of
. It means
that if our Graph has 3-complete sub-graph we can create a (5,2) erasure
resilient code.
Indeed, our Graph has 16128 such 3-complete sub-graphs.
Similarly, if we have a k-complete sub-graph in our Graph we can
create erasure resilient code. Hopefully we have also 4-complete
sub-graphs and more …
Here are the numbers of the k-complete sub-graphs in our Graph
vertices |
168 |
arcs |
4032 |
3-complete sub-graphs |
16128 |
4-complete sub-graphs |
6720 |
5-complete sub-graphs |
4032 |
6-complete sub-graphs |
1344 |
7-complete sub-graphs |
192 |
8-complete sub-graphs |
0 |
Thus with this scheme we have 192 possible (9,2) erasure
resilient codes, which can restore the original two information packets from
any two received packets (out of 9 transmitted). Note that with three bits
symbols the Reed Solomon code can produce only blocks of packets. I.e. the
largest Reed-Solomon code is RS(7,2).
Below are a few of our codes (the full list is in the output of the AMPL program):
(11,73,140,167,198,292,323)
(11,75,134,182,241,247,314)
(11,78,145,153,212,273,332)
(12,71,137,163,203,290,328)
(12,77,135,178,244,249,309)
(12,80,146,149,217,267,333)
The numbers above refer to a reversible derivative of from the table below. The derivative must be
XOR-ed with
in order to obtain the instance of the
corresponding redundant packet.
Number |
Component 1 |
Component 2 |
Component 3 |
11 |
x |
y |
z |
12 |
x |
y |
x+z |
13 |
x |
y |
y+z |
14 |
x |
y |
x+y+z |
18 |
x |
x+y |
z |
19 |
x |
x+y |
x+z |
20 |
x |
x+y |
y+z |
21 |
x |
x+y |
x+y+z |
23 |
x |
z |
y |
24 |
x |
z |
x+y |
27 |
x |
z |
y+z |
28 |
x |
z |
x+y+z |
30 |
x |
x+z |
y |
31 |
x |
x+z |
x+y |
34 |
x |
x+z |
y+z |
35 |
x |
x+z |
x+y+z |
37 |
x |
y+z |
y |
38 |
x |
y+z |
x+y |
39 |
x |
y+z |
z |
40 |
x |
y+z |
x+z |
44 |
x |
x+y+z |
y |
45 |
x |
x+y+z |
x+y |
46 |
x |
x+y+z |
z |
47 |
x |
x+y+z |
x+z |
53 |
y |
x |
z |
54 |
y |
x |
x+z |
55 |
y |
x |
y+z |
56 |
y |
x |
x+y+z |
67 |
y |
x+y |
z |
68 |
y |
x+y |
x+z |
69 |
y |
x+y |
y+z |
70 |
y |
x+y |
x+y+z |
71 |
y |
z |
x |
73 |
y |
z |
x+y |
75 |
y |
z |
x+z |
77 |
y |
z |
x+y+z |
78 |
y |
x+z |
x |
80 |
y |
x+z |
x+y |
81 |
y |
x+z |
z |
83 |
y |
x+z |
y+z |
85 |
y |
y+z |
x |
87 |
y |
y+z |
x+y |
89 |
y |
y+z |
x+z |
91 |
y |
y+z |
x+y+z |
92 |
y |
x+y+z |
x |
94 |
y |
x+y+z |
x+y |
95 |
y |
x+y+z |
z |
97 |
y |
x+y+z |
y+z |
102 |
x+y |
x |
z |
103 |
x+y |
x |
x+z |
104 |
x+y |
x |
y+z |
105 |
x+y |
x |
x+y+z |
109 |
x+y |
y |
z |
110 |
x+y |
y |
x+z |
111 |
x+y |
y |
y+z |
112 |
x+y |
y |
x+y+z |
120 |
x+y |
z |
x |
121 |
x+y |
z |
y |
124 |
x+y |
z |
x+z |
125 |
x+y |
z |
y+z |
127 |
x+y |
x+z |
x |
128 |
x+y |
x+z |
y |
130 |
x+y |
x+z |
z |
133 |
x+y |
x+z |
x+y+z |
134 |
x+y |
y+z |
x |
135 |
x+y |
y+z |
y |
137 |
x+y |
y+z |
z |
140 |
x+y |
y+z |
x+y+z |
141 |
x+y |
x+y+z |
x |
142 |
x+y |
x+y+z |
y |
145 |
x+y |
x+y+z |
x+z |
146 |
x+y |
x+y+z |
y+z |
149 |
z |
x |
y |
150 |
z |
x |
x+y |
153 |
z |
x |
y+z |
154 |
z |
x |
x+y+z |
155 |
z |
y |
x |
157 |
z |
y |
x+y |
159 |
z |
y |
x+z |
161 |
z |
y |
x+y+z |
162 |
z |
x+y |
x |
163 |
z |
x+y |
y |
166 |
z |
x+y |
x+z |
167 |
z |
x+y |
y+z |
177 |
z |
x+z |
y |
178 |
z |
x+z |
x+y |
181 |
z |
x+z |
y+z |
182 |
z |
x+z |
x+y+z |
183 |
z |
y+z |
x |
185 |
z |
y+z |
x+y |
187 |
z |
y+z |
x+z |
189 |
z |
y+z |
x+y+z |
190 |
z |
x+y+z |
x |
191 |
z |
x+y+z |
y |
194 |
z |
x+y+z |
x+z |
195 |
z |
x+y+z |
y+z |
198 |
x+z |
x |
y |
199 |
x+z |
x |
x+y |
202 |
x+z |
x |
y+z |
203 |
x+z |
x |
x+y+z |
204 |
x+z |
y |
x |
206 |
x+z |
y |
x+y |
207 |
x+z |
y |
z |
209 |
x+z |
y |
y+z |
211 |
x+z |
x+y |
x |
212 |
x+z |
x+y |
y |
214 |
x+z |
x+y |
z |
217 |
x+z |
x+y |
x+y+z |
219 |
x+z |
z |
y |
220 |
x+z |
z |
x+y |
223 |
x+z |
z |
y+z |
224 |
x+z |
z |
x+y+z |
232 |
x+z |
y+z |
x |
233 |
x+z |
y+z |
y |
235 |
x+z |
y+z |
z |
238 |
x+z |
y+z |
x+y+z |
239 |
x+z |
x+y+z |
x |
241 |
x+z |
x+y+z |
x+y |
242 |
x+z |
x+y+z |
z |
244 |
x+z |
x+y+z |
y+z |
247 |
y+z |
x |
y |
248 |
y+z |
x |
x+y |
249 |
y+z |
x |
z |
250 |
y+z |
x |
x+z |
253 |
y+z |
y |
x |
255 |
y+z |
y |
x+y |
257 |
y+z |
y |
x+z |
259 |
y+z |
y |
x+y+z |
260 |
y+z |
x+y |
x |
261 |
y+z |
x+y |
y |
263 |
y+z |
x+y |
z |
266 |
y+z |
x+y |
x+y+z |
267 |
y+z |
z |
x |
269 |
y+z |
z |
x+y |
271 |
y+z |
z |
x+z |
273 |
y+z |
z |
x+y+z |
274 |
y+z |
x+z |
x |
275 |
y+z |
x+z |
y |
277 |
y+z |
x+z |
z |
280 |
y+z |
x+z |
x+y+z |
289 |
y+z |
x+y+z |
y |
290 |
y+z |
x+y+z |
x+y |
291 |
y+z |
x+y+z |
z |
292 |
y+z |
x+y+z |
x+z |
296 |
x+y+z |
x |
y |
297 |
x+y+z |
x |
x+y |
298 |
x+y+z |
x |
z |
299 |
x+y+z |
x |
x+z |
302 |
x+y+z |
y |
x |
304 |
x+y+z |
y |
x+y |
305 |
x+y+z |
y |
z |
307 |
x+y+z |
y |
y+z |
309 |
x+y+z |
x+y |
x |
310 |
x+y+z |
x+y |
y |
313 |
x+y+z |
x+y |
x+z |
314 |
x+y+z |
x+y |
y+z |
316 |
x+y+z |
z |
x |
317 |
x+y+z |
z |
y |
320 |
x+y+z |
z |
x+z |
321 |
x+y+z |
z |
y+z |
323 |
x+y+z |
x+z |
x |
325 |
x+y+z |
x+z |
x+y |
326 |
x+y+z |
x+z |
z |
328 |
x+y+z |
x+z |
y+z |
331 |
x+y+z |
y+z |
y |
332 |
x+y+z |
y+z |
x+y |
333 |
x+y+z |
y+z |
z |
334 |
x+y+z |
y+z |
x+z |
where operation + is a binary XOR
Here is an implementation of the algorithm in AMPL:
reset; set
B ordered = {"x","y","z"}; set
A{i in 1..7} within B = (if i div 1 mod 2 then {member(1,B)} else
{}) union (if i div 2 mod 2 then {member(2,B)} else
{}) union (if i div 4 mod 2 then {member(3,B)} else
{}); set
S{n in 1..7^3,p in 0..2} within B = A[(n-1) div 7^p mod 7 + 1]; #210
members according to Binomial Coefficient (7 over 3) multiplied by 3! set
Binomial = { n in 1..7^3: (S[n,0] symdiff S[n,1] not within {})
and (S[n,1] symdiff S[n,2] not within {})
and (S[n,2] symdiff S[n,0] not within {}) }; set
Codes ordered = { n in Binomial: not ( ( (S[n,0] symdiff S[n,1]) symdiff
S[n,2] within {} ) or ( (S[n,1] symdiff S[n,2]) symdiff
S[n,0] within {} ) or ( (S[n,2] symdiff S[n,0]) symdiff
S[n,1] within {} ) ) }; set
Graph = { n in Codes, m in Codes: { k in Codes: ( (S[n,0] symdiff S[m,0]) symdiff
S[k,0] within {} ) and ( (S[n,1] symdiff S[m,1]) symdiff
S[k,1] within {} ) and ( (S[n,2] symdiff S[m,2]) symdiff
S[k,2] within {} ) } not within {} }; set
Codes2 = { (n1,n2) in Graph: n2>n1}; set
Codes3 = { (n1,n2) in Codes2, n3 in Codes: n3>n2 and (n1,n3) in Codes2 and (n2,n3) in Codes2 }; set
Codes4 = { (n1,n2,n3) in Codes3, n4 in Codes: n4>n3 and (n1,n4) in Codes2 and (n2,n4) in Codes2 and (n3,n4) in Codes2 }; set
Codes5 = { (n1,n2,n3,n4) in Codes4, n5 in Codes: n5>n4 and (n1,n5) in Codes2 and (n2,n5) in Codes2 and (n3,n5) in Codes2 and (n4,n5) in Codes2 }; set
Codes6 = { (n1,n2,n3,n4,n5) in Codes5, n6 in Codes: n6>n5 and (n1,n6) in Codes2 and (n2,n6) in Codes2 and (n3,n6) in Codes2 and (n4,n6) in Codes2 and (n5,n6) in Codes2 }; set
Codes7 = { (n1,n2,n3,n4,n5,n6) in Codes6, n7 in
Codes: n7>n6 and (n1,n7) in Codes2 and (n2,n7) in Codes2 and (n3,n7) in Codes2 and (n4,n7) in Codes2 and (n5,n7) in Codes2 and (n6,n7) in Codes2 }; set
Codes8 = { (n1,n2,n3,n4,n5,n6,n7) in Codes7, n8 in
Codes: n8>n7 and (n1,n8) in Codes2 and (n2,n8) in Codes2 and (n3,n8) in Codes2 and (n4,n8) in Codes2 and (n5,n8) in Codes2 and (n6,n8) in Codes2 and (n7,n8) in Codes2 }; display
card(Codes); display
card(Codes2); display
card(Codes3); display
card(Codes4); display
card(Codes5); display
card(Codes6); display
card(Codes7); display
card(Codes8); for {n in Codes: (n-1) div 7^0 mod 7 + 1 > (n-1) div
7^1 mod 7 + 1 > (n-1) div 7^2 mod 7 + 1 } display n,S[n,2],S[n,1],S[n,0]; display
Codes7; |
* * *
© 2005 – Switzernet (www.switzernet.com)