55 lines
1.6 KiB
Fortran
55 lines
1.6 KiB
Fortran
program Primes
|
|
|
|
use ISO_FORTRAN_ENV
|
|
|
|
implicit none
|
|
|
|
integer(int64), dimension(7) :: data = (/2099726827, 15780709, 1122725370, 15808973, 576460741, 12878611, 12757923/)
|
|
integer(int64), dimension(100) :: outprimes
|
|
integer(int64) :: largest_factor = 0, largest = 0, minim = 0, val = 0
|
|
integer(int16) :: count = 0, OMP_GET_THREAD_NUM
|
|
|
|
call omp_set_num_threads(4);
|
|
!$omp parallel do private(val,outprimes,count) shared(data,largest_factor,largest)
|
|
do val = 1, 7
|
|
outprimes = 0
|
|
call find_factors(data(val), outprimes, count)
|
|
minim = minval(outprimes(1:count))
|
|
if (minim > largest_factor) then
|
|
largest_factor = minim
|
|
largest = data(val)
|
|
end if
|
|
write(*, fmt = '(A7,i0,A2,i12,100i12)') 'Thread ', OMP_GET_THREAD_NUM(), ': ', data(val), outprimes(1:count)
|
|
end do
|
|
!$omp end parallel do
|
|
|
|
write(*, fmt = '(i0,A26,i0)') largest, ' have the Largest factor: ', largest_factor
|
|
|
|
return
|
|
|
|
contains
|
|
|
|
subroutine find_factors(n, d, count)
|
|
integer(int64), intent(in) :: n
|
|
integer(int64), dimension(:), intent(out) :: d
|
|
integer(int16), intent(out) :: count
|
|
integer(int16) :: i
|
|
integer(int64) :: div, next, rest
|
|
|
|
i = 1
|
|
div = 2; next = 3; rest = n
|
|
|
|
do while (rest /= 1)
|
|
do while (mod(rest, div) == 0)
|
|
d(i) = div
|
|
i = i + 1
|
|
rest = rest / div
|
|
end do
|
|
div = next
|
|
next = next + 2
|
|
end do
|
|
count = i - 1
|
|
end subroutine find_factors
|
|
|
|
end program Primes
|