Функция Modulo Power в Дж

Если я хочу вычислить a^b по модулю c, то есть эффективный способ сделать это без полного вычисления a^b.

Однако при программировании, если я пишу f g x, тогда g(x) вычисляется независимо от f.

J предусматривает композицию f и g в особых случаях, и функция по модулю мощности является одним из них. Например, следующее выполняется очень быстро.

1000&| @ (2&^) 10000000x

Это связано с тем, что союз «поверх» @ указывает языку, что функции нужно составлять, если это возможно. Если я его уберу, он будет идти невыносимо медленно.

Однако, если я хочу работать с x^x , тогда ^~ больше не работает, и я получаю ошибки ограничения для больших значений. Однако привязка этих больших значений работает.

So

999&| @ (100333454&^) 100333454x

работает красиво и быстро, но

999&| @ ^~ 100333454x

выдает ошибку предела - правая сторона слишком велика.

Прав ли я, думая, что в этом случае J не использует эффективный алгоритм мощности по модулю?


person user1202733    schedule 08.04.2015    source источник


Ответы (2)


Согласно специальной кодовой странице:

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

Случай для ^~ не поддерживается специальным кодом.

person Eelvex    schedule 08.04.2015

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

включает привязки для библиотеки openssl (распространяемой с J в Windows и предустановленной во всех других совместимых системах) библиотеки BN, включая modexp. Случай x^x будет особенно эффективен из-за меньшего количества параметров, преобразованных из J в "C" (BN)

person pascalJ    schedule 20.09.2015