fortran66のブログ

fortran について書きます。

problem 007

ガウス素数定理によって大体の値の見当をつけてそこまでの素数をやや大目に求めます。

ソース・プログラム

    program PEuler007
      implicit none
      integer, parameter :: np = 10001
      integer, allocatable :: iptab(:)
      integer :: n 
      ! np ~ n / log(n) ! approximate number of primes less than n : Gauss   
      ! approximate np-th prime n ~ np * log(n) ~ np * log( np * log(n) ) ...  
      n = np * log( np * log( real(np) ) ) + 3 
      iptab = ieratos(n)
      print *, iptab(np)
      stop
    contains  
      function ieratos(n) ! thieve of Eratostenes
        integer, intent(in) :: n
        integer, allocatable :: ieratos(:)
        logical :: tab(n)
        integer :: i
        tab = .true.
        tab(1) = .false.
        do i = 2, int( sqrt(real(n)) ) 
          if ( tab(i) ) tab(i * i:n:i) = .false.
        end do
        ieratos = pack( [ (i, i = 1, n) ], mask = tab )
        return
      end function ieratos
    end program PEuler007

実行結果

104743
続行するには何かキーを押してください . . .