斐波那契數列取餘是否有規律?

時間 2021-05-29 22:57:52

1樓:李俊南

大部分人會這麼寫

n = eval(input())

a = 0

b = 1

for i in range(n):

a,b = a+b, a

print(a%10007)

這樣寫沒有任何問題,但如果需要求第***項對10007取余時,我試了一下,三分鐘都沒有得出答案,電腦風扇狂轉。

有沒有更簡潔的辦法

答案是有的

我們這樣想,a%10007,是否等於(a+10007*n)%10007:(n為正整數)

答案是相等的

那(a+10008)%10007和(a+1)%10007取餘有區別嗎,當然也是沒有。

也就是說(a+b)%10007 = (a+b%10007)%10007

那麼我們的程式改寫成這樣

n = eval(input())

a = 0

b = 1

for i in range(n+1):

a,b = a+b, a%10007

print(b)

再試試第***項,三秒得出答案。

效率提公升了不少。

2樓:George2019

(1)為什麼 (a + b) mod m = (a mod m + b mod m) mod m?

這是同餘的性質。正是因為餘數可以提前取,不影響結果,才避免了大數的運算。證明的話把整數 a, b 都寫成帶餘除法形式:

a = p * m + r, b = q * m + s. 那麼有

a + b = (p + q) * m + r + s.

所以 a + b 和 r + s 相差整數倍的 m,它們是模 m 同餘的。故兩邊對 m 取余會相等,原式得證。可以提前取餘這件事還可以推廣到乘法和乘方(僅底數)。也就是有

(a * b) mod m = ((a mod m) * (b mod m)) mod m,

(a ^ b) mod m = ((a mod m) ^ b) mod m.

可以學習一下模 m 剩餘類環 Z(m) 的性質。

(2)如何將程式的時間複雜度由 O(n) 降低為 O(log2(n))?

即使知道了(1),只是迴避了大數,但項數 n 很大以後,求出 F[n] 需要一項一項遞推地算還是很慢。我們可以把遞推式 F[n] = F[n-1] + F[n-2] 寫成矩陣形式

這樣的話,求 F[n] 就可以從 F[0] = 0, F[1] = 1 的初條件開始寫作

接下來你會冪取模的二分法(例如算 2^100 天以後星期幾,就是把 2^100 除以 7 求餘數,不必將 2 乘 100 次的那個方法)的話,把那個方法用於矩陣相乘就好了。

附註 1:不要想著將矩陣對角化,因為 sqrt(5) 在模 10007 的有限域 Z(10007) 裡面是算不出來的(沒有乙個整數平方以後被 10007 除餘數為 5)。即使對角化了還是要算乙個數的 n 次方模 10007 的餘數,和矩陣 n 次方的二分法冪取模時間複雜度都是 O(log2(n)).

附註 2:不要想著觀察週期。乙個二階遞推數列模 10007 的週期上限最長可以達到 10007^2. 所以觀察週期的方法推廣不到大規模的問題。

3樓:

這個結論其實可以推廣為,任意乙個齊次線性的整數遞推數列都是模週期的我們考慮k階常係數齊次線性遞推數列

這個數列 是整數數列

其中 , 是常整數,

則對於任意自然數 ,數列 的各項整除以 ,所得餘數成週期數列考慮 元有序陣列

其中 並且 ( )

這樣的 元陣列至多有 種,所以對於無窮陣列列( )必將出現兩個陣列相同

令則由遞推關係

有從而有

這證明了數列 是以 為週期的週期數列(不一定是純週期數列)它從第 項起開始迴圈

要使得 是純週期數列,需要滿足乙個條件

注意到假如

則從而有

即說明從第 項起便開始迴圈

以此類推,可知它從首項起就構成週期數列

回到本題,斐波那契數列的餘數數列當然是純週期數列,因為任何自然數都與1互素

4樓:mcg

整數的加、減、乘運算對運算元的取餘運算,不影響對最終結果取餘。(不過有可能出現負數,所以要把結果+除數做取餘)

也就是說 (a+b-c*d)%f = ((a%f+b%f-(c%f)*(d%f))%f+f)%f

後面那個%f+f)%f 是為了針對減法出現負數,如果沒有減法,直接%f就好,或者假設規定負數取餘結果為正,-2%7=5,那也不需要。要看語法規則。

問,今天周五,2的2020次方天之後,是週幾?

5樓:3Ni2Co

把相鄰兩項 看做乙個數對 ,那麼 可以由 唯一確定,而不同的 最多隻會有 種( 為質數),所以在若干項後一定會出現與之前相同的 ,就進入了迴圈.

其實 這個上界非常松,有結論是最短迴圈節長度不會超過 .

求解斐波那契數列模$p$意義下最短迴圈節 - NamelessOIer - 部落格園

6樓:加油的希望

首先,我們要了解抽屜原理:

將多於n+1(包含)個物體放到n個抽屜裡,則至少有乙個抽屜中有至少兩件物品。

例如,一年中有12個月,任意的13個或更多不同的人中,至少有兩個人在同乙個月出生。

令 表示斐波那契數列第 項 對 取模後的餘數的結果,即先證引理:

證明:設

則(注意此處同餘號與等號的區別)

又因為則

引理成立。

由 的定義可知,

由抽屜原理,對於有序數對集合

集合 中的數對至多有 種組合,則當 時,必定存在一組 ,使得由引理可得

即 數列存在迴圈節。

斐波那契數列可以求和嗎?

水十三 Sn A n 2 1 公式推導如下 斐波那契數列 1 1 2 3 5 8 13 21 An則 a1 1,a2 1,a3 2,a4 3,a5 5,an。求和 Sn a1 a2 a3 AnSn 1 a1 a2 a3 An 1因為a2等於1,所以Sn a2 a1 a2 a3 An 1即 Sn a2...

如何利用單調有界準則證明斐波那契數列前後兩項之比的極限存在?

水之心 設 為 Fibonacci 數列,即 且對任何 有 由此可得對任何 有 記後項與前項之比所構成的數列為 其中 從而有 結論一 0 eeimg 1 對所有 成立.顯然 結論二 的所有奇數項都大於 所有偶數項都小於 證明 由遞推公式可得 故由結論一可知 與 同號.由於 frac eeimg 1 ...

以下是python求斐波那契數列第n項的值是多少,求高手詳釋,真想不通while迴圈裡的邏輯,求詳解?

單爾博 fib的定義 fib n fib n 1 fib n 2 fib n 1 fib n fib n 1 在 式子中 fib n 是 result fib n 1 是 prev resultfib n 2 是 next result在 式子中 fib n 1 是 result fib n 是 p...