Algorithm 基于无理基的指数型算法

Algorithm 基于无理基的指数型算法,algorithm,math,exponentiation,exponent,Algorithm,Math,Exponentiation,Exponent,我知道在计算a^n时有一个O(logn)算法,a是一个整数,n是一个大整数(可能结果需要模化另一个素数MOD) 我想知道是否还有一个O(logn)算法需要计算 (a+sqrt(b))^n+(a-sqrt(b))^n(mod mod) 无理部分sqrt(b)在指数计算中看起来不容易处理。我所能做的就是分别计算a+sqrt(b)和a-sqrt(b)部分并将它们相加,然后进行模块化,但是如果n很大,很容易溢出。有什么想法吗?你可以通过计算(用ZM[x]/⟨x²-b⟩)来实现

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

我想知道是否还有一个
O(logn)
算法需要计算

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


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

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

同样,你可以对幂使用模减半和平方,中间结果现在是线性多项式(模整数)。实际上,你只需要一个幂,结果是常数系数的两倍


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

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

因此,您可以使用此递归的系统矩阵的快速矩阵求幂,再次获得O(log(n))算法(忽略位大小)


示例:根据注释,取a=3,b=8,n=2(整数mod M=10^9+7,示例不够大)

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

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

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

所以第一个序列元素是

u[0]=2
u[1]=6
u[2]=6*u[1]-u[0]=34
如果展开
(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)

正如我们所知,结果将是一个整数,我们可以尝试通过运行算法来跟踪整数的分数分量。写入
a+sqrt(b)=x+y
,其中x是整数,y是小数部分

找到这个的平方,我们有
x^2+2xy+y^2
。尽管我们只对整数部分感兴趣,但由于存在
2xy+y^2
的整数部分,因此我们存在一些问题。这导致了有效计算整数部分的问题,因为我们将知道很多
y
的数字。当我们使用高次幂时,需要更多的
y
位数才能得到整数部分


我认为普通的浮点乘法不足以计算非常大的
n

的项。快速求幂算法只假设指数是整数。基地可以是任何东西。这有用吗?@templatetypedef谢谢你,template。因为n非常大,所以我每一步都需要进行模块化运算,如果基数包含无理数,这对我来说就不是那么简单了。谢谢你的意见。我尝试了一些简单的例子,但结果与我直接计算的结果不一致:a=3,b=8,n=2,x=10^9+7,ans应该是2*(3^2+8)=34…在两个变量中都非常好,添加了计算作为示例。完美!我错误地将x设置为10^9+7,现在我知道它只是迭代过程中的一个变量。谢谢!你的另一种方法(u(n)=pu(n-1)+qu(n-2))在我看来更简单,是的,这里可以使用快速矩阵乘法。第一个看起来不容易编程,因为它是一个变量x部分的模运算。第一个同样容易,它类似于复数乘法<代码>(c0+c1*x)*(d0+d1*x)=(c0*d0+b*c1*d1)+(c0*d1+c1*d0)*x。
u[0]=1
u[1]=3+x
u[2]=(3+x)^2 mod (x^2-8)=9+6x+8=17+6x
u[n+2]-6*u[n+1]+u[n]=0
u[0]=2
u[1]=6
u[2]=6*u[1]-u[0]=34
  ( 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 + ...