exponentiation modulaire - Code de Rosetta

Nous pouvons utiliser la fonction puismod intégrée avec le type BigInt intégré (basé sur GMP):

version 1 [modifier]

Ce programme REXX tente de gérer toute une. b. ou m. mais il y a des limites pour tout langage informatique.
Pour certains REXXes, il est environ huit millions de chiffres pour toute expression arithmétique ou valeur, ce qui impose des limites à la
les valeurs d'une ou deux 10 m.

Il y a un code REXX (ci-dessous) pour régler automatiquement le nombre de chiffres pour accueillir un très grand nombre qui sont
calculé en soulevant un grand nombre à une puissance arbitraire.

Ce programme REXX utilise linesize programme REXX (ou BIF) qui est utilisée pour déterminer la largeur de l'écran (ou linesize) du terminal (console).
Le programme LINESIZE.REX REXX est inclus ici ──► LINESIZE.REX.

sortie lors de l'utilisation de l'entrée. . 40 80 180 888

Notez que le programme REXX exécutait dans une fenêtre de 600 caractères de large, et même avec cela, le dernier résultat enveloppé.

version 2 [modifier]

La bibliothèque de base de Ruby n'a pas exponentiation modulaire. OpenSSL, dans la bibliothèque standard de Ruby, fournit OpenSSL :: BN # mod_exp. Pour arriver à cette méthode, nous appelons Integer # to_bn pour convertir un entier à partir OpenSSL :: BN. Le procédé convertit implicitement b et m.

Ou nous pouvons mettre en œuvre une méthode personnalisée, Entier # rosetta_mod_exp, pour calculer le même résultat. Cette méthode ne exponentiation rapide successive, mais remplace chaque produit intermédiaire avec une valeur congruente. (A besoin du programme Ruby 1.8.7 pour Integer # impair?).

Marche avec. Version Ruby 1.8.7