Advertisement
Ladies_Man

F-A-A-A-ST Fibonacci Matrix

Mar 20th, 2014
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.02 KB | None | 0 0
  1. package main
  2. import "fmt"
  3. import "math/big"
  4.                
  5. func fib(n int) *big.Int {
  6.         mul := func(tl1, tr1, bl1, br1, tl2, tr2, bl2, br2 *big.Int) (a, b, c, d *big.Int) {
  7.         a, b, c, d = new(big.Int), new(big.Int), new(big.Int), new(big.Int)
  8.         a1, a2 := new(big.Int), new(big.Int)
  9.         a.Add(a1.Mul(tl1, tl2), a2.Mul(tr1, bl2)) // a = (topleft1 * topleft2) + (topright1 * botleft2)
  10.         b.Add(a1.Mul(tl1, tr2), a2.Mul(tr1, br2))
  11.         c.Add(a1.Mul(bl1, tl2), a2.Mul(br1, bl2))
  12.         d.Add(a1.Mul(bl1, tr2), a2.Mul(br1, br2))
  13.         return
  14.     }
  15.     //   |A B| * |E F|
  16.     //   |C D|   |G H|
  17.     a, b, c, d := big.NewInt(0), big.NewInt(1), big.NewInt(1), big.NewInt(1)
  18.     e, f, g, h := big.NewInt(1), big.NewInt(0), big.NewInt(0), big.NewInt(1)
  19.     for n != 0 {
  20.         if (n & 1) != 0 { e, f, g, h = mul(e, f, g, h, a, b, c, d) }
  21.         a, b, c, d = mul(a, b, c, d, a, b, c, d)
  22.         n >>= 1
  23.     }
  24.     return f  // f = topright2
  25. }
  26.  
  27. func main() {
  28.     var n int
  29.     fmt.Scanf("%d", &n)
  30.     res := new(big.Int)
  31.     fmt.Pritf("%d", fib(n))
  32. }
  33. //
  34. // fib(1'000'000) has 208,988 decimals
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement