Если я хочу вычислить 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 не использует эффективный алгоритм мощности по модулю?