Fibonocci Numbers

Fibonocci numbers is given by

(1)Fn=Fn1+Fn2
where
(2)F1=F2=1

So the first few numbers are
1, 1, 2, 3, 5, 8, ...

What I done in this program is that entering a how many Fibonocci numbers you want, then I allocate the memeory for that array. Next is the simplest part, I iterate the Fibonocci number using (1), and write the result out.

Code

!========================================================
!   Purpose: Find first N of Fibonacci numbers
!
!   Methods: Fn = Fn-1 + Fn-2
!       
!       Date        Programer       Description of change
!       ====        =========       =====================
!      9/28/20        Morris        Original Code
!========================================================
PROGRAM fibonacci
    IMPLICIT NONE
    INTEGER :: N, i 
    INTEGER, PARAMETER :: verylong = selected_int_kind(32)
    INTEGER(verylong), DIMENSION(:), ALLOCATABLE :: fib

    write(*, *) "Numbers of Fibonocci number you want >>>"
    read(*, *) N
    ! allocate size N of array
    allocate(fib(N))

    ! F1 = F2 = 1
    fib(1) = 1
    fib(2) = 1
    do i = 3, N
        fib(i) = fib(i-1) + fib(i-2) 
    end do

    ! write to a file
    open(1, file='fib.dat', status='unknown')
    write(1, *) fib

    ! write on screen 
    write(*, '(a)') repeat("=", 100)
    write(*, '(10I10)') fib(1:10)
    write(*, '(a)') repeat("=", 100)
    write(*, '(10I10)') fib(11:20)
    write(*, '(a)') repeat("=", 100)
    write(*, '(10I10)') fib(21:30)
    write(*, '(a)') repeat("=", 100)
    write(*, '(10I10)') fib(31:40)
    write(*, '(a)') repeat("=", 100)
END PROGRAM fibonacci

Result

Below screenshot shows the first 40 Fibonocci number.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Lastly, I plot the Fibonocci number vs. N. It clearly shows a extremly rapid growth.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

In 64 bit Fortran integer type, there are limit to the maximun digit you can hold in one variable. In order to calculate 200th Fibonocci number, I need to seperate this very long integer(

42 digits) into different place. What I do is assigning each digit to an element of array, so that I can store as big number as I desire. Hardest part is then to calculate the sum of two number which I store digit ny digit in two big array. Below program(line 30 to 36) show how I manage to calulate
the sum of two number by using two array.

Big Fibonocci Number

PROGRAM big_fibonacci
    IMPLICIT NONE
    INTEGER :: N, i, j, res=0 
    ! store 50 digit of number of 3 Fibonocci numbers
    INTEGER, DIMENSION(:, :), ALLOCATABLE :: fib


    write(*, *) "Numbers of Fibonocci number you want >>>"
    read(*, *) N
    ! allocate N x 50 array
    allocate(fib(N, 50))
    ! initialize
    fib = 0.
    ! F1 = F2 = 1
    fib(1, 50) = 1
    fib(2, 50) = 1

    CALL big_addition

    CONTAINS

        SUBROUTINE big_addition
            write(*, '(a)') repeat('=', 100)
            write(6, '(50I2, 7I7)') fib(1, :), 1
            write(6, '(50I2, 7I7)') fib(2, :), 2
            do i = 3, N
                res = 0
                do j = 50, 1, -1
                    fib(i, j) = mod(fib(i-1, j) + &
                                fib(i-2, j) + res, 10)
                    res = (fib(i-1, j) + fib(i-2, j) + res &
                           - mod(fib(i-1, j) + fib(i-2, j) &
                           + res, 10)) / 10
                end do
                write(6, '(50I2, 7I7)') fib(i, :), i
            end do
            write(*, '(a)') repeat('=', 100)

            ! write to a file
            open(1, file='f200.dat', status='unknown')
            do i = 1, N
                write(1, '(50I1)') fib(i, :)
            end do
        END SUBROUTINE big_addition
END PROGRAM big_fibonacci

Result

Below screenshot show the 190th to 200th Fibonocci number which I store each digit seperatly(there is no way I can calculate this big number just using intrinsic Fortran function).

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Golden Mean

Golden mean is the ratio between two succescive Fibonocci numbers.

(3)Golden Mean=limnFnFn+1=5+12=0.618...

Code

!========================================================
!   Purpose: Find Golden Mean
!
!   Methods: Fn+1 / Fn
!       
!       Date        Programer       Description of change
!       ====        =========       =====================
!      9/28/20        Morris        Original Code
!========================================================
PROGRAM golden
    IMPLICIT NONE
    INTEGER :: N, i 
    INTEGER(16), DIMENSION(:), ALLOCATABLE :: fib
    REAL(16), DIMENSION(:), ALLOCATABLE :: ratio
    REAL(16) :: golden


    write(*, *) "Numbers of Fibonocci number you want >>>"
    read(*, *) N
    ! allocate N x 50 array
    allocate(fib(N))
    allocate(ratio(N-1))
    ! initialize
    fib = 0.
    ! F1 = F2 = 1
    fib(1) = 1
    fib(2) = 1
    ratio(1) = dble(fib(2)) / dble(fib(1))
    golden = (dsqrt(5.D0) - 1.D0) / 2.D0
    write(*, '(a)') repeat('=', 100)
    write(6, '(I25, 7I7)') fib(1), 1
    write(6, '(I25, 7I7)') fib(2), 2
    do i = 3, N
        fib(i) = fib(i-1) + fib(i-2)
        ratio(i-1) = dble(fib(i-1)) / dble(fib(i))
        write(6, '(I25, 7I7)') fib(i), i
    end do
    write(*, '(a)') repeat('=', 100)
    do i = 1, N-1
        write(6, '(D30.20, D30.20, 7I7)') ratio(i), &
        abs(ratio(i) - golden), i
    end do
    write(*, '(a)') repeat('=', 100)

    ! write to a file
    open(1, file='golden.dat', status='unknown')
    do i = 1, N
        write(1, '(F30.20)') ratio(i)
    end do
END PROGRAM golden

Result

I can calculate two successive Fibonocci ratio and it converges to golden ratio very fast.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

If I calculate the error between the ratio I calculate and (3), the error decrease as N increase. I plot the N vs

ε in which y axis is log scale. For
ε<1012
, at least I need to calcuate the ratio between 31th and 30th Fibonocci number.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →