En aritmética modular , la reducción de Barrett es un algoritmo diseñado para optimizar el cálculo de [ 1 ] sin necesidad de un algoritmo de división rápido . Reemplaza las divi...
Hispanopedia WikiContenido en espanolLectura gratuita
En aritmética modular , la reducción de Barrett es un algoritmo diseñado para optimizar el cálculo de [ 1 ] sin necesidad de un algoritmo de división rápido . Reemplaza las divisiones con multiplicaciones y puede utilizarse cuando es constante y . Fue introducido en 1986 por P. D. Barrett. [ 2 ]
Históricamente, para valores , se calculaba aplicando la reducción de Barrett al producto completo . En 2021, Becker et al. demostraron que el producto completo es innecesario si podemos realizar un preprocesamiento en uno de los operandos. [ 3 ]
Idea general
Llamamos a una función aproximación entera si . Para un módulo y una aproximación entera , definimos como
Generalmente, la multiplicación de Barrett comienza especificando dos aproximaciones enteras y calcula una aproximación razonablemente cercana de como
,
donde es una constante fija, normalmente una potencia de 2, elegida de manera que la multiplicación y la división por se puedan realizar de forma eficiente.
El caso fue introducido por PD Barrett [ 2 ] para el caso de la función piso . El caso general para se puede encontrar en NTL . [ 4 ] La vista de aproximación entera y la correspondencia entre la multiplicación de Montgomery y la multiplicación de Barrett fueron descubiertas por Hanno Becker, Vincent Hwang, Matthias J. Kannwischer, Bo-Yin Yang y Shang-Yi Yang. [ 3 ]
Reducción de Barrett de una sola palabra
Barrett consideró inicialmente una versión entera del algoritmo anterior cuando los valores cabían en palabras de máquina. Ilustramos la idea para el caso de la función piso con y .
Al realizar cálculos con enteros sin signo, el análogo obvio sería usar la división por :
func reduce ( a uint ) uint { q := a / n // La división devuelve implícitamente el redondeo hacia abajo del resultado. return a - q * n }
Sin embargo, la división puede ser costosa y, en entornos criptográficos, podría no ser una instrucción de tiempo constante en algunas CPU, lo que expone la operación a un ataque de temporización . Por lo tanto, la reducción de Barrett se aproxima con un valor porque la división por es simplemente un desplazamiento a la derecha, y por lo tanto es barata.
Para calcular el mejor valor para un valor dado , considere lo siguiente:
Para que sea un número entero, necesitamos redondearlo de alguna manera. Redondear al entero más cercano dará la mejor aproximación, pero puede resultar en un valor mayor que , lo que puede causar desbordamientos negativos. Por lo tanto, se utiliza para aritmética sin signo.
Por lo tanto, podemos aproximar la función anterior con lo siguiente:
func reduce ( a uint ) uint { q := ( a * m ) >> k // ">> k" denota desplazamiento de bits en k. return a - q * n }
Sin embargo, dado que , el valor de en esa función puede terminar siendo uno demasiado pequeño, y por lo tanto solo se garantiza que esté dentro de en lugar de como generalmente se requiere. Una resta condicional corregirá esto: qa
func reduce ( a uint ) uint { q := ( a * m ) >> k a := a - q * n if a >= n { a := a - n } return a }
Multiplicación de Barrett de una sola palabra
Supongamos que se conoce. Esto nos permite precalcular antes de recibir . La multiplicación de Barrett calcula , aproxima la parte superior de con , y resta la aproximación. Como es un múltiplo de , el valor resultante es un representante de .
Correspondencia entre las multiplicaciones de Barrett y Montgomery
Límites similares se aplican a otros tipos de funciones de aproximación entera. Por ejemplo, si elegimos , la función de redondeo al alza , entonces tenemos
Es común seleccionar R de tal manera que (o en el caso de) para que la salida permanezca dentro de y ( y respectivamente), y por lo tanto solo se realiza una verificación para obtener el resultado final entre y . Además, se puede omitir la verificación y realizarla una sola vez al final de un algoritmo a costa de mayores entradas a las operaciones aritméticas de campo.
Multiplicación de Barrett con operandos no constantes
La multiplicación de Barrett descrita anteriormente requiere un operando constante b que debe precalcularse . De lo contrario, la operación no es eficiente. Es común usar la multiplicación de Montgomery cuando ambos operandos no son constantes, ya que ofrece un mejor rendimiento. Sin embargo, la multiplicación de Montgomery requiere una conversión hacia y desde el dominio de Montgomery, lo que implica un alto costo computacional cuando se necesitan pocas multiplicaciones modulares.
Para realizar la multiplicación de Barrett con operandos no constantes, se puede establecer como el producto de los operandos y establecer en . Esto conduce a
Una comprobación rápida de los límites arroja lo siguiente en caso
y lo siguiente en caso
La configuración siempre producirá una comprobación en la salida. Sin embargo, podría ser posible una restricción más estricta en ya que es una constante que a veces es significativamente menor que .
Surge un pequeño problema al realizar el siguiente producto, ya que es un producto de dos operandos. Suponiendo que cabe en bits, entonces cabría en bits y cabría en bits. Su producto requeriría una multiplicación, lo que podría requerir fragmentación en sistemas que no pueden realizar el producto en una sola operación.
Un enfoque alternativo consiste en realizar la siguiente reducción de Barrett:
La comprobación de límites en este caso produce lo siguiente:
y para este caso se obtiene lo siguiente
Para cualquier módulo y suponiendo , el límite dentro del paréntesis en ambos casos es menor o igual que:
donde en el caso y en el caso.
Establecer y (o en el caso) siempre producirá una comprobación. En algunos casos, probar los límites podría producir valores más bajos de y/o .
Reducción de Barrett pequeña
Es posible realizar una reducción de Barrett con una multiplicación menos de la siguiente manera:
donde y es la longitud en bits de
Todo módulo puede escribirse en la forma para algún entero .
Por lo tanto, reducir cualquier for o cualquier for produce un cheque.
Del análisis de la restricción, se puede observar que el límite de es mayor cuando es menor. En otras palabras, el límite es mayor cuando está más cerca de .
División Barrett
La reducción de Barrett se puede utilizar para calcular la división por piso, redondo o techo sin realizar costosas divisiones largas. Además, se puede utilizar para calcular . Después de precalcular las constantes, los pasos son los siguientes:
Calcula el cociente aproximado .
Calcula el resto de Barrett .
Calcula el error del cociente donde . Esto se hace restando un múltiplo de a hasta que se obtenga.
Calcula el cociente .
Si las restricciones para la reducción de Barrett se eligen de manera que haya una sola verificación, entonces el valor absoluto de en el paso 3 no puede ser mayor que 1. Usando y restricciones apropiadas, el error se puede obtener a partir del signo de .
Reducción de Barrett de varias palabras
La principal motivación de Barrett para considerar la reducción fue la implementación de RSA , donde los valores en cuestión casi con certeza excederán el tamaño de una palabra de máquina. En esta situación, Barrett proporcionó un algoritmo que se aproxima a la versión de una sola palabra mencionada anteriormente, pero para valores de varias palabras. Para más detalles, consulte la sección 14.3.3 del Manual de Criptografía Aplicada . [ 5 ]
Algoritmo de Barrett para polinomios
También es posible utilizar el algoritmo de Barrett para la división de polinomios, invirtiendo los polinomios y utilizando aritmética X-ádica. [ 6 ]
^ a b Barrett, P. (1986). "Implementación del algoritmo de cifrado de clave pública Rivest Shamir y Adleman en un procesador de señal digital estándar". Avances en criptología – CRYPTO' 86. Notas de clase en ciencias de la computación. Vol. 263. págs. 311–323 . doi : 10.1007/3-540-47721-7_24 . ISBN 978-3-540-18047-0.
^ a b c Becker, Hanno; Hwang, Vincent; Kannwischer, Matthias J.; Yang, Bo-Yin; Yang, Shang-Yi (2021), "Neon NTT: Dilithium, Kyber y Saber más rápidos en Cortex-A72 y Apple M1" , IACR Transactions on Cryptographic Hardware and Embedded Systems , 2022 (1): 221–244 , doi : 10.46586/tches.v2022.i1.221-244
^ Shoup, Victor. "Biblioteca de teoría de números" .
^ Menezes, Alfred; Oorschot, Paul; Vanstone, Scott (1997). Manual de criptografía aplicada (5.ª ed.). CRC Press. doi : 10.1201/9780429466335 . ISBN 0-8493-8523-7.
^ "Reducción de Barrett para polinomios" . www.corsix.org . Consultado el 7 de septiembre de 2022 .
Fuentes
Bosselaers, A.; Govaerts, R.; Vandewalle, J. (1993). "Comparación de tres funciones de reducción modular" . En Stinson, Douglas R. (ed.). Avances en criptología – Crypto'93 . Lecture Notes in Computer Science. Vol. 773. Springer. pp. 175–186 . CiteSeerX 10.1.1.40.3779 . ISBN 3540483292.
Hasenplaugh, W.; Gaubatz, G.; Gopal, V. (2007). «Reducción modular rápida» (PDF) . 18.º Simposio IEEE sobre aritmética computacional (ARITH'07) . págs. 225–229 . doi : 10.1109/ARITH.2007.18 . ISBN 978-0-7695-2854-0. S2CID 14801112 .