[英]Huge fibonacci modulo m C++
我正在嘗試計算 Fn mod m,其中 Fn 是第 n 個斐波那契數。 n 可能真的很大,因此以直接的方式計算 Fn 確實效率不高(盡管矩陣求冪可以工作)。 問題陳述要求我們在不計算 Fn 的情況下使用模的分配特性來做到這一點: (a+b)mod m = [a mod m + b mod m] mod m
(在有人問我之前,我查找了同一問題的答案。但是,我想回答我的具體問題,因為我不是在問解決這個問題的算法)
使用這個和第 n 個斐波那契數只是前兩個之和的事實,我不需要存儲斐波那契數,而只需要計算連續模運算的結果。 從這個意義上說,我應該有一個大小為 n 的數組 F,其中存儲了使用上述屬性迭代計算 Fn mod m 的結果。 我已經設法使用以下代碼解決了這個問題。 然而,在回顧它時,我偶然發現了一些讓我感到困惑的事情。
long long get_fibonacci_huge_mod(long long n, long long m) {
long long Fib[3] = {0, 1, 1};
long long result;
long long index;
long long period;
long long F[n+1];
F[0] = 0;
F[1] = 1;
F[2] = 1;
for (long long i = 3; i <= n; i++) {
F[i] = (F[i-2] + F[i-1]) % m;
if (F[i] == 0 && F[i+1] == 1 && F[i+2] == 1) {
period = i;
break;
}
}
index = n % period;
result = F[index];
return result;
}
該解決方案輸出任何 n 和 m 的正確結果,即使它們非常大。 當 n 很大時它可能會變慢,但我現在並不擔心。 我有興趣以這種方式專門解決問題。 我會嘗試使用矩陣冪或任何其他快得多算法后解決它。
所以我的問題如下。 在代碼的開頭,我創建了一個大小為 n+1 的數組 F。 然后我遍歷這個數組,使用分布屬性計算 Fn mod m。 在編寫這個循環后讓我感到困惑的一件事是,由於 F 被初始化為全零,如果 F[i+2]、F[i+1] 尚未計算,那么如何正確使用它們? 我假設它們被正確使用,因為算法每次都會輸出正確的結果。 也許這個假設是錯誤的?
我的問題不是關於算法本身,而是關於循環內部發生了什么。
謝謝
這是正確算法的錯誤實現。 讓我們先看看修正后的版本。
long long get_fibonacci_huge_mod(long long n, long long m) {
long long result;
long long index;
long long period = n+1;
long long sz = min (n+1,m*m+1); // Bound for period
long long *F = new long long[sz];
F[0] = 0;
F[1] = 1;
F[2] = 1;
for (long long i = 3; i < sz; i++) {
F[i] = (F[i-2] + F[i-1]) % m;
if (F[i] == 1 && F[i-1] == 0) { // we have got back to where we started
period = i-1;
break;
}
}
index = n % period;
result = F[index];
delete[]F;
return result;
}
那么為什么原始代碼有效呢? 因為你很幸運。 由於數組被初始化為幸運垃圾,因此對 i+1 和 i+2 的檢查從未評估為真。 結果,這簡化為對 F(n) 的幼稚評估,而根本不包含周期性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.