RosettaCodeData/Task/Mertens-function/V-(Vlang)/mertens-function.v
2023-07-01 13:44:08 -04:00

65 lines
1.5 KiB
V

fn mertens(t int) ([]int, int, int) {
mut to:=t
if to < 1 {
to = 1
}
mut merts := []int{len:to+1}
mut primes := [2]
mut sum := 0
mut zeros := 0
mut crosses := 0
for i := 1; i <= to; i++ {
mut j := i
mut cp := 0 // counts prime factors
mut spf := false // true if there is a square prime factor
for p in primes {
if p > j {
break
}
if j%p == 0 {
j /= p
cp++
}
if j%p == 0 {
spf = true
break
}
}
if cp == 0 && i > 2 {
cp = 1
primes << i
}
if !spf {
if cp%2 == 0 {
sum++
} else {
sum--
}
}
merts[i] = sum
if sum == 0 {
zeros++
if i > 1 && merts[i-1] != 0 {
crosses++
}
}
}
return merts, zeros, crosses
}
fn main() {
merts, zeros, crosses := mertens(1000)
println("Mertens sequence - First 199 terms:")
for i := 0; i < 200; i++ {
if i == 0 {
print(" ")
continue
}
if i%20 == 0 {
println('')
}
print(" ${merts[i]:2}")
}
println("\n\nEquals zero $zeros times between 1 and 1000")
println("\nCrosses zero $crosses times between 1 and 1000")
}