<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://en.zaoniao.it/index.php?action=history&amp;feed=atom&amp;title=Zemor%27s_decoding_algorithm</id>
	<title>Zemor's decoding algorithm - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://en.zaoniao.it/index.php?action=history&amp;feed=atom&amp;title=Zemor%27s_decoding_algorithm"/>
	<link rel="alternate" type="text/html" href="http://en.zaoniao.it/index.php?title=Zemor%27s_decoding_algorithm&amp;action=history"/>
	<updated>2026-05-16T19:35:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>http://en.zaoniao.it/index.php?title=Zemor%27s_decoding_algorithm&amp;diff=1154&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;'''Zemor's algorithm''', designed and developed by Gilles Zemor, is a recursive low-complexity approach to code construction. It is an improvement over the algorithm of Mich...&quot;</title>
		<link rel="alternate" type="text/html" href="http://en.zaoniao.it/index.php?title=Zemor%27s_decoding_algorithm&amp;diff=1154&amp;oldid=prev"/>
		<updated>2019-02-26T05:41:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Zemor&amp;#039;s algorithm&amp;#039;&amp;#039;&amp;#039;, designed and developed by Gilles Zemor, is a recursive low-complexity approach to code construction. It is an improvement over the algorithm of Mich...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''Zemor's algorithm''', designed and developed by Gilles Zemor, is a recursive low-complexity approach to code construction. It is an improvement over the algorithm of [[Michael Sipser|Sipser]] and [[Daniel Spielman|Spielman]].&lt;br /&gt;
&lt;br /&gt;
Zemor considered a typical class of Sipser–Spielman construction of [[expander code]]s, where the underlying graph is [[bipartite graph]]. Sipser and Spielman introduced a constructive family of asymptotically good linear-error codes together with a simple parallel algorithm that will always remove a constant fraction of errors. The article is based on Dr. Venkatesan Guruswami's course notes &lt;br /&gt;
&lt;br /&gt;
== Code construction ==&lt;br /&gt;
&lt;br /&gt;
Zemor's algorithm is based on a type of [[expander graphs]] called [[Tanner graph]]. The construction of code was first proposed by Tanner. The codes are based on [[double cover (topology)|double cover]] &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;, regular expander &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, which is a bipartite graph. &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; =&amp;lt;math&amp;gt; \left(V,E\right)&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; is the set of vertices and &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; is the set of edges and &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\emptyset&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; denotes the set of 2 vertices. Let &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; be the number of vertices in each group, ''i.e'', &amp;lt;math&amp;gt;|A| =|B| =n&amp;lt;/math&amp;gt;. The edge set &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; be of size &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; =&amp;lt;math&amp;gt;nd&amp;lt;/math&amp;gt; and every edge in &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; has one endpoint in both &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;E(v)&amp;lt;/math&amp;gt; denotes the set of edges containing &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Assume an ordering on &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, therefore ordering will be done on every edges of &amp;lt;math&amp;gt;E(v)&amp;lt;/math&amp;gt; for every &amp;lt;math&amp;gt;v \in V&amp;lt;/math&amp;gt;. Let [[finite field]] &amp;lt;math&amp;gt;\mathbb{F}=GF(2)&amp;lt;/math&amp;gt;, and for a word &amp;lt;math&amp;gt;x=(x_e), e\in E&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;\mathbb{F}^N&amp;lt;/math&amp;gt;, let the subword of the word will be indexed by &amp;lt;math&amp;gt;E(v)&amp;lt;/math&amp;gt;. Let that word be denoted by &amp;lt;math&amp;gt;(x)_v&amp;lt;/math&amp;gt;. The subset of vertices &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; induces every word &amp;lt;math&amp;gt;x\in \mathbb{F}^N&amp;lt;/math&amp;gt; a partition into &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; non-overlapping sub-words &amp;lt;math&amp;gt; \left(x\right)_v\in \mathbb{F}^d&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; ranges over the elements of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
For constructing a code &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, consider a linear subcode &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt;, which is a &amp;lt;math&amp;gt;[d,r_od,\delta] &amp;lt;/math&amp;gt; code, where &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, the size of the alphabet is &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;. For any vertex &amp;lt;math&amp;gt;v \in V&amp;lt;/math&amp;gt;, let &amp;lt;math&amp;gt; v(1), v(2),\ldots,v(d)&amp;lt;/math&amp;gt; be some ordering of the &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; vertices of &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. In this code, each bit &amp;lt;math&amp;gt;x_e&amp;lt;/math&amp;gt; is linked with an edge &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
We can define the code &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; to be the set of binary vectors &amp;lt;math&amp;gt;x = \left( x_1,x_2,\ldots,x_N \right)&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;\{0,1\}^N &amp;lt;/math&amp;gt; such that, for every vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \left(x_{v(1)}, x_{v(2)},\ldots, x_{v(d)}\right) &amp;lt;/math&amp;gt; is a code word of &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt;. In this case, we can consider a special case when every vertex of &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; is adjacent to exactly &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; vertices of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. It means that &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; make up, respectively, the vertex set and edge set of &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; regular graph &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Let us call the code &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; constructed in this way as &amp;lt;math&amp;gt;\left(G,C_o\right) &amp;lt;/math&amp;gt; code. For a given graph &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; and a given code &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt;, there are several &amp;lt;math&amp;gt;\left(G,C_o\right) &amp;lt;/math&amp;gt; codes as there are different ways of ordering edges incident to a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, i.e., &amp;lt;math&amp;gt; v(1), v(2),\ldots,v(d) &amp;lt;/math&amp;gt;. In fact our code &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; consist of all codewords such that &amp;lt;math&amp;gt;x_v\in C_o&amp;lt;/math&amp;gt; for all &amp;lt;math&amp;gt;v \in A, B&amp;lt;/math&amp;gt;. The code &amp;lt;math&amp;gt; C&amp;lt;/math&amp;gt; is linear &amp;lt;math&amp;gt;[N,K,D] &amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;\mathbb{F}&amp;lt;/math&amp;gt; as it is generated from a subcode &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt;, which is linear. The code &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; is defined as &amp;lt;math&amp;gt;C=\{c\in \mathbb{F}^N :(c)_v \in C_o\}&amp;lt;/math&amp;gt; for every &amp;lt;math&amp;gt;v\in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In this figure, &amp;lt;math&amp;gt;(x)_v =\left(x_{e1}, x_{e2}, x_{e3}, x_{e4}\right)\in C_o&amp;lt;/math&amp;gt;. It shows the graph &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; and code &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In matrix &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, let &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; is equal to the second largest [[eigen value]] of [[adjacency matrix]] of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;. Here the largest eigen value is &amp;lt;math&amp;gt; d&amp;lt;/math&amp;gt;. &lt;br /&gt;
Two important claims are made:&lt;br /&gt;
&lt;br /&gt;
=== Claim 1 ===&lt;br /&gt;
'''&amp;lt;math&amp;gt;\left(\dfrac{K}{N}\right)\geq 2r_o-1&amp;lt;/math&amp;gt;'''&amp;lt;br&amp;gt;&lt;br /&gt;
''. Let &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; be the rate of a linear code constructed from a bipartite graph whose digit nodes have degree &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; and whose subcode nodes have degree &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. If a single linear code with parameters &amp;lt;math&amp;gt;\left(n,k\right)&amp;lt;/math&amp;gt; and rate &amp;lt;math&amp;gt;r = \left(\dfrac{k}{n}\right)&amp;lt;/math&amp;gt; is associated with each of the subcode nodes, then &amp;lt;math&amp;gt;k\geq 1-\left(1-r\right)m&amp;lt;/math&amp;gt;''.&lt;br /&gt;
&lt;br /&gt;
==== Proof ====&lt;br /&gt;
Let &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; be the rate of the linear code, which is equal to &amp;lt;math&amp;gt;K/N&amp;lt;/math&amp;gt;&lt;br /&gt;
Let there are &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; subcode nodes in the graph. If the degree of the subcode is &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, then the code must have &amp;lt;math&amp;gt;\left(\dfrac{n}{m}\right) S&amp;lt;/math&amp;gt; digits, as each digit node is connected to &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; of the &amp;lt;math&amp;gt;\left(n\right)S&amp;lt;/math&amp;gt; edges in the graph. Each subcode node contributes &amp;lt;math&amp;gt;(n-k)&amp;lt;/math&amp;gt; equations to parity check matrix for a total of &amp;lt;math&amp;gt;\left(n-k\right) S&amp;lt;/math&amp;gt;. These equations may not be linearly independent. &lt;br /&gt;
Therefore, &amp;lt;math&amp;gt;\left(\dfrac{K}{N}\right)\geq \left(\dfrac{(\dfrac{n}{m})S - (n-k)S}{(\dfrac{n}{m}) S}\right)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\geq 1-m\left(\dfrac{n-k}{n}\right)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\geq 1-m \left(1-r\right) &amp;lt;/math&amp;gt;, Since the value of &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;,i.e., the digit node of this bipartite graph is &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; and here &amp;lt;math&amp;gt;r = r_o&amp;lt;/math&amp;gt;, we can write as:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\left(\dfrac{K}{N}\right)\geq 2r_o -1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Claim 2 ===&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;D\geq N\left(\dfrac{(\delta-(\dfrac{\lambda}{d}))}{(1-(\dfrac{\lambda}{d})})\right)^2&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;=N\left(\delta^2- O\left(\dfrac{\lambda}{d}\right)\right)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\rightarrow (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''If &amp;lt;math&amp;gt; S &amp;lt;/math&amp;gt; is linear code of rate &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, block code length &amp;lt;math&amp;gt; d&amp;lt;/math&amp;gt;, and minimum relative distance &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, and if &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; is the edge vertex incidence graph of a &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; – regular graph with second largest eigen value &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, then the code &amp;lt;math&amp;gt;C(B,S)&amp;lt;/math&amp;gt; has rate at least &amp;lt;math&amp;gt;2r_o -1&amp;lt;/math&amp;gt; and minimum relative distance at least &amp;lt;math&amp;gt;\left(\left(\dfrac{\delta- \left(\dfrac{\lambda}{d}\right)}{1-\left(\dfrac{\lambda}{d}\right)}\right)\right)^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Proof ====&lt;br /&gt;
Let &amp;lt;math&amp;gt; B&amp;lt;/math&amp;gt; be derived from the &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; regular graph &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;. So, the number of variables of &amp;lt;math&amp;gt;C(B,S)&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt; \left(\dfrac{dn}{2}\right)&amp;lt;/math&amp;gt; and the number of constraints is &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. According to Alon - Chung, if &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; is a subset of vertices of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; of size &amp;lt;math&amp;gt;\gamma n&amp;lt;/math&amp;gt;, then the number of edges contained in the subgraph is induced by &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; is at most &amp;lt;math&amp;gt;\left(\dfrac{dn}{2}\right) \left(\gamma^2 + (\dfrac{\lambda}{d})\gamma \left(1-\gamma\right)\right)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
As a result, any set of &amp;lt;math&amp;gt;\left(\dfrac{dn}{2}\right) \left(\gamma^2 + \left(\dfrac{\lambda}{d}\right)\gamma \left(1-\gamma\right)\right)&amp;lt;/math&amp;gt; variables will be having at least &amp;lt;math&amp;gt;\gamma n&amp;lt;/math&amp;gt; constraints as neighbours. So the average number of variables per constraint is : &amp;lt;math&amp;gt;\left(\dfrac{(\dfrac{2nd}{2}) \left(\gamma^2 + (\dfrac{\lambda}{d})\gamma \left(1-\gamma\right)\right)}{\gamma n}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;= d\left( \gamma + (\dfrac{\lambda}{d}) \left( 1-\gamma\right)\right)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\rightarrow (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if &amp;lt;math&amp;gt; d\left( \gamma + (\dfrac{\lambda}{d}) \left( 1-\gamma\right)\right) &amp;lt; \gamma d&amp;lt;/math&amp;gt;, then a word of relative weight &amp;lt;math&amp;gt; \left(\gamma^2 + (\dfrac{\lambda}{d})\gamma \left(1-\gamma\right)\right)&amp;lt;/math&amp;gt;, cannot be a codeword of &amp;lt;math&amp;gt;C(B,S)&amp;lt;/math&amp;gt;. The inequality &amp;lt;math&amp;gt;(2)&amp;lt;/math&amp;gt; is satisfied for &amp;lt;math&amp;gt;\gamma &amp;lt; \left(\dfrac{1-(\dfrac{\lambda}{d})}{\delta-(\dfrac{\lambda}{d})}\right)&amp;lt;/math&amp;gt;. Therefore, &amp;lt;math&amp;gt;C(B,S)&amp;lt;/math&amp;gt; cannot have a non zero codeword of relative weight &amp;lt;math&amp;gt;\left(\dfrac{\delta-(\dfrac{\lambda}{d})}{1-(\dfrac{\lambda}{d})}\right)^2&amp;lt;/math&amp;gt; or less.&lt;br /&gt;
&lt;br /&gt;
In matrix &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, we can assume that &amp;lt;math&amp;gt;\lambda/d&amp;lt;/math&amp;gt; is bounded away from &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;. For those values of &amp;lt;math&amp;gt; d&amp;lt;/math&amp;gt; in which &amp;lt;math&amp;gt;d-1&amp;lt;/math&amp;gt; is odd prime, there are explicit constructions of sequences of &amp;lt;math&amp;gt; d&amp;lt;/math&amp;gt; - regular bipartite graphs with arbitrarily large number of vertices such that each graph &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; in the sequence is a [[Ramanujan graph]]. It is called Ramanujan graph as it satisfies the inequality &amp;lt;math&amp;gt;\lambda(G) \leq 2\sqrt{d-1}&amp;lt;/math&amp;gt;. Certain expansion properties are visible in graph &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; as the separation between the eigen values &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt; \lambda &amp;lt;/math&amp;gt;. If the graph &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; is Ramanujan graph, then that expression &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt; will become &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; eventually as &amp;lt;math&amp;gt; d &amp;lt;/math&amp;gt; becomes large.&lt;br /&gt;
&lt;br /&gt;
== Zemor's algorithm ==&lt;br /&gt;
&lt;br /&gt;
The iterative decoding algorithm written below alternates between the vertices &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; and corrects the codeword of &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and then it switches to correct the codeword &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Here edges associated with a vertex on one side of a graph are not incident to other vertex on that side. In fact, it doesn't matter in which order, the set of nodes &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; are processed. The vertex processing can also be done in parallel. &lt;br /&gt;
&lt;br /&gt;
The decoder &amp;lt;math&amp;gt;\mathbb{D}:\mathbb{F}^d \rightarrow C_o&amp;lt;/math&amp;gt;stands for a decoder for &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt; that recovers correctly with any codewords with less than &amp;lt;math&amp;gt;\left(\dfrac{d}{2}\right)&amp;lt;/math&amp;gt; errors.&lt;br /&gt;
&lt;br /&gt;
=== Decoder algorithm ===&lt;br /&gt;
&lt;br /&gt;
Received word : &amp;lt;math&amp;gt;w=(w_e), e\in E&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;z \leftarrow w&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
For &amp;lt;math&amp;gt;t \leftarrow 1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; do //&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; is the number of iterations&amp;lt;br&amp;gt;&lt;br /&gt;
{ if (&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; is odd) // Here the algorithm will alternate between its two vertex sets.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;X \leftarrow A&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
else &amp;lt;math&amp;gt;X \leftarrow B&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt; &lt;br /&gt;
Iteration &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;: For every &amp;lt;math&amp;gt;v \in X&amp;lt;/math&amp;gt;, let &amp;lt;math&amp;gt;(z)_v \leftarrow \mathbb{D}((z)_v)&amp;lt;/math&amp;gt; // Decoding &amp;lt;math&amp;gt;z_v&amp;lt;/math&amp;gt; to its nearest codeword.&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Output: &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Explanation of the algorithm ===&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; is bipartite, the set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of vertices induces the partition of the edge set &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\cup_{v\in A} E_v&amp;lt;/math&amp;gt; . The set &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; induces another partition, &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\cup_{v\in B} E_v&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;w \in \{0,1\}^N&amp;lt;/math&amp;gt; be the received vector, and recall that &amp;lt;math&amp;gt;N=dn&amp;lt;/math&amp;gt;. The first iteration of the algorithm consists of applying the complete decoding for the code induced by &amp;lt;math&amp;gt;E_v&amp;lt;/math&amp;gt; for every &amp;lt;math&amp;gt;v \in A&amp;lt;/math&amp;gt; . This means that for replacing, for every &amp;lt;math&amp;gt;v \in A&amp;lt;/math&amp;gt;, the vector &amp;lt;math&amp;gt;\left( w_{v(1)}, w_{v(2)}, \ldots, w_{v(d)}\right)&amp;lt;/math&amp;gt; by one of the closest codewords of &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt;. Since the subsets of edges &amp;lt;math&amp;gt;E_v&amp;lt;/math&amp;gt; are disjoint for &amp;lt;math&amp;gt;v \in A&amp;lt;/math&amp;gt;, the decoding of these &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; subvectors of &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; may be done in parallel.&lt;br /&gt;
&lt;br /&gt;
The iteration will yield a new vector &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;. The next iteration consists of applying the preceding procedure to &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; but with &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; replaced by &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. In other words, it consists of decoding all the subvectors induced by the vertices of &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. The coming iterations repeat those two steps alternately applying parallel decoding to the subvectors induced by the vertices of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; and to the subvectors induced by the vertices of &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Note:''' [If &amp;lt;math&amp;gt;d=n&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; is the complete bipartite graph, then &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; is a product code of &amp;lt;math&amp;gt;C_o&amp;lt;/math&amp;gt; with itself and the above algorithm reduces to the natural hard iterative decoding of product codes].&lt;br /&gt;
&lt;br /&gt;
Here, the number of iterations, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;\left(\dfrac{(\log{n})}{\log(2-\alpha)}\right)&amp;lt;/math&amp;gt;. &lt;br /&gt;
In general, the above algorithm can correct a code word whose Hamming weight is no more than &amp;lt;math&amp;gt;(\dfrac{1}{2}).\alpha N \delta \left((\dfrac{\delta}{2})-(\dfrac{\lambda}{d})\right) =\left((\dfrac{1}{4}).\alpha N (\delta^2- O(\dfrac{\lambda}{d})\right)&amp;lt;/math&amp;gt; for values of &amp;lt;math&amp;gt;\alpha &amp;lt; 1&amp;lt;/math&amp;gt;. Here, the decoding algorithm is implemented as a circuit of size &amp;lt;math&amp;gt;O(N \log{N} )&amp;lt;/math&amp;gt; and depth &amp;lt;math&amp;gt;O(\log{N})&amp;lt;/math&amp;gt; that returns the codeword given that error vector has weight less than &amp;lt;math&amp;gt;\alpha N \delta^2 (1-\epsilon)/4&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
=== Theorem ===&lt;br /&gt;
&lt;br /&gt;
''If &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; is a Ramanujan graph of sufficiently high degree, for any &amp;lt;math&amp;gt;\alpha &amp;lt; 1&amp;lt;/math&amp;gt;, the decoding algorithm can correct &amp;lt;math&amp;gt;(\dfrac{\alpha \delta_o^2}{4})(1-\in) N &amp;lt;/math&amp;gt; errors, in &amp;lt;math&amp;gt; O(\log {n}) &amp;lt;/math&amp;gt; rounds ( where the big- &amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt; notation hides a dependence on &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;). This can be implemented in linear time on a single processor; on &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; processors each round can be implemented in constant time.''&lt;br /&gt;
&lt;br /&gt;
==== Proof ====&lt;br /&gt;
&lt;br /&gt;
Since the decoding algorithm is insensitive to the value of the edges and by linearity, we can assume that the transmitted codeword is the all zeros - vector. Let the received codeword be &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. The set of edges which has an incorrect value while decoding is considered. Here by incorrect value, we mean &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; in any of the bits. Let &amp;lt;math&amp;gt;w=w^0&amp;lt;/math&amp;gt; be the initial value of the codeword, &amp;lt;math&amp;gt;w^1, w^2,\ldots, w^t&amp;lt;/math&amp;gt; be the values after first, second&amp;amp;nbsp;.&amp;amp;nbsp;.&amp;amp;nbsp;. &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; stages of decoding. &lt;br /&gt;
Here, &amp;lt;math&amp;gt;X^i={e\in E|x_e^i =1}&amp;lt;/math&amp;gt;, and &amp;lt;math&amp;gt;S^i ={v\in V^i | E_v \cap X^{i+1} !=\emptyset}&amp;lt;/math&amp;gt;. Here &amp;lt;math&amp;gt;S^i&amp;lt;/math&amp;gt; corresponds to those set of vertices that was not able to successfully decode their codeword in the &amp;lt;math&amp;gt;i^{th}&amp;lt;/math&amp;gt; round. From the above algorithm &amp;lt;math&amp;gt;S^1 &amp;lt;S^0 &amp;lt;/math&amp;gt; as number of unsuccessful vertices will be corrected in every iteration. We can prove that &amp;lt;math&amp;gt;S^0&amp;gt;S^1&amp;gt;S^2&amp;gt;\cdots&amp;lt;/math&amp;gt;is a decreasing sequence.&lt;br /&gt;
In fact, &amp;lt;math&amp;gt;|S_{i+1}|&amp;lt;=(\dfrac{1}{2-\alpha})|S_i|&amp;lt;/math&amp;gt;. As we are assuming, &amp;lt;math&amp;gt;\alpha&amp;lt;1&amp;lt;/math&amp;gt;, the above equation is in a [[geometric series|geometric decreasing sequence]]. &lt;br /&gt;
So, when &amp;lt;math&amp;gt;|S_i|&amp;lt;n&amp;lt;/math&amp;gt;, more than &amp;lt;math&amp;gt;log_{2-\alpha} n &amp;lt;/math&amp;gt; rounds are necessary. Furthermore, &amp;lt;math&amp;gt;\sum|S_i|=n\sum(\dfrac{1}{(2-\alpha)^i})=O(n)&amp;lt;/math&amp;gt;, and if we implement the &amp;lt;math&amp;gt;i^{th}&amp;lt;/math&amp;gt; round in &amp;lt;math&amp;gt;O(|S_i|)&amp;lt;/math&amp;gt; time, then the total sequential running time will be linear.&lt;br /&gt;
&lt;br /&gt;
== Drawbacks of Zemor's algorithm ==&lt;br /&gt;
# It is lengthy process as the number of iterations &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; in decoder algorithm takes is &amp;lt;math&amp;gt;[(\log{ n})/(\log(2-\alpha))]&amp;lt;/math&amp;gt;&lt;br /&gt;
# Zemor's decoding algorithm finds it difficult to decode erasures. A detailed way of how we can improve the algorithm is&lt;br /&gt;
given in.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Expander code]]s&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
&lt;br /&gt;
[http://wikipedia.org/ http://wikipedia.org/]&lt;br /&gt;
&lt;br /&gt;
[[Category:Cryptographic algorithms]]&lt;br /&gt;
[[Category:Security]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>