2015-04-08 2 views
4

Если я хочу вычислить a^b mod c, тогда есть эффективный способ сделать это, не вычисляя a^b в полном объеме.Функция Modulo Power в J

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

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

1000&| @ (2&^) 10000000x

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

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

Так

999&| @ (100333454&^) 100333454x

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

999&| @ ^~ 100333454x

дает мне предельную ошибку - ОРЗ является слишком большим.

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

ответ

1

согласно special code page:

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

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

0

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

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

Смежные вопросы