我知道在计算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
很大,则很容易溢出。有什么想法吗?
答案 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
的条件。