Para añadir a la respuesta de Ted, dependiendo de las capacidades de su plataforma, el XOR de secuencias de bits que implementa la suma en GF$(256)$ podría ser implementable como el XOR de bytes; a menudo disponible como una instrucción de máquina, incluso en procesadores simples.
Por otro lado, implementar la multiplicación de dos elementos de GF$(256)$ como la multiplicación de dos polinomios y luego tomar el resto módulo $x^8+x^4+x^3+x^2+1$ es muy consumidor de tiempo. Le recomiendo que lea una excelente descripción tutorial por @Jyrki Lahtonen. Si tiene memoria disponible, la multiplicación en el campo de Galois se puede implementar a través de tablas de logaritmos. Vea aquí para una descripción de las tablas de logaritmos, y siga todos los enlaces allí para tener algunas ideas sobre cómo acelerar las cosas.
Editar: añadido nuevo material sobre multiplicación
Supongamos que queremos multiplicar polinomios binarios $c(x) = \sum_{i=0}^7 c_ix^i$ y $d(x) = \sum_{i=0}^7 d_ix^i$, y encontrar el resto después de dividir el resultado por $m(x) = x^8+x^4+x^3+x^2+1$, es decir, queremos calcular $c(x)d(x)\bmod m(x)$. A veces es conveniente incrustar la división por $m(x)$ en el proceso de multiplicación, y esta idea puede ser particularmente útil en la figura del codificador mostrada en la pregunta en la que se debe multiplicar un polinomio (el que se está retroalimentando en la línea superior de la figura) por $k$ polinomios diferentes (fijos) $g^{(i)}(x), 0 \leq i \leq k-1$. Tenemos $$\begin{align*} e(x) &= c(x)d(x) \bmod m(x)\\ &= \left(\sum_{i=0}^7 c_ix^i\right) d(x) \bmod m(x)\\ &= \left[c_0d(x) + c_1xd(x) + c_2x^2d(x) + \cdots + c_7x^7d(x)\right] \bmod m(x)\\ &= c_0d(x) + c_1[xd(x)\bmod m(x)] + c_2[x (xd(x)\bmod m(x))\bmod m(x) ]+\cdots\\ &\quad\quad\quad\quad\quad\quad\quad \cdots + c_7[x(x^6d(x)\bmod m(x)) \bmod m(x)]\\ &= \sum_{i=0}^7 c_if^{(i)}(x) \end{align*}$$ donde $f^{(0)}(x) = f(x)$ y $f^{(i)}(x) = xf^{(i-1)}(x) \bmod m(x) = x^id(x) \bmod m(x)$. Tenga en cuenta que los $c_i$ son $0$ o $1$. Así, $e(x)$ se inicializa con el polinomio cero y luego si $c_0 = 1$, se añade $d(x)$ a $e(x)$. Luego, si $d(x)$ no se necesita más (no está en la aplicación de código QR que se está considerando aquí), se reemplaza por $$xd(x) \bmod m(x) = \sum_{i=0}^7 d_ix^{i+1} \bmod m(x) = \sum_{i=0}^7 (d_{i-1}\oplus d_7m_i)x^{i}. $$ Si $d(x)$ es necesario en otro lugar, esta operación se realiza en la copia que se ha llamado $f(x)$. A continuación, si $c_1 = 1$, el nuevo $d(x)$ se añade a la suma que se está acumulando en $e(x)$ y el nuevo $d(x)$ se reemplaza por $xd(x) \bmod d(x)$, etc. En resumen, se ejecuta el siguiente proceso de dos pasos para $k = 0, \ldots , 7$.
- Si $c_k = 1$, $e(x):= e(x) + d(x)$
- $d(x) := \sum_{i=0}^7 (d_{i-1}\oplus d_7m_i)x^{i}$
para completar la multiplicación en GF$(256)$ en ocho iteraciones del proceso de dos pasos.
Existen dos ventajas en este enfoque para la aplicación de código QR. Primero, si se elige $d(x)$ como el polinomio que se retroalimenta y $c(x)$ como uno de los $g^{(j)}(x)$, entonces los coeficientes de $c(x)$ están fijos y son conocidos de antemano, por lo que el primer de los dos pasos anteriores puede simplificarse. Segundo, dado que el mismo $d(x)$ está siendo utilizado para multiplicar $k$ $g^{(j)}(x)$ diferentes, la actualización de $d(x)$ puede ser compartida entre las $k$ diferentes multiplicaciones si se organizan para proceder en paralelo en lugar de una a la vez. Además, como una mejora menor, dado que el producto $e(x)$ se suma a un $b(x)$, $e(x)$ puede ser inicializado con el valor de $b(x)$ en lugar del polinomio cero.