En el desarrollo de .NET, a veces debido al contenido de conocimiento de algunos temas marginales, como estadística, finanzas, astronomía y otros cálculos, los algoritmos de cifrado y descifrado implicarán un gran número de operaciones, incluso si se almacena el tipo numérico más grande en .net. se desbordará. Número, una de mis ideas es usar tipos numéricos al calcular y almacenar (temporalmente) y generar como cadenas. Luego, al almacenar, se necesitan BOX[n] n matrices para almacenar temporalmente los resultados de un pequeño paso en el. cálculo.
'Como ejemplo
==================== Diagrama de comprensión del algoritmo ========================
'97*97*97*97*97 = 8587340257 caja(1) = 587340257 caja(2)=8
'97*97*97*97*97*97 = 832972004929 caja(1) = 972004929 caja(2)=832
'97*97*97*97*97*97*97 = 80798284478113 caja(1) = 284478113 caja(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 caja(1) = 594376961 caja(2)=7837433
'97^ 9 = 760231058654565217 caja(1) = 654565217 caja(2)=760231058
'97^ 10 = 73742412689492826049 caja(1) = 492826049 caja(2)=742412689 caja(3)=73
…………………………
Tenga en cuenta que cuanto más grande sea el cuadro en la siguiente tabla, mayor será el número correspondiente. Cuando utilice el algoritmo anterior, recuerde ① primero definir el número de dígitos de una CAJA, por ejemplo, lo anterior es de 9 dígitos (según las necesidades y lo real). condiciones),
②Debido a los hábitos de cálculo, muchas personas primero calcularán el número de dígitos del cuadro (n + 1) cuando cuentan desde la posición inferior {cuadro (0 -> n)}, y luego agregarán el número de acarreo generado por el cuadro (n) (como como el primero Calcule el cuadro (1) al cuadro (2) = 0 para generar un número de acarreo de 8 cuadro (2) + número de acarreo = 8) para el procesamiento, como el procesamiento de suma anterior ③ Es mejor comenzar desde el nivel superior posición, se ahorrará muchos problemas. Se desconoce el número de cuadros. No importa. Cuando esté lleno (el número de acarreos generados por el cuadro con el subíndice más alto), agregue otro. hay una operación de módulo, si el módulo no es grande, también puede usar la idea anterior para calcular el módulo en partes y luego vincular El cuadro es un resultado temporal y el cuadro se redistribuye (debe volver a truncarse). la posición alta, por ejemplo, si es módulo 123456789123456789, establezca un cuadro con ocho dígitos box(1)=89 box(2)=91234567 box(3)=12345678. es 123456789123456789 ÷ 333=370741108478849 el módulo es 72) Entonces el cuadro redistribuido debe ser box(1) =478849 box(2) =370741180 pero no box(1) =370741180 box(2) = 478849 ¿Por qué ∵ Empezar a tomar el módulo de la posición alta. Si el cuadro (n) no cambia después de ser módulo una vez, el resultado de tomar el módulo nuevamente no cambia y el resultado es cuadro (n) = cuadro (n).
Otra situación que involucra operaciones con números grandes es tomar el módulo de A elevado a la enésima potencia (A ^n mod V). Si el número mod no es grande, se puede hacer (termina después de n A mod) ((A mod). V)* Un mod V) * Un mod V... Este algoritmo no necesariamente necesita implementarse de forma recursiva, se puede usar un bucle simple, con hasta dos niveles de bucles anidados.
Consejo final: al sumar, restar, multiplicar o dividir un número grande, no factorice fácilmente el dividendo (suma/resta/multiplicación/división). Este algoritmo será muy ineficiente.
(El artículo fue escrito apresuradamente, puede haber errores tipográficos, perdóneme)
Fuente: mismo BLOG