-
Notifications
You must be signed in to change notification settings - Fork 1
/
mod_prime.F90
56 lines (46 loc) · 1.43 KB
/
mod_prime.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module mod_prime
use, intrinsic :: iso_fortran_env, only: int64
implicit none
integer :: my_int
type :: square
real :: x, y
character(len=20) :: name
end type square
type(square) :: my_square
contains
function is_prime(n)
integer(kind=int64), intent(in) :: n
logical :: is_prime
integer(kind=int64) :: max_test, i
! First a few direct removals
if (n <= 1_int64) then
! Negative numbers, zero, and one are not primes.
is_prime = .FALSE.
return
end if
if (n == 2_int64) then
! 2 is the only even prime
is_prime = .TRUE.
return
end if
if ( modulo(n, 2_int64) == 0 ) then
! If it were 2, we would have already returned true,
! all other even numbers are not primes.
is_prime = .FALSE.
return
end if
! If we don't find a divisor before reaching the square root
! we won't find any other later
max_test = int(sqrt(real(n)), kind=int64)
is_prime = .TRUE.
! Test all odd number from 3 up to max_test
do i = 3, max_test, 2
if ( modulo(n, i) == 0_int64 ) then
! Found a divisor, it's not a prime
is_prime = .FALSE.
! exit
end if
end do
return
end function is_prime
end module mod_prime