如果我想计算一个^ b mod c,那么有一种有效的方法可以做到这一点,而无需完全计算^ b。
然而,在编程时,如果我写f g x
,那么无论f
如何都会计算g(x)。
J在特殊情况下提供组合f和g,模幂功能就是其中之一。例如,以下运行非常快。
1000&| @ (2&^) 10000000x
这是因为' atop'如果可能,结合@
告诉语言组成函数。如果我把它取下来,它就会慢得无法忍受。
但是,如果我想使用x ^ x,则^~
不再有效,并且我得到大值的限制错误。然而,绑定那些大值确实有效。
所以
999&| @ (100333454&^) 100333454x
执行得很快但很快
999&| @ ^~ 100333454x
给了我一个限制错误 - RHS太大了。
我是否正确地认为在这种情况下,J没有使用高效的幂模数算法?
答案 0 :(得分:2)
m&|@^ dyad avoids exponentiation for integer arguments
m&|@(n&^) monad avoids exponentiation for integer arguments
特殊代码不支持^~
的情况。
答案 1 :(得分:0)
https://github.com/Pascal-J/BN-openssl-bindings-for-J
包括openssl的绑定(在Windows上与J一起分发,并预先安装在所有其他兼容系统上)的BN库,包括modexp。由于从J转换为“C”(BN)
的参数较少,x ^ x情况将特别有效