How to resolve the algorithm N-smooth numbers step by step in the Wren programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm N-smooth numbers step by step in the Wren programming language

Table of Contents

Problem Statement

n-smooth   numbers are positive integers which have no prime factors > n. The   n   in the expression   n-smooth   is always prime; there are   no   9-smooth numbers. 1   (unity)   is always included in n-smooth numbers.

2-smooth   numbers are non-negative powers of two. 5-smooth   numbers are also called   Hamming numbers. 7-smooth   numbers are also called   humble numbers.

A way to express   11-smooth   numbers is:

All ranges   (for   n)   are to be inclusive, and only prime numbers are to be used. The (optional) n-smooth numbers for the third range are:   503,   509,   and   521. Show all n-smooth numbers for any particular   n   in a horizontal list. Show all output here on this page.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm N-smooth numbers step by step in the Wren programming language

Source code in the wren programming language

import "/math" for Int
import "/big" for BigInt, BigInts

// cache all primes up to 521
var smallPrimes = Int.primeSieve(521)
var primes = smallPrimes.map { |p| BigInt.new(p) }.toList

var nSmooth = Fn.new { |n, size|
    if (n < 2 || n > 521) Fiber.abort("n must be between 2 and 521")
    if (size < 1) Fiber.abort("size must be at least 1")
    var bn = BigInt.new(n)
    var ok = false
    for (prime in primes) {
        if (bn == prime) {
            ok = true
            break
        }
    }
    if (!ok) Fiber.abort("n must be a prime number")
    var ns = List.filled(size, null)
    ns[0] = BigInt.one
    var next = []
    for (i in 0...primes.count) {
        if (primes[i] > bn) break
        next.add(primes[i])
    }
    var indices = List.filled(next.count, 0)
    for (m in 1...size) {
        ns[m] = BigInts.min(next)
        for (i in 0...indices.count) {
            if (ns[m] == next[i]) {
                indices[i] = indices[i] + 1
                next[i] = primes[i] * ns[indices[i]]
            }
        }
    }
    return ns
}

smallPrimes = smallPrimes.where { |p| p <= 29 }
for (i in smallPrimes) {
    System.print("The first 25 %(i)-smooth numbers are:")
    System.print(nSmooth.call(i, 25))
    System.print()
}
for (i in smallPrimes.skip(1)) {
    System.print("The 3,000th to 3,202nd %(i)-smooth numbers are:")
    System.print(nSmooth.call(i, 3002)[2999..-1])
    System.print()
}
for (i in [503, 509, 521]) {
    System.print("The 30,000th to 30,019th %(i)-smooth numbers are:")
    System.print(nSmooth.call(i, 30019)[29999..-1])
    System.print()
}

  

You may also check:How to resolve the algorithm Hello world/Graphical step by step in the Frege programming language
You may also check:How to resolve the algorithm Sieve of Eratosthenes step by step in the VBA programming language
You may also check:How to resolve the algorithm String comparison step by step in the zkl programming language
You may also check:How to resolve the algorithm Repeat a string step by step in the Nanoquery programming language
You may also check:How to resolve the algorithm Averages/Mode step by step in the Slate programming language