Dans le développement .NET, parfois en raison du contenu en connaissances de certains sujets marginaux, tels que les statistiques, la finance, l'astronomie et d'autres calculs, les algorithmes de cryptage et de décryptage impliqueront un grand nombre d'opérations, même si le plus grand type numérique est stocké dans .net. va déborder. Nombre, une de mes idées est d'utiliser des types numériques lors du calcul, et de stocker (temporairement) et de sortir sous forme de chaînes. Ensuite, lors du stockage, des tableaux BOX[n] n sont nécessaires pour stocker temporairement les résultats d'une petite étape dans le. calcul.
'À titre d'exemple
=================== Diagramme de compréhension de l'algorithme ========================
'97*97*97*97*97 = 8587340257 boîte(1) = 587340257 boîte(2)=8
'97*97*97*97*97*97 = 832972004929 boîte(1) = 972004929 boîte(2)=832
'97*97*97*97*97*97*97 = 80798284478113 boîte(1) = 284478113 boîte(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 boîte (1) = 594376961 boîte (2) = 7837433
'97 ^ 9 = 760231058654565217 boîte (1) = 654565217 boîte (2) = 760231058
'97 ^ 10 = 73742412689492826049 boîte (1) = 492826049 boîte (2) = 742412689 boîte (3) = 73
… … … … … …
Notez que plus la case dans le tableau ci-dessous est grande, plus le nombre correspondant est élevé. Lorsque vous utilisez l'algorithme ci-dessus, n'oubliez pas de ① définir d'abord le nombre de chiffres d'une BOÎTE, par exemple, celui ci-dessus est de 9 chiffres (selon les besoins et le réel). conditions),
②En raison des habitudes de calcul, de nombreuses personnes calculeront d'abord le nombre de chiffres de la case (n+1) lors du comptage à partir de la position inférieure {box(0 -> n)}, puis ajouteront le numéro de report généré par la case(n) (tel que comme premier Calculer box(1) à box(2)=0 pour générer un numéro de report de 8 box(2)+numéro de report = 8) pour le traitement, comme le traitement d'addition ci-dessus ③ Il est préférable de commencer par le plus haut position, vous éviterez bien des ennuis, le nombre de cases est inconnu, peu importe. Lorsqu'il est plein (le nombre de carrys générés par la case d'indice le plus élevé), ajoutez-en un autre. il y a une opération modulo, si le module n'est pas grand, vous pouvez également utiliser l'idée ci-dessus pour calculer le module en morceaux puis lier la boîte est un résultat temporaire, et la boîte est redistribuée (elle doit être re-tronquée de. la position haute). Par exemple, s'il s'agit du modulo 123456789123456789, définissez une case à huit chiffres box(1)=89 box(2)=91234567 box(3)=12345678. est 123456789123456789 ÷ 333=370741108478849 le module est 72) Alors la boîte redistribuée devrait être box(1) =478849 box(2) =370741180 mais pas box(1) =370741180 box(2) = 478849 Pourquoi ∵ Commencer à prendre le module nous de la position haute. Si box(n) ne change pas après avoir été modulo une fois, le résultat de la prise à nouveau du module ne change pas et le résultat est box(n) = box(n).
Une autre situation impliquant un grand nombre d'opérations est de prendre le modulo de A élevé à la nième puissance (A ^n mod V Si le nombre de mod n'est pas grand, cela peut être fait (il se termine après n A mod) ((A mod). V)* A mod V) * A mod V... Cet algorithme ne doit pas nécessairement être implémenté de manière récursive, une simple boucle peut être utilisée, avec jusqu'à deux niveaux de boucles imbriquées.
Dernier conseil : lors de l'addition, de la soustraction, de la multiplication ou de la division d'un grand nombre, ne factorisez pas facilement le dividende (addition/soustraction/multiplication/division). Cet algorithme sera très inefficace.
(L'article a été écrit à la hâte, il peut y avoir des fautes de frappe, pardonnez-moi)
Source : même BLOG