How to resolve the algorithm Stirling numbers of the second kind step by step in the C programming language

Published on 7 June 2024 03:52 AM
#C

How to resolve the algorithm Stirling numbers of the second kind step by step in the C programming language

Table of Contents

Problem Statement

Stirling numbers of the second kind, or Stirling partition numbers, are the number of ways to partition a set of n objects into k non-empty subsets. They are closely related to Bell numbers, and may be derived from them.

Stirling numbers of the second kind obey the recurrence relation:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Stirling numbers of the second kind step by step in the C programming language

This C program calculates and prints Stirling numbers of the second kind for a given maximum value. Here's a detailed explanation of the code:

  1. Header Inclusions:

    • The program includes the standard input/output library <stdio.h>, the standard library <stdlib.h> for memory allocation, and <stdbool.h> for Boolean values.
  2. Stirling Cache Structure:

    • A structure stirling_cache is defined to store precomputed Stirling numbers. It has two members:
      • max: The maximum value for which Stirling numbers are calculated.
      • values: An array to store the calculated Stirling numbers.
  3. stirling_number2 Function:

    • This function retrieves a specific Stirling number of the second kind for given n and k values from the cache. It checks for boundary conditions and then returns the value stored in the values array at the appropriate index.
  4. stirling_cache_create Function:

    • This function creates and initializes the Stirling cache. It allocates memory for the values array and then calculates and stores Stirling numbers up to the specified max value. The cache is initialized with zeros initially.
  5. stirling_cache_destroy Function:

    • This function frees the allocated memory for the values array when the cache is no longer needed.
  6. print_stirling_numbers Function:

    • This function prints the calculated Stirling numbers in a tabular format. It prints the numbers in the format n/k, where n is the row index and k is the column index.
  7. main Function:

    • The main function serves as the entry point of the program.
    • It initializes a stirling_cache structure sc with all zero values.
    • It specifies the maximum value max up to which Stirling numbers will be calculated, which is set to 12 in this program.
    • It calls stirling_cache_create to create and initialize the cache.
    • It calls print_stirling_numbers to print the calculated Stirling numbers.
    • Finally, it calls stirling_cache_destroy to free the allocated memory.

In summary, this program generates Stirling numbers of the second kind up to a specified maximum value and prints them in a tabular format using a precomputed cache for efficiency. It provides a convenient way to calculate and explore these numbers for various combinations of n and k.

Source code in the c programming language

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct stirling_cache_tag {
    int max;
    int* values;
} stirling_cache;

int stirling_number2(stirling_cache* sc, int n, int k) {
    if (k == n)
        return 1;
    if (k == 0 || k > n || n > sc->max)
        return 0;
    return sc->values[n*(n-1)/2 + k - 1];
}

bool stirling_cache_create(stirling_cache* sc, int max) {
    int* values = calloc(max * (max + 1)/2, sizeof(int));
    if (values == NULL)
        return false;
    sc->max = max;
    sc->values = values;
    for (int n = 1; n <= max; ++n) {
        for (int k = 1; k < n; ++k) {
            int s1 = stirling_number2(sc, n - 1, k - 1);
            int s2 = stirling_number2(sc, n - 1, k);
            values[n*(n-1)/2 + k - 1] = s1 + s2 * k;
        }
    }
    return true;
}

void stirling_cache_destroy(stirling_cache* sc) {
    free(sc->values);
    sc->values = NULL;
}

void print_stirling_numbers(stirling_cache* sc, int max) {
    printf("Stirling numbers of the second kind:\nn/k");
    for (int k = 0; k <= max; ++k)
        printf(k == 0 ? "%2d" : "%8d", k);
    printf("\n");
    for (int n = 0; n <= max; ++n) {
        printf("%2d ", n);
        for (int k = 0; k <= n; ++k)
            printf(k == 0 ? "%2d" : "%8d", stirling_number2(sc, n, k));
        printf("\n");
    }
}

int main() {
    stirling_cache sc = { 0 };
    const int max = 12;
    if (!stirling_cache_create(&sc, max)) {
        fprintf(stderr, "Out of memory\n");
        return 1;
    }
    print_stirling_numbers(&sc, max);
    stirling_cache_destroy(&sc);
    return 0;
}


  

You may also check:How to resolve the algorithm Totient function step by step in the S-BASIC programming language
You may also check:How to resolve the algorithm Same fringe step by step in the Haskell programming language
You may also check:How to resolve the algorithm Matrix transposition step by step in the SPAD programming language
You may also check:How to resolve the algorithm Best shuffle step by step in the Ursala programming language
You may also check:How to resolve the algorithm Empty directory step by step in the Go programming language