program primes
  !
  ! Program zlicza liczby pierwsze w przedziale 
  ! (kmin, kmax); podaje ich ilosc i czas zliczania
  !
  implicit none
  integer, parameter :: kmin=1, kmax=1000
  integer numberOfPrimes, countPrimes
  real*4 startingTime, elapsedTime

  ! pomiar czasu
  startingTime=secnds(0.0)

  numberOfPrimes = countPrimes(kmin, kmax)
  print *, numberOfPrimes

  ! czas wykonania
  elapsedTime=secnds(startingTime)  ! elapsed time
  print *, "Time = ", elapsedTime

end program primes


function countPrimes(kmin, kmax) result(count) 
  !
  ! procedura zlicza liczby pierwsze w przedziale 
  ! (kmin, kmax) i zwraca ich liczbe
  !
  implicit none
  integer, intent(in) :: kmin, kmax
  integer number, count
  logical isPrime
  count = 0
  do number=kmin, kmax
     if (isPrime(number)) count = count + 1 
  end do
end function countPrimes


function isPrime(number)
  !
  ! funkcja sprawdza, czy liczba jest pierwsza
  ! i zwraca .true. jesli jest lub .false.
  !
  logical isPrime
  integer, intent(in) :: number
  integer k, limit

  limit = int(sqrt(float(number)))+1
  isPrime = .true.
  do k=2, limit
     if (mod(number,k) == 0) then
        isPrime = .false.
        return
     end if
  end do
end function isPrime

