No desenvolvimento .NET, às vezes devido ao conteúdo de conhecimento de alguns assuntos marginais, como estatística, finanças, astronomia e outros cálculos, os algoritmos de criptografia e descriptografia envolverão um grande número de operações. Mesmo que o maior tipo numérico em .net seja armazenado, ele. irá estourar o número, uma das minhas idéias é usar tipos numéricos ao calcular e armazenar (temporariamente) e produzir como strings. Então, ao armazenar, BOX[n] n matrizes são necessárias para armazenar temporariamente os resultados de uma pequena etapa no. cálculo.
'Como exemplo
=================== Diagrama de compreensão do algoritmo =======================
'97*97*97*97*97 = 8587340257 caixa(1) = 587340257 caixa(2)=8
'97*97*97*97*97*97 = 832972004929 caixa(1) = 972004929 caixa(2)=832
'97*97*97*97*97*97*97 = 80798284478113 caixa(1) = 284478113 caixa(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 caixa(1) = 594376961 caixa(2)=7837433
'97 ^ 9 = 760231058654565217 caixa (1) = 654565217 caixa (2) = 760231058
'97 ^ 10 = 73742412689492826049 caixa (1) = 492826049 caixa (2) = 742412689 caixa (3) = 73
… … … … … …
Observe que quanto maior a caixa na tabela abaixo, maior será o número correspondente. Ao usar o algoritmo acima, lembre-se de ① primeiro definir o número de dígitos de uma CAIXA, por exemplo, o acima é de 9 dígitos (de acordo com as necessidades e reais. condições),
②Devido aos hábitos de cálculo, muitas pessoas calcularão primeiro o número de dígitos da caixa (n+1) ao contar a partir da posição inferior {caixa (0 -> n)} e, em seguida, adicionarão o número de transporte gerado pela caixa (n) (tal como o primeiro Calcule caixa (1) para caixa (2) = 0 para gerar um número de transporte de 8 caixa (2) + número de transporte = 8) para processamento, como o processamento de adição acima ③ É melhor começar do alto posição, você evitará muitos problemas. O número de caixas é desconhecido. Não importa. Quando estiver cheio (o número de carregamentos gerados pela caixa de subscrito mais alta), adicione outro. existe uma operação de módulo, se o módulo não for grande, você também pode usar a ideia acima para calcular o módulo em pedaços e depois vincular. A caixa é um resultado temporário e a caixa é redistribuída (deve ser truncada novamente). a posição alta). Por exemplo, se for o módulo 123456789123456789, defina uma caixa com oito dígitos box(1)=89 box(2)=91234567 box(3)=12345678. ∵ Comece a pegar o módulo. nós de a posição alta Se box(n) não mudar depois de ser módulo uma vez, o resultado de tomar o módulo novamente não muda e o resultado é box(n) = box(n).
Outra situação que envolve operações com grandes números é elevar o módulo de A à enésima potência (A ^n mod V Se o número do mod não for grande, isso pode ser feito (termina após n A mod) ((A mod). V)* A mod V) * A mod V... Este algoritmo não precisa necessariamente ser implementado de forma recursiva, pode ser utilizado um loop simples, com até dois níveis de loops aninhados.
Conselho final: Ao adicionar, subtrair, multiplicar ou dividir um número grande, não fatore facilmente o dividendo (adição/subtração/multiplicação/divisão. Este algoritmo será muito ineficiente).
(O artigo foi escrito às pressas, pode haver erros de digitação, por favor me perdoem)
Fonte: mesmo BLOG