65 lines
1.5 KiB
V
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")
|
|
}
|