RosettaCodeData/Task/M-bius-function/Fortran/m-bius-function.f

42 lines
1.1 KiB
Fortran

program moebius
use iso_fortran_env, only: output_unit
integer, parameter :: mu_max=1000000, line_break=20
integer, parameter :: sqroot=int(sqrt(real(mu_max)))
integer :: i, j
integer, dimension(mu_max) :: mu
mu = 1
do i = 2, sqroot
if (mu(i) == 1) then
do j = i, mu_max, i
mu(j) = mu(j) * (-i)
end do
do j = i**2, mu_max, i**2
mu(j) = 0
end do
end if
end do
do i = 2, mu_max
if (mu(i) == i) then
mu(i) = 1
else if (mu(i) == -i) then
mu(i) = -1
else if (mu(i) < 0) then
mu(i) = 1
else if (mu(i) > 0) then
mu(i) = -1
end if
end do
write(output_unit,*) "The first 199 terms of the Möbius sequence are:"
write(output_unit,'(3x)', advance="no") ! Alignment of first number
do i = 1, 199
write(output_unit,'(I2,x)', advance="no") mu(i)
if (modulo(i+1, line_break) == 0) write(output_unit,*)
end do
end program moebius