Como crasic señaló en los comentarios, que realmente no es necesario para el cálculo de la exponencial real. Puede utilizar la aritmética modular para reducir el valor máximo que usted necesita para almacenar:
\begin{gather}
(a b) ~\textrm{mod}~ m = ((a ~\textrm{mod}~ m) (b ~\textrm{mod}~ m)) ~\textrm{mod}~ m
\end{reunir}
Para \$(a b)~\textrm{mod}~m\$, el valor máximo que se necesita para almacenar es \$(m-1)^2\$, que para m=23
significa que usted debe ser capaz de almacenar 484. Esto está fuera del intervalo de 8 bits de los números, pero cabe en 16-bits. Sin embargo, como Olin señaló algunos de los 8-bits de micros se pueden manipular los valores de 16 bits eficaz para que este no es un gran problema.
Una aplicación general en C aspecto:
uint16_t exp_mod(uint16_t base, uint16_t power, uint16_t m)
{
uint16_t res = 1;
while(power)
{
if(power & 1)
{
res = (res * base) % m;
}
res = (res*res) % m;
power >>= 1;
}
return res;
}
Si la uC tiene un eficiente módulo de instrucción, esto es generalmente lo suficientemente bueno. Sin embargo, si usted no lo hace y saber que n siempre será un valor determinado, hay una división eficiente (y por lo tanto el modulo) la aplicación por T. Granlun y P. L. Montomery. Agner Niebla también tiene una descripción de cómo funciona esto.
He aquí una hackeado aplicación para m=23
.
uint16_t mod23(uint16_t m)
{
// note: I didn't actually figure out what n and the error correction term is suppose
// to be, I just guessed a value for n which produces a simple function
// only checked to be correct for m <= 484
//
// n = 11
uint16_t res = a - 23*((m*89)>>11);
return (res == 23) ? 0 : res;
}
La única de 16 bits de operaciones, a continuación, son:
- suma/resta
- la multiplicación
- bit a bit cambio
- bit a bit y
- la comparación de igualdad
Yo no estoy familiarizado con el PIC conjunto de instrucciones, pero aquí es más o menos el peor de los casos las instrucciones de conteo:
4*log2(power)
comparaciones
4*log2(power)
salta
2*log2(power)
sustracciones
3*log2(power)
bit a bit shift
6*log2(power)
multiplicaciones
Para power=15
, esto es aproximadamente 76 manual de instrucciones. Tenga en cuenta que esto puede ir hacia abajo si usted tiene acceso a multiplicar-agregar instrucciones u otras instrucciones especiales. Yo consideraría bastante razonable.
nota: Esta aplicación tiene la variable de los tiempos de cuánto tiempo exp_mod toma dependiendo del parámetro de entrada, por lo que es vulnerable a la sincronización basada en las grietas (aunque para una de 16 bits de la clave, puede ser simplemente la fuerza bruta agrietado, también). Es relativamente fácil de modificar este código para ser resistentes a este mediante la inyección de maniquí de instrucciones, que en teoría sólo debe doler rendimiento promedio y el peor de los casos el rendimiento es igual.