无理基指数的指数算法

时间:2014-06-15 23:03:22

标签: algorithm math exponentiation exponent

我知道在计算O(logn)时有一个a^n算法,其中a是一个整数,而n是一个巨大的整数(可能结果需要模块化另一个素数MOD)。

我想知道是否还有O(logn)算法来计算

  

(a+sqrt(b))^n + (a-sqrt(b))^n (mod MOD)

在指数计算中,不合理的部分sqrt(b)看起来不容易处理。我所能做的就是分别计算a+sqrt(b)a-sqrt(b)部分并将它们加在一起,然后进行模块化,但如果n很大,则很容易溢出。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你可以通过计算来实现(在Z M [x] /⟨x²-b⟩)

(a+x)^n+(a-x)^n mod (M, x^2-b)

再次,您可以使用模块化对齐和平方功率,其中中间结果现在是线性多项式(超过模块化整数)。实际上,你只需要一个幂,结果是常数系数的两倍。


或者,这些幂组合是2阶线性递归的解决方案

u[n+2]-2*a*u[n+1]+(a^2-b)*u[n]

,其中

u[0]=2 and u[1]=2*a

这样你就可以使用这种递归的系统矩阵的快速矩阵求幂,再次获得一个O(log(n))算法(忽略bitsize)。


示例:根据评论,取a = 3,b = 8,n = 2(整数mod M = 10 ^ 9 + 7,示例不够大,不足以解决问题)

在第一个变体中,计算u [n] =(a + x)^ n mod(M,x ^ 2-b),所以

u[0]=1
u[1]=3+x
u[2]=(3+x)^2 mod (x^2-8)=9+6x+8=17+6x

和常数项的两倍是2 * 17 = 34

在第二个变体中,递归是(2 * a = 6,a ^ 2-b = 1)

u[n+2]-6*u[n+1]+u[n]=0

以便第一个序列元素

u[0]=2
u[1]=6
u[2]=6*u[1]-u[0]=34

答案 1 :(得分:1)

如果您展开(a+sqrt(b))^n + (a-sqrt(b))^n,则

  ( a + nC1 a^(n-1) √b + nC2 a^(n-2) b + nC3 a^(n-3) √b b + ... )
 +( a - nC1 a^(n-1) √b + nC2 a^(n-2) b - nC3 a^(n-3) √b b + ... )
= 2 a  +  0            + 2 nC2 a^(n-2) b  + 0 + ... + 2 nC4 a^(n-4) b^2 + ...

所以涉及可能不合理的部分的条款取消。 (nC2等是二项式系数)。

可以使用整数运算相当有效地计算上述RHS,因为您可以将序列中的每个项与前一个项相关联。但是有n / 2项,所以计算是O(n)。

我们知道结果将是一个整数,我们可以尝试运行Exponentiation by squaring算法,跟踪整数的小数部分。写a+sqrt(b) = x + y,其中x是整数,y是小数部分。

找到这个方块我们有x^2 + 2 x y + y^2。即使我们只对整数部分感兴趣,但由于存在2 x y+ y^2的整数部分,因此存在一些问题。这导致了有效计算整数部分的问题,我们将知道y的许多数字。当我们达到更高的权力时,你需要更多的y数字来获得整数部分。

我不认为正常的浮点乘法足以计算非常大的n的条件。