簡體   English   中英

巨大的斐波那契模數 m C++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM