[英]Algorithm on exponential with irrational base
我知道在計算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
很大,則很容易溢出。 有任何想法嗎?
您可以通過計算(以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))算法(不考慮位大小)。
示例:根據注釋,取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
如果展開(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 + 2 xy + y^2
。 即使我們只對整數部分感興趣,但由於2 x y+ y^2
的整數部分,我們仍然會遇到一些問題。 這會導致問題,無法有效地計算我們將要知道的很多y
整數部分。 當我們使用更高的冪時,您需要更多更多的y
才能得到整數部分。
我認為正常的浮點乘法不足以計算非常大的n
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.