2015-04-08 2 views
4

Si je veux calculer un^b mod c alors il y a un moyen efficace de le faire, sans calculer a^b en entier.Fonction Modulo Power dans J

Cependant, lors de la programmation, si j'écris f g x alors g (x) est calculé indépendamment de f.

J permet de composer f et g dans des cas spéciaux, et la fonction modulo power en fait partie. Par exemple, ce qui suit est extrêmement rapide.

1000&| @ (2&^) 10000000x

En effet, le « sommet » conjonction « @ » indique la langue pour composer les fonctions, si possible. Si je l'enlève, ça va insupportablement lentement.

Si toutefois je veux travailler avec x^x, alors^~ ne fonctionne plus et j'obtiens des erreurs de limite pour les grandes valeurs. Relier ces grandes valeurs fonctionne cependant.

Alors

999&| @ (100333454&^) 100333454x

exécute agréable et rapide, mais

999&| @ ^~ 100333454x

Ça me donne une erreur de limite - l'ERS est trop grand. Ai-je raison de penser que dans ce cas, J n'utilise pas un algorithme efficace de modulo de puissance?

Répondre

1

par le special code page:

m&|@^  dyad avoids exponentiation for integer arguments 
m&|@(n&^) monad avoids exponentiation for integer arguments 

Le cas pour ^~ est pas pris en charge par un code spécial.

0

https://github.com/Pascal-J/BN-openssl-bindings-for-J

comprend des fixations pour openssl (distribué par J sur les fenêtres, et pré-installé sur tous les autres systèmes compatibles) bibliothèque de BN compris modexp. Le cas x^x sera particulièrement efficace en raison du nombre réduit de paramètres convertis de J en "C" (BN)