J中的模幂功能

时间:2015-04-08 19:56:54

标签: modulo j exponentiation

如果我想计算一个^ 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没有使用高效的幂模数算法?

2 个答案:

答案 0 :(得分:2)

根据special code page

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情况将特别有效