Блог пользователя xuanquang1999

Автор xuanquang1999, 11 лет назад, По-английски

Is there a way to do this?

  • Проголосовать: нравится
  • +11
  • Проголосовать: не нравится

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

Yes, there is.

»
11 лет назад, скрыть # |
Rev. 10  
Проголосовать: нравится +21 Проголосовать: не нравится

Yes, there is. Think about the formula...

Fi = Fi - 1 + Fi - 2 = 2 * Fi - 2 + Fi - 3 = 3 * Fi - 3 + 2 * Fi - 4....

If you keep on with the formula, assuming F0 = 1 and F1 = 1, you'll reach a point where...

(if i is even)

(if i is odd)

Or, generalizing for every i...

Using those formulas and a recursive function with memoization, you can run the algorithm in no time.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится

By the way can anyone say how to calculate Pisano period fast?

»
11 лет назад, скрыть # |
Rev. 6  
Проголосовать: нравится +1 Проголосовать: не нравится

I'm not sure about this, but you may test it. The formula for the n-th Fibonacci number is

If we write the pow function to be fast modulo exponentiation this gives us O(logN) complexity.

UPD: This function might not work with double arguments, so this is hardly a right solution.

  • »
    »
    11 лет назад, скрыть # ^ |
    Rev. 3  
    Проголосовать: нравится +5 Проголосовать: не нравится

    This formula is applicable iff 5 is a quadratic residue modulo p and p is prime. We can check it using Euler's criterion.

    For example, let's take p = 109 + 9. Euler's criterion is true: . That means we can find a square root of 5 modulo p.

    Let's find it. I prefer Wolfram Alpha: powermod[5,1/2,10^9+9] = 383008016. We can insert this number into your formula, and the final result is

    Fn = 276601605·(691504013n - 308495997n)

    • »
      »
      »
      11 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      So this actually works?

    • »
      »
      »
      11 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Still can't understand where did you get all the numbers in the formula.

    • »
      »
      »
      11 лет назад, скрыть # ^ |
      Rev. 12  
      Проголосовать: нравится +21 Проголосовать: не нравится

      If I am not mistaken, you can do same thing for all modules not equal to 5 by adding roots of x2 - 5 to if 5 is not quadratic residue . I mean, calculate value of the same formula on numbers of type a + bx, where and with rules of addition and multiplication similar to complex numbers (result will always be free of "imaginary" part):

      • »
        »
        »
        »
        11 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        I guess you are right. The thing is the expression never contains square root of five. So we don't really care whether it even exists. It is nice if it does, but it is totally unnecessary. For example my program (link) can calculate Fibonacci numbers modulo 3^6*7^2=35721. And there is no x such that x*x=5 mod 35721. The trick is to work with numbers, similar to complex, with only one difference that i*i=5, not -1.

  • »
    »
    11 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +13 Проголосовать: не нравится

    Nevertheless you can actually use this formula to calculate Fibonacci numbers modulo any odd number. You just need to calculate it not with the help of doubles, but numbers of the form . They have properties similar to complex numbers. For example the product of two numbers equals .

    And because of special structure of this formula, the answer is , where Im takes the part right next to square root of five (I called it so because of similarity with complex numbers). So you only need to be able to divide by two and that can be done modulo any odd number.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +15 Проголосовать: не нравится
»
11 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Yes. See this page.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

You came and gave a problem: Calculate Fib(n)=Fib(n-1)+Fib(n-2) % M in O(logN). Cool.

Now I come and give you a challenge: SuperFib(n)=A*SuperFib(n-1)+B*SuperFib(n-2)+C*SuperFib(n-3) % M (SuperFib(0), SF(1), SF(2) are given, as well as A, B and C). Solve it in O(logN) time. This requires matrix exponential. If you want to learn something great.

»
9 лет назад, скрыть # |
 
Проголосовать: нравится -34 Проголосовать: не нравится

You could use matrix multiplication here, to get to the Nth number in log(N) time. Here is a video tutorial explaining the same: Fibonacci Numbers using Matrix Multiplication

»
3 года назад, скрыть # |
Rev. 2  
Проголосовать: нравится -74 Проголосовать: не нравится

.

»
3 года назад, скрыть # |
Rev. 2  
Проголосовать: нравится -20 Проголосовать: не нравится

.

»
3 года назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

idk