Answers:
lambda x,n:pow(x,2**n-1,2**n)
这对于偶数x返回0 。它使用Euler定理,并观察到2 ^ n − 1可通过Python内置的快速模幂运算被2 ^(n − 1)− 1 整除。这对于n到7000左右的n来说已经足够快了,它开始花费大约一秒钟以上的时间。
{:^((1${\.**2^?%}+*}:f;
不存在的逆的定点结果为0
。
这是欧拉定理的简单应用。,所以 X - 1 ≡ X 2 Ñ - 1 - 1
不幸的是,直接计算的指数太大了,因此我们必须使用循环并在循环内进行模块化归约。迭代步骤是,我们有基本情况的选择:要么与k=1
{1\:^(@{\.**2^?%}+*}:f;
或k=2
搭配
{:^((1${\.**2^?%}+*}:f;
我正在研究另一种方法,但是哨兵更加困难。
关键的观察是,我们可以通过建立位反了一下:如果
这给出了19个字符的功能
{1$)1$?@/~)2@?%}:f;
x&1
1
{1$.1&+1$?@/~)2@?%}:f;
{1$.1&*)1$?@/~)2@?%}:f;
n x f
{..1&*)2$?\/~)2@?%}:f;
_!1=1
x!n|r<-x!div(n+1)2=(2-r*x)*r`mod`2^n
使用基于Hensel引理的算法,该算法在每次迭代中使数字位数加倍,从而在不到一秒的时间内运行n到大约3000 万!