Count in factors: Difference between revisions
Content added Content deleted
mNo edit summary |
|||
Line 597: | Line 597: | ||
15 main bye</lang> |
15 main bye</lang> |
||
=={{header|FORTRAN}}== |
|||
Please find the example output along with the build instructions in the comments at the start of the FORTRAN 2008 source. Compiler: gfortran from the GNU compiler collection. Command interpreter: bash. |
|||
<lang FORTRAN> |
|||
!-*- mode: compilation; default-directory: "/tmp/" -*- |
|||
!Compilation started at Thu Jun 6 23:29:06 |
|||
! |
|||
!a=./f && make $a && echo -2 | OMP_NUM_THREADS=2 $a |
|||
!gfortran -std=f2008 -Wall -fopenmp -ffree-form -fall-intrinsics -fimplicit-none f.f08 -o f |
|||
! assert 1 = */ 1 |
|||
! assert 2 = */ 2 |
|||
! assert 3 = */ 3 |
|||
! assert 4 = */ 2 2 |
|||
! assert 5 = */ 5 |
|||
! assert 6 = */ 2 3 |
|||
! assert 7 = */ 7 |
|||
! assert 8 = */ 2 2 2 |
|||
! assert 9 = */ 3 3 |
|||
! assert 10 = */ 2 5 |
|||
! assert 11 = */ 11 |
|||
! assert 12 = */ 3 2 2 |
|||
! assert 13 = */ 13 |
|||
! assert 14 = */ 2 7 |
|||
! assert 15 = */ 3 5 |
|||
! assert 16 = */ 2 2 2 2 |
|||
! assert 17 = */ 17 |
|||
! assert 18 = */ 3 2 3 |
|||
! assert 19 = */ 19 |
|||
! assert 20 = */ 2 2 5 |
|||
! assert 21 = */ 3 7 |
|||
! assert 22 = */ 2 11 |
|||
! assert 23 = */ 23 |
|||
! assert 24 = */ 3 2 2 2 |
|||
! assert 25 = */ 5 5 |
|||
! assert 26 = */ 2 13 |
|||
! assert 27 = */ 3 3 3 |
|||
! assert 28 = */ 2 2 7 |
|||
! assert 29 = */ 29 |
|||
! assert 30 = */ 5 2 3 |
|||
! assert 31 = */ 31 |
|||
! assert 32 = */ 2 2 2 2 2 |
|||
! assert 33 = */ 3 11 |
|||
! assert 34 = */ 2 17 |
|||
! assert 35 = */ 5 7 |
|||
! assert 36 = */ 3 3 2 2 |
|||
! assert 37 = */ 37 |
|||
! assert 38 = */ 2 19 |
|||
! assert 39 = */ 3 13 |
|||
! assert 40 = */ 5 2 2 2 |
|||
module prime_mod |
|||
! sieve_table stores 0 in prime numbers, and a prime factor in composites. |
|||
integer, dimension(:), allocatable :: sieve_table |
|||
private :: PrimeQ |
|||
contains |
|||
! setup routine must be called first! |
|||
subroutine sieve(n) ! populate sieve_table. If n is 0 it deallocates storage, invalidating sieve_table. |
|||
integer, intent(in) :: n |
|||
integer :: status, i, j |
|||
if ((n .lt. 1) .or. allocated(sieve_table)) deallocate(sieve_table) |
|||
if (n .lt. 1) return |
|||
allocate(sieve_table(n), stat=status) |
|||
if (status .ne. 0) stop 'cannot allocate space' |
|||
sieve_table(1) = 1 |
|||
do i=2,n |
|||
if (sieve_table(i) .eq. 0) then |
|||
do j = i*i, n, i |
|||
sieve_table(j) = i |
|||
end do |
|||
end if |
|||
end do |
|||
end subroutine sieve |
|||
subroutine check_sieve(n) |
|||
integer, intent(in) :: n |
|||
if (.not. (allocated(sieve_table) .and. ((1 .le. n) .and. (n .le. size(sieve_table))))) stop 'Call sieve first' |
|||
end subroutine check_sieve |
|||
logical function isPrime(p) |
|||
integer, intent(in) :: p |
|||
call check_sieve(p) |
|||
isPrime = PrimeQ(p) |
|||
end function isPrime |
|||
logical function isComposite(p) |
|||
integer, intent(in) :: p |
|||
isComposite = .not. isPrime(p) |
|||
end function isComposite |
|||
logical function PrimeQ(p) |
|||
integer, intent(in) :: p |
|||
PrimeQ = sieve_table(p) .eq. 0 |
|||
end function PrimeQ |
|||
subroutine prime_factors(p, rv, n) |
|||
integer, intent(in) :: p ! number to factor |
|||
integer, dimension(:), intent(out) :: rv ! the prime factors |
|||
integer, intent(out) :: n ! number of factors returned |
|||
integer :: i, m |
|||
call check_sieve(p) |
|||
m = p |
|||
i = 1 |
|||
if (p .ne. 1) then |
|||
do while ((.not. PrimeQ(m)) .and. (i .lt. size(rv))) |
|||
rv(i) = sieve_table(m) |
|||
m = m/rv(i) |
|||
i = i+1 |
|||
end do |
|||
end if |
|||
if (i .le. size(rv)) rv(i) = m |
|||
n = i |
|||
end subroutine prime_factors |
|||
end module prime_mod |
|||
program count_in_factors |
|||
use prime_mod |
|||
integer :: i, n |
|||
integer, dimension(8) :: factors |
|||
call sieve(40) ! setup |
|||
do i=1,40 |
|||
factors = 0 |
|||
call prime_factors(i, factors, n) |
|||
write(6,*)'assert',i,'= */',factors(:n) |
|||
end do |
|||
call sieve(0) ! release memory |
|||
end program count_in_factors |
|||
</lang> |
|||
=={{header|Go}}== |
=={{header|Go}}== |