質問が重複していないことを願っていますが、提案されたトピックでは同様の問題は発生しませんでした。数値が素数かどうかをチェックする関数があります。現在、これは素数を検索する最も遅い方法です。
subroutine is_prime_slow(num, stat)
implicit none
logical :: stat
integer :: num
integer :: i
if ((num .le. 3) .and. (num .gt. 1)) then
stat = .true.
return
end if
! write(*,*) 'limit = ',limit
do i = 2,num - 1
! write(*,*) 'mod(',limit,i,') = ',mod(limit,i)
if (mod(num,i) == 0) then
stat = .false.
return
end if
end do
stat = .true.
return
end
今、私はそれにいくつかの改善をしたとしましょう。
subroutine is_prime_slow(num, stat)
implicit none
logical :: stat
integer :: num
integer :: i
if ((num .le. 3) .and. (num .gt. 1)) then
stat = .true.
return
end if
! IMPROVEMENT
if ((mod(num,2) == 0) .or. (mod(num,3) == 0) .or. (mod(num,5) == 0) .or. (mod(num,7) == 0)) then
stat = .false.
return
end if
! write(*,*) 'limit = ',limit
do i = 2,num - 1
! write(*,*) 'mod(',limit,i,') = ',mod(limit,i)
if (mod(num,i) == 0) then
stat = .false.
return
end if
end do
stat = .true.
return
end
現在、2 番目のバージョンでは、2、3、5、7 で割り切れるすべての数など、半分以上の数が除外されています。Linux の「time」プログラムで実行の時間を計測すると、「改善された」バージョンの実行速度が同じように遅くなる可能性はありますか? 明らかなトリックがありませんか?
Searching the first 900000 numbers:
1st: 4m28sec
2nd 4m26sec