How to resolve the algorithm Sequence: smallest number with exactly n divisors step by step in the Python programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Sequence: smallest number with exactly n divisors step by step in the Python programming language

Table of Contents

Problem Statement

Calculate the sequence where each term   an   is the smallest natural number that has exactly   n   divisors.

Show here, on this page, at least the first  15  terms of the sequence.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Sequence: smallest number with exactly n divisors step by step in the Python programming language

The Python code you provided is an implementation of the A005179 sequence, which represents the smallest number with exactly n divisors. The code includes two different implementations of the sequence: one using a generator function (sequence) and the other using a more functional programming approach (a005179). The code also includes a helper function, divisors, which computes the divisors of a given number, and several utility functions for working with sequences and numbers (take, until, properDivisors, primeFactors, and go).

Here's a detailed explanation of how the code works:

divisors function:

  • This function takes an integer n and returns a list of its divisors.
  • It starts by initializing a list divs with the number 1 (which is always a divisor of any number).
  • Then, it iterates through the numbers from 2 to the square root of n (rounded up to the nearest integer).
  • For each number ii, it checks if it evenly divides n. If it does, it adds ii and n / ii to the divs list.
  • Finally, it adds n to the divs list and returns the set of all unique divisors in the list.

sequence function:

  • This is a generator function that yields the smallest number with exactly n divisors, for each n in the range [1, max_n].
  • It initializes a variable n to 0 and enters a while loop that runs indefinitely.
  • Inside the loop, it increments n by 1.
  • It then initializes another variable ii to 0 and enters a nested while loop.
  • Inside the nested loop, it increments ii by 1.
  • It computes the divisors of ii using the divisors function and checks if the length of the divisors list is equal to n.
  • If the condition is met, it yields ii and breaks out of the nested loop.
  • The outer while loop continues to iterate, incrementing n and repeating the process for the next value of n.

a005179 function:

  • This is a generator function that yields the A005179 sequence.
  • It uses a comprehension to generate the sequence. The comprehension starts with a generator that produces the numbers 1, 2, 3, ... indefinitely.
  • It then applies a filter to the generator, which checks if the number n (the next number in the sequence) satisfies the condition that it has exactly n divisors. The condition is checked using the properDivisors function, which returns the proper divisors of a number (excluding the number itself).
  • The filtered generator is then used to create the sequence, which is yielded by the a005179 function.

properDivisors function:

  • This function computes the proper divisors of an integer n, which are the divisors of n excluding n itself.
  • It uses a recursive helper function go to compute the divisors. The go function takes two arguments: a list of divisors a and a list of prime factors x.
  • The go function first initializes a list qr with the divisors a and the product of the elements in x.
  • It then maps the elements of qr to a list of products of the elements in a and the accumulated product of the elements in x.
  • The resulting list is sorted and then returned, excluding the last element (which is n).

primeFactors function:

  • This function computes the prime factors of an integer n.
  • It uses a recursive helper function f to compute the prime factors. The f function takes a tuple qr as an argument, where qr[0] is a prime factor and qr[1] is the quotient of n divided by the prime factor.
  • The f function returns a tuple qr where qr[0] is the next prime factor and qr[1] is the quotient of n divided by the next prime factor.
  • The f function is applied recursively until the quotient qr[1] is less than or equal to the square root of n.
  • The resulting list of prime factors is returned.

take function:

  • This is a utility function that takes a number n and a sequence xs as arguments and returns the prefix of xs of length n, or xs itself if n is greater than the length of xs.

until function:

  • This is a utility function that takes a predicate function p and a function f as arguments and returns a function that applies f to an initial value x until p(x) is True. The resulting value of x is returned.

The main function uses the a005179 function to generate the first 15 terms of the A005179 sequence and print them to the console.

Source code in the python programming language

def divisors(n):
    divs = [1]
    for ii in range(2, int(n ** 0.5) + 3):
        if n % ii == 0:
            divs.append(ii)
            divs.append(int(n / ii))
    divs.append(n)
    return list(set(divs))


def sequence(max_n=None):
    n = 0
    while True:
        n += 1
        ii = 0
        if max_n is not None:
            if n > max_n:
                break
        while True:
            ii += 1
            if len(divisors(ii)) == n:
                yield ii
                break


if __name__ == '__main__':
    for item in sequence(15):
        print(item)


'''Smallest number with exactly n divisors'''

from itertools import accumulate, chain, count, groupby, islice, product
from functools import reduce
from math import sqrt, floor
from operator import mul


# a005179 :: () -> [Int]
def a005179():
    '''Integer sequence: smallest number with exactly n divisors.'''
    return (
        next(
            x for x in count(1)
            if n == 1 + len(properDivisors(x))
        ) for n in count(1)
    )


# --------------------------TEST---------------------------
# main :: IO ()
def main():
    '''First 15 terms of a005179'''
    print(main.__doc__ + ':\n')
    print(
        take(15)(
            a005179()
        )
    )


# -------------------------GENERIC-------------------------

# properDivisors :: Int -> [Int]
def properDivisors(n):
    '''The ordered divisors of n, excluding n itself.
    '''
    def go(a, x):
        return [a * b for a, b in product(
            a,
            accumulate(chain([1], x), mul)
        )]
    return sorted(
        reduce(go, [
            list(g) for _, g in groupby(primeFactors(n))
        ], [1])
    )[:-1] if 1 < n else []


# primeFactors :: Int -> [Int]
def primeFactors(n):
    '''A list of the prime factors of n.
    '''
    def f(qr):
        r = qr[1]
        return step(r), 1 + r

    def step(x):
        return 1 + (x << 2) - ((x >> 1) << 1)

    def go(x):
        root = floor(sqrt(x))

        def p(qr):
            q = qr[0]
            return root < q or 0 == (x % q)

        q = until(p)(f)(
            (2 if 0 == x % 2 else 3, 1)
        )[0]
        return [x] if q > root else [q] + go(x // q)

    return go(n)


# take :: Int -> [a] -> [a]
# take :: Int -> String -> String
def take(n):
    '''The prefix of xs of length n,
       or xs itself if n > length xs.
    '''
    return lambda xs: (
        xs[0:n]
        if isinstance(xs, (list, tuple))
        else list(islice(xs, n))
    )


# until :: (a -> Bool) -> (a -> a) -> a -> a
def until(p):
    '''The result of repeatedly applying f until p holds.
       The initial seed value is x.
    '''
    def go(f, x):
        v = x
        while not p(v):
            v = f(v)
        return v
    return lambda f: lambda x: go(f, x)


# MAIN ---
if __name__ == '__main__':
    main()


  

You may also check:How to resolve the algorithm Two bullet roulette step by step in the Factor programming language
You may also check:How to resolve the algorithm Window creation step by step in the REBOL programming language
You may also check:How to resolve the algorithm 99 bottles of beer step by step in the SmileBASIC programming language
You may also check:How to resolve the algorithm Exponentiation operator step by step in the D programming language
You may also check:How to resolve the algorithm Middle three digits step by step in the zkl programming language