How to resolve the algorithm Meissel–Mertens constant step by step in the Wren programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Meissel–Mertens constant step by step in the Wren programming language

Table of Contents

Problem Statement

Calculate Meissel–Mertens constant up to a precision your language can handle.

Analogous to Euler's constant, which is important in determining the sum of reciprocal natural numbers, Meissel-Mertens' constant is important in calculating the sum of reciprocal primes.

We consider the finite sum of reciprocal natural numbers: 1 + 1/2 + 1/3 + 1/4 + 1/5 ... 1/n this sum can be well approximated with: log(n) + E where E denotes Euler's constant: 0.57721... log(n) denotes the natural logarithm of n.

Now consider the finite sum of reciprocal primes: 1/2 + 1/3 + 1/5 + 1/7 + 1/11 ... 1/p this sum can be well approximated with: log( log(p) ) + M where M denotes Meissel-Mertens constant: 0.26149...

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Meissel–Mertens constant step by step in the Wren programming language

Source code in the wren programming language

import "./math" for Int
import "./fmt" for Fmt

var euler = 0.57721566490153286
var primes = Int.primeSieve(2.pow(31))
var pc = primes.count
var sum = 0
var c = 0
System.print("Primes added         M")
System.print("------------  --------------")
for (p in primes) {
    var rp = 1/p
    sum = (1-rp).log + rp + sum
    c = c + 1
    if ((c % 1e7) == 0 || c == pc) Fmt.print("$,11d   $0.12f", c, sum + euler)
}


import "./gmp" for Mpf
import "./math" for Int
import "./fmt" for Fmt

var isSquareFree = Fn.new { |n|
    var i = 2
    while (i * i <= n) {
        if (n%(i*i) == 0) return false
        i = (i > 2) ? i + 2 : i + 1
    }
    return true
}

var mu = Fn.new { |n|
    if (n < 1) Fiber.abort("Argument must be a positive integer")
    if (n == 1) return 1
    var sqFree = isSquareFree.call(n)
    var factors = Int.primeFactors(n)
    if (sqFree && factors.count % 2 == 0) return 1
    if (sqFree) return -1
    return 0
}

var meisselMertens = Fn.new { |d|
    Mpf.defaultPrec = d
    var z = Mpf.zero
    var y = Mpf.zero
    var r = Mpf.new()
    var q = Mpf.new()
    var t = Mpf.new()
    var m = Mpf.new()
    for (p in [2, 3, 5, 7]) {
        r.setUi(p).inv
        t.uiSub(1, r).log.add(r)
        z.add(t, z)
    }
    for (k in 2..d) {
        q.setUi(1)
        for (p in [2, 3, 5, 7]) {
            r.setUi(p).inv
            t.uiSub(1, r.pow(k))
            q.mul(t)
        }
        m.setSi(mu.call(k))
        t.zetaUi(k).mul(q).log.mul(m).div(k)
        y.add(t, y)
    }
    return Mpf.euler.add(z).add(y)
}

Fmt.print("$20a", meisselMertens.call(3300).toString(1001))


  

You may also check:How to resolve the algorithm Leonardo numbers step by step in the Racket programming language
You may also check:How to resolve the algorithm Sorting algorithms/Merge sort step by step in the Yabasic programming language
You may also check:How to resolve the algorithm Leap year step by step in the PostScript programming language
You may also check:How to resolve the algorithm Classes step by step in the AmigaE programming language
You may also check:How to resolve the algorithm Factorial step by step in the C programming language